diff --git a/FsmProcess.tcc b/FsmProcess.tcc new file mode 100644 index 0000000..ee0fa91 --- /dev/null +++ b/FsmProcess.tcc @@ -0,0 +1,168 @@ +/* + * File: FsmProcess.tcc + * Author: jens + * + * Created on 24. Januar 2015, 18:01 + */ + +#ifndef FSMPROCESS_TCC +#define FSMPROCESS_TCC + +#include "FsmProcess.hpp" + +template +FsmProcess::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); +} + +template +FsmProcess::~FsmProcess() +{ +} + +template +void FsmProcess::process(int x) +{ + dynamic_cast(currState())->process(x); +} + +template +FsmProcess::StateInit::StateInit(IFsmProcess::StateId id, Context &context) +: AState(id) +, m_context(context) +{ + +} + +template +FsmProcess::StateInit::~StateInit() +{ +} + +// Transition to Init is reset +template +void FsmProcess::StateInit::onTransition() +{ + printf("%s\n", __PRETTY_FUNCTION__); +} + +template +void FsmProcess::StateInit::process(int x) +{ + printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); + setState(IFsmProcess::IDLE); +} + +template +FsmProcess::StateIdle::StateIdle(IFsmProcess::StateId id, Context &context) +: AState(id) +, m_context(context) +{ + +} + +template +FsmProcess::StateIdle::~StateIdle() +{} + +template +void FsmProcess::StateIdle::onTransition() +{ + printf("%s\n", __PRETTY_FUNCTION__); + m_context.m_count = 0; +} + +template +void FsmProcess::StateIdle::process(int x) +{ + printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); + if (x >= 10) + { + setState(IFsmProcess::ACTIVE_0); + } +} + +template <> +void FsmProcess::StateIdle::process(int x) +{ + printf("%s() x=%d\n", __PRETTY_FUNCTION__, x); + if (x >= 10) + { + setState(IFsmProcess::ACTIVE_0); + } +} + +template +FsmProcess::StateActive0::StateActive0(IFsmProcess::StateId id, Context &context) +: AState(id) +, m_context(context) +{ + +} + +template +FsmProcess::StateActive0::~StateActive0() +{ +} + +template +void FsmProcess::StateActive0::onTransition() +{ + m_context.m_count = 0; + printf("%s, Count = %d\n", __PRETTY_FUNCTION__, m_context.m_count); +} + +template +void FsmProcess::StateActive0::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); + } +} + +template +FsmProcess::StateActive1::StateActive1(IFsmProcess::StateId id, Context &context) +: AState(id) +, m_context(context) +{ + +} + +template +FsmProcess::StateActive1::~StateActive1() +{ +} + +template +void FsmProcess::StateActive1::onTransition() +{ + m_context.m_count = 5; + printf("%s, Count = %d\n", __PRETTY_FUNCTION__, m_context.m_count); +} + +template +void FsmProcess::StateActive1::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); + } +} + +#endif /* FSMPROCESS_TCC */ +