This library is designed to create and run state graphs. It supports hierarchical states and the parallel execution
utt_foobar.h@1:0f11d9338d89, 2017-10-03 (annotated)
- 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?
User | Revision | Line number | New 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__*/ |