fix thinko in TransportFSM's handling of deferred events

If a deferred event was used in process_event() but was deferred again, we deleted it. That was wrong,
it should remain in the deferred_events queue.
This commit is contained in:
Paul Davis 2021-04-15 23:17:53 -06:00
parent 11416bf9d1
commit 79f1ff3df3

View file

@ -83,6 +83,7 @@ TransportFSM::process_events ()
MotionState oms = _motion_state; MotionState oms = _motion_state;
ButlerState obs = _butler_state; ButlerState obs = _butler_state;
DirectionState ods = _direction_state;
Event* ev = &queued_events.front(); Event* ev = &queued_events.front();
bool deferred; bool deferred;
@ -98,23 +99,30 @@ TransportFSM::process_events ()
if (process_event (*ev, false, deferred)) { /* event processed successfully */ if (process_event (*ev, false, deferred)) { /* event processed successfully */
if (oms != _motion_state || obs != _butler_state) { if (oms != _motion_state || obs != _butler_state || ods != _direction_state) {
/* state changed, so now check deferred events /* state changed, so now check deferred events
* to see if they can be processed now * to see if they can be processed now
*/ */
if (!deferred_events.empty() ){ if (!deferred_events.empty() ){
DEBUG_TRACE (DEBUG::TFSMEvents, string_compose ("processing %1 deferred events\n", deferred_events.size())); DEBUG_TRACE (DEBUG::TFSMEvents, string_compose ("processing %1 deferred events\n", deferred_events.size()));
for (EventList::iterator e = deferred_events.begin(); e != deferred_events.end(); ) { for (EventList::iterator e = deferred_events.begin(); e != deferred_events.end(); ) {
Event* deferred_ev = &(*e); Event* deferred_ev = &(*e);
bool deferred2; bool deferred2;
if (process_event (*e, true, deferred2)) { /* event processed, remove from deferred */
e = deferred_events.erase (e); if (process_event (*e, true, deferred2)) {
delete deferred_ev; if (!deferred2) { /* event processed and not deferred again, remove from deferred */
} else { e = deferred_events.erase (e);
delete deferred_ev;
} else {
++e;
}
} else { /* process error or deferred (again) */
++e; ++e;
delete deferred_ev;
} }
} }
} }
@ -210,8 +218,8 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
case Reversing: case Reversing:
if (!already_deferred) { if (!already_deferred) {
defer (ev); defer (ev);
deferred = true;
} }
deferred = true;
break; break;
default: default:
switch (_motion_state) { switch (_motion_state) {
@ -222,8 +230,8 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
default: default:
if (!already_deferred) { if (!already_deferred) {
defer (ev); defer (ev);
deferred = true;
} }
deferred = true;
} }
break; break;
} }
@ -241,14 +249,14 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
case WaitingForLocate: case WaitingForLocate:
if (!already_deferred) { if (!already_deferred) {
defer (ev); defer (ev);
deferred = true;
} }
deferred = true;
break; break;
case DeclickToStop: case DeclickToStop:
if (!already_deferred) { if (!already_deferred) {
defer (ev); defer (ev);
deferred = true;
} }
deferred = true;
break; break;
default: default:
bad_transition (ev); return false; bad_transition (ev); return false;
@ -268,8 +276,8 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
case WaitingForLocate: case WaitingForLocate:
if (!already_deferred) { if (!already_deferred) {
defer (ev); defer (ev);
deferred = true;
} }
deferred = true;
break; break;
case DeclickToStop: case DeclickToStop:
/* already doing it */ /* already doing it */