... | ... | @@ -243,6 +243,10 @@ This can be done via delayed events. |
|
|
#include "events/HSM.h"
|
|
|
#include "events/EventBroker.h"
|
|
|
|
|
|
#define sEventBroker Singleton<EventBroker>::getInstance()
|
|
|
|
|
|
namespace Boardcore {
|
|
|
|
|
|
enum ExampleEvents : uint8_t
|
|
|
{
|
|
|
EV_1 = EV_FIRST_CUSTOM,
|
... | ... | @@ -259,17 +263,17 @@ class MyFSM : public FSM<MyFSM> |
|
|
public:
|
|
|
MyFSM() : FSM(&MyFSM::state_S1)
|
|
|
{
|
|
|
sEventBroker->subscribe(this, TOPIC_1);
|
|
|
sEventBroker.subscribe(this, TOPIC_1);
|
|
|
}
|
|
|
|
|
|
~MyFSM()
|
|
|
{
|
|
|
sEventBroker->unsubscribe(this);
|
|
|
sEventBroker.unsubscribe(this);
|
|
|
}
|
|
|
|
|
|
void state_S1(const Event& ev)
|
|
|
{
|
|
|
switch (ev.sig)
|
|
|
switch (ev)
|
|
|
{
|
|
|
case EV_ENTRY:
|
|
|
case EV_EXIT:
|
... | ... | @@ -282,7 +286,7 @@ public: |
|
|
const unsigned int TIMEOUT = 1000; // in milliseconds
|
|
|
// post delayed event and store the event id
|
|
|
delayed_event_id =
|
|
|
sEventBroker->postDelayed<TIMEOUT>({EV_2}, TOPIC_1);
|
|
|
sEventBroker.postDelayed<TIMEOUT>({EV_2}, TOPIC_1);
|
|
|
break;
|
|
|
}
|
|
|
case EV_2:
|
... | ... | @@ -297,18 +301,18 @@ public: |
|
|
}
|
|
|
}
|
|
|
|
|
|
last_event = ev.sig;
|
|
|
last_event = ev;
|
|
|
}
|
|
|
|
|
|
void state_S2(const Event& ev)
|
|
|
{
|
|
|
switch (ev.sig)
|
|
|
switch (ev)
|
|
|
{
|
|
|
case EV_ENTRY:
|
|
|
{
|
|
|
TRACE("S2 : EV_ENTRY (remove delayed EV_2) \n");
|
|
|
// if it's not needed, remove the delayed event
|
|
|
sEventBroker->removeDelayed(delayed_event_id);
|
|
|
sEventBroker.removeDelayed(delayed_event_id);
|
|
|
break;
|
|
|
}
|
|
|
case EV_EXIT:
|
... | ... | @@ -321,25 +325,29 @@ public: |
|
|
}
|
|
|
}
|
|
|
|
|
|
last_event = ev.sig;
|
|
|
last_event = ev;
|
|
|
}
|
|
|
|
|
|
private:
|
|
|
uint8_t delayed_event_id = 0;
|
|
|
uint8_t last_event = 0;
|
|
|
};
|
|
|
|
|
|
} //namespace Boardcore
|
|
|
```
|
|
|
#### test-fsm.cpp
|
|
|
```cpp
|
|
|
#include <Common.h>
|
|
|
#include "MyFSM.h"
|
|
|
#include <miosix.h>
|
|
|
#include "events/MyFSM.h"
|
|
|
|
|
|
#define broker Singleton<EventBroker>::getInstance()
|
|
|
|
|
|
using namespace miosix;
|
|
|
using namespace Boardcore;
|
|
|
|
|
|
int main()
|
|
|
{
|
|
|
EventBroker* broker = EventBroker::getInstance(); // singleton object
|
|
|
broker->start();
|
|
|
broker.start();
|
|
|
|
|
|
MyFSM fsm;
|
|
|
|
... | ... | @@ -348,14 +356,14 @@ int main() |
|
|
// 1. trigger post of delayed event (timer)
|
|
|
// 2. when the timer elapsed EV_2 is posted
|
|
|
// and the FSM moves to state S2
|
|
|
broker->post(Event{EV_1}, TOPIC_1);
|
|
|
broker.post(Event{EV_1}, TOPIC_1);
|
|
|
|
|
|
// wait for the delayed event to be posted
|
|
|
// before stopping the active objects
|
|
|
Thread::sleep(2000);
|
|
|
|
|
|
fsm.stop();
|
|
|
broker->stop();
|
|
|
broker.stop();
|
|
|
}
|
|
|
else {
|
|
|
TRACE("Failed to start MyFSM\n");
|
... | ... | @@ -363,10 +371,11 @@ int main() |
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
```
|
|
|
#### Output
|
|
|
```
|
|
|
0.12> S1 : EV_1 (start timer, post delayed EV_2)
|
|
|
1.15> S1 : EV_2 (timeout) ---> S2
|
|
|
1.17> S2 : EV_ENTRY (remove delayed EV_2)
|
|
|
0.04> S1 : EV_1 (start timer, post delayed EV_2)
|
|
|
1.04> S1 : EV_2 (timeout) ---> S2
|
|
|
1.05> S2 : EV_ENTRY (remove delayed EV_2)
|
|
|
``` |
|
|
\ No newline at end of file |