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

Committer:
martin13
Date:
Tue Feb 12 08:56:43 2019 +0000
Revision:
3:d4d69d0d8381
Parent:
0:f4fdca2c4c67
Child:
4:22b4462fcb26
Added README.md

Who changed what in which revision?

UserRevisionLine numberNew contents of line
martin13 0:f4fdca2c4c67 1 #ifndef __UTT_FOOBAR_WUD_H__
martin13 0:f4fdca2c4c67 2 #define __UTT_FOOBAR_WUD_H__
martin13 0:f4fdca2c4c67 3
martin13 0:f4fdca2c4c67 4 #include "StateMachine.h"
martin13 0:f4fdca2c4c67 5
martin13 0:f4fdca2c4c67 6 class Foo : public State{
martin13 0:f4fdca2c4c67 7
martin13 0:f4fdca2c4c67 8 public:
martin13 0:f4fdca2c4c67 9
martin13 0:f4fdca2c4c67 10 static const char* OUTCOME_BAR;
martin13 0:f4fdca2c4c67 11
martin13 0:f4fdca2c4c67 12 Foo(const char* uuid, UserData *ud):
martin13 0:f4fdca2c4c67 13 State(uuid),
martin13 0:f4fdca2c4c67 14 _count(0)
martin13 0:f4fdca2c4c67 15 {
martin13 0:f4fdca2c4c67 16 // Capture data ptr by key
martin13 0:f4fdca2c4c67 17 _data = ud->get<DataInt32*>("COUNT");
martin13 0:f4fdca2c4c67 18 }
martin13 0:f4fdca2c4c67 19
martin13 0:f4fdca2c4c67 20 virtual void onEntry(){ /* Do something */ }
martin13 0:f4fdca2c4c67 21
martin13 0:f4fdca2c4c67 22 virtual const char* onExecute(){
martin13 0:f4fdca2c4c67 23
martin13 0:f4fdca2c4c67 24 _count++;
martin13 0:f4fdca2c4c67 25
martin13 0:f4fdca2c4c67 26 return OUTCOME_BAR;
martin13 0:f4fdca2c4c67 27 }
martin13 0:f4fdca2c4c67 28
martin13 0:f4fdca2c4c67 29 virtual void onExit(){
martin13 0:f4fdca2c4c67 30 // Update data
martin13 0:f4fdca2c4c67 31 _data->setData(_count);
martin13 0:f4fdca2c4c67 32 }
martin13 0:f4fdca2c4c67 33
martin13 0:f4fdca2c4c67 34 private:
martin13 0:f4fdca2c4c67 35 int _count;
martin13 0:f4fdca2c4c67 36 DataInt32 *_data;
martin13 0:f4fdca2c4c67 37 };
martin13 0:f4fdca2c4c67 38
martin13 0:f4fdca2c4c67 39 const char* Foo::OUTCOME_BAR = "OUTCOME_BAR";
martin13 0:f4fdca2c4c67 40
martin13 0:f4fdca2c4c67 41 class Bar : public State{
martin13 0:f4fdca2c4c67 42
martin13 0:f4fdca2c4c67 43 public:
martin13 0:f4fdca2c4c67 44
martin13 0:f4fdca2c4c67 45 static const char* OUTCOME_FOO;
martin13 0:f4fdca2c4c67 46
martin13 0:f4fdca2c4c67 47 Bar(const char* uuid, UserData *ud):
martin13 0:f4fdca2c4c67 48 State(uuid)
martin13 0:f4fdca2c4c67 49 {
martin13 0:f4fdca2c4c67 50 // Capture data ptr
martin13 0:f4fdca2c4c67 51 _data = ud->get<DataInt32*>("COUNT");
martin13 0:f4fdca2c4c67 52 }
martin13 0:f4fdca2c4c67 53
martin13 0:f4fdca2c4c67 54 virtual void onEntry(){
martin13 0:f4fdca2c4c67 55 }
martin13 0:f4fdca2c4c67 56
martin13 0:f4fdca2c4c67 57 virtual const char* onExecute(){
martin13 0:f4fdca2c4c67 58
martin13 0:f4fdca2c4c67 59 Logger::info("COUNT : %i",_data->getData());
martin13 0:f4fdca2c4c67 60
martin13 0:f4fdca2c4c67 61 // Check data value
martin13 0:f4fdca2c4c67 62 if (_data->getData() >= 20){
martin13 0:f4fdca2c4c67 63 return SUCCEDED;
martin13 0:f4fdca2c4c67 64 }
martin13 0:f4fdca2c4c67 65
martin13 0:f4fdca2c4c67 66 return OUTCOME_FOO;
martin13 0:f4fdca2c4c67 67 }
martin13 0:f4fdca2c4c67 68
martin13 0:f4fdca2c4c67 69 virtual void onExit(){
martin13 0:f4fdca2c4c67 70 }
martin13 0:f4fdca2c4c67 71
martin13 0:f4fdca2c4c67 72 private:
martin13 0:f4fdca2c4c67 73 DataInt32 *_data;
martin13 0:f4fdca2c4c67 74 };
martin13 0:f4fdca2c4c67 75
martin13 0:f4fdca2c4c67 76 const char* Bar::OUTCOME_FOO = "OUTCOME_FOO";
martin13 0:f4fdca2c4c67 77
martin13 0:f4fdca2c4c67 78 class FooBar : public StateMachine{
martin13 0:f4fdca2c4c67 79
martin13 0:f4fdca2c4c67 80 public:
martin13 0:f4fdca2c4c67 81
martin13 0:f4fdca2c4c67 82 FooBar(const char* uuid, UserData *ud):
martin13 0:f4fdca2c4c67 83 StateMachine(uuid, ud),
martin13 0:f4fdca2c4c67 84 foo(NULL), bar(NULL)
martin13 0:f4fdca2c4c67 85 {
martin13 0:f4fdca2c4c67 86 // States instance
martin13 0:f4fdca2c4c67 87 foo = this->Instance<Foo>("FOO");
martin13 0:f4fdca2c4c67 88 bar = this->Instance<Bar>("BAR");
martin13 0:f4fdca2c4c67 89
martin13 0:f4fdca2c4c67 90 // Connect Foo to Bar
martin13 0:f4fdca2c4c67 91 this->connect(STATE(foo), Foo::OUTCOME_BAR, STATE(bar));
martin13 0:f4fdca2c4c67 92
martin13 0:f4fdca2c4c67 93 // Connect Bar to Foo
martin13 0:f4fdca2c4c67 94 this->connect(STATE(bar), Bar::OUTCOME_FOO, STATE(foo));
martin13 0:f4fdca2c4c67 95
martin13 0:f4fdca2c4c67 96 // Connect Bar to exit state machine
martin13 0:f4fdca2c4c67 97 this->connect(STATE(bar), Bar::SUCCEDED, SUCCEDED);
martin13 0:f4fdca2c4c67 98
martin13 0:f4fdca2c4c67 99 this->setInitialState(STATE(foo));
martin13 0:f4fdca2c4c67 100 }
martin13 0:f4fdca2c4c67 101
martin13 0:f4fdca2c4c67 102 private:
martin13 0:f4fdca2c4c67 103 Foo *foo;
martin13 0:f4fdca2c4c67 104 Bar *bar;
martin13 0:f4fdca2c4c67 105 };
martin13 0:f4fdca2c4c67 106
martin13 0:f4fdca2c4c67 107 /*
martin13 0:f4fdca2c4c67 108 InterruptIn button(PC_13);
martin13 0:f4fdca2c4c67 109 DigitalOut led(LED1);
martin13 0:f4fdca2c4c67 110 */
martin13 0:f4fdca2c4c67 111 void unit_test(){
martin13 0:f4fdca2c4c67 112
martin13 0:f4fdca2c4c67 113 StateMachine root("FOOBAR_ROOT");
martin13 0:f4fdca2c4c67 114
martin13 0:f4fdca2c4c67 115 button.rise(&root, &FooBar::preempt);
martin13 0:f4fdca2c4c67 116
martin13 0:f4fdca2c4c67 117 DataInt32* data = new DataInt32(0);
martin13 0:f4fdca2c4c67 118
martin13 0:f4fdca2c4c67 119 root.getUserData()->put("COUNT", data);
martin13 0:f4fdca2c4c67 120
martin13 0:f4fdca2c4c67 121 FooBar *foobar1 = root.Instance<FooBar>("FOOBAR_1");
martin13 0:f4fdca2c4c67 122 FooBar *foobar2 = root.Instance<FooBar>("FOOBAR_2");
martin13 0:f4fdca2c4c67 123
martin13 0:f4fdca2c4c67 124 root.setInitialState(STATE(foobar1));
martin13 0:f4fdca2c4c67 125
martin13 0:f4fdca2c4c67 126 root.connect(STATE(foobar1), "SUCCEDED", STATE(foobar2));
martin13 0:f4fdca2c4c67 127 root.connect(STATE(foobar2), "SUCCEDED", "SUCCEDED");
martin13 0:f4fdca2c4c67 128
martin13 0:f4fdca2c4c67 129 root.printGraph();
martin13 0:f4fdca2c4c67 130
martin13 0:f4fdca2c4c67 131 printf("STATE MACHINE RETURN %s \n",root.execute());
martin13 0:f4fdca2c4c67 132 }
martin13 0:f4fdca2c4c67 133
martin13 0:f4fdca2c4c67 134
martin13 0:f4fdca2c4c67 135 #endif /* #ifndef __UTT_FOOBAR_WUD_H__*/