TransportFSM: do not enter Reversing state too early

We do need to know that a reversal is intended before we do a locate, but we should
not enter Reversing before the declick is finished. So instead, we add a new
member, _reverse_after_declick to keep track, and enter Reversing just before
we start the locate
This commit is contained in:
Paul Davis 2021-05-06 19:40:00 -06:00
parent 97167ed927
commit bfd52fd94d
2 changed files with 15 additions and 4 deletions

View file

@ -209,6 +209,7 @@ struct TransportFSM
mutable boost::optional<bool> current_roll_after_locate_status; mutable boost::optional<bool> current_roll_after_locate_status;
mutable double most_recently_requested_speed; mutable double most_recently_requested_speed;
mutable double _default_speed; mutable double _default_speed;
int _reverse_after_declick;
void defer (Event& ev); void defer (Event& ev);
void bad_transition (Event const &); void bad_transition (Event const &);

View file

@ -88,6 +88,7 @@ TransportFSM::TransportFSM (TransportAPI& tapi)
, processing (0) , processing (0)
, most_recently_requested_speed (std::numeric_limits<double>::max()) , most_recently_requested_speed (std::numeric_limits<double>::max())
, _default_speed (1.0) , _default_speed (1.0)
, _reverse_after_declick (0)
{ {
init (); init ();
} }
@ -419,6 +420,9 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
case DeclickDone: case DeclickDone:
switch (_motion_state) { switch (_motion_state) {
case DeclickToLocate: case DeclickToLocate:
if (_reverse_after_declick) {
transition (Reversing);
}
transition (WaitingForLocate); transition (WaitingForLocate);
start_locate_after_declick (); start_locate_after_declick ();
break; break;
@ -598,7 +602,7 @@ TransportFSM::start_locate_after_declick ()
double post_locate_speed; double post_locate_speed;
if (api->user_roll_after_locate()) { if (api->user_roll_after_locate() && !_reverse_after_declick) {
post_locate_speed = _default_speed; post_locate_speed = _default_speed;
} else { } else {
post_locate_speed = most_recently_requested_speed; post_locate_speed = most_recently_requested_speed;
@ -609,6 +613,12 @@ TransportFSM::start_locate_after_declick ()
transition (Reversing); transition (Reversing);
} }
DEBUG_TRACE (DEBUG::TFSMEvents, string_compose ("post-locate speed will be %1 based on user-roll-after %2 and r-a-dc %3\n", post_locate_speed, api->user_roll_after_locate(), _reverse_after_declick));
if (_reverse_after_declick) {
_reverse_after_declick--;
}
if (api->user_roll_after_locate()) { if (api->user_roll_after_locate()) {
most_recently_requested_speed = post_locate_speed; most_recently_requested_speed = post_locate_speed;
} }
@ -797,14 +807,14 @@ TransportFSM::set_speed (Event const & ev)
DEBUG_TRACE (DEBUG::TFSMState, string_compose ("switch-directions, target speed %1 state %2 IR %3\n", ev.speed, current_state(), initial_reverse)); DEBUG_TRACE (DEBUG::TFSMState, string_compose ("switch-directions, target speed %1 state %2 IR %3\n", ev.speed, current_state(), initial_reverse));
transition (Reversing);
Event lev (Locate, api->position(), must_roll ? MustRoll : MustStop, false, true); Event lev (Locate, api->position(), must_roll ? MustRoll : MustStop, false, true);
if (_transport_speed) { if (_transport_speed) {
_reverse_after_declick++;
transition (DeclickToLocate); transition (DeclickToLocate);
start_declick_for_locate (lev); start_declick_for_locate (lev);
} else { } else {
transition (Reversing);
transition (WaitingForLocate); transition (WaitingForLocate);
start_locate_while_stopped (lev); start_locate_while_stopped (lev);
} }
@ -814,7 +824,7 @@ TransportFSM::set_speed (Event const & ev)
bool bool
TransportFSM::will_roll_fowards () const TransportFSM::will_roll_fowards () const
{ {
if (reversing()) { if (reversing() || _reverse_after_declick) {
return most_recently_requested_speed >= 0; /* note: future speed of zero is equivalent to Forwards */ return most_recently_requested_speed >= 0; /* note: future speed of zero is equivalent to Forwards */
} }
return (_direction_state == Forwards); return (_direction_state == Forwards);