This library is designed to create and run state graphs. It supports hierarchical states and the parallel execution

Committer:
martin13
Date:
Tue Oct 03 08:36:40 2017 +0000
Revision:
1:0f11d9338d89
Parent:
0:f4fdca2c4c67
added empty readme

Who changed what in which revision?

UserRevisionLine numberNew contents of line
martin13 0:f4fdca2c4c67 1 #ifndef __UTT_HERACHICAL_SM_H__
martin13 0:f4fdca2c4c67 2 #define __UTT_HERACHICAL_SM_H__
martin13 0:f4fdca2c4c67 3
martin13 0:f4fdca2c4c67 4
martin13 0:f4fdca2c4c67 5 #include "mbed.h"
martin13 0:f4fdca2c4c67 6 #include "StateMachine.h"
martin13 0:f4fdca2c4c67 7
martin13 0:f4fdca2c4c67 8 class S1 : public State{
martin13 0:f4fdca2c4c67 9
martin13 0:f4fdca2c4c67 10 public:
martin13 0:f4fdca2c4c67 11 static OUTCOME CONTINUE;
martin13 0:f4fdca2c4c67 12
martin13 0:f4fdca2c4c67 13 S1(const char* uuid, UserData* ud):
martin13 0:f4fdca2c4c67 14 State(uuid),
martin13 0:f4fdca2c4c67 15 m_count(0)
martin13 0:f4fdca2c4c67 16 {
martin13 0:f4fdca2c4c67 17 }
martin13 0:f4fdca2c4c67 18
martin13 0:f4fdca2c4c67 19 virtual void onEntry(){}
martin13 0:f4fdca2c4c67 20
martin13 0:f4fdca2c4c67 21 virtual const char* onExecute(){
martin13 0:f4fdca2c4c67 22 m_count++;
martin13 0:f4fdca2c4c67 23 if (m_count > 20){
martin13 0:f4fdca2c4c67 24 m_count = 0;
martin13 0:f4fdca2c4c67 25 return SUCCEDED;
martin13 0:f4fdca2c4c67 26 }
martin13 0:f4fdca2c4c67 27
martin13 0:f4fdca2c4c67 28 return CONTINUE;
martin13 0:f4fdca2c4c67 29 }
martin13 0:f4fdca2c4c67 30
martin13 0:f4fdca2c4c67 31 virtual void onExit(){}
martin13 0:f4fdca2c4c67 32
martin13 0:f4fdca2c4c67 33 private:
martin13 0:f4fdca2c4c67 34 int m_count;
martin13 0:f4fdca2c4c67 35 };
martin13 0:f4fdca2c4c67 36
martin13 0:f4fdca2c4c67 37 OUTCOME S1::CONTINUE = "CONTINUE";
martin13 0:f4fdca2c4c67 38
martin13 0:f4fdca2c4c67 39 class S2 : public State{
martin13 0:f4fdca2c4c67 40
martin13 0:f4fdca2c4c67 41 public:
martin13 0:f4fdca2c4c67 42
martin13 0:f4fdca2c4c67 43 S2(const char* uuid, UserData* ud):
martin13 0:f4fdca2c4c67 44 State(uuid)
martin13 0:f4fdca2c4c67 45 {
martin13 0:f4fdca2c4c67 46 }
martin13 0:f4fdca2c4c67 47
martin13 0:f4fdca2c4c67 48 virtual void onEntry(){}
martin13 0:f4fdca2c4c67 49
martin13 0:f4fdca2c4c67 50 virtual const char* onExecute(){
martin13 0:f4fdca2c4c67 51 return SUCCEDED;
martin13 0:f4fdca2c4c67 52 }
martin13 0:f4fdca2c4c67 53
martin13 0:f4fdca2c4c67 54 virtual void onExit(){}
martin13 0:f4fdca2c4c67 55 };
martin13 0:f4fdca2c4c67 56
martin13 0:f4fdca2c4c67 57 class SMSub : public StateMachine{
martin13 0:f4fdca2c4c67 58
martin13 0:f4fdca2c4c67 59 public:
martin13 0:f4fdca2c4c67 60
martin13 0:f4fdca2c4c67 61 SMSub(const char* uuid, UserData* ud):
martin13 0:f4fdca2c4c67 62 StateMachine(uuid, ud)
martin13 0:f4fdca2c4c67 63 {
martin13 0:f4fdca2c4c67 64
martin13 0:f4fdca2c4c67 65 S1 *s1 = this->Instance<S1>("S1");
martin13 0:f4fdca2c4c67 66 S2 *s2 = this->Instance<S2>("S2");
martin13 0:f4fdca2c4c67 67
martin13 0:f4fdca2c4c67 68 this->connect(STATE(s1), S1::CONTINUE, STATE(s2));
martin13 0:f4fdca2c4c67 69 this->connect(STATE(s1), S1::SUCCEDED, SUCCEDED);
martin13 0:f4fdca2c4c67 70
martin13 0:f4fdca2c4c67 71 this->connect(STATE(s2), S2::SUCCEDED, STATE(s1));
martin13 0:f4fdca2c4c67 72
martin13 0:f4fdca2c4c67 73 this->setInitialState(STATE(s1));
martin13 0:f4fdca2c4c67 74 }
martin13 0:f4fdca2c4c67 75 };
martin13 0:f4fdca2c4c67 76
martin13 0:f4fdca2c4c67 77 class SMRoot : public StateMachine{
martin13 0:f4fdca2c4c67 78
martin13 0:f4fdca2c4c67 79 public:
martin13 0:f4fdca2c4c67 80 SMRoot(): StateMachine("ROOT"){
martin13 0:f4fdca2c4c67 81
martin13 0:f4fdca2c4c67 82 S1* s1 = this->Instance<S1>("S1_R");
martin13 0:f4fdca2c4c67 83 S2* s2 = this->Instance<S2>("S2_R");
martin13 0:f4fdca2c4c67 84 SMSub* sub = this->Instance<SMSub>("SUB");
martin13 0:f4fdca2c4c67 85
martin13 0:f4fdca2c4c67 86 this->connect(STATE(s1), S1::CONTINUE, STATE(s2));
martin13 0:f4fdca2c4c67 87 this->connect(STATE(s1), S1::SUCCEDED, STATE(sub));
martin13 0:f4fdca2c4c67 88
martin13 0:f4fdca2c4c67 89 this->connect(STATE(s2), S2::SUCCEDED, STATE(s1));
martin13 0:f4fdca2c4c67 90
martin13 0:f4fdca2c4c67 91 this->connect(STATE(sub), SMSub::SUCCEDED, SUCCEDED);
martin13 0:f4fdca2c4c67 92
martin13 0:f4fdca2c4c67 93 this->setInitialState(STATE(s1));
martin13 0:f4fdca2c4c67 94 }
martin13 0:f4fdca2c4c67 95 };
martin13 0:f4fdca2c4c67 96
martin13 0:f4fdca2c4c67 97 InterruptIn button(PC_13);
martin13 0:f4fdca2c4c67 98 DigitalOut led(LED1);
martin13 0:f4fdca2c4c67 99
martin13 0:f4fdca2c4c67 100 void unit_test(){
martin13 0:f4fdca2c4c67 101
martin13 0:f4fdca2c4c67 102 SMRoot root;
martin13 0:f4fdca2c4c67 103
martin13 0:f4fdca2c4c67 104 button.rise(&root, &StateMachine::preempt);
martin13 0:f4fdca2c4c67 105
martin13 0:f4fdca2c4c67 106 printf("SM FINISHED WITH OUTCOME %s\n",root.execute());
martin13 0:f4fdca2c4c67 107 }
martin13 0:f4fdca2c4c67 108
martin13 0:f4fdca2c4c67 109 #endif /* #ifndef __UTT_HERACHICAL_SM_H__*/