Open dfleury2 opened 9 months ago
After some investigations, I found something that can help (at least for on_exit), in resolve_state.h, function resolveExitAction,
if constexpr (transition.internal()) {
return [](auto&&...) {};
} else if constexpr (has_exit_action(transition.source())) {
return get_exit_action(transition.source());
}
// -----------------------
// Adding a check for initial state and underlying source state
else if constexpr (is_initial_state(transition.source()) && has_exit_action(resolveSrc(transition))) {
return get_exit_action(resolveSrc(transition));
}
// -----------------------
else if constexpr (hasPseudoExitAction) {
return get_exit_action(resolveSrcParent(transition));
} else {
return [](auto&&...) {};
}
Do you have any opinion about this ?
[EDIT] a simplification do the job, using resolveSrc on transition instead of transition.source()
if constexpr (transition.internal()) {
return [](auto&&...) {};
} else if constexpr (has_exit_action(resolveSrc(transition))) {
return get_exit_action(resolveSrc(transition));
} else if constexpr (has_pseudo_exit_action(transition)) {
return get_exit_action(resolveSrcParent(transition));
} else {
return [](auto&&...) {};
}
Hi, Describe the bug The on_exit is never called for the initial state neither in the main state nor a substate. But the on_entry is sometimes call.
To Reproduce
Expected behavior On_exit called every time a state is exited (at least when the on_entry was called)
Additional context
output:
------------------------------------------- Initial (with a substate) struct ee::Idle + struct ee::start = struct ee::A0 -- ENTRY: SubState -- ENTRY: A0 ----- process_event(press) ----- here expecting EXIT: A0
struct ee::A0 + struct ee::press = struct ee::A1 -- ENTRY: A1 ----- process_event(press) ----- -- EXIT: A1 struct ee::A1 + struct ee::press = struct ee::A2 -- ENTRY: A2 ----- process_event(press) ----- -- EXIT: A2 struct ee::A2 + struct ee::press = struct ee::A0 -- ENTRY: A0 ----- process_event(press) -----
here expecting EXIT: A0
struct ee::A0 + struct ee::press = struct ee::A1 -- ENTRY: A1 -- EXIT: SubState
__<- here the sate on_exit is called which is great struct ee::SubState + struct ee::stop = struct ee::Idle -- ENTRY: Idle
<- here ENTRY is called but was not called at the start, nor the EXIT is called__
------------------------------------------- SubState ----- process_event(press) ----- here, may be EXIT expected, may by ENTRY too for A0 struct ee::A0 + struct ee::press = struct ee::A1 -- ENTRY: A1 ----- process_event(press) ----- -- EXIT: A1 struct ee::A1 + struct ee::press = struct ee::A2 -- ENTRY: A2 ----- process_event(press) ----- -- EXIT: A2 struct ee::A2 + struct ee::press = struct ee::A0 -- ENTRY: A0 ----- process_event(press) ----- here ENTRY: A0 was called, but not EXIT struct ee::A0 + struct ee::press = struct ee::A1 -- ENTRY: A1
Unfortunately, the code itself is beeyond my template/boost.Hana knowledge, If I have some tips to find the issue or change the behavior, may be I can help.
Regards,