diff --git a/FsmMode.hpp b/FsmMode.hpp index 152b7e4..1030e35 100644 --- a/FsmMode.hpp +++ b/FsmMode.hpp @@ -14,9 +14,8 @@ class ModeContext { public: - ModeContext(FsmProcess *init, FsmProcess *mode0, FsmProcess *mode1) - : fsmInit(init) - , fsmMode0(mode0) + ModeContext(FsmProcess *mode0, FsmProcess *mode1) + : fsmMode0(mode0) , fsmMode1(mode1) { @@ -24,9 +23,8 @@ public: ~ModeContext() {} - FsmProcess *fsmInit; - FsmProcess *fsmMode0; - FsmProcess *fsmMode1; + FsmProcess *fsmMode0; + FsmProcess *fsmMode1; }; diff --git a/FsmProcess.hpp b/FsmProcess.hpp index 2ddb950..ac7e4da 100644 --- a/FsmProcess.hpp +++ b/FsmProcess.hpp @@ -10,6 +10,9 @@ #include "AStateMachine.hpp" +typedef struct {} Mode0; +typedef struct {} Mode1; + class Context { public: @@ -54,57 +57,25 @@ public: }; +template 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); - } + FsmProcess(Context &context); + ~FsmProcess(); + void process(int x); private: - class StateInit : public AState, public IFsmProcess { public: - StateInit(IFsmProcess::StateId id, Context &context) - : AState(id) - , m_context(context) - { - - } - - ~StateInit() {} + StateInit(IFsmProcess::StateId id, 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); - } + void onTransition(); + void process(int x); private: Context &m_context; @@ -113,29 +84,11 @@ private: class StateIdle : public AState, public IFsmProcess { public: - StateIdle(IFsmProcess::StateId id, Context &context) - : AState(id) - , m_context(context) - { + StateIdle(IFsmProcess::StateId id, Context &context); + ~StateIdle(); - } - - ~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); - } - } + void onTransition(); + void process(int x); private: Context &m_context; @@ -144,31 +97,11 @@ private: class StateActive0 : public AState, public IFsmProcess { public: - StateActive0(IFsmProcess::StateId id, Context &context) - : AState(id) - , m_context(context) - { + StateActive0(IFsmProcess::StateId id, Context &context); + ~StateActive0(); - } - - ~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); - } - } + void onTransition(); + void process(int x); private: Context &m_context; @@ -177,30 +110,11 @@ private: class StateActive1 : public AState, public IFsmProcess { public: - StateActive1(IFsmProcess::StateId id, Context &context) - : AState(id) - , m_context(context) - { + StateActive1(IFsmProcess::StateId id, Context &context); + ~StateActive1(); - } - - ~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); - } - } + void onTransition(); + void process(int x); private: Context &m_context; @@ -212,6 +126,7 @@ private: StateActive1 active1; }; +#include "FsmProcess.tcc" #endif /* FSMPROCESS_HPP */ diff --git a/main.cpp b/main.cpp index 7020a06..7ebaebc 100644 --- a/main.cpp +++ b/main.cpp @@ -20,9 +20,9 @@ using namespace std; int main(int argc, char** argv) { Context ctx; - FsmProcess fsmProcess0(ctx); - FsmProcess fsmProcess1(ctx); - ModeContext mctx(0, &fsmProcess0, &fsmProcess1); + FsmProcess fsmProcess0(ctx); + FsmProcess fsmProcess1(ctx); + ModeContext mctx(&fsmProcess0, &fsmProcess1); FsmMode fsmMode(mctx); fsmMode.reset(); diff --git a/nbproject/Makefile-Release.mk b/nbproject/Makefile-Release.mk index 83820ae..042e9b9 100644 --- a/nbproject/Makefile-Release.mk +++ b/nbproject/Makefile-Release.mk @@ -35,6 +35,7 @@ OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} # Object Files OBJECTFILES= \ + ${OBJECTDIR}/FsmProcess.o \ ${OBJECTDIR}/main.o @@ -62,6 +63,11 @@ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/fsmeval.exe: ${OBJECTFILES} ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM} ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/fsmeval ${OBJECTFILES} ${LDLIBSOPTIONS} +${OBJECTDIR}/FsmProcess.o: FsmProcess.tcc + ${MKDIR} -p ${OBJECTDIR} + ${RM} "$@.d" + $(COMPILE.cc) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/FsmProcess.o FsmProcess.tcc + ${OBJECTDIR}/main.o: main.cpp ${MKDIR} -p ${OBJECTDIR} ${RM} "$@.d" diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml index 09ef6b5..6ac8335 100644 --- a/nbproject/configurations.xml +++ b/nbproject/configurations.xml @@ -8,6 +8,7 @@ AStateMachine.hpp FsmMode.hpp FsmProcess.hpp + FsmProcess.tcc + + @@ -79,6 +82,8 @@ + + diff --git a/nbproject/project.xml b/nbproject/project.xml index dafc3b9..ea705ba 100644 --- a/nbproject/project.xml +++ b/nbproject/project.xml @@ -6,7 +6,7 @@ FsmEval cpp - hpp + hpp,tcc UTF-8