diff --git a/mcc/mcc_finite_state_machine.h b/mcc/mcc_finite_state_machine.h index e3e2efb..0bec64e 100644 --- a/mcc/mcc_finite_state_machine.h +++ b/mcc/mcc_finite_state_machine.h @@ -396,6 +396,10 @@ public: [p_event, states, currentState, this](curr_state_t*) { using to_state_t = curr_state_t::transition_t::template find_state_by_event_t; + if constexpr (std::holds_alternative(*currentState)) { + // ?!!!! from self + } + if constexpr (!std::is_void_v) { std::lock_guard lock(_transitionMutex); diff --git a/mcc/mcc_generic_mount.h b/mcc/mcc_generic_mount.h index adddc06..90105dd 100644 --- a/mcc/mcc_generic_mount.h +++ b/mcc/mcc_generic_mount.h @@ -260,7 +260,7 @@ public: using transition_t = fsm::fsm_transition_table_t, std::pair, - std::pair, + std::pair, std::pair, std::pair, std::pair, @@ -272,14 +272,6 @@ public: this->exitLog(event); } - void enter(MccGenericMountEventInit& event) - { - error_t err = event.mount().initMount(); - if (err) { - event.mount().dispatchEvent(MccGenericMountEventError{event.mount(), err}); - } - } - template EvT> void enter(EvT& event) { @@ -287,6 +279,35 @@ public: } }; + struct MccGenericMountStateInit : MccGenericMountBaseState { + using transition_t = + fsm::fsm_transition_table_t, + std::pair, + std::pair, + std::pair, + std::pair, + std::pair, + std::pair>; + + template EvT> + void exit(EvT& event) + { + this->exitLog(event); + } + + template EvT> + void enter(EvT& event) + { + this->enterLog(event); + + error_t err = event.mount()._initMount(); + if (err) { + event.mount().dispatchEvent(MccGenericMountEventError{event.mount(), err}); + } else { + event.mount().dispatchEvent(MccGenericMountEventIDLE{event.mount()}); + } + } + }; /* CONSTRUCTORS AND DESTRUCTOR */ @@ -311,10 +332,30 @@ public: virtual ~MccGenericMountFSM() = default; + auto initMount() + { + this->dispatchEvent(MccGenericMountEventInit{*this}); + } + + auto stopMount() { this->dispatchEvent(MccGenericMountEventStop{*this}); } + +protected: + // wrappers + + auto _initMount() + { + return base_gmount_t::initMount(); + } + + + auto _stopMount() + { + return base_gmount_t::stopMount(); + } };