Initial commit
This commit is contained in:
		
							
								
								
									
										92
									
								
								test-bench/test4/src/app/statemachine04a.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								test-bench/test4/src/app/statemachine04a.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| #include <cassert> | ||||
| #include "trace/trace.h" | ||||
| #include "events/evrestart.h" | ||||
| #include "statemachine04a.h" | ||||
|  | ||||
| StateMachine04a::StateMachine04a() | ||||
|  : pNeighbour_(nullptr) | ||||
| { | ||||
| 	currentState_ = STATE_INITIAL; | ||||
| } | ||||
|  | ||||
| StateMachine04a::~StateMachine04a() | ||||
| { | ||||
|  | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Sets the association to the neighbour state machine. | ||||
|  * Call this method prior the start the state machine. | ||||
|  */ | ||||
| void StateMachine04a::setNeighbour(XFBehavior * pNeighbour) | ||||
| { | ||||
| 	pNeighbour_ = pNeighbour; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Returns reference to neighbour state machine. | ||||
|  */ | ||||
| XFBehavior * StateMachine04a::getNeighbour() const | ||||
| { | ||||
| 	assert(pNeighbour_); | ||||
| 	return pNeighbour_; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Implements state machine behavior. | ||||
|  */ | ||||
| XFEventStatus StateMachine04a::processEvent() | ||||
| { | ||||
| 	eEventStatus eventStatus = XFEventStatus::Unknown; | ||||
|  | ||||
| 	switch (currentState_) | ||||
| 	{ | ||||
| 	case STATE_INITIAL: | ||||
| 		{ | ||||
| 			if (getCurrentEvent()->getEventType() == XFEvent::Initial) | ||||
| 			{ | ||||
| 				GEN(XFDefaultTransition()); | ||||
|  | ||||
| 				currentState_ = STATE_WAIT; | ||||
| 				eventStatus = XFEventStatus::Consumed; | ||||
| 			} | ||||
| 		} | ||||
| 		break; | ||||
| 	case STATE_WAIT: | ||||
| 		{ | ||||
| 			if (getCurrentEvent()->getEventType() == XFEvent::DefaultTransition) | ||||
| 			{ | ||||
| 				{ | ||||
| 					Trace::out("SM04a: Wait"); | ||||
| 				} | ||||
|  | ||||
|                 scheduleTimeout(Timeout_WAIT_id, 4500); | ||||
|  | ||||
| 				currentState_ = STATE_SEND_RESTART; | ||||
| 				eventStatus = XFEventStatus::Consumed; | ||||
| 			} | ||||
| 		} | ||||
| 		break; | ||||
| 	case STATE_SEND_RESTART: | ||||
| 		{ | ||||
| 			if (getCurrentEvent()->getEventType() == XFEvent::Timeout && | ||||
| 				getCurrentTimeout()->getId() == Timeout_WAIT_id) | ||||
| 			{ | ||||
| 				{ | ||||
| 					Trace::out("SM04a: Send restart to SM04b"); | ||||
| 					getNeighbour()->GEN(evRestart()); | ||||
| 				} | ||||
|  | ||||
| 				GEN(XFDefaultTransition()); | ||||
|  | ||||
| 				currentState_ = STATE_WAIT; | ||||
| 				eventStatus = XFEventStatus::Consumed; | ||||
| 			} | ||||
| 		} | ||||
| 		break; | ||||
| 	default: | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
| 	return eventStatus; | ||||
| } | ||||
							
								
								
									
										54
									
								
								test-bench/test4/src/app/statemachine04a.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								test-bench/test4/src/app/statemachine04a.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| #ifndef STATEMACHINE04A_H | ||||
| #define STATEMACHINE04A_H | ||||
|  | ||||
| #include <string> | ||||
| #include "xf/behavior.h" | ||||
|  | ||||
| /** | ||||
|  * \ingroup test04 | ||||
|  * | ||||
|  * Implements a state machine sending its neighbour state machine | ||||
|  * an \a evRestart event every four seconds. | ||||
|  * | ||||
|  * Following you will find the state machine implemented by StateMachine04a: | ||||
|  * \image html state-machine04a.png "State Machine implemented by StateMachine04" | ||||
|  */ | ||||
| class StateMachine04a : public XFBehavior | ||||
| { | ||||
| public: | ||||
| 	StateMachine04a();					///< Constructor | ||||
|     ~StateMachine04a() override; | ||||
|  | ||||
|     void setNeighbour(XFBehavior * pNeighbour); | ||||
|     XFBehavior * getNeighbour() const; | ||||
|  | ||||
| protected: | ||||
|     XFEventStatus processEvent() override; | ||||
|  | ||||
| protected: | ||||
| 	/** | ||||
| 	 * Timeout identifier(s) for this state machine | ||||
| 	 */ | ||||
| 	typedef enum | ||||
| 	{ | ||||
| 		Timeout_WAIT_id = 1			///< Timeout id for WAIT | ||||
| 	} eTimeoutId; | ||||
|  | ||||
| 	/** | ||||
| 	 * Enumeration used to have a unique identifier for every | ||||
| 	 * state in the state machine. | ||||
| 	 */ | ||||
| 	typedef enum | ||||
| 	{ | ||||
| 		STATE_UNKOWN = 0,			///< Unknown state | ||||
| 		STATE_INITIAL = 1,			///< Initial state | ||||
| 		STATE_WAIT = 2,				///< Wait state | ||||
| 		STATE_SEND_RESTART = 3		///< State sending an restart event | ||||
| 	} eMainState; | ||||
|  | ||||
|     eMainState currentState_;		///< Attribute indicating currently active state | ||||
|  | ||||
|     XFBehavior * pNeighbour_;		///< Association to the neigbour state machine | ||||
| }; | ||||
|  | ||||
| #endif // STATEMACHINE04A_H | ||||
							
								
								
									
										85
									
								
								test-bench/test4/src/app/statemachine04b.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								test-bench/test4/src/app/statemachine04b.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| #include <stdio.h> | ||||
| #include "trace/trace.h" | ||||
| #include "events/evrestart.h" | ||||
| #include "statemachine04b.h" | ||||
|  | ||||
|  | ||||
| StateMachine04b::StateMachine04b() | ||||
| { | ||||
| 	currentState_ = STATE_INITIAL; | ||||
| } | ||||
|  | ||||
| StateMachine04b::~StateMachine04b() | ||||
| { | ||||
|  | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Implements state machine behavior. | ||||
|  */ | ||||
| XFEventStatus StateMachine04b::processEvent() | ||||
| { | ||||
| 	eEventStatus eventStatus = XFEventStatus::Unknown; | ||||
|  | ||||
| 	// Every time receiving an evRestart event, reset state machine | ||||
| 	if (isRestartEvent()) | ||||
| 	{ | ||||
| 		// Remove any previous WAIT timeouts | ||||
|         unscheduleTimeout(Timeout_WAIT_id); | ||||
|  | ||||
| 		currentState_ = STATE_INITIAL; | ||||
| 	} | ||||
|  | ||||
| 	switch (currentState_) | ||||
| 	{ | ||||
| 	case STATE_INITIAL: | ||||
| 		{ | ||||
| 			if (isRestartEvent() || | ||||
| 				getCurrentEvent()->getEventType() == XFEvent::Initial) | ||||
| 			{ | ||||
| 				{ | ||||
| 					timeout_ = 0; | ||||
| 				} | ||||
|  | ||||
| 				GEN(XFDefaultTransition()); | ||||
|  | ||||
| 				currentState_ = STATE_WAIT; | ||||
| 				eventStatus = XFEventStatus::Consumed; | ||||
| 			} | ||||
| 		} | ||||
| 		break; | ||||
| 	case STATE_WAIT: | ||||
| 		{ | ||||
| 			if (getCurrentEvent()->getEventType() == XFEvent::DefaultTransition || | ||||
| 				isTimeoutEvent(Timeout_WAIT_id)) | ||||
| 			{ | ||||
| 				if (isTimeoutEvent(Timeout_WAIT_id)) | ||||
| 				{ | ||||
| 					Trace::out("SM04b: Timeout %d", ++timeout_); | ||||
| 				} | ||||
|  | ||||
|                 scheduleTimeout(Timeout_WAIT_id, 1000); | ||||
|  | ||||
| 				currentState_ = STATE_WAIT; | ||||
| 				eventStatus = XFEventStatus::Consumed; | ||||
| 			} | ||||
| 		} | ||||
| 		break; | ||||
| 	default: | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
| 	return eventStatus; | ||||
| } | ||||
|  | ||||
| bool StateMachine04b::isTimeoutEvent(int timeoutId) | ||||
| { | ||||
| 	return (getCurrentEvent()->getEventType() == XFEvent::Timeout && | ||||
| 			getCurrentTimeout()->getId() == timeoutId); | ||||
| } | ||||
|  | ||||
| bool StateMachine04b::isRestartEvent() const | ||||
| { | ||||
| 	return (getCurrentEvent()->getEventType() == XFEvent::Event && | ||||
| 			getCurrentEvent()->getId() == EventId::evRestart); | ||||
| } | ||||
							
								
								
									
										53
									
								
								test-bench/test4/src/app/statemachine04b.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								test-bench/test4/src/app/statemachine04b.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| #ifndef STATEMACHINE04B_H | ||||
| #define STATEMACHINE04B_H | ||||
|  | ||||
| #include <string> | ||||
| #include "xf/behavior.h" | ||||
|  | ||||
| /** | ||||
|  * \ingroup test04 | ||||
|  * | ||||
|  * Implements a state machine timeouting every second. It shows how many times | ||||
|  * the timeout has expired (using a #timeout_ attribute). The state machine can | ||||
|  * be reset by sending an \a evRestart event. | ||||
|  * | ||||
|  * Following you will find the state machine implemented by StateMachine04b: | ||||
|  * \image html state-machine04b.png "State Machine implemented by StateMachine04" | ||||
|  */ | ||||
| class StateMachine04b : public XFBehavior | ||||
| { | ||||
| public: | ||||
| 	StateMachine04b(); | ||||
|     ~StateMachine04b() override; | ||||
|  | ||||
| protected: | ||||
|     XFEventStatus processEvent() override; | ||||
|  | ||||
| 	bool isTimeoutEvent(int timeoutId);		///< Returns true in case state machine is currently processing a timeout. | ||||
| 	bool isRestartEvent() const;			///< Returns true in case state machine is currently processing an \a evRestart event. | ||||
|  | ||||
| protected: | ||||
| 	/** | ||||
| 	 * Timeout identifier(s) for this state machine | ||||
| 	 */ | ||||
| 	typedef enum | ||||
| 	{ | ||||
| 		Timeout_WAIT_id = 1			///< Timeout id for WAIT | ||||
| 	} eTimeoutId; | ||||
|  | ||||
| 	/** | ||||
| 	 * Enumeration used to have a unique identifier for every | ||||
| 	 * state in the state machine. | ||||
| 	 */ | ||||
| 	typedef enum | ||||
| 	{ | ||||
| 		STATE_UNKOWN = 0,			///< Unkown state | ||||
| 		STATE_INITIAL = 1,			///< Initial state | ||||
| 		STATE_WAIT = 2				///< Wait for timeout state | ||||
| 	} eMainState; | ||||
|  | ||||
|     eMainState currentState_;		///< Attribute indicating currently active state | ||||
|     int timeout_;					///< Timeout attribute counting rised timeouts in state machine | ||||
| }; | ||||
|  | ||||
| #endif // STATEMACHINE04B_H | ||||
							
								
								
									
										39
									
								
								test-bench/test4/src/app/testfactory04.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								test-bench/test4/src/app/testfactory04.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| #include "xf/xf.h" | ||||
| #include "trace/trace.h" | ||||
| #include "testfactory04.h" | ||||
|  | ||||
| void Factory_initialize() | ||||
| { | ||||
|     TestFactory04::initialize(); | ||||
| } | ||||
|  | ||||
| void Factory_build() | ||||
| { | ||||
|     TestFactory04::build(); | ||||
| } | ||||
|  | ||||
| StateMachine04a TestFactory04::task01_; | ||||
| StateMachine04b TestFactory04::task02_; | ||||
|  | ||||
| TestFactory04::TestFactory04() | ||||
| { | ||||
| } | ||||
|  | ||||
| // static | ||||
| void TestFactory04::initialize() | ||||
| { | ||||
| } | ||||
|  | ||||
| // static | ||||
| void TestFactory04::build() | ||||
| { | ||||
| 	Trace::out("Starting test4..."); | ||||
| 	Trace::out("---------------------"); | ||||
|  | ||||
| 	// Set up association(s) | ||||
| 	task01_.setNeighbour(&task02_); | ||||
|  | ||||
| 	// Start state machine(s) | ||||
| 	task01_.startBehavior(); | ||||
| 	task02_.startBehavior(); | ||||
| } | ||||
							
								
								
									
										47
									
								
								test-bench/test4/src/app/testfactory04.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								test-bench/test4/src/app/testfactory04.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| #ifndef TESTFACTORY04_H | ||||
| #define TESTFACTORY04_H | ||||
|  | ||||
| // | ||||
| // What is seen only by the C++ compiler | ||||
| // | ||||
| #ifdef __cplusplus | ||||
|  | ||||
| #include "statemachine04a.h" | ||||
| #include "statemachine04b.h" | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * \ingroup test04 | ||||
|  * | ||||
|  * Factory creating all objects used in test4. | ||||
|  * | ||||
|  */ | ||||
| class TestFactory04 | ||||
| { | ||||
| public: | ||||
|     TestFactory04();                    ///< Constructor | ||||
|  | ||||
|     static void initialize();           ///< Initializes the factory | ||||
|     static void build();                ///< Creates components and initializes relations | ||||
| 	 | ||||
| protected: | ||||
| 	static StateMachine04a task01_;		///< Instance of StateMachine04a | ||||
| 	static StateMachine04b task02_;		///< Instance of StateMachine04b | ||||
| }; | ||||
|  | ||||
| #endif // __cplusplus | ||||
|  | ||||
| // | ||||
| // What is seen by the C and C++ compiler | ||||
| // | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif // __cplusplus | ||||
|  | ||||
| void Factory_initialize(); | ||||
| void Factory_build(); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif // __cplusplus | ||||
| #endif // TESTFACTORY03_H | ||||
		Reference in New Issue
	
	Block a user