| <?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>Ping Pong Tutorial (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-07-03 15: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-docse9.html" >next</a>] [<a |
| href="etrice-docse7.html" >prev</a>] [<a |
| href="etrice-docse7.html#tailetrice-docse7.html" >prev-tail</a>] [<a |
| href="#tailetrice-docse8.html">tail</a>] [<a |
| href="etrice-docch2.html#etrice-docse8.html" >up</a>] </p></div> |
| <h3 class="sectionHead"><span class="titlemark">2.6 </span> <a |
| id="x12-470006"></a>Ping Pong Tutorial (Java and C)</h3> |
| <a |
| id="x12-47001r62"></a> |
| <h4 class="subsectionHead"><span class="titlemark">2.6.1 </span> <a |
| id="x12-480001"></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 ende of this tutorial should look like this: |
| </p><!--l. 13--><p class="noindent" ><img |
| src="images/017-01-MSC.png" alt="PIC" |
| /> |
| </p><!--l. 15--><p class="noindent" >We will take this MSC as specification for the desired behavior. |
| </p><!--l. 17--><p class="noindent" >You will perform the following steps: |
| </p><ol class="enumerate1" > |
| <li |
| class="enumerate" id="x12-48002x1">create a new model from scratch |
| </li> |
| <li |
| class="enumerate" id="x12-48004x2">define a protocol |
| </li> |
| <li |
| class="enumerate" id="x12-48006x3">create an actor structure |
| </li> |
| <li |
| class="enumerate" id="x12-48008x4">create finite state machines |
| </li> |
| <li |
| class="enumerate" id="x12-48010x5">use the predefined <span |
| class="ec-lmsso-10">TimingService</span> |
| </li> |
| <li |
| class="enumerate" id="x12-48012x6">build and run the model |
| </li> |
| <li |
| class="enumerate" id="x12-48014x7">open the message sequence chart</li></ol> |
| <a |
| id="x12-48015r64"></a> |
| <h4 class="subsectionHead"><span class="titlemark">2.6.2 </span> <a |
| id="x12-490002"></a>Create a new model from scratch</h4> |
| <!--l. 31--><p class="noindent" >Create a new eTrice project according to <span |
| class="ec-lmsso-10">HelloWorld for Java or C </span>and name it <span |
| class="ec-lmsso-10">PingPong</span>. |
| </p><!--l. 33--><p class="noindent" >Your <span |
| class="ec-lmsso-10">ROOM </span>model should look like this: |
| </p> |
| <!--l. 35--> |
| <div class="lstlisting" id="listing-11"><span class="label"><a |
| id="x12-49001r1"></a></span><span |
| class="ec-lmssbx-10x-x-90">RoomModel</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">PingPong_Model</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="x12-49002r2"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">LogicalSystem</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">LogSys1</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="x12-49003r3"></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">SubSystemRef</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">subSysRef1</span><span |
| class="ec-lmtt-9">:</span><span |
| class="ec-lmtt-9">SubSysClass1</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-49004r4"></a></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="x12-49005r5"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">SubSystemClass</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">SubSysClass1</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="x12-49006r6"></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">ActorRef</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">actorRef1</span><span |
| class="ec-lmtt-9">:</span><span |
| class="ec-lmtt-9">PingPongTop</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-49007r7"></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">LogicalThread</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">defaultThread</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-49008r8"></a></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="x12-49009r9"></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">PingPongTop</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="x12-49010r10"></a></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="x12-49011r11"></a></span><span |
| class="ec-lmtt-9">}</span> |
| </div> |
| <a |
| id="x12-49012r65"></a> |
| <h4 class="subsectionHead"><span class="titlemark">2.6.3 </span> <a |
| id="x12-500003"></a>Create a new protocol</h4> |
| <!--l. 51--><p class="noindent" >First we define a protocol for the communication between the Sender and the Receiver. From the specification MSC above |
| we can derive that the Sender sends a <span |
| class="ec-lmsso-10">ping </span>message to the receiver and the receiver responds with a <span |
| class="ec-lmsso-10">pong</span> |
| message. |
| |
| |
| </p><!--l. 53--><p class="noindent" >In <span |
| class="ec-lmsso-10">ROOM </span>the <span |
| class="ec-lmsso-10">ProtocolClass </span>specifies interfaces. In this case we go for an asynchronous, bidirectional messaging interface |
| (eventdriven) which is the standard communication type for a <span |
| class="ec-lmsso-10">ProtocolClass</span>. With the help of <span |
| class="ec-lmsso-10">Content Assist </span>(Ctrl+Space) |
| we create a <span |
| class="ec-lmsso-10">ProtocolClass </span>and name it <span |
| class="ec-lmsso-10">PingPongProtocol</span>. Inside the brackets use the <span |
| class="ec-lmsso-10">Content Assist </span>to create two incoming |
| messages called <span |
| class="ec-lmsso-10">ping </span>and <span |
| class="ec-lmsso-10">pong</span>. |
| </p><!--l. 59--><p class="noindent" >The resulting code should look like this: |
| </p> |
| <!--l. 61--> |
| <div class="lstlisting" id="listing-12"><span class="label"><a |
| id="x12-50001r1"></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="x12-50002r2"></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="x12-50003r3"></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="x12-50004r4"></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="x12-50005r5"></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="x12-50006r6"></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="x12-50007r7"></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="x12-50008r8"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">}</span> |
| </div> |
| <!--l. 72--><p class="noindent" >With <span |
| class="ec-lmsso-10">Ctrl-Shift+F </span>or selecting <span |
| class="ec-lmsso-10">Format </span>from the context menu you can format the <span |
| class="ec-lmsso-10">ROOM </span>model. Note that the new |
| <span |
| class="ec-lmsso-10">ProtocolClass </span>is displayed in the outline view. |
| <a |
| id="x12-50009r66"></a> |
| </p> |
| <h4 class="subsectionHead"><span class="titlemark">2.6.4 </span> <a |
| id="x12-510004"></a>Create the Actor Structure</h4> |
| <a |
| id="Q1-12-68"></a> |
| <h5 class="likesubsubsectionHead"><a |
| id="x12-520004"></a>Add two additional actor classes</h5> |
| <!--l. 78--><p class="noindent" >Position the cursor outside any class definition and call the <span |
| class="ec-lmsso-10">Content Assist </span>with <span |
| class="ec-lmsso-10">Ctrl+Space</span>. Select <span |
| class="ec-lmsso-10">ActorClass - actor class</span> |
| <span |
| class="ec-lmsso-10">skeleton or ActorClass </span>and name the ActorClass <span |
| class="ec-lmsso-10">Sender</span>. |
| </p><!--l. 81--><p class="noindent" ><img |
| src="images/017-02-content-assist.png" alt="PIC" |
| /> |
| </p><!--l. 84--><p class="noindent" >Repeat the described procedure and name the new actor <span |
| class="ec-lmsso-10">Receiver</span>. |
| </p><!--l. 86--><p class="noindent" >With Ctrl+Shift+F you can format your textual model. |
| </p><!--l. 88--><p class="noindent" >The Result: |
| </p> |
| <!--l. 90--> |
| <div class="lstlisting" id="listing-13"><span class="label"><a |
| id="x12-52001r1"></a></span><span |
| class="ec-lmssbx-10x-x-90">RoomModel</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">PingPong_Model</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="x12-52002r2"></a></span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-52003r3"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">LogicalSystem</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">LogSys1</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="x12-52004r4"></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">SubSystemRef</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">subSysRef1</span><span |
| class="ec-lmtt-9">:</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">SubSysClass1</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-52005r5"></a></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="x12-52006r6"></a></span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-52007r7"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">SubSystemClass</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">SubSysClass1</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="x12-52008r8"></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">ActorRef</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">actorRef1</span><span |
| class="ec-lmtt-9">:</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">PingPongTop</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-52009r9"></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">LogicalThread</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">defaultThread</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-52010r10"></a></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="x12-52011r11"></a></span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-52012r12"></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">PingPongTop</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="x12-52013r13"></a></span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-52014r14"></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><span |
| class="ec-lmtt-9">}</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-52015r15"></a></span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-52016r16"></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><span |
| class="ec-lmtt-9">}</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-52017r17"></a></span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-52018r18"></a></span><span |
| class="ec-lmtt-9">}</span> |
| </div> |
| <!--l. 111--><p class="noindent" >You can should also see the new <span |
| class="ec-lmsso-10">ActorClass</span>es in the outline view. |
| <a |
| id="Q1-12-70"></a> |
| </p> |
| <h5 class="likesubsubsectionHead"><a |
| id="x12-530004"></a>Add ports to the actors</h5> |
| <!--l. 115--><p class="noindent" >To open the graphical structure editor, right click <span |
| class="ec-lmsso-10">Receiver </span>in the Outline View and select <span |
| class="ec-lmsso-10">Edit Structure</span>. Drag and Drop an |
| <span |
| class="ec-lmsso-10">Interface Port </span>from the <span |
| class="ec-lmsso-10">Palette </span>to the border of the <span |
| class="ec-lmsso-10">Receiver </span>actor. Note that an <span |
| class="ec-lmsso-10">Interface Port </span>can only be placed on the |
| border of the actor. Name the port <span |
| class="ec-lmsso-10">sender </span>and select <span |
| class="ec-lmsso-10">PingPongProtocol </span>as Protocol from the drop down list. The |
| checkboxes <span |
| class="ec-lmsso-10">Conjugated </span>and <span |
| class="ec-lmsso-10">Is Relay Port </span>stay unchecked. Click <span |
| class="ec-lmsso-10">ok</span>. The resulting structure should look like |
| this: |
| </p><!--l. 119--><p class="noindent" ><img |
| src="images/017-04-Port-for-Actor-Receiver.png" alt="PIC" |
| /> |
| </p><!--l. 122--><p class="noindent" >Repeat the steps above for the <span |
| class="ec-lmsso-10">sender</span>. Create a port named <span |
| class="ec-lmsso-10">receiver </span>with the same <span |
| class="ec-lmsso-10">Protocol </span>and make it |
| <span |
| class="ec-lmsso-10">Conjugated</span>. |
| </p><!--l. 124--><p class="noindent" >Keep in mind that the protocol defines <span |
| class="ec-lmsso-10">ping </span>as incoming message and <span |
| class="ec-lmsso-10">pong </span>as outgoing message. <span |
| class="ec-lmsso-10">Receiver </span>receives <span |
| class="ec-lmsso-10">ping </span>and |
| sends <span |
| class="ec-lmsso-10">pong</span>. Therefore the <span |
| class="ec-lmsso-10">Receiver</span>s port must be a regular port. The <span |
| class="ec-lmsso-10">Sender </span>has to send <span |
| class="ec-lmsso-10">ping </span>and receive <span |
| class="ec-lmsso-10">pong</span>. Therefore |
| the <span |
| class="ec-lmsso-10">Sender</span>s port must be a conjugated port. |
| <a |
| id="Q1-12-72"></a> |
| </p> |
| <h5 class="likesubsubsectionHead"><a |
| id="x12-540004"></a>Build hierarchical actor structure</h5> |
| <!--l. 130--><p class="noindent" >Now we want to add the new actors to the structure of <span |
| class="ec-lmsso-10">ActorClass PingPongTop</span>. |
| </p><!--l. 132--><p class="noindent" >From the outline view right click <span |
| class="ec-lmsso-10">PingPongTop </span>and select <span |
| class="ec-lmsso-10">Edit Structure</span>. Remember that you can only see the outline view if |
| the textual editor with the .room file is active. |
| |
| |
| </p><!--l. 134--><p class="noindent" >Drag and Drop an <span |
| class="ec-lmsso-10">ActorRef </span>inside the <span |
| class="ec-lmsso-10">PingPongTop </span>actor. Name it <span |
| class="ec-lmsso-10">sender</span>. From the actor class drop down list select |
| <span |
| class="ec-lmsso-10">Sender</span>. Do the same for <span |
| class="ec-lmsso-10">Receiver</span>. Connect the ports via the binding tool int the <span |
| class="ec-lmsso-10">Palette</span>. The resulting structure should look |
| like this: |
| </p><!--l. 137--><p class="noindent" ><img |
| src="images/017-03-PingPongTop-Structure.png" alt="PIC" |
| /> |
| </p><!--l. 140--><p class="noindent" >We have build the structure of a hierarchical actor system with two actors that send each other messages. |
| <a |
| id="Q1-12-74"></a> |
| </p> |
| <h5 class="likesubsubsectionHead"><a |
| id="x12-550004"></a>Import the Timing Service</h5> |
| <!--l. 144--><p class="noindent" >In order to implement the waiting time of the <span |
| class="ec-lmsso-10">Receiver </span>we need a timing service. The timing service is provided by the model |
| library and must be imported before it can be used in your model. |
| </p> |
| <hr class="figure" /><div class="figure" |
| > |
| |
| |
| |
| |
| <div class="minipage"> |
| ______________________________________________ |
| ______________________________________________          <!--l. 149--><p class="noindent" ><span |
| class="ec-lmssbx-10">room model for Java </span><br |
| class="newline" /></p><!--l. 151--> |
| <div class="lstlisting" id="listing-14"><span class="label"><a |
| id="x12-55001r1"></a></span><span |
| class="ec-lmssbx-10x-x-90">RoomModel</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">PingPong_Model</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="x12-55002r2"></a></span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-55003r3"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">import</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">room</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">basic</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">service</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">timing</span><span |
| class="ec-lmtt-9">.*</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">from</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">"</span><span |
| class="ec-lmtt-9">../../</span><span |
| class="ec-lmtt-9">org</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">eclipse</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">etrice</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">modellib</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">java</span><span |
| class="ec-lmtt-9">/</span><span |
| class="ec-lmtt-9">model</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">room</span><span |
| class="ec-lmtt-9">"</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-55004r4"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">(...)</span> |
| </div> |
| </div> <div class="minipage"> |
| ___________________________________________________          <!--l. 162--><p class="noindent" ><span |
| class="ec-lmssbx-10">room model for C </span><br |
| class="newline" /></p><!--l. 164--> |
| <div class="lstlisting" id="listing-15"><span class="label"><a |
| id="x12-55005r1"></a></span><span |
| class="ec-lmssbx-10x-x-90">RoomModel</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">PingPong_Model</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="x12-55006r2"></a></span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-55007r3"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">import</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">room</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">basic</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">service</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">timing</span><span |
| class="ec-lmtt-9">.*</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">from</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">"</span><span |
| class="ec-lmtt-9">../../</span><span |
| class="ec-lmtt-9">org</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">eclipse</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">etrice</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">modellib</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">c</span><span |
| class="ec-lmtt-9">/</span><span |
| class="ec-lmtt-9">model</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">room</span><span |
| class="ec-lmtt-9">"</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-55008r4"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">(...)</span> |
| </div> |
| </div> |
| |
| |
| </div><hr class="endfigure" /> |
| <!--l. 174--><p class="noindent" >This is the first time you use an element from the modellib. Make sure that your Java Build Path or the settings for your C |
| compiler are configured to use the modellib. Otherwise the generated code can not be built. |
| </p> |
| <hr class="figure" /><div class="figure" |
| > |
| |
| |
| <a |
| id="x17-8900074"></a> |
| |
| |
| <div class="minipage"> |
| ______________________________________________ |
| ______________________________________________          <!--l. 179--><p class="noindent" ><span |
| class="ec-lmssbx-10">build settings for Java </span><br |
| class="newline" />Right click the project <span |
| class="ec-lmsso-10">PingPong </span>and select <span |
| class="ec-lmsso-10">Properties</span> |
| <span |
| class="ec-lmsso-10">-> Java Build Path -> Projects </span>. Add the project |
| <span |
| class="ec-lmsso-10">org.eclipse.etrice.modellib.java </span>. |
| </p><!--l. 183--><p class="noindent" ><img |
| src="images/020-Blinky16.png" alt="PIC" |
| /> |
| </p></div> <div class="minipage"> |
| ________________________________________________________________________          <!--l. 191--><p class="noindent" ><span |
| class="ec-lmssbx-10">build settings for C </span><br |
| class="newline" /> |
| </p><!--l. 194--><p class="noindent" >Right click the project <span |
| class="ec-lmsso-10">PingPong </span>and select <span |
| class="ec-lmsso-10">Properties</span> |
| <span |
| class="ec-lmsso-10">-> C/C++ Build -> Settings -> Includes</span>. Add the |
| include path <span |
| class="ec-lmsso-10">org.eclipse.etrice.modellib.c/src-gen </span>to |
| the list. |
| </p><!--l. 196--><p class="noindent" ><img |
| src="images/017-06-Settings-for-C-Includes.png" alt="PIC" |
| /> |
| </p><!--l. 199--><p class="noindent" >Select <span |
| class="ec-lmsso-10">Properties -> C/C++ Build -> Settings -></span> |
| <span |
| class="ec-lmsso-10">Libraries</span>. Add the library <span |
| class="ec-lmsso-10">org.eclipse.etrice.modellib.c</span> |
| and the library |
| path <span |
| class="ec-lmsso-10">org.eclipse.etrice.modellib.c/MinGWDebug </span>to |
| the lists. For Posix the path will be |
| <span |
| class="ec-lmsso-10">org.eclipse.etrice.modellib.c/PosixDebug</span>. |
| </p><!--l. 202--><p class="noindent" ><img |
| src="images/017-07-Settings-for-C-Libraries.png" alt="PIC" |
| /> |
| </p></div> |
| |
| |
| </div><hr class="endfigure" /> |
| <!--l. 209--><p class="noindent" >Now the imported library can be used within your model and we will add the actor with the timing service to our |
| model. |
| </p><!--l. 211--><p class="noindent" >Right click the <span |
| class="ec-lmsso-10">SubSystemClass SubSysClass1 </span>in the outline view and select <span |
| class="ec-lmsso-10">Edit Structure</span>. The <span |
| class="ec-lmsso-10">ActorClass PingPongTop </span>is |
| already referenced in the subsystem as <span |
| class="ec-lmsso-10">actorRef1</span>. Drag and Drop an <span |
| class="ec-lmsso-10">ActorRef </span>into the structure of <span |
| class="ec-lmsso-10">SubSysClass1 </span>and name |
| it <span |
| class="ec-lmsso-10">timingService</span>. From the actor class drop down list select <span |
| class="ec-lmsso-10">room.basic.service.timing.ATimingService</span>. Draw a |
| <span |
| class="ec-lmsso-10">LayerConnection </span>from <span |
| class="ec-lmsso-10">actorRef1 </span>to the service provision point (<span |
| class="ec-lmsso-10">SPP</span>) of the <span |
| class="ec-lmsso-10">timingService</span>. The resulting structure should |
| look like this: |
| </p><!--l. 216--><p class="noindent" ><img |
| src="images/017-08-SubSystem-with-timing-service.png" alt="PIC" |
| /> |
| </p><!--l. 219--><p class="noindent" >The layer connection between an <span |
| class="ec-lmsso-10">ActorRef </span>and a <span |
| class="ec-lmsso-10">SPP </span>enables the use of service access points (<span |
| class="ec-lmsso-10">SAP</span>) for the service provided |
| by the <span |
| class="ec-lmsso-10">SPP</span>, in this case the timing service. <span |
| class="ec-lmsso-10">SAP</span>s and <span |
| class="ec-lmsso-10">SPP</span>s are ports with a different kind of connection. Every <span |
| class="ec-lmsso-10">SAP </span>of the |
| type <span |
| class="ec-lmsso-10">PTimer </span>inside actorRef1 is now connected automatically by the code generator with the <span |
| class="ec-lmsso-10">SPP </span>of the |
| <span |
| class="ec-lmsso-10">timingService</span>. |
| </p><!--l. 221--><p class="noindent" >The current version of eTrice does not provide a graphical element for a service access point (SAP). Therefore the SAPs to |
| access the timing service must be added in the .room file. Open the <span |
| class="ec-lmsso-10">PingPong.room </span>file and navigate to the <span |
| class="ec-lmsso-10">Receiver </span>actor. |
| Add the SAP for the protocol <span |
| class="ec-lmsso-10">PTimer </span>to the structure of the actor: |
| </p> |
| <!--l. 225--> |
| <div class="lstlisting" id="listing-16"><span class="label"><a |
| id="x12-55009r1"></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="x12-55010r2"></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="x12-55011r3"></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">sender</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="x12-55012r4"></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="x12-55013r5"></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="x12-55014r6"></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">sender</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-55015r7"></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">timing</span><span |
| class="ec-lmtt-9"> </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="x12-55016r8"></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="x12-55017r9"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">}</span> |
| </div> |
| <!--l. 237--><p class="noindent" >Now the <span |
| class="ec-lmsso-10">Receiver </span>can use the timing service. |
| <a |
| id="Q1-12-76"></a> |
| </p> |
| <h5 class="likesubsubsectionHead"><a |
| id="x12-560004"></a>Inspect the Actor Structure</h5> |
| <!--l. 240--><p class="noindent" >Before we start with the implementation of the behavior we will have a short look at the instance tree of the application we |
| built so far: |
| </p><!--l. 242--><p class="noindent" ><img |
| src="images/017-09-PingPong_InstanceTree.jpg" alt="PIC" |
| /> |
| </p><!--l. 245--><p class="noindent" >For each instance you can see the names of the <span |
| class="ec-lmsso-10">ActorRef </span>s and in brackets the names of the <span |
| class="ec-lmsso-10">ActorClass</span>es. Starting at the |
| subsystem level this instance tree will be implemented by the code generator. The subsystem will be implemented as process |
| in Linux or Windows. |
| <a |
| id="x12-56001r67"></a> |
| </p> |
| <h4 class="subsectionHead"><span class="titlemark">2.6.5 </span> <a |
| id="x12-570005"></a>Implement the Behavior</h4> |
| <!--l. 250--><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. 252--><p class="noindent" >Before you start with the implementation, have a look at the MSC with the specification of the behavior. |
| </p><!--l. 254--><p class="noindent" >Lets start with the <span |
| class="ec-lmsso-10">Sender</span>. Right click to <span |
| class="ec-lmsso-10">Sender </span>in the outline view or the structure editor and select <span |
| class="ec-lmsso-10">Edit Behavior</span>. Drag |
| and Drop the <span |
| class="ec-lmsso-10">Initial Point </span>and two <span |
| class="ec-lmsso-10">States </span>into the top state. Name the states <span |
| class="ec-lmsso-10">SendingPing </span>and <span |
| class="ec-lmsso-10">ReceivedPong</span>. Use the |
| <span |
| class="ec-lmsso-10">Transition </span>tool to draw transitions from <span |
| class="ec-lmsso-10">init </span>to <span |
| class="ec-lmsso-10">SendingPing </span>and from <span |
| class="ec-lmsso-10">SendingPing </span>to <span |
| class="ec-lmsso-10">ReceivedPong</span>. When you draw a |
| transition, the Dialog <span |
| class="ec-lmsso-10">Edit Transition </span>opens. Here you can specify the trigger event and the action code for each transition. |
| Note that the initial transition does not have a trigger event. The transition dialog for the Transition from <span |
| class="ec-lmsso-10">SendingPing </span>to |
| <span |
| class="ec-lmsso-10">ReceivedPong </span>should look like this: |
| </p><!--l. 261--><p class="noindent" ><img |
| src="images/017-10-Edit-Transition.png" alt="PIC" |
| /> |
| </p><!--l. 264--><p class="noindent" >The transition will now be triggered by an incoming message <span |
| class="ec-lmsso-10">ping </span>at the port <span |
| class="ec-lmsso-10">receiver</span>. |
| </p><!--l. 266--><p class="noindent" >Now we open the dialog <span |
| class="ec-lmsso-10">Edit State </span>of the state <span |
| class="ec-lmsso-10">SendingPing </span>by right clicking the state and selecting <span |
| class="ec-lmsso-10">Edit</span> |
| <span |
| class="ec-lmsso-10">State </span>from the menu. We want to send the message <span |
| class="ec-lmsso-10">ping </span>in the entry code of this state. The defined ports |
| will be generated as a member attribute of the actor class from type of the attached protocol. To send a |
| message you must state <span |
| class="ec-lmsso-10">port.message(param);</span>. In this example <span |
| class="ec-lmsso-10">receiver.ping(); </span>sends the <span |
| class="ec-lmsso-10">ping </span>message via the |
| <span |
| class="ec-lmsso-10">receiver </span>port. You can also use the Button <span |
| class="ec-lmsso-10">Messages </span>to select the message from the list of available ports and |
| their available messages. Assuming that the actor <span |
| class="ec-lmsso-10">Receiver </span>is connected to this port, the message will be sent |
| there. |
| |
| |
| </p><!--l. 273--><p class="noindent" >The FSM of <span |
| class="ec-lmsso-10">Sender </span>should now look like this: |
| </p><!--l. 275--><p class="noindent" ><img |
| src="images/017-11-FSM-Sender.png" alt="PIC" |
| /> |
| </p><!--l. 278--><p class="noindent" >Now we implement the FSM of the <span |
| class="ec-lmsso-10">ActorClass Receiver</span>. |
| </p><!--l. 280--><p class="noindent" ><img |
| src="images/017-12-FSM-Receiver.png" alt="PIC" |
| /> |
| </p><!--l. 283--><p class="noindent" >In the entry code of the state <span |
| class="ec-lmsso-10">WaitingForAWhile </span>we start the timeout: |
| |
| |
| </p> |
| <div class="verbatim" id="verbatim-7"> |
| timing.startTimeout(1000); |
| </div> |
| <!--l. 287--><p class="nopar" > |
| </p><!--l. 289--><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>: |
| |
| |
| </p> |
| <div class="verbatim" id="verbatim-8"> |
| sender.pong(); |
| </div> |
| <!--l. 293--><p class="nopar" > |
| </p><!--l. 295--><p class="noindent" >Save the diagram and inspect the <span |
| class="ec-lmsso-10">PingPong.room </span>file. The <span |
| class="ec-lmsso-10">Receiver </span>should look like this: |
| </p> |
| <!--l. 297--> |
| <div class="lstlisting" id="listing-17"><span class="label"><a |
| id="x12-57001r1"></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="x12-57002r2"></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="x12-57003r3"></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">sender</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="x12-57004r4"></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="x12-57005r5"></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="x12-57006r6"></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">sender</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-57007r7"></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">timing</span><span |
| class="ec-lmtt-9"> </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="x12-57008r8"></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="x12-57009r9"></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">Behavior</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="x12-57010r10"></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">StateMachine</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="x12-57011r11"></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-lmssbx-10x-x-90">Transition</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">init</span><span |
| class="ec-lmtt-9">:</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmssbx-10x-x-90">initial</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">-></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">WaitingForPing</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="x12-57012r12"></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-lmssbx-10x-x-90">Transition</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">tr0</span><span |
| class="ec-lmtt-9">:</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">WaitingForPing</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">-></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">WaitingForAWhile</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="x12-57013r13"></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><span |
| class="ec-lmssbx-10x-x-90">triggers</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="x12-57014r14"></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><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </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><span |
| class="ec-lmtt-9">sender</span><span |
| class="ec-lmtt-9">></span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-57015r15"></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><span |
| class="ec-lmtt-9">}</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-57016r16"></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><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-57017r17"></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-lmssbx-10x-x-90">Transition</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">tr1</span><span |
| class="ec-lmtt-9">:</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">WaitingForAWhile</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">-></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">SentPong</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="x12-57018r18"></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><span |
| class="ec-lmssbx-10x-x-90">triggers</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="x12-57019r19"></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><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"><</span><span |
| class="ec-lmtt-9">timeout</span><span |
| class="ec-lmtt-9">:</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">timing</span><span |
| class="ec-lmtt-9">></span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-57020r20"></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><span |
| class="ec-lmtt-9">}</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-57021r21"></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><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-57022r22"></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-lmssbx-10x-x-90">State</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">WaitingForPing</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-57023r23"></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-lmssbx-10x-x-90">State</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">SentPong</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="x12-57024r24"></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><span |
| class="ec-lmssbx-10x-x-90">entry</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="x12-57025r25"></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><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </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">pong</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="x12-57026r26"></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><span |
| class="ec-lmtt-9">}</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-57027r27"></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><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-57028r28"></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-lmssbx-10x-x-90">State</span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">WaitingForAWhile</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="x12-57029r29"></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><span |
| class="ec-lmssbx-10x-x-90">entry</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="x12-57030r30"></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><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">"</span><span |
| class="ec-lmtt-9">timing</span><span |
| class="ec-lmtt-9">.</span><span |
| class="ec-lmtt-9">startTimeout</span><span |
| class="ec-lmtt-9">(1000)</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="x12-57031r31"></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><span |
| class="ec-lmtt-9">}</span><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-57032r32"></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><span |
| class="ec-lmtt-9"> </span><br /><span class="label"><a |
| id="x12-57033r33"></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><br /><span class="label"><a |
| id="x12-57034r34"></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="x12-57035r35"></a></span><span |
| class="ec-lmtt-9"> </span><span |
| class="ec-lmtt-9">}</span> |
| </div> |
| <!--l. 335--><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 tmp/log should show the same MSC we used to specify the behavior at the beginning of this |
| tutorial. |
| </p><!--l. 337--><p class="noindent" ><img |
| src="images/017-01-MSC.png" alt="PIC" |
| /> |
| </p><!--l. 340--><p class="noindent" >Please note that the timeout messages startTimeout and timeout might vary depending on the target language and are not |
| displayed completely correct in the current version (red dot). The MSC logger will be extended to handle this correct in the |
| next version. |
| <a |
| id="x12-57036r78"></a> |
| </p> |
| <h4 class="subsectionHead"><span class="titlemark">2.6.6 </span> <a |
| id="x12-580006"></a>Summary</h4> |
| <!--l. 344--><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-docse9.html" >next</a>] [<a |
| href="etrice-docse7.html" >prev</a>] [<a |
| href="etrice-docse7.html#tailetrice-docse7.html" >prev-tail</a>] [<a |
| href="etrice-docse8.html" >front</a>] [<a |
| href="etrice-docch2.html#etrice-docse8.html" >up</a>] </p></div> |
| <!--l. 1--><p class="noindent" ><a |
| id="tailetrice-docse8.html"></a></p> |
| </body></html> |