<html><head> | |
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | |
<title>Frontend / Backend interface</title><link rel="stylesheet" href="boostbook.css" type="text/css"><meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2"><link rel="home" href="index.html" title="Meta State Machine (MSM) V2.12"><link rel="up" href="ch06.html" title="Chapter 6. Internals"><link rel="prev" href="ch06.html" title="Chapter 6. Internals"><link rel="next" href="ch06s03.html" title="Generated state ids"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Frontend / Backend | |
interface</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch06.html">Prev</a> </td><th width="60%" align="center">Chapter 6. Internals</th><td width="20%" align="right"> <a accesskey="n" href="ch06s03.html">Next</a></td></tr></table><hr></div><div class="sect1" title="Frontend / Backend interface"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2722"></a><span class="command"><strong><a name="internals-front-back-interface"></a></strong></span>Frontend / Backend | |
interface</h2></div></div></div><p>The design of MSM tries to make front-ends and back-ends (later) to be as | |
interchangeable as possible. Of course, no back-end will ever implement every | |
feature defined by any possible front-end and inversely, but the goal is to make | |
it as easy as possible to extend the current state of the library.</p><p>To achieve this, MSM divides the functionality between both sides: the | |
front-end is a sort of user interface and is descriptive, the back-end | |
implements the state machine engine.</p><p>MSM being based on a transition table, a concrete state machine (or a given | |
front-end) must provide a transition_table. This transition table must be made | |
of rows. And each row must tell what kind of transition it is and implement the | |
calls to the actions and guards. A state machine must also define its regions | |
(marked by initial states) And that is about the only constraints for | |
front-ends. How the rows are described is implementer's choice. </p><p>Every row must provide:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>A <code class="code">Source</code> typedef indicating, well, the type of the source | |
state.</p></li><li class="listitem"><p>A <code class="code">Target</code> typedef indicating, well, the type of the target | |
state.</p></li><li class="listitem"><p>A <code class="code">Evt</code> typedef indicating the type of the event triggering | |
the transition.</p></li><li class="listitem"><p>A <code class="code">row_type_tag</code> typedef indicating the type of the | |
transition.</p></li><li class="listitem"><p>Rows having a type requiring transition actions must provide a static | |
function <code class="code">action_call</code> with the following signature: <code class="code"> | |
template <class Fsm,class SourceState,class TargetState,class | |
AllStates> </code></p><p><code class="code">static void action_call (Fsm& fsm, Event const& evt, | |
SourceState&, TargetState&, AllStates&) </code></p><p>The function gets as parameters the (back-end) state machine, the | |
event, source and target states and a container (in the current | |
back-end, a fusion::set) of all the states defined in the state machine. | |
For example, as the back-end has the front-end as basic class, | |
<code class="code">action_call</code> is simply defined as | |
<code class="code">(fsm.*action)(evt)</code>.</p></li><li class="listitem"><p>Rows having a type requiring a guard must provide a static function | |
<code class="code">guard_call</code> with the following signature:<code class="code"> </code></p><p><code class="code">template <class Fsm,class SourceState,class TargetState,class | |
AllStates></code></p><p><code class="code">static bool guard_call (Fsm&, Event const&, | |
SourceState&, TargetState&, AllStates&)</code></p></li><li class="listitem"><p>The possible transition (row) types are:</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>a_row_tag: a transition with actions and no guard</p></li><li class="listitem"><p>g_row_type: a transition with a guard and no | |
actions</p></li><li class="listitem"><p>_row_tag: a transition without actions or guard</p></li><li class="listitem"><p>row_tag: a transition with guard and actions</p></li><li class="listitem"><p>a_irow_tag: an internal transition (defined inside the | |
<code class="code">transition_table</code>) with actions</p></li><li class="listitem"><p>g_irow_tag: an internal transition (defined inside the | |
<code class="code">transition_table</code>) with guard</p></li><li class="listitem"><p>irow_tag: an internal transition (defined inside the | |
<code class="code">transition_table</code>) with actions and | |
guards</p></li><li class="listitem"><p>_irow_tag: an internal transition (defined inside the | |
<code class="code">transition_table</code>) without action or guard. | |
Due to higher priority for internal transitions, this is | |
equivalent to a "ignore event"</p></li><li class="listitem"><p>sm_a_i_row_tag: an internal transition (defined inside the | |
<code class="code">internal_transition_table</code>) with | |
actions</p></li><li class="listitem"><p>sm_g_i_row_tag: an internal transition (defined inside the | |
<code class="code">internal_transition_table</code>) with | |
guard</p></li><li class="listitem"><p>sm_i_row_tag: an internal transition (defined inside the | |
<code class="code">internal_transition_table</code>) with actions and | |
guards</p></li><li class="listitem"><p>sm__i_row_tag: an internal transition (defined inside the | |
<code class="code">internal_transition_table</code>) without action | |
or guard. Due to higher priority for internal transitions, | |
this is quivalent to a "ignore event"</p></li></ul></div></li></ul></div><p>Furthermore, a front-end must provide the definition of states and state | |
machines. State machine definitions must provide (the implementer is free to | |
provide it or let it be done by every concrete state machine. Different MSM | |
front-ends took one or the other approach):</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="code">initial_state</code>: This typedef can be a single state or | |
a mpl container and provides the initial states defining one or | |
several orthogonal regions.</p></li><li class="listitem"><p><code class="code">transition_table</code>: This typedef is a MPL sequence of | |
transition rows.</p></li><li class="listitem"><p><code class="code">configuration</code>: this typedef is a MPL sequence of | |
known types triggering special behavior in the back-end, for example | |
if a concrete fsm requires a message queue or exception | |
catching.</p></li></ul></div><p>States and state machines must both provide a (possibly empty) definition of:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="code">flag_list</code>: the flags being active when this state or | |
state machine become the current state of the fsm.</p></li><li class="listitem"><p><code class="code">deferred_events</code>: events being automatically deferred | |
when the state is the current state of the fsm.</p></li><li class="listitem"><p><code class="code">internal_transition_table</code>: the internal transitions | |
of this state.</p></li><li class="listitem"><p><code class="code">on_entry</code> and <code class="code">on_exit</code> methods.</p></li></ul></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch06.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch06.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch06s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 6. Internals </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> Generated state ids </td></tr></table></div></body></html> |