/* * File: FsmProcess.hpp * Author: jens * * Created on 24. Januar 2015, 15:45 */ #ifndef FSMPROCESS_HPP #define FSMPROCESS_HPP #include "AStateMachine.hpp" class Context { public: Context() : m_count(0) { } ~Context() {} int m_count; }; class IFsmProcess { public: enum StateId { INIT=0, IDLE, ACTIVE_0, ACTIVE_1, NUM_STATES }; IFsmProcess() { } virtual ~IFsmProcess() { } virtual void process(int x) { printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); } }; class FsmProcess : public AStateMachine { public: FsmProcess(Context &context) : AStateMachine() , init(IFsmProcess::INIT, context) , idle(IFsmProcess::IDLE, context) , active0(IFsmProcess::ACTIVE_0, context) , active1(IFsmProcess::ACTIVE_1, context) { add(&init); add(&idle); add(&active0); add(&active1); } ~FsmProcess() { } void process(int x) { dynamic_cast(currState())->process(x); } private: class StateInit : public AState, public IFsmProcess { public: StateInit(IFsmProcess::StateId id, Context &context) : AState(id) , m_context(context) { } ~StateInit() {} // Transition to Init is reset void onTransition() { printf("%s\n", __PRETTY_FUNCTION__); } void process(int x) { printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); setState(IFsmProcess::IDLE); } private: Context &m_context; }; class StateIdle : public AState, public IFsmProcess { public: StateIdle(IFsmProcess::StateId id, Context &context) : AState(id) , m_context(context) { } ~StateIdle() {} void onTransition() { printf("%s\n", __PRETTY_FUNCTION__); m_context.m_count = 0; } void process(int x) { printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); if (x >= 10) { setState(IFsmProcess::ACTIVE_0); } } private: Context &m_context; }; class StateActive0 : public AState, public IFsmProcess { public: StateActive0(IFsmProcess::StateId id, Context &context) : AState(id) , m_context(context) { } ~StateActive0() {} void onTransition() { m_context.m_count = 0; printf("%s, Count = %d\n", __PRETTY_FUNCTION__, m_context.m_count); } void process(int x) { printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); m_context.m_count++; if (m_context.m_count == 10) { setState(IFsmProcess::ACTIVE_1); } } private: Context &m_context; }; class StateActive1 : public AState, public IFsmProcess { public: StateActive1(IFsmProcess::StateId id, Context &context) : AState(id) , m_context(context) { } ~StateActive1() {} void onTransition() { m_context.m_count = 5; printf("%s, Count = %d\n", __PRETTY_FUNCTION__, m_context.m_count); } void process(int x) { printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); m_context.m_count--; if (m_context.m_count == 0) { setState(IFsmProcess::ACTIVE_0); } } private: Context &m_context; }; StateInit init; StateIdle idle; StateActive0 active0; StateActive1 active1; }; #endif /* FSMPROCESS_HPP */