Initial commit
This commit is contained in:
		
							
								
								
									
										102
									
								
								test-bench/test2/src/app/statemachine02.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								test-bench/test2/src/app/statemachine02.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,102 @@ | ||||
| #include <stdio.h> | ||||
| #include "trace/trace.h" | ||||
| #include "statemachine02.h" | ||||
|  | ||||
| uint32_t StateMachine02::nextId = 1;        // Static attribute initialization. | ||||
|  | ||||
| StateMachine02::StateMachine02() : | ||||
|     id(nextId++), | ||||
|     counter(0) | ||||
| { | ||||
|     _currentState = STATE_INITIAL; | ||||
|  | ||||
|     Trace::out("Called constructor of StateMachine02 object '%d' (obj%02d)", id, id); | ||||
| } | ||||
|  | ||||
| StateMachine02::~StateMachine02() | ||||
| { | ||||
|     Trace::out("obj%02d: Called destructor", id); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Implements state machine behavior. | ||||
|  */ | ||||
| XFEventStatus StateMachine02::processEvent() | ||||
| { | ||||
|     eEventStatus eventStatus = XFEventStatus::Unknown; | ||||
|  | ||||
|     switch (_currentState) | ||||
|     { | ||||
|     case STATE_INITIAL: | ||||
|         { | ||||
|             if (getCurrentEvent()->getEventType() == XFEvent::Initial) | ||||
|             { | ||||
|                 { | ||||
|                     counter = 5; | ||||
|                 } | ||||
|  | ||||
|                 GEN(XFDefaultTransition()); | ||||
|  | ||||
|                 _currentState = STATE_PRINT_COUNT; | ||||
|  | ||||
|                 eventStatus = XFEventStatus::Consumed; | ||||
|             } | ||||
|         } | ||||
|         break; | ||||
|     case STATE_PRINT_COUNT: | ||||
|         { | ||||
|             if (getCurrentEvent()->getEventType() == XFEvent::DefaultTransition) | ||||
|             { | ||||
|                 { | ||||
|                     Trace::out("obj%02d: counter %d", id, counter); | ||||
|                 } | ||||
|  | ||||
|                 scheduleTimeout(Timeout_PRINT_COUNT_id, 1000); | ||||
|  | ||||
|                 _currentState = STATE_CONDITION_01; | ||||
|  | ||||
|                 eventStatus = XFEventStatus::Consumed; | ||||
|             } | ||||
|         } | ||||
|         break; | ||||
|     case STATE_CONDITION_01: | ||||
|         { | ||||
|             if (getCurrentEvent()->getEventType() == XFEvent::Timeout && | ||||
|                 getCurrentTimeout()->getId() == Timeout_PRINT_COUNT_id) | ||||
|             { | ||||
|                 { | ||||
|                     counter--; | ||||
|                 } | ||||
|  | ||||
|                 if (counter) | ||||
|                 { | ||||
|                     _currentState = STATE_PRINT_COUNT; | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     _currentState = STATE_TERMINATION_01; | ||||
|                 } | ||||
|  | ||||
|                 GEN(XFDefaultTransition()); | ||||
|  | ||||
|                 eventStatus = XFEventStatus::Consumed; | ||||
|             } | ||||
|         } | ||||
|         break; | ||||
|     case STATE_TERMINATION_01: | ||||
|         { | ||||
|             if (getCurrentEvent()->getEventType() == XFEvent::DefaultTransition) | ||||
|             { | ||||
|  | ||||
|                 Trace::out("obj%02d: Terminating State Machine", id); | ||||
|  | ||||
|                 eventStatus = XFEventStatus::Terminate; | ||||
|             } | ||||
|         } | ||||
|         break; | ||||
|     default: | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     return eventStatus; | ||||
| } | ||||
							
								
								
									
										55
									
								
								test-bench/test2/src/app/statemachine02.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								test-bench/test2/src/app/statemachine02.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| #ifndef STATEMACHINE02_H | ||||
| #define STATEMACHINE02_H | ||||
|  | ||||
| #include <string> | ||||
| #include "xf/behavior.h" | ||||
|  | ||||
| /** | ||||
|  * \ingroup test02 | ||||
|  * | ||||
|  * Task implementing a state machine doing a count down | ||||
|  * from 5 to 1 and terminating. | ||||
|  * | ||||
|  * Following you will find the state machine implemented by StateMachine02: | ||||
|  * \image html state-machine02.png "State Machine implemented by StateMachine02" | ||||
|  */ | ||||
| class StateMachine02 : public XFBehavior | ||||
| { | ||||
| public: | ||||
|     StateMachine02(); | ||||
|     ~StateMachine02() override; | ||||
|  | ||||
| protected: | ||||
|     XFEventStatus processEvent() override; | ||||
|  | ||||
| protected: | ||||
|     /** | ||||
|      * Timeout identifier(s) for this state machine | ||||
|      */ | ||||
|     typedef enum | ||||
|     { | ||||
|         Timeout_PRINT_COUNT_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_PRINT_COUNT = 2,		///< Print count state. | ||||
|         STATE_CONDITION_01 = 3,		///< Condition after print count state. | ||||
|         STATE_TERMINATION_01 = 4	///< Termination state. | ||||
|     } eMainState; | ||||
|  | ||||
|     eMainState _currentState;		///< Attribute indicating currently active state. | ||||
|  | ||||
|     static uint32_t nextId;         ///< Static attribute providing identifier for next object. | ||||
|     const uint32_t id;              ///< Object identifier. | ||||
|  | ||||
|     int counter;					///< Count down attribute used in state machine. | ||||
| }; | ||||
|  | ||||
| #endif // STATEMACHINE02_H | ||||
							
								
								
									
										62
									
								
								test-bench/test2/src/app/testfactory02.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								test-bench/test2/src/app/testfactory02.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| #include <cassert> | ||||
| #include "xf/xf.h" | ||||
| #include "trace/trace.h" | ||||
| #include "testfactory02.h" | ||||
|  | ||||
| void Factory_initialize() | ||||
| { | ||||
|     TestFactory02::initialize(); | ||||
| } | ||||
|  | ||||
| void Factory_build() | ||||
| { | ||||
|     TestFactory02::build(); | ||||
| } | ||||
|  | ||||
| TestFactory02::TestFactory02() | ||||
| { | ||||
| } | ||||
|  | ||||
| // static | ||||
| void TestFactory02::initialize() | ||||
| { | ||||
|     // Object is statically created. Object cannot be deleted by the XF | ||||
|     getStaticTask().setDeleteOnTerminate(false); | ||||
|  | ||||
|     // Object is dynamically created. Object must be deleted by the XF | ||||
|     // when after event processing the behavior wants to be deleted | ||||
|     getDynamicTask().setDeleteOnTerminate(true); | ||||
| } | ||||
|  | ||||
| // static | ||||
| void TestFactory02::build() | ||||
| { | ||||
|     Trace::out("Starting test2..."); | ||||
|     Trace::out("---------------------"); | ||||
|  | ||||
|     // Start state machines | ||||
|     getStaticTask().startBehavior(); | ||||
|     getDynamicTask().startBehavior(); | ||||
| } | ||||
|  | ||||
| // static | ||||
| StateMachine02 &TestFactory02::getStaticTask() | ||||
| { | ||||
|     static StateMachine02 staticTask; | ||||
|  | ||||
|     return staticTask; | ||||
| } | ||||
|  | ||||
| // static | ||||
| StateMachine02 &TestFactory02::getDynamicTask() | ||||
| { | ||||
|     static StateMachine02 * dynamicTask = nullptr; | ||||
|  | ||||
|     if (!dynamicTask) | ||||
|     { | ||||
|         dynamicTask = new StateMachine02; | ||||
|     } | ||||
|  | ||||
|     assert(dynamicTask);        // Check heap | ||||
|     return *dynamicTask; | ||||
| } | ||||
							
								
								
									
										45
									
								
								test-bench/test2/src/app/testfactory02.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								test-bench/test2/src/app/testfactory02.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| #ifndef TESTFACTORY02_H | ||||
| #define TESTFACTORY02_H | ||||
|  | ||||
| // | ||||
| // What is seen only by the C++ compiler | ||||
| // | ||||
| #ifdef __cplusplus | ||||
|  | ||||
| #include "statemachine02.h" | ||||
|  | ||||
| /** | ||||
|  * \ingroup test02 | ||||
|  * | ||||
|  * Factory creating all objects used in test2. | ||||
|  * | ||||
|  */ | ||||
| class TestFactory02 | ||||
| { | ||||
| public: | ||||
|     TestFactory02();                            ///< Constructor. | ||||
|  | ||||
|     static void initialize();                   ///< Initializes the factory. | ||||
|     static void build();                        ///< Creates components and initializes relations. | ||||
|  | ||||
| protected: | ||||
|     static StateMachine02 & getStaticTask();    ///< Returns reference to static instance of StateMachine02. | ||||
|     static StateMachine02 & getDynamicTask();   ///< Returns reference to dynamically allocated instance of StateMachine02. | ||||
| }; | ||||
|  | ||||
| #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 // TESTFACTORY02_H | ||||
							
								
								
									
										14
									
								
								test-bench/test2/src/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								test-bench/test2/src/main.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| #include "xf/xf.h" | ||||
| #include "app/testfactory02.h" | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|     XF::initialize(20, argc, argv); | ||||
|  | ||||
|     TestFactory02 factory; | ||||
|  | ||||
|     factory.initialize(); | ||||
|     factory.build(); | ||||
|  | ||||
|     return XF::exec(); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user