29 #ifndef ETL_MESSAGE_BUS_
30 #define ETL_MESSAGE_BUS_
41 #include "message_types.h"
43 #include "message_router.h"
71 :
message_bus_exception(ETL_ERROR_TEXT(
"message bus:too many subscribers", ETL_FILE
"A"), file_name_, line_number_)
87 using etl::imessage_router::receive;
97 if (router.is_consumer())
99 ok = !router_list.
full();
105 router_list_t::iterator irouter = etl::upper_bound(router_list.
begin(),
107 router.get_message_router_id(),
108 compare_router_id());
110 router_list.
insert(irouter, &router);
122 if (
id == etl::imessage_bus::ALL_MESSAGE_ROUTERS)
128 ETL_OR_STD::pair<router_list_t::iterator, router_list_t::iterator> range = etl::equal_range(router_list.
begin(),
131 compare_router_id());
133 router_list.
erase(range.first, range.second);
140 router_list_t::iterator irouter = etl::find(router_list.
begin(),
144 if (irouter != router_list.
end())
146 router_list.
erase(irouter);
154 receive(nmr, etl::imessage_router::ALL_MESSAGE_ROUTERS, message);
158 void receive(etl::message_router_id_t destination_router_id,
162 receive(nmr, destination_router_id, message);
169 receive(source, etl::imessage_router::ALL_MESSAGE_ROUTERS, message);
174 etl::message_router_id_t destination_router_id,
177 switch (destination_router_id)
181 case etl::imessage_router::ALL_MESSAGE_ROUTERS:
183 router_list_t::iterator irouter = router_list.
begin();
186 while (irouter != router_list.
end())
190 if (router.accepts(message.message_id))
192 router.receive(source, message);
205 router_list_t::iterator irouter = router_list.
begin();
208 ETL_OR_STD::pair<router_list_t::iterator, router_list_t::iterator> range = etl::equal_range(router_list.
begin(),
210 destination_router_id,
211 compare_router_id());
214 while (range.first != range.second)
216 if ((*(range.first))->accepts(message.message_id))
218 (*(range.first))->receive(source, message);
226 irouter = etl::lower_bound(router_list.
begin(),
228 etl::imessage_bus::MESSAGE_BUS,
229 compare_router_id());
231 while (irouter != router_list.
end())
234 (*irouter)->receive(source, destination_router_id, message);
244 using imessage_router::accepts;
258 return router_list.
size();
264 return router_list.
clear();
268 ETL_DEPRECATED
bool is_null_router() const ETL_OVERRIDE
274 bool is_producer() const ETL_OVERRIDE
280 bool is_consumer() const ETL_OVERRIDE
301 struct compare_router_id
305 return prouter->get_message_router_id() < id;
310 return id < prouter->get_message_router_id();
314 router_list_t& router_list;
320 template <u
int_least8_t MAX_ROUTERS_>
344 bus.receive(message);
351 etl::message_router_id_t
id,
354 bus.receive(
id, message);
364 bus.receive(source, message);
372 etl::message_router_id_t
id,
375 bus.receive(source,
id, message);
Interface for message bus.
Definition: message_bus.h:80
bool accepts(etl::message_id_t) const ETL_OVERRIDE
Definition: message_bus.h:250
bool subscribe(etl::imessage_router &router)
Subscribe to the bus.
Definition: message_bus.h:92
void unsubscribe(etl::message_router_id_t id)
Unsubscribe from the bus.
Definition: message_bus.h:120
imessage_bus(router_list_t &list)
Constructor.
Definition: message_bus.h:290
This is the base of all message routers.
Definition: message_router_generator.h:114
A templated list implementation that uses a fixed size buffer.
Definition: list.h:2029
Base exception class for message bus.
Definition: message_bus.h:54
Too many subscribers.
Definition: message_bus.h:67
The message bus.
Definition: message_bus.h:322
message_bus()
Constructor.
Definition: message_bus.h:328
This router can be used as a sink for messages or a 'null source' router.
Definition: message_router_generator.h:194
#define ETL_ASSERT(b, e)
Definition: error_handler.h:290
Definition: exception.h:47
iterator begin()
Definition: vector.h:108
iterator insert(iterator position, const_reference value)
Definition: vector.h:531
void clear()
Clears the vector.
Definition: vector.h:398
iterator end()
Definition: vector.h:126
bool full() const
Definition: vector.h:914
size_type size() const
Definition: vector.h:896
iterator erase(iterator i_element)
Definition: vector.h:820
Definition: absolute.h:37
uint_least8_t message_id_t
Allow alternative type for message id.
Definition: message_types.h:40