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