Compare commits
	
		
			3 Commits
		
	
	
		
			render
			...
			262b89fe45
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 262b89fe45 | |||
| 2c5fa52b9f | |||
| 0ccfd522ee | 
| @@ -9,8 +9,13 @@ | |||||||
| #include "trace/trace.h" | #include "trace/trace.h" | ||||||
| #include "ButtonEvent.h" | #include "ButtonEvent.h" | ||||||
|  |  | ||||||
| ButtonEventsLogger::ButtonEventsLogger() { | ButtonEventsLogger::ButtonEventsLogger() | ||||||
| 	curentState_ = state::initial; | 	: stWait(this) { | ||||||
|  |  | ||||||
|  | 	stInitial.addInitialTransition(&stWait); | ||||||
|  | 	stWait.addTransition(event::evButtonShortPressed, &stWait); | ||||||
|  | 	stWait.addTransition(event::evButtonLongPressed, &stWait); | ||||||
|  | 	stWait.registerOnEntry((XFState::callbackEv)&ButtonEventsLogger::logOnTrace); | ||||||
| } | } | ||||||
|  |  | ||||||
| void ButtonEventsLogger::onButtonShortPressed(ButtonIndex buttonIndex) { | void ButtonEventsLogger::onButtonShortPressed(ButtonIndex buttonIndex) { | ||||||
| @@ -21,62 +26,13 @@ void ButtonEventsLogger::onButtonLongPressed(ButtonIndex buttonIndex) { | |||||||
| 	GEN(ButtonEvent(event::evButtonLongPressed, this, buttonIndex)); | 	GEN(ButtonEvent(event::evButtonLongPressed, this, buttonIndex)); | ||||||
| } | } | ||||||
|  |  | ||||||
| XFEventStatus ButtonEventsLogger::processEvent() { | void ButtonEventsLogger::logOnTrace(const XFEvent* ev) { | ||||||
| 	eEventStatus eventStatus = XFEventStatus::NotConsumed; | 	ButtonEvent* buttonEvent = (ButtonEvent*)ev; | ||||||
|  | 	int evid = buttonEvent->getId(); | ||||||
| 	ButtonEvent* ev = (ButtonEvent*)getCurrentEvent(); | 	if(evid == event::evButtonShortPressed){ | ||||||
| 	XFEvent::XFEventType evType = ev->getEventType(); | 			Trace::out("ButtonEventLogger: Button %d short pressed", buttonEvent->getButtonId()); | ||||||
| 	int evid = ev->getId(); |  | ||||||
|  |  | ||||||
| 	oldState_ = curentState_; |  | ||||||
| 	changeXFState = false; |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 	switch (curentState_) { //on state |  | ||||||
| 		case state::initial: |  | ||||||
| 			if(evType == XFEvent::Initial) { |  | ||||||
| 				curentState_ = state::waitButtonPressed; |  | ||||||
| 				changeXFState = true; |  | ||||||
| 				eventStatus = XFEventStatus::Consumed; |  | ||||||
| 			} |  | ||||||
| 			break; |  | ||||||
|  |  | ||||||
| 		case state::waitButtonPressed: |  | ||||||
| 			if(evid == event::evButtonShortPressed){ |  | ||||||
| 					Trace::out("ButtonEventLogger: Button %d short pressed", ev->getButtonId()); |  | ||||||
| 					curentState_ = state::waitButtonPressed; |  | ||||||
| 					changeXFState = true; |  | ||||||
| 					eventStatus = XFEventStatus::Consumed; |  | ||||||
| 			} |  | ||||||
| 			if(evid == event::evButtonLongPressed){ |  | ||||||
| 					Trace::out("ButtonEventLogger: Button %d long pressed", ev->getButtonId()); |  | ||||||
| 					curentState_ = state::waitButtonPressed; |  | ||||||
| 					changeXFState = true; |  | ||||||
| 					eventStatus = XFEventStatus::Consumed; |  | ||||||
| 			} |  | ||||||
| 			break; |  | ||||||
| 	} | 	} | ||||||
|  | 	if(evid == event::evButtonLongPressed){ | ||||||
| 	if(changeXFState) { | 			Trace::out("ButtonEventLogger: Button %d long pressed", buttonEvent->getButtonId()); | ||||||
| 		switch (oldState_) { // onExit |  | ||||||
| 			case state::initial: |  | ||||||
| 				break; |  | ||||||
|  |  | ||||||
| 			case state::waitButtonPressed: |  | ||||||
| 				break; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		switch (curentState_) { // onEntry |  | ||||||
| 			case state::initial: |  | ||||||
| 				break; |  | ||||||
|  |  | ||||||
| 			case state::waitButtonPressed: |  | ||||||
| 				break; |  | ||||||
|  |  | ||||||
| 		} |  | ||||||
| 		changeXFState = false; |  | ||||||
| 	} | 	} | ||||||
| 	return eventStatus; |  | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -21,20 +21,14 @@ public: | |||||||
|  |  | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	XFEventStatus processEvent() override; | 	void logOnTrace(const XFEvent* ev); | ||||||
|  |  | ||||||
| 	typedef enum { | 	typedef enum { | ||||||
| 		evButtonShortPressed = 1, | 		evButtonShortPressed = 10, | ||||||
| 		evButtonLongPressed | 		evButtonLongPressed | ||||||
| 	} event; | 	} event; | ||||||
|  |  | ||||||
| 	typedef enum { | 	XFState stWait; | ||||||
| 		initial, |  | ||||||
| 		waitButtonPressed |  | ||||||
| 	} state; |  | ||||||
|  |  | ||||||
| 	state curentState_; |  | ||||||
| 	state oldState_; |  | ||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,12 +16,12 @@ ButtonEventsHandler::ButtonEventsHandler() | |||||||
| 		observer_[i] = nullptr; | 		observer_[i] = nullptr; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	stInitial.setNextState(&stRun); | 	stInitial.addInitialTransition(&stRun); | ||||||
| 	stRun.registerOnEntry((XFState::callback)&ButtonEventsHandler::startButtonSM); | 	stRun.registerOnEntry((XFState::callback)&ButtonEventsHandler::startButtonSM); | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void ButtonEventsHandler::startButtonSM(const XFEvent* ev) { | void ButtonEventsHandler::startButtonSM() { | ||||||
| 	buttonStateSm_[0].startBehavior(); | 	buttonStateSm_[0].startBehavior(); | ||||||
| 	buttonStateSm_[1].startBehavior(); | 	buttonStateSm_[1].startBehavior(); | ||||||
| 	buttonStateSm_[2].startBehavior(); | 	buttonStateSm_[2].startBehavior(); | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ public: | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	ButtonEventsHandler(); | 	ButtonEventsHandler(); | ||||||
| 	void startButtonSM(const XFEvent* ev); | 	void startButtonSM(); | ||||||
|  |  | ||||||
| 	XFState stRun; | 	XFState stRun; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,10 +8,27 @@ | |||||||
| #include <button/ButtonStateSm.h> | #include <button/ButtonStateSm.h> | ||||||
| #include "mdw/button/ButtonEventsHandler.h" | #include "mdw/button/ButtonEventsHandler.h" | ||||||
|  |  | ||||||
| //TODO start State Machine. For that, turn ButtonEventsHandler to a State Machine (Initial, run) |  | ||||||
| ButtonStateSm::ButtonStateSm() | ButtonStateSm::ButtonStateSm() | ||||||
| 	: buttonIndex_(getNbInstance()) { | 	: buttonIndex_(getNbInstance()), | ||||||
| 	currentState_ = state::initial; | 	  stWaitButtonPressed(this), | ||||||
|  | 	  stButtonPressed(this), | ||||||
|  | 	  stButtonShortPressed(this), | ||||||
|  | 	  stButtonLongPressed(this) { | ||||||
|  |  | ||||||
|  | 	stInitial.addInitialTransition(&stWaitButtonPressed); | ||||||
|  |  | ||||||
|  | 	stWaitButtonPressed.addTransition(event::evButtonPressed, &stButtonPressed); | ||||||
|  |  | ||||||
|  | 	// TODO bug if setTimeout is used before addTransition !!! | ||||||
|  | 	stButtonPressed.addTransition(event::evButtonReleased, &stButtonShortPressed); | ||||||
|  | 	stButtonPressed.setTimeout(1000, &stButtonLongPressed); | ||||||
|  | 	stButtonPressed.registerOnExit((XFState::callback)&ButtonStateSm::genNullTransition); | ||||||
|  |  | ||||||
|  | 	stButtonShortPressed.registerOnEntry((XFState::callback)&ButtonStateSm::notifyShortPress); | ||||||
|  | 	stButtonShortPressed.addTransition(event::evReturn, &stWaitButtonPressed); | ||||||
|  |  | ||||||
|  | 	stButtonLongPressed.registerOnEntry((XFState::callback)&ButtonStateSm::notifyLongPress); | ||||||
|  | 	stButtonLongPressed.addTransition(event::evReturn, &stWaitButtonPressed); | ||||||
| } | } | ||||||
|  |  | ||||||
| uint8_t ButtonStateSm::getNbInstance(){ | uint8_t ButtonStateSm::getNbInstance(){ | ||||||
| @@ -26,102 +43,14 @@ void ButtonStateSm::genButtonReleased() { | |||||||
| 	GEN(XFEvent(XFEvent::Event, event::evButtonReleased, this)); | 	GEN(XFEvent(XFEvent::Event, event::evButtonReleased, this)); | ||||||
| } | } | ||||||
|  |  | ||||||
| XFEventStatus ButtonStateSm::processEvent() { | void ButtonStateSm::notifyShortPress() { | ||||||
| 	eEventStatus eventStatus = XFEventStatus::Unknown; | 	ButtonEventsHandler::getInstance()->notifyButtonShortPressed(buttonIndex_); | ||||||
|  | } | ||||||
| 	const XFEvent* ev = getCurrentEvent(); |  | ||||||
| 	XFEvent::XFEventType evType = ev->getEventType(); | void ButtonStateSm::notifyLongPress() { | ||||||
| 	int evid = ev->getId(); | 	ButtonEventsHandler::getInstance()->notifyButtonLongPressed(buttonIndex_); | ||||||
|  | } | ||||||
| 	oldState_ = currentState_; |  | ||||||
| 	changeState_ = false; | void ButtonStateSm::genNullTransition() { | ||||||
|  | 	GEN(XFEvent(XFEvent::Event, event::evReturn, this)); | ||||||
| 	switch (currentState_) { |  | ||||||
| 		case state::initial: |  | ||||||
| 			if(evType == XFEvent::Initial) { |  | ||||||
| 				currentState_ = state::waitButtonPressed; |  | ||||||
| 				changeState_ = true; |  | ||||||
| 				eventStatus = XFEventStatus::Consumed; |  | ||||||
| 			} |  | ||||||
| 			break; |  | ||||||
|  |  | ||||||
| 		case state::waitButtonPressed: |  | ||||||
| 			if(evid == event::evButtonPressed) { |  | ||||||
| 				currentState_ = state::buttonPressed; |  | ||||||
| 				changeState_ = true; |  | ||||||
| 				eventStatus = XFEventStatus::Consumed; |  | ||||||
| 				scheduleTimeout(event::evTimeout, 1000); |  | ||||||
| 			} |  | ||||||
| 			break; |  | ||||||
|  |  | ||||||
| 		case state::buttonPressed: |  | ||||||
| 			if(evid == event::evButtonReleased) { |  | ||||||
| 				currentState_ = state::buttonShortPressed; |  | ||||||
| 				changeState_ = true; |  | ||||||
| 				eventStatus = XFEventStatus::Consumed; |  | ||||||
| 				unscheduleTimeout(event::evTimeout); |  | ||||||
| 			} |  | ||||||
| 			if(evid == event::evTimeout) { |  | ||||||
| 				currentState_ = state::buttonLongPressed; |  | ||||||
| 				changeState_ = true; |  | ||||||
| 				eventStatus = XFEventStatus::Consumed; |  | ||||||
| 			} |  | ||||||
| 			GEN(XFNullTransition(this)); |  | ||||||
| 			break; |  | ||||||
|  |  | ||||||
| 		case state::buttonShortPressed: |  | ||||||
| 			if(evType == XFEvent::XFEventType::NullTransition) { |  | ||||||
| 				currentState_ = state::waitButtonPressed; |  | ||||||
| 				changeState_ = true; |  | ||||||
| 				eventStatus = XFEventStatus::Consumed; |  | ||||||
| 			} |  | ||||||
| 			break; |  | ||||||
|  |  | ||||||
| 		case state::buttonLongPressed: |  | ||||||
| 			if(evType == XFEvent::XFEventType::NullTransition) { |  | ||||||
| 				currentState_ = state::waitButtonPressed; |  | ||||||
| 				changeState_ = true; |  | ||||||
| 				eventStatus = XFEventStatus::Consumed; |  | ||||||
| 			} |  | ||||||
| 			break; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if(changeState_) { |  | ||||||
| 		switch (oldState_) { // onExit |  | ||||||
| 			case state::initial: |  | ||||||
| 				break; |  | ||||||
|  |  | ||||||
| 			case state::waitButtonPressed: |  | ||||||
| 				break; |  | ||||||
|  |  | ||||||
| 			case state::buttonPressed: |  | ||||||
| 				break; |  | ||||||
|  |  | ||||||
| 			case state::buttonShortPressed: |  | ||||||
| 				break; |  | ||||||
|  |  | ||||||
| 			case state::buttonLongPressed: |  | ||||||
| 				break; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		switch (currentState_) { |  | ||||||
| 			case state::initial: |  | ||||||
| 				break; |  | ||||||
|  |  | ||||||
| 			case state::waitButtonPressed: |  | ||||||
| 				break; |  | ||||||
|  |  | ||||||
| 			case state::buttonPressed: |  | ||||||
| 				break; |  | ||||||
|  |  | ||||||
| 			case state::buttonShortPressed: |  | ||||||
| 				ButtonEventsHandler::getInstance()->notifyButtonShortPressed(buttonIndex_); |  | ||||||
| 				break; |  | ||||||
|  |  | ||||||
| 			case state::buttonLongPressed: |  | ||||||
| 				ButtonEventsHandler::getInstance()->notifyButtonLongPressed(buttonIndex_); |  | ||||||
| 				break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return eventStatus; |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -18,27 +18,24 @@ public: | |||||||
| 	void genButtonReleased(); | 	void genButtonReleased(); | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	XFEventStatus processEvent(); | 	void notifyShortPress(); | ||||||
|  | 	void notifyLongPress(); | ||||||
|  | 	void genNullTransition(); | ||||||
|  |  | ||||||
| 	typedef enum { | 	typedef enum { | ||||||
| 		evButtonPressed, | 		evButtonPressed = 10, | ||||||
| 		evButtonReleased, | 		evButtonReleased, | ||||||
| 		evTimeout | 		evTimeout, | ||||||
|  | 		evReturn | ||||||
| 	} event; | 	} event; | ||||||
|  |  | ||||||
| 	typedef enum { |  | ||||||
| 		initial, |  | ||||||
| 		waitButtonPressed, |  | ||||||
| 		buttonPressed, |  | ||||||
| 		buttonShortPressed, |  | ||||||
| 		buttonLongPressed |  | ||||||
| 	} state; |  | ||||||
|  |  | ||||||
| 	state currentState_; |  | ||||||
| 	state oldState_; |  | ||||||
| 	bool changeState_; |  | ||||||
| 	const uint8_t buttonIndex_; | 	const uint8_t buttonIndex_; | ||||||
|  |  | ||||||
|  | 	XFState stWaitButtonPressed; | ||||||
|  | 	XFState stButtonPressed; | ||||||
|  | 	XFState stButtonShortPressed; | ||||||
|  | 	XFState stButtonLongPressed; | ||||||
|  |  | ||||||
| private: | private: | ||||||
| 	static uint8_t getNbInstance(); | 	static uint8_t getNbInstance(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,8 +16,8 @@ ButtonsController::ButtonsController() | |||||||
| 	cbProvider = nullptr; | 	cbProvider = nullptr; | ||||||
| 	cbMethod = nullptr; | 	cbMethod = nullptr; | ||||||
|  |  | ||||||
| 	stInitial.setNextState(&stCheckButtons); | 	stInitial.addInitialTransition(&stCheckButtons); | ||||||
| 	stCheckButtons.setNextState(event::evButtonIrq, &stDebounce); | 	stCheckButtons.addTransition(event::evButtonIrq, &stDebounce); | ||||||
| 	stCheckButtons.registerOnEntry((XFState::callback)&ButtonsController::fctCheckButtons); | 	stCheckButtons.registerOnEntry((XFState::callback)&ButtonsController::fctCheckButtons); | ||||||
|  |  | ||||||
| 	stDebounce.setTimeout(20, &stCheckButtons); | 	stDebounce.setTimeout(20, &stCheckButtons); | ||||||
| @@ -45,7 +45,7 @@ bool ButtonsController::registerCallback( | |||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| void ButtonsController::fctCheckButtons(const XFEvent* ev) { | void ButtonsController::fctCheckButtons() { | ||||||
| 	if(cbProvider != nullptr) { | 	if(cbProvider != nullptr) { | ||||||
|  |  | ||||||
| 		newState[0] = HAL_GPIO_ReadPin(BUTTON0_GPIO_Port, BUTTON0_Pin); | 		newState[0] = HAL_GPIO_ReadPin(BUTTON0_GPIO_Port, BUTTON0_Pin); | ||||||
|   | |||||||
| @@ -30,8 +30,7 @@ protected: | |||||||
| 	bool newState[4]; | 	bool newState[4]; | ||||||
| 	bool buttonState[4]; | 	bool buttonState[4]; | ||||||
|  |  | ||||||
| 	void fctCheckButtons(const XFEvent* ev); | 	void fctCheckButtons(); | ||||||
| 	void fctScheduleTimeout(const XFEvent* ev); |  | ||||||
|  |  | ||||||
| 	XFState stCheckButtons; | 	XFState stCheckButtons; | ||||||
| 	XFState stDebounce; | 	XFState stDebounce; | ||||||
|   | |||||||
| @@ -14,9 +14,15 @@ | |||||||
| XFState::XFState(XFBehavior* behavior) | XFState::XFState(XFBehavior* behavior) | ||||||
| 	: pBehavior(behavior) { | 	: pBehavior(behavior) { | ||||||
| 	assert(behavior != nullptr); | 	assert(behavior != nullptr); | ||||||
|  | 	cbState_ = nullptr; | ||||||
|  | 	cbEntry_ = nullptr; | ||||||
|  | 	cbExit_ = nullptr; | ||||||
|  | 	cbEvState_ = nullptr; | ||||||
|  | 	cbEvEntry_ = nullptr; | ||||||
|  | 	cbEvExit_ = nullptr; | ||||||
| } | } | ||||||
|  |  | ||||||
| void XFState::setNextState(const int evid, const int time, XFEvent::XFEventType type, XFState* state) { | void XFState::addTransition(XFEvent::XFEventType type, const int evid, const int time, XFState* state) { | ||||||
| 	assert(state != nullptr); | 	assert(state != nullptr); | ||||||
| 	transition t; | 	transition t; | ||||||
| 	t.evid = evid; | 	t.evid = evid; | ||||||
| @@ -28,11 +34,14 @@ void XFState::setNextState(const int evid, const int time, XFEvent::XFEventType | |||||||
|  |  | ||||||
| XFEventStatus XFState::onState(const XFEvent* ev) { | XFEventStatus XFState::onState(const XFEvent* ev) { | ||||||
|  |  | ||||||
| 	assert(ev != nullptr); | 	if(cbState_ != nullptr) { | ||||||
| 	assert(pBehavior != nullptr); | 		(pBehavior->*cbState_)(); | ||||||
|  | 	} | ||||||
|  | 	if(cbEvState_ != nullptr) { | ||||||
|  | 		(pBehavior->*cbEvState_)(ev); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	for(transition t : transitions_) { | 	for(transition t : transitions_) { | ||||||
| 		assert(t.nextState != nullptr); |  | ||||||
|  |  | ||||||
| 		if(t.evType == XFEvent::XFEventType::Initial){ | 		if(t.evType == XFEvent::XFEventType::Initial){ | ||||||
| 			pBehavior->curentXFState_ = t.nextState; | 			pBehavior->curentXFState_ = t.nextState; | ||||||
| @@ -59,11 +68,14 @@ XFEventStatus XFState::onState(const XFEvent* ev) { | |||||||
|  |  | ||||||
| void XFState::onEntry(const XFEvent* ev) { | void XFState::onEntry(const XFEvent* ev) { | ||||||
| 	if(cbEntry_ != nullptr) { | 	if(cbEntry_ != nullptr) { | ||||||
| 		(pBehavior->*cbEntry_)(ev); | 		(pBehavior->*cbEntry_)(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if(cbEvEntry_ != nullptr) { | ||||||
|  | 		(pBehavior->*cbEvEntry_)(ev); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for(transition t : transitions_) { | 	for(transition t : transitions_) { | ||||||
| 		assert(t.nextState != nullptr); |  | ||||||
|  |  | ||||||
| 		if(t.evType == XFEvent::XFEventType::Timeout) { | 		if(t.evType == XFEvent::XFEventType::Timeout) { | ||||||
| 			pBehavior->scheduleTimeout(XFEvent::Timeout, t.time); | 			pBehavior->scheduleTimeout(XFEvent::Timeout, t.time); | ||||||
| @@ -73,6 +85,19 @@ void XFState::onEntry(const XFEvent* ev) { | |||||||
| } | } | ||||||
| void XFState::onExit(const XFEvent* ev) { | void XFState::onExit(const XFEvent* ev) { | ||||||
| 	if(cbExit_ != nullptr) { | 	if(cbExit_ != nullptr) { | ||||||
| 		(pBehavior->*cbExit_)(ev); | 		(pBehavior->*cbExit_)(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if(cbEvExit_ != nullptr) { | ||||||
|  | 		(pBehavior->*cbEvExit_)(ev); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for(transition t: transitions_) { | ||||||
|  |  | ||||||
|  | 		if(t.evType == XFEvent::XFEventType::Timeout) { | ||||||
|  | 			if(ev->getEventType() != XFEvent::XFEventType::Timeout) { | ||||||
|  | 				pBehavior->unscheduleTimeout(XFEvent::Timeout); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -24,17 +24,20 @@ public: | |||||||
| 	XFState(XFBehavior* behavior); | 	XFState(XFBehavior* behavior); | ||||||
| 	~XFState() = default; | 	~XFState() = default; | ||||||
|  |  | ||||||
| 	inline void setNextState(XFState* state) { setNextState(XFEvent::Initial, XFEvent::XFEventType::Initial, state); }; | 	inline void addTransition(const int evid, XFState* state) { addTransition(XFEvent::XFEventType::Event, evid, 0, state); }; | ||||||
| 	inline void setNextState(const int evid, XFState* state) { setNextState(evid, XFEvent::XFEventType::Event, state); }; |  | ||||||
|  |  | ||||||
| 	inline void setTimeout(int time, XFState* nextState) { setNextState(XFEvent::Timeout, time, XFEvent::XFEventType::Timeout, nextState); }; | 	inline void setTimeout(int time, XFState* nextState) { addTransition(XFEvent::XFEventType::Timeout, XFEvent::Timeout, time, nextState); }; | ||||||
| 	typedef void (XFBehavior::*callback)(const XFEvent* ev); | 	typedef void (XFBehavior::*callback)(); | ||||||
|  | 	typedef void (XFBehavior::*callbackEv)(const XFEvent* ev); | ||||||
|  | 	//inline void registerOnState(callback cbState) { cbState_ = cbState; }; | ||||||
| 	inline void registerOnEntry(callback cbEntry) { cbEntry_ = cbEntry; }; | 	inline void registerOnEntry(callback cbEntry) { cbEntry_ = cbEntry; }; | ||||||
| 	inline void registerOnExit(callback cbExit) { cbExit_ = cbExit; }; | 	inline void registerOnExit(callback cbExit) { cbExit_ = cbExit; }; | ||||||
|  | 	//inline void registerOnState(callbackEv cbState) { cbEvState_ = cbState; }; | ||||||
|  | 	inline void registerOnEntry(callbackEv cbEntry) { cbEvEntry_ = cbEntry; }; | ||||||
|  | 	inline void registerOnExit(callbackEv cbExit) { cbEvExit_ = cbExit; }; | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
| 	inline void setNextState(const int evid, XFEvent::XFEventType type, XFState* state) {setNextState(evid, 0, type, state); }; | 	void addTransition(XFEvent::XFEventType type, const int evid, const int time, XFState* state); | ||||||
| 	void setNextState(const int evid, const int time, XFEvent::XFEventType type, XFState* state); |  | ||||||
|  |  | ||||||
| 	XFEventStatus onState(const XFEvent* ev); | 	XFEventStatus onState(const XFEvent* ev); | ||||||
| 	void onEntry(const XFEvent* ev); | 	void onEntry(const XFEvent* ev); | ||||||
| @@ -50,9 +53,20 @@ protected: | |||||||
| 	} transition; | 	} transition; | ||||||
| 	std::list<transition> transitions_; | 	std::list<transition> transitions_; | ||||||
|  |  | ||||||
|  | 	callback cbState_; | ||||||
| 	callback cbEntry_; | 	callback cbEntry_; | ||||||
| 	callback cbExit_; | 	callback cbExit_; | ||||||
|  | 	callbackEv cbEvState_; | ||||||
|  | 	callbackEv cbEvEntry_; | ||||||
|  | 	callbackEv cbEvExit_; | ||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class XFInitialState : public XFState { | ||||||
|  | public: | ||||||
|  | 	inline XFInitialState(XFBehavior* behavior) : XFState(behavior) {}; | ||||||
|  | 	~XFInitialState() = default; | ||||||
|  | 	inline void addInitialTransition(XFState* state) { addTransition(XFEvent::XFEventType::Initial, XFEvent::Initial, 0, state); }; | ||||||
|  | }; | ||||||
| #endif /* XFSTATE_H_ */ | #endif /* XFSTATE_H_ */ | ||||||
|   | |||||||
| @@ -100,7 +100,7 @@ protected: | |||||||
|     const XFEvent * pCurrentEvent_;					///< Reference to actually processed event. |     const XFEvent * pCurrentEvent_;					///< Reference to actually processed event. | ||||||
|  |  | ||||||
| protected: | protected: | ||||||
|     XFState stInitial; |     XFInitialState stInitial; | ||||||
| 	XFState* curentXFState_ = &stInitial; | 	XFState* curentXFState_ = &stInitial; | ||||||
| 	XFState* oldXFState_ = &stInitial; | 	XFState* oldXFState_ = &stInitial; | ||||||
| 	bool changeXFState = false; | 	bool changeXFState = false; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user