From 42d61787bddcad64c6b0c357cad68b9b8fd18b46 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sat, 24 Jan 2015 16:21:43 +0000 Subject: [PATCH] - chained FsmMode and FsmProcess git-svn-id: http://moon:8086/svn/software/trunk/projects/FsmEval@137 b431acfa-c32f-4a4a-93f1-934dc6c82436 --- FsmMode.hpp | 176 ++++++++++++++++++++++++++++ FsmProcess.hpp | 218 +++++++++++++++++++++++++++++++++++ main.cpp | 204 ++------------------------------ nbproject/configurations.xml | 10 ++ 4 files changed, 413 insertions(+), 195 deletions(-) create mode 100644 FsmMode.hpp create mode 100644 FsmProcess.hpp diff --git a/FsmMode.hpp b/FsmMode.hpp new file mode 100644 index 0000000..152b7e4 --- /dev/null +++ b/FsmMode.hpp @@ -0,0 +1,176 @@ +/* + * File: FsmMode.hpp + * Author: jens + * + * Created on 24. Januar 2015, 15:54 + */ + +#ifndef FSMMODE_HPP +#define FSMMODE_HPP + +#include "AStateMachine.hpp" +#include "FsmProcess.hpp" + +class ModeContext +{ +public: + ModeContext(FsmProcess *init, FsmProcess *mode0, FsmProcess *mode1) + : fsmInit(init) + , fsmMode0(mode0) + , fsmMode1(mode1) + { + + } + + ~ModeContext() {} + + FsmProcess *fsmInit; + FsmProcess *fsmMode0; + FsmProcess *fsmMode1; + +}; + +class IFsmMode +{ +public: + + enum StateId + { + INIT=0, + MODE0, + MODE1, + NUM_STATES + }; + + IFsmMode() + { + + } + + virtual ~IFsmMode() + { + + } + + virtual void process(int x) + { + printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); + } + +}; + +class FsmMode : public AStateMachine +{ +public: + + FsmMode(ModeContext &ctx) + : AStateMachine() + , init(IFsmMode::INIT, ctx) + , mode0(IFsmMode::MODE0, ctx) + , mode1(IFsmMode::MODE1, ctx) + { + add(&init); + add(&mode0); + add(&mode1); + } + + ~FsmMode() + { + } + + void process(int x) + { + dynamic_cast(currState())->process(x); + } + +private: + class AStateBase : public AState, public IFsmMode + { + public: + AStateBase(IFsmMode::StateId id, ModeContext &context) + : AState(id) + , m_context(context) + { + + } + + protected: + ModeContext &m_context; + + }; + + class StateInit : public AStateBase + { + public: + StateInit(IFsmMode::StateId id, ModeContext &context) + : AStateBase(id, context) + { + + } + + ~StateInit() {} + + // Transition to Init is reset + void onTransition() + { + m_context.fsmMode0->reset(); + m_context.fsmMode1->reset(); + } + + void process(int x) + { + printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); + + if (x == 10) + setState(IFsmMode::MODE0); + } + + }; + + class StateMode0 : public AStateBase + { + public: + StateMode0(IFsmMode::StateId id, ModeContext &context) + : AStateBase(id, context) + { + + } + + ~StateMode0() {} + + void process(int x) + { + printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); + m_context.fsmMode0->process(x); + if (x == 20) + setState(IFsmMode::MODE1); + } + + }; + + class StateMode1 : public AStateBase + { + public: + StateMode1(IFsmMode::StateId id, ModeContext &context) + : AStateBase(id, context) + { + + } + + ~StateMode1() {} + + void process(int x) + { + printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); + m_context.fsmMode1->process(x); + } + + }; +private: + StateInit init; + StateMode0 mode0; + StateMode1 mode1; +}; + +#endif /* FSMMODE_HPP */ + diff --git a/FsmProcess.hpp b/FsmProcess.hpp new file mode 100644 index 0000000..2ddb950 --- /dev/null +++ b/FsmProcess.hpp @@ -0,0 +1,218 @@ +/* + * 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 */ + diff --git a/main.cpp b/main.cpp index ef928d8..7020a06 100644 --- a/main.cpp +++ b/main.cpp @@ -8,8 +8,8 @@ #include #include -#include "AState.hpp" -#include "AStateMachine.hpp" +#include "FsmProcess.hpp" +#include "FsmMode.hpp" using namespace std; @@ -17,206 +17,20 @@ using namespace std; * */ -class Context -{ -public: - Context() - : m_count(0) - { - - } - - ~Context() {} - - int m_count; - -}; -class IState -{ -public: - IState() - { - - } - - virtual ~IState() - { - - } - - virtual void process(int x) - { - printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); - } - -}; - -enum StateId -{ - INIT=0, - IDLE, - ACTIVE_0, - ACTIVE_1, - NUM_STATES -}; - -class StateMachine : public AStateMachine -{ -public: - - StateMachine() - : AStateMachine() - { - } - - ~StateMachine() - { - } - - void process(int x) - { - dynamic_cast(currState())->process(x); - } - -}; - -class StateInit : public AState, public IState -{ -public: - StateInit(StateId id, Context &context) - : AState(id) - , m_context(context) - { - - } - - ~StateInit() {} - - void process(int x) - { - printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); - setState(IDLE); - } - -private: - Context &m_context; -}; - -class StateIdle : public AState, public IState -{ -public: - StateIdle(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(ACTIVE_0); - } - } - -private: - Context &m_context; -}; - -class StateActive0 : public AState, public IState -{ -public: - StateActive0(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(ACTIVE_1); - } - } - -private: - Context &m_context; -}; - -class StateActive1 : public AState, public IState -{ -public: - StateActive1(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(ACTIVE_0); - } - } - -private: - Context &m_context; -}; - int main(int argc, char** argv) { Context ctx; - StateMachine fsm; - StateInit init(INIT, ctx); - StateIdle idle(IDLE, ctx); - StateActive0 active0(ACTIVE_0, ctx); - StateActive1 active1(ACTIVE_1, ctx); + FsmProcess fsmProcess0(ctx); + FsmProcess fsmProcess1(ctx); + ModeContext mctx(0, &fsmProcess0, &fsmProcess1); + FsmMode fsmMode(mctx); - fsm.add(&init); - fsm.add(&idle); - fsm.add(&active0); - fsm.add(&active1); - - fsm.reset(); + fsmMode.reset(); for (int i=0; i < 1000; i++) { - fsm.process(i); + fsmMode.process(i); } + fsmMode.reset(); return 0; } diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml index 5630851..09ef6b5 100644 --- a/nbproject/configurations.xml +++ b/nbproject/configurations.xml @@ -6,6 +6,8 @@ projectFiles="true"> AState.hpp AStateMachine.hpp + FsmMode.hpp + FsmProcess.hpp + + + + @@ -69,6 +75,10 @@ + + + +