13
0

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 double most_recently_requested_speed;
mutable double _default_speed;
int _reverse_after_declick;
void defer (Event& ev);
void bad_transition (Event const &);

View File

@ -88,6 +88,7 @@ TransportFSM::TransportFSM (TransportAPI& tapi)
, processing (0)
, most_recently_requested_speed (std::numeric_limits<double>::max())
, _default_speed (1.0)
, _reverse_after_declick (0)
{
init ();
}
@ -419,6 +420,9 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
case DeclickDone:
switch (_motion_state) {
case DeclickToLocate:
if (_reverse_after_declick) {
transition (Reversing);
}
transition (WaitingForLocate);
start_locate_after_declick ();
break;
@ -598,7 +602,7 @@ TransportFSM::start_locate_after_declick ()
double post_locate_speed;
if (api->user_roll_after_locate()) {
if (api->user_roll_after_locate() && !_reverse_after_declick) {
post_locate_speed = _default_speed;
} else {
post_locate_speed = most_recently_requested_speed;
@ -609,6 +613,12 @@ TransportFSM::start_locate_after_declick ()
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()) {
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));
transition (Reversing);
Event lev (Locate, api->position(), must_roll ? MustRoll : MustStop, false, true);
if (_transport_speed) {
_reverse_after_declick++;
transition (DeclickToLocate);
start_declick_for_locate (lev);
} else {
transition (Reversing);
transition (WaitingForLocate);
start_locate_while_stopped (lev);
}
@ -814,7 +824,7 @@ TransportFSM::set_speed (Event const & ev)
bool
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 (_direction_state == Forwards);