123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766 |
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-
- <title>Examples — SCCD 0.9 documentation</title>
-
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
- <link rel="stylesheet" href="_static/mystyle.css" type="text/css" />
-
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: './',
- VERSION: '0.9',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true
- };
- </script>
- <script type="text/javascript" src="_static/jquery.js"></script>
- <script type="text/javascript" src="_static/underscore.js"></script>
- <script type="text/javascript" src="_static/doctools.js"></script>
- <link rel="top" title="SCCD 0.9 documentation" href="index.html" />
- <link rel="next" title="Semantic Options" href="semantic_options.html" />
- <link rel="prev" title="Runtime Platforms" href="runtime_platforms.html" />
- </head>
- <body role="document">
- <div class="related" role="navigation" aria-label="related navigation">
- <h3>Navigation</h3>
- <ul>
- <li class="right" style="margin-right: 10px">
- <a href="genindex.html" title="General Index"
- accesskey="I">index</a></li>
- <li class="right" >
- <a href="py-modindex.html" title="Python Module Index"
- >modules</a> |</li>
- <li class="right" >
- <a href="semantic_options.html" title="Semantic Options"
- accesskey="N">next</a> |</li>
- <li class="right" >
- <a href="runtime_platforms.html" title="Runtime Platforms"
- accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">SCCD 0.9 documentation</a> »</li>
- </ul>
- </div>
- <div class="document">
- <div class="documentwrapper">
- <div class="bodywrapper">
- <div class="body" role="main">
-
- <div class="section" id="examples">
- <h1>Examples<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h1>
- <div class="section" id="timer">
- <h2>Timer<a class="headerlink" href="#timer" title="Permalink to this headline">¶</a></h2>
- <p>This example demonstrates the timed behavior of SCCD. It does not have dynamic structure.</p>
- <p>We model a clock which prints the current time every 0.05 seconds. Two clocks are printed: the current wall-clock time and the current simulated time. We expect both to (almost) be the same. The user can interrupt the clock by sending an “interrupt” event. The user can resume the clock by sending a “resume” event.</p>
- <div class="section" id="threads-python">
- <h3>Threads (Python)<a class="headerlink" href="#threads-python" title="Permalink to this headline">¶</a></h3>
- <p>In this version, the model sends the current times to an output port, on which the user listens, to print out these times. <em>self.getSimulatedTime()</em> and <em>time()</em> return the current time in milliseconds, which we have to convert to seconds.</p>
- <p>The SCCD model:</p>
- <div class="highlight-default"><div class="highlight"><pre><?xml version="1.0" ?>
- <diagram author="Simon Van Mierlo" name="Timer (Threaded Version)">
- <top>
- from sccd.runtime.accurate_time import time
- </top>
- <inport name="input" />
- <outport name="output" />
- <class name="MainApp" default="true">
- <scxml initial="running">
- <state id="running">
- <transition target="." after="0.05">
- <raise event="time_update" port="output">
- <parameter expr="self.getSimulatedTime()" />
- <parameter expr="time()" />
- </raise>
- </transition>
- <transition target="../interrupted" event="interrupt" port="input">
- <raise event="time_update" port="output">
- <parameter expr="self.getSimulatedTime()" />
- <parameter expr="time()" />
- </raise>
- </transition>
- </state>
- <state id="interrupted">
- <transition target="." event="interrupt" port="input">
- <raise event="time_update" port="output">
- <parameter expr="self.getSimulatedTime()" />
- <parameter expr="time()" />
- </raise>
- </transition>
- <transition target="../running" event="continue" port="input">
- <raise event="time_update" port="output">
- <parameter expr="self.getSimulatedTime()" />
- <parameter expr="time()" />
- </raise>
- </transition>
- </state>
- </scxml>
- </class>
- </diagram>
- </pre></div>
- </div>
- <p>To compile, save this in a file called <code class="docutils literal"><span class="pre">timer.xml</span></code> and run <code class="docutils literal"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">sccd.compiler.sccdc</span> <span class="pre">-p</span> <span class="pre">threads</span> <span class="pre">-l</span> <span class="pre">python</span> <span class="pre">timer.xml</span></code></p>
- <p>Then, the following file will run the model:</p>
- <div class="highlight-default"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">timer</span>
- <span class="kn">from</span> <span class="nn">sccd.runtime.statecharts_core</span> <span class="k">import</span> <span class="n">Event</span>
- <span class="kn">import</span> <span class="nn">threading</span>
- <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
- <span class="n">controller</span> <span class="o">=</span> <span class="n">timer</span><span class="o">.</span><span class="n">Controller</span><span class="p">()</span>
- <span class="k">def</span> <span class="nf">raw_inputter</span><span class="p">():</span>
- <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
- <span class="n">controller</span><span class="o">.</span><span class="n">addInput</span><span class="p">(</span><span class="n">Event</span><span class="p">(</span><span class="n">raw_input</span><span class="p">(),</span> <span class="s">"input"</span><span class="p">,</span> <span class="p">[]))</span>
- <span class="n">input_thread</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">raw_inputter</span><span class="p">)</span>
- <span class="n">input_thread</span><span class="o">.</span><span class="n">daemon</span> <span class="o">=</span> <span class="k">True</span>
- <span class="n">input_thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
- <span class="n">output_listener</span> <span class="o">=</span> <span class="n">controller</span><span class="o">.</span><span class="n">addOutputListener</span><span class="p">([</span><span class="s">"output"</span><span class="p">])</span>
- <span class="k">def</span> <span class="nf">outputter</span><span class="p">():</span>
- <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
- <span class="n">event</span> <span class="o">=</span> <span class="n">output_listener</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
- <span class="nb">print</span> <span class="s">"SIMTIME: %.2fs"</span> <span class="o">%</span> <span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">getParameters</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="mf">1000.0</span><span class="p">)</span>
- <span class="nb">print</span> <span class="s">"ACTTIME: %.2fs"</span> <span class="o">%</span> <span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">getParameters</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span> <span class="o">/</span> <span class="mf">1000.0</span><span class="p">)</span>
- <span class="n">output_thread</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">outputter</span><span class="p">)</span>
- <span class="n">output_thread</span><span class="o">.</span><span class="n">daemon</span> <span class="o">=</span> <span class="k">True</span>
- <span class="n">output_thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
- <span class="n">controller</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
- </pre></div>
- </div>
- <p>The time will be printed to the console. The user can send events by typing the string “interrupt” or “continue” in the console.</p>
- </div>
- <div class="section" id="eventloop-python">
- <h3>Eventloop (Python)<a class="headerlink" href="#eventloop-python" title="Permalink to this headline">¶</a></h3>
- <p>The SCCD model:</p>
- <div class="highlight-default"><div class="highlight"><pre><?xml version="1.0" ?>
- <diagram author="Simon Van Mierlo" name="Timer (Eventloop Version)">
- <top>
- from sccd.runtime.libs.ui import ui
- from sccd.runtime.accurate_time import time
- </top>
- <inport name="ui" />
- <class name="MainApp" default="true">
- <method name="MainApp">
- <body>
- <![CDATA[
- self.canvas = ui.append_canvas(ui.window,100,100,{'background':'#eee'})
- self.clock_text = self.canvas.element.create_text(25,25,{'text':'0.0'})
- self.actual_clock_text = self.canvas.element.create_text(25,50,{'text':'0.0'})
- interrupt_button = ui.append_button(ui.window, 'INTERRUPT');
- continue_button = ui.append_button(ui.window, 'CONTINUE');
- ui.bind_event(interrupt_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'interrupt_clicked');
- ui.bind_event(continue_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'continue_clicked');
- ]]>
- </body>
- </method>
- <method name="update_timers">
- <body>
- self.canvas.element.itemconfigure(self.clock_text, text=str('%.2f' % (self.getSimulatedTime() / 1000.0)))
- self.canvas.element.itemconfigure(self.actual_clock_text, text='%.2f' % (time() / 1000.0))
- </body>
- </method>
- <scxml initial="running">
- <state id="running">
- <transition target="." after="0.05">
- <script>
- self.update_timers()
- </script>
- </transition>
- <transition target="../interrupted" event="interrupt_clicked" port="ui">
- <script>
- self.update_timers()
- </script>
- </transition>
- </state>
- <state id="interrupted">
- <transition target="." event="interrupt_clicked" port="ui">
- <script>
- self.update_timers()
- </script>
- </transition>
- <transition target="../running" event="continue_clicked" port="ui">
- <script>
- self.update_timers()
- </script>
- </transition>
- </state>
- </scxml>
- </class>
- </diagram>
- </pre></div>
- </div>
- <p>To compile, save this in a file called <code class="docutils literal"><span class="pre">timer.xml</span></code> and run <code class="docutils literal"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">sccd.compiler.sccdc</span> <span class="pre">-p</span> <span class="pre">eventloop</span> <span class="pre">-l</span> <span class="pre">python</span> <span class="pre">timer.xml</span></code></p>
- <p>Then, the following file will run the model:</p>
- <div class="highlight-default"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">Tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
- <span class="kn">import</span> <span class="nn">timer</span>
- <span class="kn">from</span> <span class="nn">sccd.runtime.libs.ui</span> <span class="k">import</span> <span class="n">ui</span>
- <span class="kn">from</span> <span class="nn">sccd.runtime.statecharts_core</span> <span class="k">import</span> <span class="n">Event</span>
- <span class="kn">from</span> <span class="nn">sccd.runtime.tkinter_eventloop</span> <span class="k">import</span> <span class="o">*</span>
- <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
- <span class="n">ui</span><span class="o">.</span><span class="n">window</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
- <span class="n">controller</span> <span class="o">=</span> <span class="n">timer</span><span class="o">.</span><span class="n">Controller</span><span class="p">(</span><span class="n">TkEventLoop</span><span class="p">(</span><span class="n">ui</span><span class="o">.</span><span class="n">window</span><span class="p">))</span>
- <span class="n">controller</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
- <span class="n">ui</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
- </pre></div>
- </div>
- </div>
- <div class="section" id="eventloop-javascript">
- <h3>Eventloop (Javascript)<a class="headerlink" href="#eventloop-javascript" title="Permalink to this headline">¶</a></h3>
- <p>The SCCD model:</p>
- <div class="highlight-default"><div class="highlight"><pre><?xml version="1.0" ?>
- <diagram author="Simon Van Mierlo" name="Timer">
- <inport name="ui" />
- <class name="MainApp" default="true">
- <method name="MainApp">
- <body>
- <![CDATA[
- this.canvas = ui.append_canvas(ui.window,400,150,{'background':'#eee'})
- this.clock_text = this.canvas.add_text(25,25,'0.0')
- this.actual_clock_text = this.canvas.add_text(25,50,'0.0')
- var interrupt_button = ui.append_button(ui.window, 'INTERRUPT');
- var continue_button = ui.append_button(ui.window, 'CONTINUE');
- ui.bind_event(interrupt_button.element, ui.EVENTS.MOUSE_CLICK, this.controller, 'interrupt_clicked');
- ui.bind_event(continue_button.element, ui.EVENTS.MOUSE_CLICK, this.controller, 'continue_clicked');
- ]]>
- </body>
- </method>
- <method name="update_timers">
- <body>
- this.clock_text.set_text((this.getSimulatedTime() / 1000).toFixed(2));
- this.actual_clock_text.set_text((this.getSimulatedTime() / 1000).toFixed(2));
- </body>
- </method>
- <scxml initial="running">
- <state id="running">
- <transition target="." after="0.05">
- <script>
- this.update_timers();
- </script>
- </transition>
- <transition target="../interrupted" event="interrupt_clicked" port="ui">
- <script>
- this.update_timers();
- </script>
- </transition>
- </state>
- <state id="interrupted">
- <transition target="." event="interrupt_clicked" port="ui">
- <script>
- this.update_timers();
- </script>
- </transition>
- <transition target="../running" event="continue_clicked" port="ui">
- <script>
- this.update_timers();
- </script>
- </transition>
- </state>
- </scxml>
- </class>
- </diagram>
- </pre></div>
- </div>
- <p>To compile, save this in a file called <code class="docutils literal"><span class="pre">timer.xml</span></code> and run <code class="docutils literal"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">sccd.compiler.sccdc</span> <span class="pre">-p</span> <span class="pre">eventloop</span> <span class="pre">-l</span> <span class="pre">javascript</span> <span class="pre">timer.xml</span></code></p>
- <p>Then, the following file will run the model:</p>
- <div class="highlight-default"><div class="highlight"><pre><span class="o"><</span><span class="n">div</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">"https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/HackTimer.js"</span><span class="o">></</span><span class="n">script</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">"https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/statecharts_core.js"</span><span class="o">></</span><span class="n">script</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">"https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/utils.js"</span><span class="o">></</span><span class="n">script</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">"https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/svg.js"</span><span class="o">></</span><span class="n">script</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">"https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/ui.js"</span><span class="o">></</span><span class="n">script</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">"timer.js"</span><span class="o">></</span><span class="n">script</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span><span class="o">></span>
- <span class="n">controller</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Timer</span><span class="o">.</span><span class="n">Controller</span><span class="p">(</span><span class="n">new</span> <span class="n">JsEventLoop</span><span class="p">());</span>
- <span class="n">controller</span><span class="o">.</span><span class="n">start</span><span class="p">();</span>
- <span class="o"></</span><span class="n">script</span><span class="o">></span>
- <span class="o"></</span><span class="n">div</span><span class="o">></span>
- </pre></div>
- </div>
- </div>
- </div>
- <div class="section" id="traffic-lights">
- <h2>Traffic Lights<a class="headerlink" href="#traffic-lights" title="Permalink to this headline">¶</a></h2>
- <p>The traffic lights example demonstrates most functionality of SCCD. There are three lights (green, yellow, and red). The traffic light autonomously switches between them, but also listens for a police interrupt, which will flash the yellow light. When a second interrupt comes in, the light returns to its last configuration (using a history state).</p>
- <div class="section" id="python">
- <h3>Python<a class="headerlink" href="#python" title="Permalink to this headline">¶</a></h3>
- <p>The SCCD model:</p>
- <div class="highlight-default"><div class="highlight"><pre><?xml version="1.0" ?>
- <diagram author="Raphael Mannadiar" name="Traffic_Light_Python_Version">
- <top>
- from sccd.runtime.libs.ui import ui
- </top>
- <inport name="ui" />
- <class name="MainApp" default="true">
- <relationships>
- <association name="trafficlight" class="TrafficLight" />
- </relationships>
- <method name="MainApp">
- <body>
- <![CDATA[
- self.canvas = ui.append_canvas(ui.window,100,310,{'background':'#eee'});
- police_button = ui.append_button(ui.window, 'Police interrupt');
- quit_button = ui.append_button(ui.window, 'Quit');
- ui.bind_event(police_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'police_interrupt_clicked');
- ui.bind_event(quit_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'quit_clicked');
- ]]>
- </body>
- </method>
- <scxml initial="initializing">
- <state id="initializing">
- <transition target="../creating">
- <raise scope="cd" event="create_instance">
- <parameter expr='"trafficlight"' />
- <parameter expr='"TrafficLight"' />
- <parameter expr="self.canvas" />
- </raise>
- </transition>
- </state>
- <state id="creating">
- <transition event="instance_created" target="../initialized">
- <parameter name="association_name" type="string"/>
- <raise scope="cd" event="start_instance">
- <parameter expr="association_name" />
- </raise>
- <raise scope="narrow" event="set_association_name" target="association_name">
- <parameter expr="association_name" />
- </raise>
- </transition>
- </state>
- <state id="initialized">
- </state>
- </scxml>
- </class>
- <class name="TrafficLight">
- <relationships>
- </relationships>
- <method name="TrafficLight">
- <parameter name="canvas" />
- <body>
- <![CDATA[
- size = 100;
- offset = size+5;
- self.RED = 0;
- self.YELLOW = 1;
- self.GREEN = 2;
- self.colors = ['#f00','#ff0','#0f0']
- self.lights = [
- canvas.add_rectangle(size/2, size/2, size, size, {'fill':'#000'}),
- canvas.add_rectangle(size/2, size/2+offset, size, size, {'fill':'#000'}),
- canvas.add_rectangle(size/2, size/2+2*offset, size, size, {'fill':'#000'})];
- ]]>
- </body>
- </method>
- <method name="clear">
- <body>
- <![CDATA[
- self.lights[self.RED].set_color('#000');
- self.lights[self.YELLOW].set_color('#000');
- self.lights[self.GREEN].set_color('#000');
- ]]>
- </body>
- </method>
- <method name="setGreen">
- <body>
- <![CDATA[
- self.clear();
- self.lights[self.GREEN].set_color(self.colors[self.GREEN]);
- ]]>
- </body>
- </method>
- <method name="setYellow">
- <body>
- <![CDATA[
- self.clear();
- self.lights[self.YELLOW].set_color(self.colors[self.YELLOW]);
- ]]>
- </body>
- </method>
- <method name="setRed">
- <body>
- <![CDATA[
- self.clear();
- self.lights[self.RED].set_color(self.colors[self.RED]);
- ]]>
- </body>
- </method>
- <scxml initial="on">
- <state id="on" initial="normal">
- <state id="normal" initial="red">
- <state id="red">
- <onentry>
- <script>
- <![CDATA[
- self.setRed();
- ]]>
- </script>
- </onentry>
- <transition after='3' target='../green'/>
- </state>
- <state id="green">
- <onentry>
- <script>
- <![CDATA[
- self.setGreen();
- ]]>
- </script>
- </onentry>
- <transition after='2' target='../yellow'/>
- </state>
- <state id="yellow">
- <onentry>
- <script>
- <![CDATA[
- self.setYellow();
- ]]>
- </script>
- </onentry>
- <transition after='1' target='../red'/>
- </state>
- <transition event='police_interrupt_clicked' port='ui' target='../interrupted'/>
- <history id="history"/>
- </state>
- <state id="interrupted" initial="yellow">
- <state id="yellow">
- <onentry>
- <script>
- <![CDATA[
- self.setYellow();
- ]]>
- </script>
- </onentry>
- <transition after='.5' target='../black'/>
- </state>
- <state id="black">
- <onentry>
- <script>
- <![CDATA[
- self.clear();
- ]]>
- </script>
- </onentry>
- <transition after='.5' target='../yellow'/>
- </state>
- <transition event='police_interrupt_clicked' port='ui' target='../normal/history'/>
- </state>
- <transition event='quit_clicked' port='ui' target='../off'/>
- </state>
- <state id="off">
- <onentry>
- <script>
- <![CDATA[
- self.clear();
- ]]>
- </script>
- </onentry>
- </state>
- </scxml>
- </class>
- </diagram>
- </pre></div>
- </div>
- <p>To compile, save this in a file called <code class="docutils literal"><span class="pre">trafficlight.xml</span></code> and run <code class="docutils literal"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">sccd.compiler.sccdc</span> <span class="pre">-p</span> <span class="pre">eventloop</span> <span class="pre">-l</span> <span class="pre">python</span> <span class="pre">trafficlight.xml</span></code></p>
- <p>Then, the following file will run the model:</p>
- <div class="highlight-default"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">Tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
- <span class="kn">import</span> <span class="nn">trafficlight</span>
- <span class="kn">from</span> <span class="nn">sccd.runtime.libs.ui</span> <span class="k">import</span> <span class="n">ui</span>
- <span class="kn">from</span> <span class="nn">sccd.runtime.statecharts_core</span> <span class="k">import</span> <span class="n">Event</span>
- <span class="kn">from</span> <span class="nn">sccd.runtime.tkinter_eventloop</span> <span class="k">import</span> <span class="o">*</span>
- <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
- <span class="n">ui</span><span class="o">.</span><span class="n">window</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
- <span class="n">controller</span> <span class="o">=</span> <span class="n">trafficlight</span><span class="o">.</span><span class="n">Controller</span><span class="p">(</span><span class="n">TkEventLoop</span><span class="p">(</span><span class="n">ui</span><span class="o">.</span><span class="n">window</span><span class="p">))</span>
- <span class="n">controller</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
- <span class="n">ui</span><span class="o">.</span><span class="n">window</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
- </pre></div>
- </div>
- </div>
- <div class="section" id="javascript">
- <h3>Javascript<a class="headerlink" href="#javascript" title="Permalink to this headline">¶</a></h3>
- <p>The SCCD model:</p>
- <div class="highlight-default"><div class="highlight"><pre><?xml version="1.0" ?>
- <diagram author="Raphael Mannadiar" name="Traffic_Light_JavaScript_Version">
- <inport name="ui" />
- <class name="MainApp" default="true">
- <relationships>
- <association name="trafficlight" class="TrafficLight" />
- </relationships>
- <method name="MainApp">
- <body>
- <![CDATA[
- this.canvas = ui.append_canvas(ui.window,100,310,{'background':'#eee'});
- var police_button = ui.append_button(ui.window, 'Police interrupt');
- var quit_button = ui.append_button(ui.window, 'Quit');
- ui.bind_event(police_button.element, ui.EVENTS.MOUSE_CLICK, this.controller, 'police_interrupt_clicked');
- ui.bind_event(quit_button.element, ui.EVENTS.MOUSE_CLICK, this.controller, 'quit_clicked');
- ]]>
- </body>
- </method>
- <scxml initial="initializing">
- <state id="initializing">
- <transition target="../creating">
- <raise scope="cd" event="create_instance">
- <parameter expr='"trafficlight"' />
- <parameter expr='"TrafficLight"' />
- <parameter expr="this.canvas" />
- </raise>
- </transition>
- </state>
- <state id="creating">
- <transition event="instance_created" target="../initialized">
- <parameter name="association_name" type="string"/>
- <raise scope="cd" event="start_instance">
- <parameter expr="association_name" />
- </raise>
- <raise scope="narrow" event="set_association_name" target="association_name">
- <parameter expr="association_name" />
- </raise>
- </transition>
- </state>
- <state id="initialized">
- </state>
- </scxml>
- </class>
- <class name="TrafficLight">
- <relationships>
- </relationships>
- <method name="TrafficLight">
- <parameter name="canvas" />
- <body>
- <![CDATA[
- var size = 100;
- var offset = size+5;
- this.RED = 0;
- this.YELLOW = 1;
- this.GREEN = 2;
- this.colors = ['#f00','#ff0','#0f0']
- this.lights = [canvas.add_rectangle(size/2, size/2, size, size, {'fill':'#000'}),
- canvas.add_rectangle(size/2, size/2+offset, size, size, {'fill':'#000'}),
- canvas.add_rectangle(size/2, size/2+2*offset, size, size, {'fill':'#000'})];
- ]]>
- </body>
- </method>
- <method name="clear">
- <body>
- <![CDATA[
- this.lights[this.RED].set_color('#000');
- this.lights[this.YELLOW].set_color('#000');
- this.lights[this.GREEN].set_color('#000');
- ]]>
- </body>
- </method>
- <method name="setGreen">
- <body>
- <![CDATA[
- this.clear();
- this.lights[this.GREEN].set_color(this.colors[this.GREEN]);
- ]]>
- </body>
- </method>
- <method name="setYellow">
- <body>
- <![CDATA[
- this.clear();
- this.lights[this.YELLOW].set_color(this.colors[this.YELLOW]);
- ]]>
- </body>
- </method>
- <method name="setRed">
- <body>
- <![CDATA[
- this.clear();
- this.lights[this.RED].set_color(this.colors[this.RED]);
- ]]>
- </body>
- </method>
- <scxml initial="on">
- <state id="on" initial="normal">
- <state id="normal" initial="red">
- <state id="red">
- <onentry>
- <script>
- <![CDATA[
- this.setRed();
- ]]>
- </script>
- </onentry>
- <transition after='3' target='../green'/>
- </state>
- <state id="green">
- <onentry>
- <script>
- <![CDATA[
- this.setGreen();
- ]]>
- </script>
- </onentry>
- <transition after='2' target='../yellow'/>
- </state>
- <state id="yellow">
- <onentry>
- <script>
- <![CDATA[
- this.setYellow();
- ]]>
- </script>
- </onentry>
- <transition after='1' target='../red'/>
- </state>
- <transition event='police_interrupt_clicked' port='ui' target='../interrupted'/>
- <history id="history"/>
- </state>
- <state id="interrupted" initial="yellow">
- <state id="yellow">
- <onentry>
- <script>
- <![CDATA[
- this.setYellow();
- ]]>
- </script>
- </onentry>
- <transition after='.5' target='../black'/>
- </state>
- <state id="black">
- <onentry>
- <script>
- <![CDATA[
- this.clear();
- ]]>
- </script>
- </onentry>
- <transition after='.5' target='../yellow'/>
- </state>
- <transition event='police_interrupt_clicked' port='ui' target='../normal/history'/>
- </state>
- <transition event='quit_clicked' port='ui' target='../off'/>
- </state>
- <state id="off">
- <onentry>
- <script>
- <![CDATA[
- this.clear();
- ]]>
- </script>
- </onentry>
- </state>
- </scxml>
- </class>
- </diagram>
- </pre></div>
- </div>
- <p>To compile, save this in a file called <code class="docutils literal"><span class="pre">trafficlight.xml</span></code> and run <code class="docutils literal"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">sccd.compiler.sccdc</span> <span class="pre">-p</span> <span class="pre">eventloop</span> <span class="pre">-l</span> <span class="pre">javascript</span> <span class="pre">trafficlight.xml</span></code></p>
- <p>Then, the following file will run the model:</p>
- <div class="highlight-default"><div class="highlight"><pre><span class="o"><</span><span class="n">div</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">"https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/HackTimer.js"</span><span class="o">></</span><span class="n">script</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">"https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/statecharts_core.js"</span><span class="o">></</span><span class="n">script</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">"https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/utils.js"</span><span class="o">></</span><span class="n">script</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">"https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/svg.js"</span><span class="o">></</span><span class="n">script</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">"https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/ui.js"</span><span class="o">></</span><span class="n">script</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">"trafficlight.js"</span><span class="o">></</span><span class="n">script</span><span class="o">></span>
- <span class="o"><</span><span class="n">script</span><span class="o">></span>
- <span class="n">controller</span> <span class="o">=</span> <span class="n">new</span> <span class="n">Traffic_Light_JavaScript_Version</span><span class="o">.</span><span class="n">Controller</span><span class="p">(</span><span class="n">new</span> <span class="n">JsEventLoop</span><span class="p">());</span>
- <span class="n">controller</span><span class="o">.</span><span class="n">start</span><span class="p">();</span>
- <span class="o"></</span><span class="n">script</span><span class="o">></span>
- <span class="o"></</span><span class="n">div</span><span class="o">></span>
- </pre></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper">
- <h3><a href="index.html">Table Of Contents</a></h3>
- <ul>
- <li><a class="reference internal" href="#">Examples</a><ul>
- <li><a class="reference internal" href="#timer">Timer</a><ul>
- <li><a class="reference internal" href="#threads-python">Threads (Python)</a></li>
- <li><a class="reference internal" href="#eventloop-python">Eventloop (Python)</a></li>
- <li><a class="reference internal" href="#eventloop-javascript">Eventloop (Javascript)</a></li>
- </ul>
- </li>
- <li><a class="reference internal" href="#traffic-lights">Traffic Lights</a><ul>
- <li><a class="reference internal" href="#python">Python</a></li>
- <li><a class="reference internal" href="#javascript">Javascript</a></li>
- </ul>
- </li>
- </ul>
- </li>
- </ul>
- <h4>Previous topic</h4>
- <p class="topless"><a href="runtime_platforms.html"
- title="previous chapter">Runtime Platforms</a></p>
- <h4>Next topic</h4>
- <p class="topless"><a href="semantic_options.html"
- title="next chapter">Semantic Options</a></p>
- <div role="note" aria-label="source link">
- <h3>This Page</h3>
- <ul class="this-page-menu">
- <li><a href="_sources/examples.txt"
- rel="nofollow">Show Source</a></li>
- </ul>
- </div>
- <div id="searchbox" style="display: none" role="search">
- <h3>Quick search</h3>
- <form class="search" action="search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
- <input type="hidden" name="check_keywords" value="yes" />
- <input type="hidden" name="area" value="default" />
- </form>
- </div>
- <script type="text/javascript">$('#searchbox').show(0);</script>
- </div>
- </div>
- <div class="clearer"></div>
- </div>
- <div class="related" role="navigation" aria-label="related navigation">
- <h3>Navigation</h3>
- <ul>
- <li class="right" style="margin-right: 10px">
- <a href="genindex.html" title="General Index"
- >index</a></li>
- <li class="right" >
- <a href="py-modindex.html" title="Python Module Index"
- >modules</a> |</li>
- <li class="right" >
- <a href="semantic_options.html" title="Semantic Options"
- >next</a> |</li>
- <li class="right" >
- <a href="runtime_platforms.html" title="Runtime Platforms"
- >previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">SCCD 0.9 documentation</a> »</li>
- </ul>
- </div>
- <div class="footer" role="contentinfo">
- © Copyright 2016, Simon Van Mierlo.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.6.
- </div>
- </body>
- </html>
|