Merge remote-tracking branch 'origin/feature/message_router_updates' into development

This commit is contained in:
John Wellbelove 2019-05-27 12:01:39 +01:00
commit dcf283b134
9 changed files with 379 additions and 97 deletions

View File

@ -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()
{
}

View File

@ -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.

View File

@ -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<etl::imessage_bus&>(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<etl::imessage_bus&>(**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:
//*******************************************

View File

@ -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;
}
};
}

View File

@ -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]]]*/

View File

@ -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<etl::imessage_bus&>(*(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

View File

@ -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)

View File

@ -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,

View File

@ -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);