diff --git a/old_examples/tests/catch/example-test-fsm.cpp b/old_examples/tests/catch/example-test-fsm.cpp index e557f212ecd513b791d9528a0edcbeab8d5f878d..9c69e2b3000ca19754a076f3c52b379bb12e66b1 100644 --- a/old_examples/tests/catch/example-test-fsm.cpp +++ b/old_examples/tests/catch/example-test-fsm.cpp @@ -131,7 +131,7 @@ public: // Start the thread in the constructor FSMTestFixture() { - sEventBroker.start(); + EventBroker::getInstance().start(); fsm.start(); } // Stop the thread in the destructor @@ -168,7 +168,7 @@ TEST_CASE_METHOD(FSMTestFixture, "Testing async transitions") SECTION("S3 --> S4 if EV_B. Delayed event should be removed") { - EventCounter counter{*sEventBroker}; + EventCounter counter{*EventBroker::getInstance()}; // Post EV_B before EV_D fires. should move to S4 and remove EV_D // from the delayed events diff --git a/old_examples/tests/catch/example-test-fsm.h b/old_examples/tests/catch/example-test-fsm.h index 3aa648ec901654b0a6dbfaf836981f1d66e72e81..03f46222db911c7304992b33a1ee525771567b5e 100644 --- a/old_examples/tests/catch/example-test-fsm.h +++ b/old_examples/tests/catch/example-test-fsm.h @@ -39,8 +39,8 @@ */ enum ExampleEvents : uint8_t { - EV_A = EV_FIRST_SIGNAL, // The first event must always have value - // EV_FIRST_SIGNAL + EV_A = EV_FIRST_CUSTOM, // The first event must always have value + // EV_FIRST_CUSTOM EV_B, // Values for the following event can be manually specified or // assigned automatically EV_C, @@ -110,10 +110,10 @@ public: FSMExample() : FSM(&FSMExample::state_S1), v(0) { // Subscribe for events posted on TOPIC_T1 - sEventBroker.subscribe(this, TOPIC_T1); + EventBroker::getInstance().subscribe(this, TOPIC_T1); } - ~FSMExample() { sEventBroker.unsubscribe(this); } + ~FSMExample() { EventBroker::getInstance().unsubscribe(this); } /* * State function definitions. @@ -207,8 +207,8 @@ public: v = 1; // Post EV_D to itself in 1 seconds - delayed_ev_id = - sEventBroker.postDelayed(Event{EV_D}, TOPIC_T1, 1000); + delayed_ev_id = EventBroker::getInstance().postDelayed( + Event{EV_D}, TOPIC_T1, 1000); break; } @@ -219,7 +219,7 @@ public: // don't remove a delayed event. This is an error! Uncomment to // fix, see the wiki for further information !!! - // sEventBroker.removeDelayed(delayed_ev_id); + // EventBroker::getInstance().removeDelayed(delayed_ev_id); break; } case EV_B: diff --git a/scripts/generators/eventgen.py b/scripts/generators/eventgen.py index dedf167d77171b073d56623f605f9139855b4010..f5014d9517d50e1ee6b3db965868af308db73ffc 100755 --- a/scripts/generators/eventgen.py +++ b/scripts/generators/eventgen.py @@ -93,7 +93,7 @@ def generate_events_h(events, date): # Prepare the event list enum_event_list = list(events) - enum_event_list[0] += ' = EV_FIRST_SIGNAL' + enum_event_list[0] += ' = EV_FIRST_CUSTOM' enum_event_list = '\n'.join( [' '*4 + event + ',' for event in enum_event_list]) vector_event_list = '\n'.join([' '*4 + event + ',' for event in events]) diff --git a/scripts/generators/fsmgen.py b/scripts/generators/fsmgen.py index b3c6bab216cb027497e6c5c3fd4129f91b583ba7..5288d3618a19e29653f97d4a7ce26e8bc5bc649e 100755 --- a/scripts/generators/fsmgen.py +++ b/scripts/generators/fsmgen.py @@ -59,7 +59,7 @@ STATE_FUNCTION_CASE_TEMPLATE = ' '*8 + 'case {event}:\n' + \ ' '*12 + 'break;\n' + \ ' '*8 + '}}' UTILITY_FUNCTION_DECLARATION_TEMPLATE = 'void {function_name}();' -TOPICS_SUBSCIPTION_TEMPLATE = ' '*4 + 'sEventBroker.subscribe(this, {topic});' +TOPICS_SUBSCIPTION_TEMPLATE = ' '*4 + 'EventBroker::getInstance().subscribe(this, {topic});' UTILITY_FUNCTION_DEFINITION_TEMPLATE = 'void {state_machine_name}Controller::{function_name}()\n{{\n // ...\n}}' STATE_FUNCTION_CASE_TRANSITION_TO_TARGET_TEMPLATE = 'transition(&{state_machine_name}Controller::state_{state_name});' TEST_CASE_METHOD_TEMPLATE = 'TEST_CASE_METHOD({state_machine_name}ControllerFixture, "Testing transitions from {state}")\n' + \ diff --git a/src/shared/events/Event.h b/src/shared/events/Event.h index d35c6ab219a2d5c2c7e0060e75eece7ea2eeb075..c38ec3ef83a50bbbe86428bbb8f7d9e89a363427 100644 --- a/src/shared/events/Event.h +++ b/src/shared/events/Event.h @@ -27,38 +27,27 @@ namespace Boardcore { -enum EventSignal : uint8_t +typedef uint8_t Event; + +enum BasicEvent : Event { EV_ENTRY = 0, EV_EXIT = 1, EV_EMPTY = 2, EV_INIT = 3, - EV_FIRST_SIGNAL = 4 + EV_FIRST_CUSTOM = 4 }; /** - * Example definiton of custom signals: - - enum CustomSignal : uint8_t - { - SIG_ONE = SG_FIRST_SIGNAL, - SIG_TWO, - SIG_THREE, - SIG_FOUR - }; - + * Example definition of custom events: + * + * enum CustomEvent : Event + * { + * EV_ONE = EV_FIRST_CUSTOM, + * EV_TWO, + * EV_THREE. + * EV_FOUR + * } */ -struct Event -{ - uint8_t code; -}; - -/* Example of extended Event structure - - struct ExtendedEvent : public Event{ - uint32_t customMember; - }; -*/ - } // namespace Boardcore diff --git a/src/shared/events/EventBroker.cpp b/src/shared/events/EventBroker.cpp index 019aefc8e0464bd9ab3b88e4e3cb27cf329e1d0c..543005be8a30c7ba8fc97d838d5a4aaa910b77e6 100644 --- a/src/shared/events/EventBroker.cpp +++ b/src/shared/events/EventBroker.cpp @@ -33,7 +33,7 @@ EventBroker::EventBroker() {} void EventBroker::post(const Event& ev, uint8_t topic) { #ifdef TRACE_EVENTS - LOG_DEBUG(logger, "Event: {}, Topic: {}", ev.code, topic); + LOG_DEBUG(logger, "Event: {}, Topic: {}", ev, topic); #endif Lock<FastMutex> lock(mtxSubscribers); diff --git a/src/shared/events/EventBroker.h b/src/shared/events/EventBroker.h index 27222a5a486524adefff64905e649689a422cda4..d769bca420e4bcc06773ec87147267116ca46ee2 100644 --- a/src/shared/events/EventBroker.h +++ b/src/shared/events/EventBroker.h @@ -62,8 +62,6 @@ class EventBroker : public Singleton<EventBroker>, public ActiveObject public: /** * Posts an event to the specified topic. - * @param ev - * @param topic */ void post(const Event& ev, uint8_t topic); @@ -190,5 +188,3 @@ private: }; } // namespace Boardcore - -#define sEventBroker Boardcore::Singleton<Boardcore::EventBroker>::getInstance() diff --git a/src/shared/events/FSM.h b/src/shared/events/FSM.h index 0f32e4c973f5334264ee67cae30937dbff064fe4..f4ed570643450d16616eafcd84c575b02b6de859 100644 --- a/src/shared/events/FSM.h +++ b/src/shared/events/FSM.h @@ -63,8 +63,8 @@ FSM<T>::FSM(void (T::*initialState)(const Event&), unsigned int stacksize, miosix::Priority priority) : EventHandler(stacksize, priority) { - state = initialState; - specialEvent.code = EV_ENTRY; + state = initialState; + specialEvent = EV_ENTRY; postEvent(specialEvent); } @@ -74,10 +74,10 @@ FSM<T>::~FSM(){}; template <class T> void FSM<T>::transition(void (T::*nextState)(const Event&)) { - specialEvent.code = EV_EXIT; + specialEvent = EV_EXIT; (static_cast<T*>(this)->*state)(specialEvent); - state = nextState; - specialEvent.code = EV_ENTRY; + state = nextState; + specialEvent = EV_ENTRY; (static_cast<T*>(this)->*state)(specialEvent); } diff --git a/src/shared/events/utils/EventCounter.h b/src/shared/events/utils/EventCounter.h index 27708720c00ab3a8987dfd98c0c70e6c9c568460..9f0914d26e17c0fca31960c706320deb5c5eebed 100644 --- a/src/shared/events/utils/EventCounter.h +++ b/src/shared/events/utils/EventCounter.h @@ -60,27 +60,22 @@ public: { Lock<FastMutex> l(mutex); - ++mapCounter[ev.code]; + ++mapCounter[ev]; ++totalCount; - lastEvent = ev.code; + lastEvent = ev; } /** - * @brief Returns the number of times a specific event has been received + * @brief Returns the number of times a specific event has been received. */ - unsigned int getCount(const Event& ev) { return getCount(ev.code); } - - /** - * @brief Returns the number of times a specific event has been received - */ - unsigned int getCount(uint8_t evSig) + unsigned int getCount(const Event& ev) { Lock<FastMutex> l(mutex); - if (mapCounter.count(evSig) == 1) + if (mapCounter.count(ev) == 1) { - return mapCounter.at(evSig); + return mapCounter.at(ev); } return 0; @@ -92,7 +87,7 @@ public: unsigned int getTotalCount() { return totalCount; } /** - * @brief Returns the signature of the last event received (ev.code) + * @brief Returns the signature of the last event received (ev) */ uint8_t getLastEvent() { return lastEvent; } diff --git a/src/shared/events/utils/EventInjector.h b/src/shared/events/utils/EventInjector.h index d57c820f137c6385fb6ce75bbb7ede6a1a89692d..c9df410e213085153a1e6146e5b123d2fd89dcbd 100644 --- a/src/shared/events/utils/EventInjector.h +++ b/src/shared/events/utils/EventInjector.h @@ -57,7 +57,7 @@ protected: getline(cin, temp); stringstream(temp) >> ev >> topic; - sEventBroker.post({(uint8_t)ev}, topic); + EventBroker::getInstance().post({(uint8_t)ev}, topic); } } }; diff --git a/src/shared/events/utils/EventSniffer.h b/src/shared/events/utils/EventSniffer.h index 19dff058ca32d00d0d6edf2c0b1755f62e317b69..67785774247ec3f5e6c17f5b2194365766d4e685 100644 --- a/src/shared/events/utils/EventSniffer.h +++ b/src/shared/events/utils/EventSniffer.h @@ -94,10 +94,7 @@ private: parent.broker.subscribe(this, topic); } - void postEvent(const Event& ev) - { - parent.onEventReceived(ev.code, topic); - } + void postEvent(const Event& ev) { parent.onEventReceived(ev, topic); } ~Sniffer() { parent.broker.unsubscribe(this); } diff --git a/src/shared/utils/TestUtils/TestHelper.h b/src/shared/utils/TestUtils/TestHelper.h index 660838fc04fcf103dd581f828e80b99443e6fe23..2e7592f4273969efca7d3ea6a4d38c70b7d02695 100644 --- a/src/shared/utils/TestUtils/TestHelper.h +++ b/src/shared/utils/TestUtils/TestHelper.h @@ -98,7 +98,7 @@ bool testFSMTransition(FSM_type& fsm, const Event& ev, template <class FSM_type> bool testFSMAsyncTransition(FSM_type& fsm, const Event& ev, uint8_t topic, void (FSM_type::*expectedState)(const Event&), - EventBroker& broker = sEventBroker) + EventBroker& broker = EventBroker::getInstance()) { broker.post(ev, topic); // Wait for the event to be handled @@ -154,7 +154,7 @@ bool testHSMTransition(HSM_type& hsm, const Event& ev, template <class HSM_type> bool testHSMAsyncTransition(HSM_type& hsm, const Event& ev, uint8_t topic, State (HSM_type::*expectedState)(const Event&), - EventBroker& broker = sEventBroker) + EventBroker& broker = EventBroker::getInstance()) { broker.post(ev, topic); // Wait for the event to be handled @@ -183,7 +183,7 @@ bool testHSMAsyncTransition(HSM_type& hsm, const Event& ev, uint8_t topic, */ bool expectEvent(uint8_t eventId, uint8_t topic, long long when, long long uncertainty = EVENT_TIMING_UNCERTAINTY, - EventBroker& broker = sEventBroker); + EventBroker& broker = EventBroker::getInstance()); /** * @brief Waits until the specified event is received or a timeout expires @@ -197,6 +197,6 @@ bool expectEvent(uint8_t eventId, uint8_t topic, long long when, * false if the timeout has expired */ bool waitForEvent(uint8_t event, uint8_t topic, long long timeout = 0, - EventBroker& broker = sEventBroker); + EventBroker& broker = EventBroker::getInstance()); } // namespace Boardcore diff --git a/src/tests/catch/test-eventbroker.cpp b/src/tests/catch/test-eventbroker.cpp index 04475591c3973eed8e1aa6a7d6d97674b4aa8e2b..18a9eb65c348d484a29c2c7823be366e4cc042d0 100644 --- a/src/tests/catch/test-eventbroker.cpp +++ b/src/tests/catch/test-eventbroker.cpp @@ -75,26 +75,26 @@ TEST_CASE("EventBroker - Posts to different topics") SECTION("Post event on TOPIC_1, only sub1 should receive it") { - ev.code = EV_A; + ev = EV_A; broker.post(ev, TOPIC_1); REQUIRE(sub1.getTotalCount() == 1); - REQUIRE(sub1.getLastEvent() == ev.code); + REQUIRE(sub1.getLastEvent() == ev); REQUIRE(sub2.getTotalCount() == 0); } SECTION("Post event on TOPIC_2, both sub1 and sub2 should receive it") { - ev.code = EV_B; + ev = EV_B; broker.post(ev, TOPIC_2); REQUIRE(sub1.getTotalCount() == 1); REQUIRE(sub2.getTotalCount() == 1); - REQUIRE(sub1.getLastEvent() == ev.code); - REQUIRE(sub2.getLastEvent() == ev.code); + REQUIRE(sub1.getLastEvent() == ev); + REQUIRE(sub2.getLastEvent() == ev); } SECTION("Post event on TOPIC_3, no one should receive it") { - ev.code = EV_C; + ev = EV_C; broker.post(ev, TOPIC_3); REQUIRE(sub1.getTotalCount() == 0); diff --git a/src/tests/events/fsm/test-fsm.cpp b/src/tests/events/fsm/test-fsm.cpp index 7c119cc16ddddbd6a58914e4f8f422a59a60ac09..b6f2dc4f7e3a8dfd43f198962d74abe988ee9c60 100644 --- a/src/tests/events/fsm/test-fsm.cpp +++ b/src/tests/events/fsm/test-fsm.cpp @@ -33,17 +33,18 @@ int main() { FSMExample fsm; - sEventBroker.start(); // Start broker thread - fsm.start(); // Start FSM thread + EventBroker::getInstance().start(); // Start broker thread + fsm.start(); // Start FSM thread // State machine starts in state S1. Post EV_A to move to S2 - sEventBroker.post(Event{EV_A}, TOPIC_T1); + EventBroker::getInstance().post(Event{EV_A}, TOPIC_T1); // FSM now in State S2 - sEventBroker.post(Event{EV_E}, - TOPIC_T1); // This makes the FSM print hello world + EventBroker::getInstance().post( + Event{EV_E}, + TOPIC_T1); // This makes the FSM print hello world - sEventBroker.post(Event{EV_C}, TOPIC_T1); // Transition to S3 + EventBroker::getInstance().post(Event{EV_C}, TOPIC_T1); // Transition to S3 printf("Waiting for the FSM to transition to S1\n"); Thread::sleep(1100); @@ -53,7 +54,7 @@ int main() // Since previously we've been in state S3, now v == 1 and EV_A will make // the FSM transition to S4 instead of S1 - sEventBroker.post(Event{EV_A}, TOPIC_T1); + EventBroker::getInstance().post(Event{EV_A}, TOPIC_T1); // Now the state machine is in state S4 @@ -68,5 +69,5 @@ int main() // Stop the threds, even though we will never reach this point, but just for // correctness ;) fsm.stop(); - sEventBroker.stop(); + EventBroker::getInstance().stop(); } diff --git a/src/tests/events/fsm/test-fsm.h b/src/tests/events/fsm/test-fsm.h index 7b16d6703e9cc8c6910dd012b2377d5461d7063c..f603cdfec09f72e09864f4dbeaf43e08264c9b6d 100644 --- a/src/tests/events/fsm/test-fsm.h +++ b/src/tests/events/fsm/test-fsm.h @@ -40,8 +40,8 @@ namespace Boardcore */ enum ExampleEvents : uint8_t { - EV_A = EV_FIRST_SIGNAL, // The first event must always have - // value EV_FIRST_SIGNAL + EV_A = EV_FIRST_CUSTOM, // The first event must always have + // value EV_FIRST_CUSTOM EV_B, // Values for the following event can be manually specified or // assigned automatically EV_C, @@ -64,7 +64,7 @@ enum ExampleTopics : uint8_t */ void traceState(uint8_t state, const Event& ev) { - switch (ev.code) + switch (ev) { case EV_ENTRY: { @@ -78,7 +78,7 @@ void traceState(uint8_t state, const Event& ev) } default: { - printf("(S%d) Received event %d\n", state, ev.code); + printf("(S%d) Received event %d\n", state, ev); break; } } @@ -110,10 +110,10 @@ public: FSMExample() : FSM(&FSMExample::state_S1), v(0) { // Subscribe for events posted on TOPIC_T1 - sEventBroker.subscribe(this, TOPIC_T1); + EventBroker::getInstance().subscribe(this, TOPIC_T1); } - ~FSMExample() { sEventBroker.unsubscribe(this); } + ~FSMExample() { EventBroker::getInstance().unsubscribe(this); } private: /* @@ -129,7 +129,7 @@ private: // state machine on the terminal. traceState(STATE_S1, ev); - switch (ev.code) + switch (ev) { // It's always good to add braces to every single case statement, to // avoid problems @@ -169,7 +169,7 @@ private: { traceState(STATE_S2, ev); - switch (ev.code) + switch (ev) { case EV_ENTRY: { @@ -200,7 +200,7 @@ private: { traceState(STATE_S3, ev); - switch (ev.code) + switch (ev) { case EV_ENTRY: { @@ -208,15 +208,15 @@ private: v = 1; // Post EV_D to itself in 1 seconds - delayed_ev_id = - sEventBroker.postDelayed<1000>(Event{EV_D}, TOPIC_T1); + delayed_ev_id = EventBroker::getInstance().postDelayed<1000>( + Event{EV_D}, TOPIC_T1); break; } case EV_EXIT: { // Remove the delayed event in case it has not fired yet - sEventBroker.removeDelayed(delayed_ev_id); + EventBroker::getInstance().removeDelayed(delayed_ev_id); break; } case EV_B: @@ -243,7 +243,7 @@ private: { traceState(STATE_S4, ev); - switch (ev.code) + switch (ev) { case EV_ENTRY: { diff --git a/src/tests/test-eventinjector.cpp b/src/tests/test-eventinjector.cpp index 424637b10027b701572790948541c489e6071e10..f36f11ba2a9bbfb3d0524d4369e69df63849fddc 100644 --- a/src/tests/test-eventinjector.cpp +++ b/src/tests/test-eventinjector.cpp @@ -37,7 +37,7 @@ int main() EventInjector injector; injector.start(); - EventCounter counter(sEventBroker); + EventCounter counter(EventBroker::getInstance()); counter.subscribe({topic}); for (;;) diff --git a/src/tests/test-hsm.cpp b/src/tests/test-hsm.cpp index c23c9d7ef15384575ee2231e2e2d2f3cabe79b56..c33ba46ba6bffbb54c97b8682b79665d4b3275ef 100644 --- a/src/tests/test-hsm.cpp +++ b/src/tests/test-hsm.cpp @@ -44,7 +44,7 @@ using namespace miosix; { \ cout << "------------------------------" << endl; \ cout << "Triggering signal " << #SIGNAL << endl; \ - sEventBroker.post({SIGNAL}, TOPIC_TEST); \ + EventBroker::getInstance().post({SIGNAL}, TOPIC_TEST); \ Thread::sleep(400); \ testValue = HSM.testState(STATE); \ cout << "Check State " << #STATE << " " \ @@ -54,7 +54,7 @@ using namespace miosix; enum TestEvents : uint8_t { - EV_A = EV_FIRST_SIGNAL, + EV_A = EV_FIRST_CUSTOM, EV_B, EV_C, EV_D, @@ -84,14 +84,13 @@ public: bool foo; }; -#define DEBUG_PRINT \ - cout << __func__ << ": event received:" << (int)e.code << endl +#define DEBUG_PRINT cout << __func__ << ": event received:" << (int)e << endl using namespace std; HSMUTTest::HSMUTTest() : HSM(&HSMUTTest::state_initialization) { - sEventBroker.subscribe(this, TOPIC_TEST); + EventBroker::getInstance().subscribe(this, TOPIC_TEST); } State HSMUTTest::state_initialization(const Event& e) @@ -105,7 +104,7 @@ State HSMUTTest::state_S(const Event& e) { State retState = HANDLED; DEBUG_PRINT; - switch (e.code) + switch (e) { case EV_ENTRY: break; @@ -138,7 +137,7 @@ State HSMUTTest::state_S1(const Event& e) { State retState = HANDLED; DEBUG_PRINT; - switch (e.code) + switch (e) { case EV_ENTRY: break; @@ -184,7 +183,7 @@ State HSMUTTest::state_S11(const Event& e) { State retState = HANDLED; DEBUG_PRINT; - switch (e.code) + switch (e) { case EV_ENTRY: break; @@ -220,7 +219,7 @@ State HSMUTTest::state_S2(const Event& e) { State retState = HANDLED; DEBUG_PRINT; - switch (e.code) + switch (e) { case EV_ENTRY: break; @@ -256,7 +255,7 @@ State HSMUTTest::state_S21(const Event& e) { State retState = HANDLED; DEBUG_PRINT; - switch (e.code) + switch (e) { case EV_ENTRY: break; @@ -281,7 +280,7 @@ State HSMUTTest::state_S211(const Event& e) { State retState = HANDLED; DEBUG_PRINT; - switch (e.code) + switch (e) { case EV_ENTRY: break; @@ -309,7 +308,7 @@ State HSMUTTest::state_S211(const Event& e) int main() { - sEventBroker.start(); + EventBroker::getInstance().start(); HSMUTTest& hsm = HSMUTTest::getInstance(); hsm.start();