diff --git a/libs/main/state_machine/pistatemachine_state.cpp b/libs/main/state_machine/pistatemachine_state.cpp index d950425c..f23b257b 100644 --- a/libs/main/state_machine/pistatemachine_state.cpp +++ b/libs/main/state_machine/pistatemachine_state.cpp @@ -97,8 +97,8 @@ void PIStateBase::print(PIString prefix) { } -bool PIStateBase::start() { - if (isActive()) return true; +bool PIStateBase::start(bool force) { + if (!force && isActive()) return true; if (isAtomic()) { setActive(true); return true; @@ -197,6 +197,20 @@ void PIStateBase::propagateRoot(PIStateMachine * r) { } +PIVector PIStateBase::gatherStates() { + PIVector ret, slice, prev_slice({this}); + while (prev_slice.isNotEmpty()) { + slice.clear(); + for (auto s: prev_slice) { + ret << s; + slice << s->children; + } + prev_slice.swap(slice); + } + return ret; +} + + void PIStateBase::gatherActiveStates(PIVector & output) { for (auto * c: children) c->gatherActiveStates(output); diff --git a/libs/main/state_machine/pistatemachine_state.h b/libs/main/state_machine/pistatemachine_state.h index c01c804d..1d22fd43 100644 --- a/libs/main/state_machine/pistatemachine_state.h +++ b/libs/main/state_machine/pistatemachine_state.h @@ -74,8 +74,10 @@ public: void print(PIString prefix = {}); + PIVector gatherStates(); + protected: - bool start(); + bool start(bool force = false); void setActive(bool yes); void setActiveRecursive(bool yes); void setChildrenActive(bool yes); diff --git a/libs/main/state_machine/pistatemachine_transition.cpp b/libs/main/state_machine/pistatemachine_transition.cpp index f895d694..b59150b6 100644 --- a/libs/main/state_machine/pistatemachine_transition.cpp +++ b/libs/main/state_machine/pistatemachine_transition.cpp @@ -91,7 +91,7 @@ void PITransitionBase::trigger() { else source_target_path[i]->activeChild(source_target_path[i + 1]); } - if (target_state->isCompound()) target_state->start(); + if (target_state->isCompound()) target_state->start(true); }