diff --git a/src/app/factory.cpp b/src/app/factory.cpp index 2efed51..aa4caa4 100644 --- a/src/app/factory.cpp +++ b/src/app/factory.cpp @@ -15,7 +15,6 @@ Factory::Factory() { void Factory::initialize() { Trace::initialize(); - // TODO: Initialize factory attributes here #if defined(TOUCHGFX_ENABLED) && (TOUCHGFX_ENABLED != 0) @@ -27,24 +26,21 @@ void Factory::initialize() { void Factory::build() { Trace::out("Factory: Creating app components..."); - // Start state machine(s) - + // Start SM of ButtonEventLogger & ButtonsController buttonEventLogger_.startBehavior(); ButtonsController::getInstance()->startBehavior(); + // Register CallBack of ButtonController with himself for the provider and onButtonChangeState for the CallBack Method ButtonsController::getInstance()->registerCallback ( ButtonEventsHandler::getInstance(), (interface::ButtonsControllerCallbackProvider::CallbackMethod) &ButtonEventsHandler::onButtonChangeState ); - buttonEventLogger_.startBehavior(); + // Subscribe ButtonEventLogger to ButtonEventsHandler & start SM of ButtonEventsHandler ButtonEventsHandler::getInstance()->subscribe(&buttonEventLogger_); ButtonEventsHandler::getInstance()->startBehavior(); - - // TODO: Start state-machines here - #if defined(TOUCHGFX_ENABLED) && (TOUCHGFX_ENABLED != 0) getTouchGfxTask().start(); #endif diff --git a/src/app/factory.h b/src/app/factory.h index 1871ebc..1043d8d 100644 --- a/src/app/factory.h +++ b/src/app/factory.h @@ -11,8 +11,6 @@ #include "platform/f7-disco-gcc/board/ButtonsController.h" #include "mdw/button/ButtonEventsHandler.h" -// TODO: Add C++ specific includes here - namespace app { /** @@ -30,7 +28,6 @@ public: #endif protected: - // TODO: Add static attributes here static ButtonEventsLogger buttonEventLogger_; }; diff --git a/src/xf/core/XFState.cpp b/src/xf/core/XFState.cpp index ca3aab3..deafda9 100644 --- a/src/xf/core/XFState.cpp +++ b/src/xf/core/XFState.cpp @@ -13,40 +13,52 @@ XFState::XFState(XFBehavior* behavior) : pBehavior(behavior) { + /* + * Initialise behavior of this state on the constructor. + * Can't be null ! + */ assert(behavior != nullptr); - cbState_ = nullptr; - cbEntry_ = nullptr; - cbExit_ = nullptr; - cbEvState_ = nullptr; - cbEvEntry_ = nullptr; - cbEvExit_ = nullptr; } void XFState::addTransition(XFEvent::XFEventType type, const int evid, const int time, XFState* state) { assert(state != nullptr); + /* + * Create a transition with his Type, ID, time if Timeout and the state to be set when this transition happen + * Push the transition on the list of transition of the event + * Pointer State can't be null + */ transition t; + t.evType = type; t.evid = evid; t.time = time; - t.evType = type; t.nextState = state; transitions_.push_back(t); } XFEventStatus XFState::changeState(XFState* state) { - pBehavior->curentXFState_ = state; + // Change current state of the behavior + pBehavior->currentXFState_ = state; + + // Set state is changed pBehavior->changeXFState = true; + + // Return the event status as consumed return XFEventStatus::Consumed; } XFEventStatus XFState::onState(const XFEvent* ev) { + // Execute onState callBack without parameter if it's defined if(cbState_ != nullptr) { (pBehavior->*cbState_)(); } + + // Execute onState callBack with event as parameter if it's defined if(cbEvState_ != nullptr) { (pBehavior->*cbEvState_)(ev); } + // Test each transition and change state if one is actual transition for(transition t : transitions_) { switch(ev->getEventType()) { @@ -71,21 +83,25 @@ XFEventStatus XFState::onState(const XFEvent* ev) { } - } + // Return event status as notConsumed if actual event isn't on the list of transitions return XFEventStatus::NotConsumed; } void XFState::onEntry(const XFEvent* ev) { + + // Execute onEntry callBack without parameter if it's defined if(cbEntry_ != nullptr) { (pBehavior->*cbEntry_)(); } + // Execute onExit callBack with event as parameter if it's defined if(cbEvEntry_ != nullptr) { (pBehavior->*cbEvEntry_)(ev); } + // If a timeout is on the list of transition start it with is own delay for(transition t : transitions_) { if(t.evType == XFEvent::XFEventType::Timeout) { @@ -95,14 +111,18 @@ void XFState::onEntry(const XFEvent* ev) { } } void XFState::onExit(const XFEvent* ev) { + + // Execute onExit callBack without parameter if it's defined if(cbExit_ != nullptr) { (pBehavior->*cbExit_)(); } + // Execute onExit callBack with event as parameter if it's defined if(cbEvExit_ != nullptr) { (pBehavior->*cbEvExit_)(ev); } + // If a timeout is on the list of transition and isn't the actual event, stop it for(transition t: transitions_) { if(t.evType == XFEvent::XFEventType::Timeout) { diff --git a/src/xf/core/behavior.cpp b/src/xf/core/behavior.cpp index 219702e..6d94267 100644 --- a/src/xf/core/behavior.cpp +++ b/src/xf/core/behavior.cpp @@ -84,16 +84,21 @@ XFBehavior::TerminateBehavior XFBehavior::process(const XFEvent * pEvent) } XFEventStatus XFBehavior::processEvent(){ + + /* + * Basic double switch pattern but not switch on an enum but on Object XFState + */ + XFEventStatus eventStatus = XFEventStatus::Unknown; const XFEvent * ev = getCurrentEvent(); - oldXFState_ = curentXFState_; + oldXFState_ = currentXFState_; - eventStatus = curentXFState_->onState(ev); + eventStatus = currentXFState_->onState(ev); if(changeXFState){ oldXFState_->onExit(ev); - curentXFState_->onEntry(ev); + currentXFState_->onEntry(ev); } return eventStatus; diff --git a/src/xf/include/xf/XFState.h b/src/xf/include/xf/XFState.h index e27844e..2d6f134 100644 --- a/src/xf/include/xf/XFState.h +++ b/src/xf/include/xf/XFState.h @@ -97,12 +97,12 @@ protected: } transition; std::list transitions_; - callback cbState_; - callback cbEntry_; - callback cbExit_; - callbackEv cbEvState_; - callbackEv cbEvEntry_; - callbackEv cbEvExit_; + callback cbState_ = nullptr; + callback cbEntry_ = nullptr; + callback cbExit_ = nullptr; + callbackEv cbEvState_ = nullptr; + callbackEv cbEvEntry_ = nullptr; + callbackEv cbEvExit_ = nullptr; }; diff --git a/src/xf/include/xf/behavior.h b/src/xf/include/xf/behavior.h index 1ff1826..598a1db 100644 --- a/src/xf/include/xf/behavior.h +++ b/src/xf/include/xf/behavior.h @@ -55,7 +55,7 @@ public: protected: /** * Executes the current event in its implemented behavior. - * This method needs to be overridden to implement the + * This method can be overridden to implement the * behavior (i.e. state machine) needed. */ virtual XFEventStatus processEvent(); @@ -100,9 +100,20 @@ protected: const XFEvent * pCurrentEvent_; ///< Reference to actually processed event. protected: + /** + * Behavior have at least an Initial State. + */ XFInitialState stInitial; - XFState* curentXFState_ = &stInitial; + + /** + * Pointer for the curent and old state of this behavior + */ + XFState* currentXFState_ = &stInitial; XFState* oldXFState_ = &stInitial; + + /** + * Keep in trace when state is changed (have to be set to true in every processEvent + */ bool changeXFState = false; };