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
Added README.md

Who changed what in which revision?

UserRevisionLine numberNew contents of line
martin13 0:f4fdca2c4c67 1 #ifndef __UTT_PARALLEL_STATES_UD_H__
martin13 0:f4fdca2c4c67 2 #define __UTT_PARALLEL_STATES_UD_H__
martin13 0:f4fdca2c4c67 3
martin13 0:f4fdca2c4c67 4 #include "ParallelStateMachine.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 Foo(const char* uuid, UserData *ud):
martin13 0:f4fdca2c4c67 11 State(uuid),
martin13 0:f4fdca2c4c67 12 _count(0)
martin13 0:f4fdca2c4c67 13 {
martin13 0:f4fdca2c4c67 14 _data = ud->get<DataInt32*>("COUNT");
martin13 0:f4fdca2c4c67 15 }
martin13 0:f4fdca2c4c67 16
martin13 0:f4fdca2c4c67 17 virtual void onEntry(){
martin13 0:f4fdca2c4c67 18 _count = _data->getData();
martin13 0:f4fdca2c4c67 19 }
martin13 0:f4fdca2c4c67 20
martin13 0:f4fdca2c4c67 21 virtual const char* onExecute(){
martin13 0:f4fdca2c4c67 22 _count++;
martin13 0:f4fdca2c4c67 23 return "BAR";
martin13 0:f4fdca2c4c67 24 }
martin13 0:f4fdca2c4c67 25
martin13 0:f4fdca2c4c67 26 virtual void onExit(){
martin13 0:f4fdca2c4c67 27 _data->setData(_count);
martin13 0:f4fdca2c4c67 28 }
martin13 0:f4fdca2c4c67 29
martin13 0:f4fdca2c4c67 30 private:
martin13 0:f4fdca2c4c67 31 int _count;
martin13 0:f4fdca2c4c67 32 DataInt32 *_data;
martin13 0:f4fdca2c4c67 33 };
martin13 0:f4fdca2c4c67 34
martin13 0:f4fdca2c4c67 35 class Bar : public State{
martin13 0:f4fdca2c4c67 36
martin13 0:f4fdca2c4c67 37 public:
martin13 0:f4fdca2c4c67 38
martin13 0:f4fdca2c4c67 39 Bar(const char* uuid, UserData *ud):
martin13 0:f4fdca2c4c67 40 State(uuid)
martin13 0:f4fdca2c4c67 41 {
martin13 0:f4fdca2c4c67 42 _data = ud->get<DataInt32*>("COUNT");
martin13 0:f4fdca2c4c67 43 }
martin13 0:f4fdca2c4c67 44
martin13 0:f4fdca2c4c67 45 virtual void onEntry(){
martin13 0:f4fdca2c4c67 46 }
martin13 0:f4fdca2c4c67 47
martin13 0:f4fdca2c4c67 48 virtual const char* onExecute(){
martin13 0:f4fdca2c4c67 49
martin13 0:f4fdca2c4c67 50 printf("%s %i \n", getUUID(), _data->getData());
martin13 0:f4fdca2c4c67 51
martin13 0:f4fdca2c4c67 52 if (_data->getData() >= 20){
martin13 0:f4fdca2c4c67 53 return SUCCEDED;
martin13 0:f4fdca2c4c67 54 }
martin13 0:f4fdca2c4c67 55
martin13 0:f4fdca2c4c67 56 return "FOO";
martin13 0:f4fdca2c4c67 57 }
martin13 0:f4fdca2c4c67 58
martin13 0:f4fdca2c4c67 59 virtual void onExit(){
martin13 0:f4fdca2c4c67 60 }
martin13 0:f4fdca2c4c67 61
martin13 0:f4fdca2c4c67 62 private:
martin13 0:f4fdca2c4c67 63 DataInt32 *_data;
martin13 0:f4fdca2c4c67 64 };
martin13 0:f4fdca2c4c67 65
martin13 0:f4fdca2c4c67 66
martin13 0:f4fdca2c4c67 67 class FooBar : public StateMachine{
martin13 0:f4fdca2c4c67 68
martin13 0:f4fdca2c4c67 69 public:
martin13 0:f4fdca2c4c67 70
martin13 0:f4fdca2c4c67 71 FooBar(const char* uuid, UserData *ud):
martin13 0:f4fdca2c4c67 72 StateMachine(uuid, ud),
martin13 0:f4fdca2c4c67 73 foo(NULL), bar(NULL)
martin13 0:f4fdca2c4c67 74 {
martin13 0:f4fdca2c4c67 75 Foo *foo = this->Instance<Foo>("FOO");
martin13 0:f4fdca2c4c67 76 Bar *bar = this->Instance<Bar>("BAR");
martin13 0:f4fdca2c4c67 77
martin13 0:f4fdca2c4c67 78 this->connect(STATE(foo), "BAR", STATE(bar));
martin13 0:f4fdca2c4c67 79
martin13 0:f4fdca2c4c67 80 this->connect(STATE(bar), "FOO", STATE(foo));
martin13 0:f4fdca2c4c67 81 this->connect(STATE(bar), "SUCCEDED", "SUCCEDED");
martin13 0:f4fdca2c4c67 82
martin13 0:f4fdca2c4c67 83 this->setInitialState(STATE(foo));
martin13 0:f4fdca2c4c67 84 }
martin13 0:f4fdca2c4c67 85
martin13 0:f4fdca2c4c67 86 private:
martin13 0:f4fdca2c4c67 87 Foo *foo;
martin13 0:f4fdca2c4c67 88 Bar *bar;
martin13 0:f4fdca2c4c67 89 };
martin13 0:f4fdca2c4c67 90
martin13 0:f4fdca2c4c67 91 class ParallelFooBar : public ParallelStateMachine{
martin13 0:f4fdca2c4c67 92
martin13 0:f4fdca2c4c67 93 public:
martin13 0:f4fdca2c4c67 94
martin13 0:f4fdca2c4c67 95 ParallelFooBar(const char* uuid, UserData* ud):
martin13 0:f4fdca2c4c67 96 ParallelStateMachine(uuid, ud){
martin13 0:f4fdca2c4c67 97
martin13 0:f4fdca2c4c67 98 _data = new DataInt32(0);
martin13 0:f4fdca2c4c67 99 getUserData()->put("COUNT", _data);
martin13 0:f4fdca2c4c67 100
martin13 0:f4fdca2c4c67 101 FooBar *foobar1 = Instance<FooBar>("FOO_BAR_1");
martin13 0:f4fdca2c4c67 102 FooBar *foobar2 = Instance<FooBar>("FOO_BAR_2");
martin13 0:f4fdca2c4c67 103
martin13 0:f4fdca2c4c67 104 this->attachOutcomesResolver(this, &ParallelFooBar::resolveOutcomes);
martin13 0:f4fdca2c4c67 105 }
martin13 0:f4fdca2c4c67 106
martin13 0:f4fdca2c4c67 107
martin13 0:f4fdca2c4c67 108 virtual void onEntry(){
martin13 0:f4fdca2c4c67 109 _data->setData(0);
martin13 0:f4fdca2c4c67 110 }
martin13 0:f4fdca2c4c67 111
martin13 0:f4fdca2c4c67 112 const char* resolveOutcomes(const char **outcomes, int nb_outcomes){
martin13 0:f4fdca2c4c67 113
martin13 0:f4fdca2c4c67 114 for( int i=0; i < nb_outcomes; i++){
martin13 0:f4fdca2c4c67 115
martin13 0:f4fdca2c4c67 116 if(strcmp(outcomes[i], "SUCCEDED") != 0){
martin13 0:f4fdca2c4c67 117 return "ABORTED";
martin13 0:f4fdca2c4c67 118 }
martin13 0:f4fdca2c4c67 119 }
martin13 0:f4fdca2c4c67 120
martin13 0:f4fdca2c4c67 121 return "SUCCEDED";
martin13 0:f4fdca2c4c67 122 }
martin13 0:f4fdca2c4c67 123
martin13 0:f4fdca2c4c67 124 private:
martin13 0:f4fdca2c4c67 125 DataInt32* _data;
martin13 0:f4fdca2c4c67 126 };
martin13 0:f4fdca2c4c67 127
martin13 0:f4fdca2c4c67 128 InterruptIn button(PC_13);
martin13 0:f4fdca2c4c67 129 DigitalOut led(LED1);
martin13 0:f4fdca2c4c67 130
martin13 0:f4fdca2c4c67 131 void unit_test(){
martin13 0:f4fdca2c4c67 132
martin13 0:f4fdca2c4c67 133 StateMachine root("ROOT");
martin13 0:f4fdca2c4c67 134
martin13 0:f4fdca2c4c67 135 button.rise(&root, &StateMachine::preempt);
martin13 0:f4fdca2c4c67 136
martin13 0:f4fdca2c4c67 137 ParallelFooBar* pfb = root.Instance<ParallelFooBar>("PARALLEL_FOOBAR");
martin13 0:f4fdca2c4c67 138
martin13 0:f4fdca2c4c67 139 root.connect(STATE(pfb), "SUCCEDED", STATE(pfb));
martin13 0:f4fdca2c4c67 140
martin13 0:f4fdca2c4c67 141 root.setInitialState(STATE(pfb));
martin13 0:f4fdca2c4c67 142
martin13 0:f4fdca2c4c67 143 root.printGraph();
martin13 0:f4fdca2c4c67 144
martin13 0:f4fdca2c4c67 145 printf("PARALLEL SM RETURN %s\n",root.execute());
martin13 0:f4fdca2c4c67 146
martin13 0:f4fdca2c4c67 147 }
martin13 0:f4fdca2c4c67 148
martin13 0:f4fdca2c4c67 149 #endif /* #ifndef __UTT_PARALLEL_STATES_UD_H__*/