29#ifndef ETL_MESSAGE_BUS_INCLUDED
30#define ETL_MESSAGE_BUS_INCLUDED
38#include "message_types.h"
40#include "message_router.h"
67 :
message_bus_exception(ETL_ERROR_TEXT(
"message bus:too many subscribers", ETL_MESSAGE_BUS_FILE_ID
"A"), file_name_, line_number_)
83 using etl::imessage_router::receive;
93 if (router.is_consumer())
95 ok = !router_list.
full();
103 router.get_message_router_id(),
104 compare_router_id());
106 router_list.
insert(irouter, &router);
118 if (
id == etl::imessage_bus::ALL_MESSAGE_ROUTERS)
124 ETL_OR_STD::pair<router_list_t::iterator, router_list_t::iterator> range = etl::equal_range(router_list.
begin(),
127 compare_router_id());
129 router_list.
erase(range.first, range.second);
136 router_list_t::iterator irouter = etl::find(router_list.
begin(),
140 if (irouter != router_list.
end())
142 router_list.
erase(irouter);
147 virtual void receive(
const etl::imessage& message) ETL_OVERRIDE
149 receive(etl::imessage_router::ALL_MESSAGE_ROUTERS, message);
155 receive(etl::imessage_router::ALL_MESSAGE_ROUTERS, shared_msg);
159 virtual void receive(etl::message_router_id_t destination_router_id,
162 switch (destination_router_id)
166 case etl::imessage_router::ALL_MESSAGE_ROUTERS:
168 router_list_t::iterator irouter = router_list.
begin();
171 while (irouter != router_list.
end())
175 if (router.accepts(message.get_message_id()))
177 router.receive(message);
190 router_list_t::iterator irouter = router_list.
begin();
193 ETL_OR_STD::pair<router_list_t::iterator, router_list_t::iterator> range = etl::equal_range(router_list.
begin(),
195 destination_router_id,
196 compare_router_id());
199 while (range.first != range.second)
201 if ((*(range.first))->accepts(message.get_message_id()))
203 (*(range.first))->receive(message);
211 irouter = etl::lower_bound(router_list.
begin(),
213 etl::imessage_bus::MESSAGE_BUS,
214 compare_router_id());
216 while (irouter != router_list.
end())
219 (*irouter)->receive(destination_router_id, message);
232 if (
successor.accepts(message.get_message_id()))
234 successor.receive(destination_router_id, message);
240 virtual void receive(etl::message_router_id_t destination_router_id,
243 switch (destination_router_id)
247 case etl::imessage_router::ALL_MESSAGE_ROUTERS:
249 router_list_t::iterator irouter = router_list.
begin();
252 while (irouter != router_list.
end())
256 if (router.accepts(shared_msg.get_message().get_message_id()))
258 router.receive(shared_msg);
272 ETL_OR_STD::pair<router_list_t::iterator, router_list_t::iterator> range = etl::equal_range(router_list.
begin(),
274 destination_router_id,
275 compare_router_id());
278 while (range.first != range.second)
280 if ((*(range.first))->accepts(shared_msg.get_message().get_message_id()))
282 (*(range.first))->receive(shared_msg);
290 router_list_t::iterator irouter = etl::lower_bound(router_list.
begin(),
292 etl::imessage_bus::MESSAGE_BUS,
293 compare_router_id());
295 while (irouter != router_list.
end())
298 (*irouter)->receive(destination_router_id, shared_msg);
311 if (
successor.accepts(shared_msg.get_message().get_message_id()))
313 successor.receive(destination_router_id, shared_msg);
318 using imessage_router::accepts;
332 return router_list.
size();
342 ETL_DEPRECATED
bool is_null_router() const ETL_OVERRIDE
348 bool is_producer() const ETL_OVERRIDE
354 bool is_consumer() const ETL_OVERRIDE
384 struct compare_router_id
388 return prouter->get_message_router_id() < id;
393 return id < prouter->get_message_router_id();
397 router_list_t& router_list;
403 template <u
int_least8_t MAX_ROUTERS_>
Interface for message bus.
Definition: message_bus.h:76
imessage_bus(router_list_t &list, etl::imessage_router &successor)
Constructor.
Definition: message_bus.h:373
bool accepts(etl::message_id_t) const ETL_OVERRIDE
Definition: message_bus.h:324
bool subscribe(etl::imessage_router &router)
Subscribe to the bus.
Definition: message_bus.h:88
void unsubscribe(etl::message_router_id_t id)
Unsubscribe from the bus.
Definition: message_bus.h:116
imessage_bus(router_list_t &list)
Constructor.
Definition: message_bus.h:364
This is the base of all message routers.
Definition: message_router_generator.h:121
A templated list implementation that uses a fixed size buffer.
Definition: list.h:2030
Base exception class for message bus.
Definition: message_bus.h:50
Too many subscribers.
Definition: message_bus.h:63
The message bus.
Definition: message_bus.h:405
message_bus()
Constructor.
Definition: message_bus.h:411
message_bus(etl::imessage_router &successor)
Constructor.
Definition: message_bus.h:419
Definition: shared_message.h:49
Adds successor traits to a class.
Definition: successor.h:73
bool has_successor() const
Does this have a successor?
Definition: successor.h:184
successor_type & get_successor() const
Definition: successor.h:174
successor()
Default constructor.
Definition: successor.h:81
#define ETL_ASSERT(b, e)
Definition: error_handler.h:316
Definition: exception.h:47
iterator begin()
Definition: vector.h:100
void clear()
Clears the vector.
Definition: vector.h:414
iterator end()
Definition: vector.h:118
bool full() const
Definition: vector.h:977
size_type size() const
Definition: vector.h:959
iterator erase(iterator i_element)
Definition: vector.h:865
iterator insert(const_iterator position, const_reference value)
Definition: vector.h:560
bitset_ext
Definition: absolute.h:38
uint_least8_t message_id_t
Allow alternative type for message id.
Definition: message_types.h:40