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_FOOBAR_H__
martin13 0:f4fdca2c4c67 2 #define __UTT_FOOBAR_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 /* Capture UserData, see in utt_foobar_with_ud.h example. */
martin13 0:f4fdca2c4c67 15 }
martin13 0:f4fdca2c4c67 16
martin13 0:f4fdca2c4c67 17 virtual void onEntry(){
martin13 0:f4fdca2c4c67 18 /* Do something before onExecute() */
martin13 0:f4fdca2c4c67 19 }
martin13 0:f4fdca2c4c67 20
martin13 0:f4fdca2c4c67 21 virtual const char* onExecute(){
martin13 0:f4fdca2c4c67 22 /* Do something */
martin13 0:f4fdca2c4c67 23 return OUTCOME_BAR;
martin13 0:f4fdca2c4c67 24 }
martin13 0:f4fdca2c4c67 25
martin13 0:f4fdca2c4c67 26 virtual void onExit(){
martin13 0:f4fdca2c4c67 27 /* Do something before exit state */
martin13 0:f4fdca2c4c67 28 }
martin13 0:f4fdca2c4c67 29 };
martin13 0:f4fdca2c4c67 30
martin13 0:f4fdca2c4c67 31 const char* Foo::OUTCOME_BAR = "OUTCOME_BAR";
martin13 0:f4fdca2c4c67 32
martin13 0:f4fdca2c4c67 33 class Bar : public State{
martin13 0:f4fdca2c4c67 34
martin13 0:f4fdca2c4c67 35 public:
martin13 0:f4fdca2c4c67 36
martin13 0:f4fdca2c4c67 37 static const char* OUTCOME_FOO;
martin13 0:f4fdca2c4c67 38
martin13 0:f4fdca2c4c67 39 Bar(const char* uuid, UserData *ud):
martin13 0:f4fdca2c4c67 40 State(uuid){
martin13 0:f4fdca2c4c67 41 /* Capture UserData, see in utt_foobar_with_ud.h example. */
martin13 0:f4fdca2c4c67 42 }
martin13 0:f4fdca2c4c67 43
martin13 0:f4fdca2c4c67 44 virtual void onEntry(){
martin13 0:f4fdca2c4c67 45 /* Do something before onExecute() */
martin13 0:f4fdca2c4c67 46 }
martin13 0:f4fdca2c4c67 47
martin13 0:f4fdca2c4c67 48 virtual const char* onExecute(){
martin13 0:f4fdca2c4c67 49 /* Do something */
martin13 0:f4fdca2c4c67 50 return OUTCOME_FOO;
martin13 0:f4fdca2c4c67 51 }
martin13 0:f4fdca2c4c67 52
martin13 0:f4fdca2c4c67 53 virtual void onExit(){
martin13 0:f4fdca2c4c67 54 /* Do something before exit state */
martin13 0:f4fdca2c4c67 55 }
martin13 0:f4fdca2c4c67 56 };
martin13 0:f4fdca2c4c67 57
martin13 0:f4fdca2c4c67 58 const char* Bar::OUTCOME_FOO = "OUTCOME_FOO";
martin13 0:f4fdca2c4c67 59
martin13 0:f4fdca2c4c67 60 class FooBar : public StateMachine{
martin13 0:f4fdca2c4c67 61
martin13 0:f4fdca2c4c67 62 public:
martin13 0:f4fdca2c4c67 63
martin13 0:f4fdca2c4c67 64 FooBar(const char* uuid):
martin13 0:f4fdca2c4c67 65 StateMachine(uuid),
martin13 0:f4fdca2c4c67 66 foo(NULL), bar(NULL)
martin13 0:f4fdca2c4c67 67 {
martin13 0:f4fdca2c4c67 68 // States instance with StateMachine context
martin13 0:f4fdca2c4c67 69 foo = this->Instance<Foo>("FOO");
martin13 0:f4fdca2c4c67 70 bar = this->Instance<Bar>("BAR");
martin13 0:f4fdca2c4c67 71
martin13 0:f4fdca2c4c67 72 // Connect Foo to Bar
martin13 0:f4fdca2c4c67 73 this->connect(STATE(foo), Foo::OUTCOME_BAR, STATE(bar));
martin13 0:f4fdca2c4c67 74
martin13 0:f4fdca2c4c67 75 // Connect Bar to Foo
martin13 0:f4fdca2c4c67 76 this->connect(STATE(bar), Bar::OUTCOME_FOO, STATE(foo));
martin13 0:f4fdca2c4c67 77
martin13 0:f4fdca2c4c67 78 // Set the first state calling when the state machine starts
martin13 0:f4fdca2c4c67 79 this->setInitialState(STATE(foo));
martin13 0:f4fdca2c4c67 80 }
martin13 0:f4fdca2c4c67 81
martin13 0:f4fdca2c4c67 82 private:
martin13 0:f4fdca2c4c67 83 Foo *foo;
martin13 0:f4fdca2c4c67 84 Bar *bar;
martin13 0:f4fdca2c4c67 85 };
martin13 0:f4fdca2c4c67 86
martin13 0:f4fdca2c4c67 87 // Preempt state mahine button
martin13 0:f4fdca2c4c67 88 InterruptIn button(PC_13);
martin13 0:f4fdca2c4c67 89
martin13 0:f4fdca2c4c67 90 void unit_test(){
martin13 0:f4fdca2c4c67 91
martin13 0:f4fdca2c4c67 92 FooBar foobar("FOOBAR_SM");
martin13 0:f4fdca2c4c67 93
martin13 0:f4fdca2c4c67 94 button.rise(&foobar, &FooBar::preempt);
martin13 0:f4fdca2c4c67 95
martin13 0:f4fdca2c4c67 96 foobar.printGraph();
martin13 0:f4fdca2c4c67 97
martin13 0:f4fdca2c4c67 98 Logger::info("STATE MACHINE FINISHED WITH OUTCOME \"%s\"",foobar.execute());
martin13 0:f4fdca2c4c67 99 }
martin13 0:f4fdca2c4c67 100
martin13 0:f4fdca2c4c67 101
martin13 0:f4fdca2c4c67 102 #endif /* #ifndef __UTT_FOOBAR_H__*/