diff --git a/include/etl/fsm.h b/include/etl/fsm.h index 8ba4b972..84bb34c7 100644 --- a/include/etl/fsm.h +++ b/include/etl/fsm.h @@ -238,7 +238,7 @@ namespace etl /// Starts the FSM. /// Can only be called once. /// Subsequent calls will do nothing. - ///\param call_on_enter_state If will call on_enter_state() for the first state. Default = true. + ///\param call_on_enter_state If true will call on_enter_state() for the first state. Default = true. //******************************************* void start(bool call_on_enter_state = true) { @@ -273,6 +273,17 @@ namespace etl receive(nmr, message); } + //******************************************* + /// Top level message handler for the FSM. + //******************************************* + void receive(imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& message) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, message); + } + } + //******************************************* /// Top level message handler for the FSM. //******************************************* @@ -360,6 +371,12 @@ namespace etl p_state = nullptr; } + //******************************************** + bool is_null_router() const + { + return false; + } + private: etl::ifsm_state* p_state; ///< A pointer to the current state. @@ -390,7 +407,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -455,7 +472,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -519,7 +536,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -582,7 +599,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -643,7 +660,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -703,7 +720,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -762,7 +779,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -820,7 +837,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -876,7 +893,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -931,7 +948,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -985,7 +1002,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -1038,7 +1055,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -1089,7 +1106,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -1139,7 +1156,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -1188,7 +1205,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -1236,7 +1253,7 @@ namespace etl } protected: - + ~fsm_state() { } @@ -1280,9 +1297,9 @@ namespace etl : ifsm_state(STATE_ID) { } - + protected: - + ~fsm_state() { } diff --git a/include/etl/fsm_generator.h b/include/etl/fsm_generator.h index 176fa60d..4dbe9715 100644 --- a/include/etl/fsm_generator.h +++ b/include/etl/fsm_generator.h @@ -285,6 +285,17 @@ namespace etl receive(nmr, message); } + //******************************************* + /// Top level message handler for the FSM. + //******************************************* + void receive(imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& message) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, message); + } + } + //******************************************* /// Top level message handler for the FSM. //******************************************* @@ -372,6 +383,12 @@ namespace etl p_state = nullptr; } + //******************************************** + bool is_null_router() const + { + return false; + } + private: etl::ifsm_state* p_state; ///< A pointer to the current state. diff --git a/include/etl/message_bus.h b/include/etl/message_bus.h index 90d9b01f..7e19ccd6 100644 --- a/include/etl/message_bus.h +++ b/include/etl/message_bus.h @@ -102,21 +102,12 @@ namespace etl if (ok) { - if (router.is_bus()) - { - // Message busses get added to the end. - router_list.push_back(&router); - } - else - { - // Routers get added in id order. - router_list_t::iterator irouter = std::upper_bound(router_list.begin(), - router_list.end(), - router.get_message_router_id(), - compare_router_id()); + router_list_t::iterator irouter = std::upper_bound(router_list.begin(), + router_list.end(), + router.get_message_router_id(), + compare_router_id()); - router_list.insert(irouter, &router); - } + router_list.insert(irouter, &router); } } @@ -203,17 +194,9 @@ namespace etl { etl::imessage_router& router = **irouter; - if (router.is_bus()) + if (router.accepts(message.message_id)) { - // The router is actually a bus. - etl::imessage_bus& bus = static_cast(router); - - // So pass it on. - bus.receive(source, destination_router_id, message); - } - else if (router.accepts(message.message_id)) - { - router.receive(source, message); + router.receive(source, destination_router_id, message); } ++irouter; @@ -254,11 +237,8 @@ namespace etl while (irouter != router_list.end()) { - // The router is actually a bus. - etl::imessage_bus& bus = static_cast(**irouter); - // So pass it on. - bus.receive(source, destination_router_id, message); + (*irouter)->receive(source, destination_router_id, message); ++irouter; } @@ -291,6 +271,12 @@ namespace etl return router_list.clear(); } + //******************************************** + bool is_null_router() const + { + return false; + } + protected: //******************************************* diff --git a/include/etl/message_router.h b/include/etl/message_router.h index 884910b7..26a68b45 100644 --- a/include/etl/message_router.h +++ b/include/etl/message_router.h @@ -102,7 +102,9 @@ namespace etl virtual ~imessage_router() {} virtual void receive(const etl::imessage& message) = 0; virtual void receive(imessage_router& source, const etl::imessage& message) = 0; + virtual void receive(imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& message) = 0; virtual bool accepts(etl::message_id_t id) const = 0; + virtual bool is_null_router() const = 0; //******************************************** bool accepts(const etl::imessage& msg) const @@ -116,18 +118,6 @@ namespace etl return message_router_id; } - //******************************************** - bool is_null_router() const - { - return (message_router_id == NULL_MESSAGE_ROUTER); - } - - //******************************************** - bool is_bus() const - { - return (message_router_id == MESSAGE_BUS); - } - //******************************************** void set_successor(imessage_router& successor_) { @@ -203,12 +193,23 @@ namespace etl { } + //******************************************** + void receive(imessage_router&, etl::message_router_id_t, const etl::imessage&) + { + } + //******************************************** bool accepts(etl::message_id_t) const { return false; } + //******************************************** + bool is_null_router() const + { + return true; + } + //******************************************** static null_message_router& instance() { @@ -369,6 +370,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -421,6 +431,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -554,6 +570,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -605,6 +630,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -736,6 +767,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -786,6 +826,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -915,6 +961,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -964,6 +1019,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -1090,6 +1151,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -1138,6 +1208,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -1262,6 +1338,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -1309,6 +1394,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -1431,6 +1522,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -1477,6 +1577,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -1597,6 +1703,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -1642,6 +1757,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -1759,6 +1880,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -1803,6 +1933,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -1918,6 +2054,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -1960,6 +2105,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -2073,6 +2224,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -2114,6 +2274,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -2225,6 +2391,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -2265,6 +2440,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -2373,6 +2554,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -2412,6 +2602,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -2518,6 +2714,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -2556,6 +2761,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -2660,6 +2871,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -2697,6 +2917,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; //*************************************************************************** @@ -2799,6 +3025,15 @@ namespace etl receive(etl::null_message_router::instance(), msg); } + //********************************************** + void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg) + { + if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS)) + { + receive(source, msg); + } + } + //********************************************** void receive(etl::imessage_router& source, const etl::imessage& msg) { @@ -2835,6 +3070,12 @@ namespace etl return false; break; } } + + //******************************************** + bool is_null_router() const + { + return false; + } }; } diff --git a/include/etl/message_router_generator.h b/include/etl/message_router_generator.h index 44c6a44b..8049b5e1 100644 --- a/include/etl/message_router_generator.h +++ b/include/etl/message_router_generator.h @@ -114,7 +114,9 @@ namespace etl virtual ~imessage_router() {} virtual void receive(const etl::imessage& message) = 0; virtual void receive(imessage_router& source, const etl::imessage& message) = 0; + virtual void receive(imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& message) = 0; virtual bool accepts(etl::message_id_t id) const = 0; + virtual bool is_null_router() const = 0; //******************************************** bool accepts(const etl::imessage& msg) const @@ -128,18 +130,6 @@ namespace etl return message_router_id; } - //******************************************** - bool is_null_router() const - { - return (message_router_id == NULL_MESSAGE_ROUTER); - } - - //******************************************** - bool is_bus() const - { - return (message_router_id == MESSAGE_BUS); - } - //******************************************** void set_successor(imessage_router& successor_) { @@ -215,12 +205,23 @@ namespace etl { } + //******************************************** + void receive(imessage_router&, etl::message_router_id_t, const etl::imessage&) + { + } + //******************************************** bool accepts(etl::message_id_t) const { return false; } + //******************************************** + bool is_null_router() const + { + return true; + } + //******************************************** static null_message_router& instance() { @@ -376,6 +377,15 @@ namespace etl cog.outl(" }") cog.outl("") cog.outl(" //**********************************************") + cog.outl(" void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg)") + cog.outl(" {") + cog.outl(" if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))") + cog.outl(" {") + cog.outl(" receive(source, msg);") + cog.outl(" }") + cog.outl(" }") + cog.outl("") + cog.outl(" //**********************************************") cog.outl(" void receive(etl::imessage_router& source, const etl::imessage& msg)") cog.outl(" {") cog.outl(" const etl::message_id_t id = msg.message_id;") @@ -419,6 +429,12 @@ namespace etl cog.outl(" return false; break;") cog.outl(" }") cog.outl(" }") + cog.outl("") + cog.outl(" //********************************************") + cog.outl(" bool is_null_router() const") + cog.outl(" {") + cog.outl(" return false;") + cog.outl(" }") cog.outl("};") #################################### @@ -561,6 +577,15 @@ namespace etl cog.outl(" }") cog.outl("") cog.outl(" //**********************************************") + cog.outl(" void receive(etl::imessage_router& source, etl::message_router_id_t destination_router_id, const etl::imessage& msg)") + cog.outl(" {") + cog.outl(" if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))") + cog.outl(" {") + cog.outl(" receive(source, msg);") + cog.outl(" }") + cog.outl(" }") + cog.outl("") + cog.outl(" //**********************************************") cog.outl(" void receive(etl::imessage_router& source, const etl::imessage& msg)") cog.outl(" {") cog.outl(" const size_t id = msg.message_id;") @@ -605,6 +630,12 @@ namespace etl cog.outl(" return false; break;") cog.outl(" }") cog.outl(" }") + cog.outl("") + cog.outl(" //********************************************") + cog.outl(" bool is_null_router() const") + cog.outl(" {") + cog.outl(" return false;") + cog.outl(" }") cog.outl("};") ]]]*/ /*[[[end]]]*/ diff --git a/include/etl/message_timer.h b/include/etl/message_timer.h index 1da2f363..4e554121 100644 --- a/include/etl/message_timer.h +++ b/include/etl/message_timer.h @@ -63,7 +63,7 @@ SOFTWARE. #if !defined(ETL_MESSAGE_TIMER_DISABLE_INTERRUPTS) || !defined(ETL_MESSAGE_TIMER_ENABLE_INTERRUPTS) #error ETL_MESSAGE_TIMER_DISABLE_INTERRUPTS and/or ETL_MESSAGE_TIMER_ENABLE_INTERRUPTS not defined #endif - + #define ETL_DISABLE_TIMER_UPDATES (ETL_MESSAGE_TIMER_DISABLE_INTERRUPTS) #define ETL_ENABLE_TIMER_UPDATES (ETL_MESSAGE_TIMER_ENABLE_INTERRUPTS) #define ETL_TIMER_UPDATES_ENABLED true @@ -95,24 +95,17 @@ namespace etl etl::imessage_router& irouter_, uint32_t period_, bool repeating_, - etl::message_router_id_t destination_router_id_) + etl::message_router_id_t destination_router_id_ = etl::imessage_bus::ALL_MESSAGE_ROUTERS) : p_message(&message_), p_router(&irouter_), period(period_), delta(etl::timer::state::INACTIVE), + destination_router_id(destination_router_id_), id(id_), previous(etl::timer::id::NO_TIMER), next(etl::timer::id::NO_TIMER), repeating(repeating_) { - if (irouter_.is_bus()) - { - destination_router_id = destination_router_id_; - } - else - { - destination_router_id = etl::imessage_bus::ALL_MESSAGE_ROUTERS; - } } //******************************************* @@ -471,17 +464,8 @@ namespace etl if (timer.p_router != nullptr) { - if (timer.p_router->is_bus()) - { - // Send to a message bus. - etl::imessage_bus& bus = static_cast(*(timer.p_router)); - bus.receive(timer.destination_router_id, *(timer.p_message)); - } - else - { - // Send to a router. - timer.p_router->receive(*(timer.p_message)); - } + static etl::null_message_router nmr; + timer.p_router->receive(nmr, timer.destination_router_id, *(timer.p_message)); } has_active = !active_list.empty(); @@ -576,7 +560,7 @@ namespace etl timer_array[id_].period = period_; return true; } - + return false; } @@ -627,7 +611,7 @@ namespace etl private_message_timer::list active_list; volatile bool enabled; - + #if defined(ETL_MESSAGE_TIMER_USE_ATOMIC_LOCK) volatile etl::timer_semaphore_t process_semaphore; #endif diff --git a/include/etl/version.h b/include/etl/version.h index 970ebd80..269c6153 100644 --- a/include/etl/version.h +++ b/include/etl/version.h @@ -38,7 +38,7 @@ SOFTWARE. ///\ingroup utilities #define ETL_VERSION_MAJOR 14 -#define ETL_VERSION_MINOR 25 +#define ETL_VERSION_MINOR 26 #define ETL_VERSION_PATCH 0 #define ETL_VERSION ETL_STRINGIFY(ETL_VERSION_MAJOR) ETL_STRINGIFY(ETL_VERSION_MINOR) ETL_STRINGIFY(ETL_VERSION_PATCH) diff --git a/support/Release notes.txt b/support/Release notes.txt index 0d23f4a8..5ac382ca 100644 --- a/support/Release notes.txt +++ b/support/Release notes.txt @@ -1,3 +1,9 @@ +=============================================================================== +14.26.0 +Simplified message framework internal code. +Additional receive() virtual function overload taking destination id. +Removed is_bus() member function. + =============================================================================== 14.25.0 Added variadic template versions of etl::largest, etl::largest_type, diff --git a/test/test_message_bus.cpp b/test/test_message_bus.cpp index 483a914e..db4dfba6 100644 --- a/test/test_message_bus.cpp +++ b/test/test_message_bus.cpp @@ -255,10 +255,10 @@ namespace RouterA router3(ROUTER3); RouterA router4(ROUTER4); - bus1.subscribe(router1); - bus1.subscribe(router2); bus1.subscribe(bus2); + bus1.subscribe(router1); bus1.subscribe(bus3); + bus1.subscribe(router2); bus2.subscribe(router3); bus3.subscribe(router4);