| <?xml version="1.0" encoding="iso-8859-1" ?> |
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
| "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| <!--http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd--> |
| <html xmlns="http://www.w3.org/1999/xhtml" |
| > |
| <head><title>Tutorial Ping Pong (Java and C)</title> |
| <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> |
| <meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/)" /> |
| <meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/)" /> |
| <!-- xhtml,3,next,html --> |
| <meta name="src" content="etrice-doc.tex" /> |
| <meta name="date" content="2015-08-27 23:56:00" /> |
| <link rel="stylesheet" type="text/css" href="etrice-doc.css" /> |
| </head><body |
| > |
| <!--l. 1--><div class="crosslinks"><p class="noindent">[<a |
| href="etrice-docse7.html" >next</a>] [<a |
| href="etrice-docse5.html" >prev</a>] [<a |
| href="etrice-docse5.html#tailetrice-docse5.html" >prev-tail</a>] [<a |
| href="#tailetrice-docse6.html">tail</a>] [<a |
| href="etrice-docch2.html#etrice-docse6.html" >up</a>] </p></div> |
| <h3 class="sectionHead"><span class="titlemark">2.4 </span> <a |
| id="x10-320004"></a>Tutorial Ping Pong (Java and C)</h3> |
| <a |
| id="x10-32001r47"></a> |
| <h4 class="subsectionHead"><span class="titlemark">2.4.1 </span> <a |
| id="x10-330001"></a>Scope</h4> |
| <!--l. 6--><p class="noindent" >This tutorial describes how to create a simple hierarchical actor system of actors communicating via ports and bindings. |
| Additionally you will use the Timing Service from the eTrice model library. This tutorial can be done for the target languages |
| Java or C. For the Ping Pong scenario we want to create a model with a sender and a reveiver of a message. |
| The receiver has to wait for the ping message from the sender, wait for a second and respond with a pong |
| message. |
| </p><!--l. 11--><p class="noindent" >The resulting Message Sequence Chart (MSC) at the end of this tutorial should look like this: |
| </p><!--l. 13--><p class="noindent" ><img |
| src="images/015-msc.png" alt="PIC" |
| /> |
| </p><!--l. 15--><p class="noindent" >We will take this MSC as specification for the desired behavior. |
| <a |
| id="x10-33001r49"></a> |
| </p> |
| <h4 class="subsectionHead"><span class="titlemark">2.4.2 </span> <a |
| id="x10-340002"></a>Create the structure</h4> |
| <!--l. 19--><p class="noindent" >We start by opening the <span |
| class="ec-lmsso-10">TemplateModel.room </span>from the template project as presented in Getting Started. As described |
| previously <span |
| class="ec-lmsso-10">topActor </span>is currently the only active actor. Furthermore the model provides a building kit for this tutorial, |
| consisting of </p> |
| <ul class="itemize1"> |
| <li class="itemize">ProtocolClass <span |
| class="ec-lmsso-10">PingPongProtocol</span>: Defining the incoming message <span |
| class="ec-lmsso-10">ping </span>and outgoing <span |
| class="ec-lmsso-10">pong </span>according the |
| specification |
| </li> |
| <li class="itemize">ActorClass <span |
| class="ec-lmsso-10">Receiver</span>: Defining a (regular) Port of type PingPongProtocol, which receives the incoming messages |
| and sends the outgoing message. Additionally it has a reference to the <span |
| class="ec-lmsso-10">TimingService</span>. |
| </li> |
| <li class="itemize">ActorClass <span |
| class="ec-lmsso-10">Sender</span>: Defining the <span |
| class="ec-lmssbx-10">conjugated </span>Port of type PingPongProtocol, which handles the messages |
| vice-versa</li></ul> |
| <div class="tabular"> <table id="TBL-4" class="tabular" |
| cellspacing="0" cellpadding="0" rules="groups" |
| ><colgroup id="TBL-4-1g"><col |
| id="TBL-4-1" /></colgroup><colgroup id="TBL-4-2g"><col |
| id="TBL-4-2" /></colgroup><colgroup id="TBL-4-3g"><col |
| id="TBL-4-3" /></colgroup><tr |
| style="vertical-align:baseline;" id="TBL-4-1-"><td style="white-space:nowrap; text-align:center;" id="TBL-4-1-1" |
| class="td11"> <!--l. 27--> <!--l. 27--><p class="noindent" ><div class="lstlisting" id="listing-1"><span class="label"><a |
| id="x10-34001r1"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">ProtocolClass</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">PingPongProtocol</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">{</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34002r2"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">incoming</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">{</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34003r3"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">Message</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">ping</span><span |
| class="ec-lmtt-9">()</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34004r4"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">}</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34005r5"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">outgoing</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">{</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34006r6"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">Message</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">pong</span><span |
| class="ec-lmtt-9">()</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34007r7"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">}</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34008r8"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">}</span> </p> </div> </td><td style="white-space:nowrap; text-align:center;" id="TBL-4-1-2" |
| class="td11"> <!--l. 37--> <!--l. 37--><p class="noindent" ><div class="lstlisting" id="listing-2"><span class="label"><a |
| id="x10-34009r1"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">ActorClass</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">Receiver</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">{</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34010r2"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">Interface</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">{</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34011r3"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">Port</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">recvPort</span><span |
| class="ec-lmtt-9">:</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">PingPongProtocol</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34012r4"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">}</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34013r5"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">Structure</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">{</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34014r6"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">external</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">Port</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">recvPort</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34015r7"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">SAP</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">timingService</span><span |
| class="ec-lmtt-9">:</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">PTimer</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34016r8"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">}</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34017r9"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">//</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">...</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34018r10"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">}</span> </p> </div> </td><td style="white-space:nowrap; text-align:center;" id="TBL-4-1-3" |
| class="td11"> <!--l. 49--> <!--l. 49--><p class="noindent" ><div class="lstlisting" id="listing-3"><span class="label"><a |
| id="x10-34019r1"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">ActorClass</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">Sender</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">{</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34020r2"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">Interface</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">{</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34021r3"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">conjugated</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">Port</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">sendPort</span><span |
| class="ec-lmtt-9">:</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34022r4"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">PingPongProtocol</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34023r5"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">}</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34024r6"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">Structure</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">{</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34025r7"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">external</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">Port</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">sendPort</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34026r8"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">}</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34027r9"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">//</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">...</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x10-34028r10"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">}</span> </p> </div> </td> |
| </tr></table></div> |
| <!--l. 64--><p class="noindent" >Note: The naming <span |
| class="ec-lmsso-10">Sender Receiver </span>is based on the first message exchange. <span |
| class="ec-lmsso-10">Sender </span>is the first actor supposed to send a |
| message (<span |
| class="ec-lmsso-10">ping</span>) and <span |
| class="ec-lmsso-10">Receiver </span>is the first actor to receive this message. Afterwards they change their roles and it is vice-versa |
| for message <span |
| class="ec-lmsso-10">pong</span>. |
| </p><!--l. 66--><p class="noindent" >Remaining tasks: </p> |
| <ul class="itemize1"> |
| <li class="itemize">creating actor hierarchic actor structure by using classes <span |
| class="ec-lmsso-10">Sender Receiver</span> |
| </li> |
| <li class="itemize">establish port binding |
| </li> |
| <li class="itemize">define the behavior of both actors |
| </li> |
| <li class="itemize">use the <span |
| class="ec-lmsso-10">TimingService</span> |
| |
| |
| </li> |
| <li class="itemize">generate and run application, then verify resulting MSC</li></ul> |
| <!--l. 75--><p class="noindent" >We are going to create hierarchic actor structure and <span |
| class="ec-lmsso-10">TopActor </span>will functions as a pure container actor. Thus its current state |
| machine is obsolete, we can ignore or delete it. |
| </p><!--l. 77--><p class="noindent" >We continue to add the actors graphically and open the structure diagram of <span |
| class="ec-lmsso-10">TopActor </span>by right-click in the Outline View on |
| <span |
| class="ec-lmsso-10">TopActor -> Edit Structure</span>. |
| </p><!--l. 79--><p class="noindent" ><img |
| src="images/015-edit-structure-top.png" alt="PIC" |
| /> |
| </p><!--l. 81--><p class="noindent" >Drag and Drop an <span |
| class="ec-lmsso-10">ActorRef </span>from the <span |
| class="ec-lmsso-10">Palette </span>within the borders and name the new actor reference <span |
| class="ec-lmsso-10">sender </span>and set the type |
| to ActorClass <span |
| class="ec-lmsso-10">Sender</span>. Repeat the step for the <span |
| class="ec-lmsso-10">receiver</span>. |
| </p><!--l. 83--><p class="noindent" ><img |
| src="images/015-add-sender.png" alt="PIC" |
| /> |
| </p><!--l. 85--><p class="noindent" >Finally we connect the ports of both actors using the <span |
| class="ec-lmsso-10">Binding </span>tool in the <span |
| class="ec-lmsso-10">Palette</span>. Drag a connection between the two port to |
| establish a Binding. |
| </p><!--l. 87--><p class="noindent" ><img |
| src="images/015-add-binding.png" alt="PIC" |
| /> |
| <a |
| id="x10-34029r50"></a> |
| </p> |
| <h4 class="subsectionHead"><span class="titlemark">2.4.3 </span> <a |
| id="x10-350003"></a>Implement the Behavior</h4> |
| <!--l. 91--><p class="noindent" >We will implement two finite state machines (<span |
| class="ec-lmsso-10">FSM</span>s) to define the event driven behavior of the actors <span |
| class="ec-lmsso-10">Sender </span>and |
| <span |
| class="ec-lmsso-10">Receiver</span>. |
| </p><!--l. 93--><p class="noindent" >Before you start with the implementation, have a look at the MSC with the specification of the behavior. |
| </p><!--l. 95--><p class="noindent" >Lets start with the <span |
| class="ec-lmsso-10">Sender</span>. Right click to <span |
| class="ec-lmsso-10">sender Open Ref Behavior </span>and in the structure diagram of <span |
| class="ec-lmsso-10">TopActor</span>. |
| </p><!--l. 97--><p class="noindent" ><img |
| src="images/015-open-behavior-sender.png" alt="PIC" |
| /> |
| </p><!--l. 99--><p class="noindent" >According to our specification: |
| </p><div class="quote"> |
| <!--l. 101--><p class="noindent" ><span |
| class="ec-lmsso-10">Sender </span>initially should send the message <span |
| class="ec-lmsso-10">ping </span>and then take a state named <span |
| class="ec-lmsso-10">sendingPing</span>. After receiving |
| the message <span |
| class="ec-lmsso-10">pong </span>it should remain in a state named <span |
| class="ec-lmsso-10">receivedPong</span>.</p></div> |
| <!--l. 104--><p class="noindent" >Drag and Drop the <span |
| class="ec-lmsso-10">Initial Point </span>and a <span |
| class="ec-lmsso-10">State </span>into the diagram. The latter causes the opening of the dialog <span |
| class="ec-lmsso-10">Edit State</span>, in |
| which we type the name <span |
| class="ec-lmsso-10">sendingPing </span>and specify the entry code <span class="obeylines-h"><span class="verb"><span |
| class="ec-lmtt-10">senderPort.ping();</span></span></span>. Note the content assist is activated |
| by pressing CTRL+Space. |
| </p><!--l. 106--><p class="noindent" ><img |
| src="images/015-edit-sending.png" alt="PIC" |
| /> |
| </p><!--l. 108--><p class="noindent" >In the same manner we create a second <span |
| class="ec-lmsso-10">State </span>named <span |
| class="ec-lmsso-10">receivedPong </span>but without any action. |
| </p><!--l. 110--><p class="noindent" >Use the <span |
| class="ec-lmsso-10">Transition </span>tool to draw the initial transition to <span |
| class="ec-lmsso-10">sendingPing</span>. The dialog <span |
| class="ec-lmsso-10">Edit Transition </span>will open and we just click |
| <span |
| class="ec-lmsso-10">OK </span>as no action is required. Note that initial transitions do not have any trigger events. |
| </p><!--l. 112--><p class="noindent" >Again draw a transition from <span |
| class="ec-lmsso-10">sendingPing </span>to <span |
| class="ec-lmsso-10">receivedPong</span>. In the dialog for this transition we set the trigger event to |
| message <span |
| class="ec-lmsso-10">pong </span>of port <span |
| class="ec-lmsso-10">sendPort </span>in the top right corner. |
| </p><!--l. 114--><p class="noindent" ><img |
| src="images/015-edit-transition-pinger.png" alt="PIC" |
| /> |
| </p><!--l. 116--><p class="noindent" >At this point the behavior of <span |
| class="ec-lmsso-10">Sender </span>is complete and should look like this: |
| </p><!--l. 118--><p class="noindent" ><img |
| src="images/015-sending-ping-fsm.png" alt="PIC" |
| /> |
| </p><!--l. 121--><p class="noindent" >We turn our attention to actor <span |
| class="ec-lmsso-10">Receiver </span>and open its state machine diagram. |
| </p><!--l. 123--><p class="noindent" >According to the specification: |
| </p><div class="quote"> |
| <!--l. 126--><p class="noindent" ><span |
| class="ec-lmsso-10">Receiver </span>initially should wait for the message <span |
| class="ec-lmsso-10">ping</span>. After a short time the message <span |
| class="ec-lmsso-10">pong </span>should be sent |
| back.</p></div> |
| <!--l. 129--><p class="noindent" >We create the states <span |
| class="ec-lmsso-10">waitingForPing</span>, <span |
| class="ec-lmsso-10">receivedPing </span>and <span |
| class="ec-lmsso-10">sendingPong </span>plus the initial transition. |
| </p><!--l. 131--><p class="noindent" >We draw a transition from <span |
| class="ec-lmsso-10">waitingForPing </span>to <span |
| class="ec-lmsso-10">receivedPing </span>and select as trigger event the message <span |
| class="ec-lmsso-10">ping </span>of port |
| <span |
| class="ec-lmsso-10">recvPort</span>. |
| </p><!--l. 133--><p class="noindent" ><img |
| src="images/015-transition-ping.png" alt="PIC" |
| /> |
| |
| |
| </p><!--l. 135--><p class="noindent" >In the entry code of the state <span |
| class="ec-lmsso-10">receivedPing </span>we start the timeout by sending the message <span |
| class="ec-lmsso-10">startTimeout(500) </span>(time unit is ms) |
| to the <span |
| class="ec-lmsso-10">timingService </span>port: |
| </p><div class="quote"> |
| <!--l. 137--><p class="noindent" ><span class="obeylines-h"><span class="verb"><span |
| class="ec-lmtt-10">timingService.startTimeout(500);</span></span></span></p></div> |
| <!--l. 140--><p class="noindent" >We draw a transition from <span |
| class="ec-lmsso-10">receivedPing </span>to <span |
| class="ec-lmsso-10">sentPong</span>. The event trigger is the respond <span |
| class="ec-lmsso-10">timeout </span>of the timing |
| service. |
| </p><!--l. 142--><p class="noindent" ><img |
| src="images/015-transition-timeout.png" alt="PIC" |
| /> |
| </p><!--l. 144--><p class="noindent" >In the entry code of the state <span |
| class="ec-lmsso-10">sentPong </span>we send the message <span |
| class="ec-lmsso-10">pong </span>back to the <span |
| class="ec-lmsso-10">Sender</span>: <span class="obeylines-h"><span class="verb"><span |
| class="ec-lmtt-10">recvPort.pong();</span></span></span> |
| </p><!--l. 146--><p class="noindent" >Now the behavior of <span |
| class="ec-lmsso-10">Receiver </span>is complete, too. It should look like this: |
| </p><!--l. 148--><p class="noindent" ><img |
| src="images/015-sending-pong-fsm.png" alt="PIC" |
| /> |
| </p><!--l. 150--><p class="noindent" >The PingPong model is done now. You can generate, compile and run it as described in <span |
| class="ec-lmsso-10">Hello World for C </span>or <span |
| class="ec-lmsso-10">Hello World for</span> |
| <span |
| class="ec-lmsso-10">Java</span>. The generated MSC in folder <span |
| class="ec-lmsso-10">log </span>should show the same MSC we used to specify the behavior at the beginning of this |
| tutorial. |
| </p><!--l. 152--><p class="noindent" ><img |
| src="images/015-msc.png" alt="PIC" |
| /> |
| <a |
| id="x10-35001r51"></a> |
| </p> |
| <h4 class="subsectionHead"><span class="titlemark">2.4.4 </span> <a |
| id="x10-360004"></a>Summary</h4> |
| <!--l. 156--><p class="noindent" >Within this tutorial you have learned how to create a FSM with transitions triggered by incoming messages. You |
| have used entry code to send messages and have used the timing service from the model library. You are |
| now familiar with the basic features of eTrice. Further tutorials and examples will take this knowledge as a |
| precondition. |
| |
| |
| </p> |
| <!--l. 1--><div class="crosslinks"><p class="noindent">[<a |
| href="etrice-docse7.html" >next</a>] [<a |
| href="etrice-docse5.html" >prev</a>] [<a |
| href="etrice-docse5.html#tailetrice-docse5.html" >prev-tail</a>] [<a |
| href="etrice-docse6.html" >front</a>] [<a |
| href="etrice-docch2.html#etrice-docse6.html" >up</a>] </p></div> |
| <!--l. 1--><p class="noindent" ><a |
| id="tailetrice-docse6.html"></a></p> |
| </body></html> |