examples.html 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>Examples &#8212; SCCD 0.9 documentation</title>
  7. <link rel="stylesheet" href="_static/classic.css" type="text/css" />
  8. <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
  9. <link rel="stylesheet" href="_static/mystyle.css" type="text/css" />
  10. <script type="text/javascript">
  11. var DOCUMENTATION_OPTIONS = {
  12. URL_ROOT: './',
  13. VERSION: '0.9',
  14. COLLAPSE_INDEX: false,
  15. FILE_SUFFIX: '.html',
  16. HAS_SOURCE: true
  17. };
  18. </script>
  19. <script type="text/javascript" src="_static/jquery.js"></script>
  20. <script type="text/javascript" src="_static/underscore.js"></script>
  21. <script type="text/javascript" src="_static/doctools.js"></script>
  22. <link rel="top" title="SCCD 0.9 documentation" href="index.html" />
  23. <link rel="next" title="Semantic Options" href="semantic_options.html" />
  24. <link rel="prev" title="Runtime Platforms" href="runtime_platforms.html" />
  25. </head>
  26. <body role="document">
  27. <div class="related" role="navigation" aria-label="related navigation">
  28. <h3>Navigation</h3>
  29. <ul>
  30. <li class="right" style="margin-right: 10px">
  31. <a href="genindex.html" title="General Index"
  32. accesskey="I">index</a></li>
  33. <li class="right" >
  34. <a href="py-modindex.html" title="Python Module Index"
  35. >modules</a> |</li>
  36. <li class="right" >
  37. <a href="semantic_options.html" title="Semantic Options"
  38. accesskey="N">next</a> |</li>
  39. <li class="right" >
  40. <a href="runtime_platforms.html" title="Runtime Platforms"
  41. accesskey="P">previous</a> |</li>
  42. <li class="nav-item nav-item-0"><a href="index.html">SCCD 0.9 documentation</a> &#187;</li>
  43. </ul>
  44. </div>
  45. <div class="document">
  46. <div class="documentwrapper">
  47. <div class="bodywrapper">
  48. <div class="body" role="main">
  49. <div class="section" id="examples">
  50. <h1>Examples<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h1>
  51. <div class="section" id="timer">
  52. <h2>Timer<a class="headerlink" href="#timer" title="Permalink to this headline">¶</a></h2>
  53. <p>This example demonstrates the timed behavior of SCCD. It does not have dynamic structure.</p>
  54. <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 &#8220;interrupt&#8221; event. The user can resume the clock by sending a &#8220;resume&#8221; event.</p>
  55. <div class="section" id="threads-python">
  56. <h3>Threads (Python)<a class="headerlink" href="#threads-python" title="Permalink to this headline">¶</a></h3>
  57. <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>
  58. <p>The SCCD model:</p>
  59. <div class="highlight-default"><div class="highlight"><pre>&lt;?xml version=&quot;1.0&quot; ?&gt;
  60. &lt;diagram author=&quot;Simon Van Mierlo&quot; name=&quot;Timer (Threaded Version)&quot;&gt;
  61. &lt;top&gt;
  62. from sccd.runtime.accurate_time import time
  63. &lt;/top&gt;
  64. &lt;inport name=&quot;input&quot; /&gt;
  65. &lt;outport name=&quot;output&quot; /&gt;
  66. &lt;class name=&quot;MainApp&quot; default=&quot;true&quot;&gt;
  67. &lt;scxml initial=&quot;running&quot;&gt;
  68. &lt;state id=&quot;running&quot;&gt;
  69. &lt;transition target=&quot;.&quot; after=&quot;0.05&quot;&gt;
  70. &lt;raise event=&quot;time_update&quot; port=&quot;output&quot;&gt;
  71. &lt;parameter expr=&quot;self.getSimulatedTime()&quot; /&gt;
  72. &lt;parameter expr=&quot;time()&quot; /&gt;
  73. &lt;/raise&gt;
  74. &lt;/transition&gt;
  75. &lt;transition target=&quot;../interrupted&quot; event=&quot;interrupt&quot; port=&quot;input&quot;&gt;
  76. &lt;raise event=&quot;time_update&quot; port=&quot;output&quot;&gt;
  77. &lt;parameter expr=&quot;self.getSimulatedTime()&quot; /&gt;
  78. &lt;parameter expr=&quot;time()&quot; /&gt;
  79. &lt;/raise&gt;
  80. &lt;/transition&gt;
  81. &lt;/state&gt;
  82. &lt;state id=&quot;interrupted&quot;&gt;
  83. &lt;transition target=&quot;.&quot; event=&quot;interrupt&quot; port=&quot;input&quot;&gt;
  84. &lt;raise event=&quot;time_update&quot; port=&quot;output&quot;&gt;
  85. &lt;parameter expr=&quot;self.getSimulatedTime()&quot; /&gt;
  86. &lt;parameter expr=&quot;time()&quot; /&gt;
  87. &lt;/raise&gt;
  88. &lt;/transition&gt;
  89. &lt;transition target=&quot;../running&quot; event=&quot;continue&quot; port=&quot;input&quot;&gt;
  90. &lt;raise event=&quot;time_update&quot; port=&quot;output&quot;&gt;
  91. &lt;parameter expr=&quot;self.getSimulatedTime()&quot; /&gt;
  92. &lt;parameter expr=&quot;time()&quot; /&gt;
  93. &lt;/raise&gt;
  94. &lt;/transition&gt;
  95. &lt;/state&gt;
  96. &lt;/scxml&gt;
  97. &lt;/class&gt;
  98. &lt;/diagram&gt;
  99. </pre></div>
  100. </div>
  101. <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>
  102. <p>Then, the following file will run the model:</p>
  103. <div class="highlight-default"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">timer</span>
  104. <span class="kn">from</span> <span class="nn">sccd.runtime.statecharts_core</span> <span class="k">import</span> <span class="n">Event</span>
  105. <span class="kn">import</span> <span class="nn">threading</span>
  106. <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
  107. <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>
  108. <span class="k">def</span> <span class="nf">raw_inputter</span><span class="p">():</span>
  109. <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
  110. <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">&quot;input&quot;</span><span class="p">,</span> <span class="p">[]))</span>
  111. <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>
  112. <span class="n">input_thread</span><span class="o">.</span><span class="n">daemon</span> <span class="o">=</span> <span class="k">True</span>
  113. <span class="n">input_thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
  114. <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">&quot;output&quot;</span><span class="p">])</span>
  115. <span class="k">def</span> <span class="nf">outputter</span><span class="p">():</span>
  116. <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
  117. <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>
  118. <span class="nb">print</span> <span class="s">&quot;SIMTIME: %.2fs&quot;</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>
  119. <span class="nb">print</span> <span class="s">&quot;ACTTIME: %.2fs&quot;</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>
  120. <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>
  121. <span class="n">output_thread</span><span class="o">.</span><span class="n">daemon</span> <span class="o">=</span> <span class="k">True</span>
  122. <span class="n">output_thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
  123. <span class="n">controller</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
  124. </pre></div>
  125. </div>
  126. <p>The time will be printed to the console. The user can send events by typing the string &#8220;interrupt&#8221; or &#8220;continue&#8221; in the console.</p>
  127. </div>
  128. <div class="section" id="eventloop-python">
  129. <h3>Eventloop (Python)<a class="headerlink" href="#eventloop-python" title="Permalink to this headline">¶</a></h3>
  130. <p>The SCCD model:</p>
  131. <div class="highlight-default"><div class="highlight"><pre>&lt;?xml version=&quot;1.0&quot; ?&gt;
  132. &lt;diagram author=&quot;Simon Van Mierlo&quot; name=&quot;Timer (Eventloop Version)&quot;&gt;
  133. &lt;top&gt;
  134. from sccd.runtime.libs.ui import ui
  135. from sccd.runtime.accurate_time import time
  136. &lt;/top&gt;
  137. &lt;inport name=&quot;ui&quot; /&gt;
  138. &lt;class name=&quot;MainApp&quot; default=&quot;true&quot;&gt;
  139. &lt;method name=&quot;MainApp&quot;&gt;
  140. &lt;body&gt;
  141. &lt;![CDATA[
  142. self.canvas = ui.append_canvas(ui.window,100,100,{&#39;background&#39;:&#39;#eee&#39;})
  143. self.clock_text = self.canvas.element.create_text(25,25,{&#39;text&#39;:&#39;0.0&#39;})
  144. self.actual_clock_text = self.canvas.element.create_text(25,50,{&#39;text&#39;:&#39;0.0&#39;})
  145. interrupt_button = ui.append_button(ui.window, &#39;INTERRUPT&#39;);
  146. continue_button = ui.append_button(ui.window, &#39;CONTINUE&#39;);
  147. ui.bind_event(interrupt_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, &#39;interrupt_clicked&#39;);
  148. ui.bind_event(continue_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, &#39;continue_clicked&#39;);
  149. ]]&gt;
  150. &lt;/body&gt;
  151. &lt;/method&gt;
  152. &lt;method name=&quot;update_timers&quot;&gt;
  153. &lt;body&gt;
  154. self.canvas.element.itemconfigure(self.clock_text, text=str(&#39;%.2f&#39; % (self.getSimulatedTime() / 1000.0)))
  155. self.canvas.element.itemconfigure(self.actual_clock_text, text=&#39;%.2f&#39; % (time() / 1000.0))
  156. &lt;/body&gt;
  157. &lt;/method&gt;
  158. &lt;scxml initial=&quot;running&quot;&gt;
  159. &lt;state id=&quot;running&quot;&gt;
  160. &lt;transition target=&quot;.&quot; after=&quot;0.05&quot;&gt;
  161. &lt;script&gt;
  162. self.update_timers()
  163. &lt;/script&gt;
  164. &lt;/transition&gt;
  165. &lt;transition target=&quot;../interrupted&quot; event=&quot;interrupt_clicked&quot; port=&quot;ui&quot;&gt;
  166. &lt;script&gt;
  167. self.update_timers()
  168. &lt;/script&gt;
  169. &lt;/transition&gt;
  170. &lt;/state&gt;
  171. &lt;state id=&quot;interrupted&quot;&gt;
  172. &lt;transition target=&quot;.&quot; event=&quot;interrupt_clicked&quot; port=&quot;ui&quot;&gt;
  173. &lt;script&gt;
  174. self.update_timers()
  175. &lt;/script&gt;
  176. &lt;/transition&gt;
  177. &lt;transition target=&quot;../running&quot; event=&quot;continue_clicked&quot; port=&quot;ui&quot;&gt;
  178. &lt;script&gt;
  179. self.update_timers()
  180. &lt;/script&gt;
  181. &lt;/transition&gt;
  182. &lt;/state&gt;
  183. &lt;/scxml&gt;
  184. &lt;/class&gt;
  185. &lt;/diagram&gt;
  186. </pre></div>
  187. </div>
  188. <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>
  189. <p>Then, the following file will run the model:</p>
  190. <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>
  191. <span class="kn">import</span> <span class="nn">timer</span>
  192. <span class="kn">from</span> <span class="nn">sccd.runtime.libs.ui</span> <span class="k">import</span> <span class="n">ui</span>
  193. <span class="kn">from</span> <span class="nn">sccd.runtime.statecharts_core</span> <span class="k">import</span> <span class="n">Event</span>
  194. <span class="kn">from</span> <span class="nn">sccd.runtime.tkinter_eventloop</span> <span class="k">import</span> <span class="o">*</span>
  195. <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
  196. <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>
  197. <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>
  198. <span class="n">controller</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
  199. <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>
  200. </pre></div>
  201. </div>
  202. </div>
  203. <div class="section" id="eventloop-javascript">
  204. <h3>Eventloop (Javascript)<a class="headerlink" href="#eventloop-javascript" title="Permalink to this headline">¶</a></h3>
  205. <p>The SCCD model:</p>
  206. <div class="highlight-default"><div class="highlight"><pre>&lt;?xml version=&quot;1.0&quot; ?&gt;
  207. &lt;diagram author=&quot;Simon Van Mierlo&quot; name=&quot;Timer&quot;&gt;
  208. &lt;inport name=&quot;ui&quot; /&gt;
  209. &lt;class name=&quot;MainApp&quot; default=&quot;true&quot;&gt;
  210. &lt;method name=&quot;MainApp&quot;&gt;
  211. &lt;body&gt;
  212. &lt;![CDATA[
  213. this.canvas = ui.append_canvas(ui.window,400,150,{&#39;background&#39;:&#39;#eee&#39;})
  214. this.clock_text = this.canvas.add_text(25,25,&#39;0.0&#39;)
  215. this.actual_clock_text = this.canvas.add_text(25,50,&#39;0.0&#39;)
  216. var interrupt_button = ui.append_button(ui.window, &#39;INTERRUPT&#39;);
  217. var continue_button = ui.append_button(ui.window, &#39;CONTINUE&#39;);
  218. ui.bind_event(interrupt_button.element, ui.EVENTS.MOUSE_CLICK, this.controller, &#39;interrupt_clicked&#39;);
  219. ui.bind_event(continue_button.element, ui.EVENTS.MOUSE_CLICK, this.controller, &#39;continue_clicked&#39;);
  220. ]]&gt;
  221. &lt;/body&gt;
  222. &lt;/method&gt;
  223. &lt;method name=&quot;update_timers&quot;&gt;
  224. &lt;body&gt;
  225. this.clock_text.set_text((this.getSimulatedTime() / 1000).toFixed(2));
  226. this.actual_clock_text.set_text((this.getSimulatedTime() / 1000).toFixed(2));
  227. &lt;/body&gt;
  228. &lt;/method&gt;
  229. &lt;scxml initial=&quot;running&quot;&gt;
  230. &lt;state id=&quot;running&quot;&gt;
  231. &lt;transition target=&quot;.&quot; after=&quot;0.05&quot;&gt;
  232. &lt;script&gt;
  233. this.update_timers();
  234. &lt;/script&gt;
  235. &lt;/transition&gt;
  236. &lt;transition target=&quot;../interrupted&quot; event=&quot;interrupt_clicked&quot; port=&quot;ui&quot;&gt;
  237. &lt;script&gt;
  238. this.update_timers();
  239. &lt;/script&gt;
  240. &lt;/transition&gt;
  241. &lt;/state&gt;
  242. &lt;state id=&quot;interrupted&quot;&gt;
  243. &lt;transition target=&quot;.&quot; event=&quot;interrupt_clicked&quot; port=&quot;ui&quot;&gt;
  244. &lt;script&gt;
  245. this.update_timers();
  246. &lt;/script&gt;
  247. &lt;/transition&gt;
  248. &lt;transition target=&quot;../running&quot; event=&quot;continue_clicked&quot; port=&quot;ui&quot;&gt;
  249. &lt;script&gt;
  250. this.update_timers();
  251. &lt;/script&gt;
  252. &lt;/transition&gt;
  253. &lt;/state&gt;
  254. &lt;/scxml&gt;
  255. &lt;/class&gt;
  256. &lt;/diagram&gt;
  257. </pre></div>
  258. </div>
  259. <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>
  260. <p>Then, the following file will run the model:</p>
  261. <div class="highlight-default"><div class="highlight"><pre><span class="o">&lt;</span><span class="n">div</span><span class="o">&gt;</span>
  262. <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/HackTimer.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  263. <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/statecharts_core.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  264. <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/utils.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  265. <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/svg.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  266. <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/ui.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  267. <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;timer.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  268. <span class="o">&lt;</span><span class="n">script</span><span class="o">&gt;</span>
  269. <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>
  270. <span class="n">controller</span><span class="o">.</span><span class="n">start</span><span class="p">();</span>
  271. <span class="o">&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  272. <span class="o">&lt;/</span><span class="n">div</span><span class="o">&gt;</span>
  273. </pre></div>
  274. </div>
  275. </div>
  276. </div>
  277. <div class="section" id="traffic-lights">
  278. <h2>Traffic Lights<a class="headerlink" href="#traffic-lights" title="Permalink to this headline">¶</a></h2>
  279. <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>
  280. <div class="section" id="python">
  281. <h3>Python<a class="headerlink" href="#python" title="Permalink to this headline">¶</a></h3>
  282. <p>The SCCD model:</p>
  283. <div class="highlight-default"><div class="highlight"><pre>&lt;?xml version=&quot;1.0&quot; ?&gt;
  284. &lt;diagram author=&quot;Raphael Mannadiar&quot; name=&quot;Traffic_Light_Python_Version&quot;&gt;
  285. &lt;top&gt;
  286. from sccd.runtime.libs.ui import ui
  287. &lt;/top&gt;
  288. &lt;inport name=&quot;ui&quot; /&gt;
  289. &lt;class name=&quot;MainApp&quot; default=&quot;true&quot;&gt;
  290. &lt;relationships&gt;
  291. &lt;association name=&quot;trafficlight&quot; class=&quot;TrafficLight&quot; /&gt;
  292. &lt;/relationships&gt;
  293. &lt;method name=&quot;MainApp&quot;&gt;
  294. &lt;body&gt;
  295. &lt;![CDATA[
  296. self.canvas = ui.append_canvas(ui.window,100,310,{&#39;background&#39;:&#39;#eee&#39;});
  297. police_button = ui.append_button(ui.window, &#39;Police interrupt&#39;);
  298. quit_button = ui.append_button(ui.window, &#39;Quit&#39;);
  299. ui.bind_event(police_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, &#39;police_interrupt_clicked&#39;);
  300. ui.bind_event(quit_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, &#39;quit_clicked&#39;);
  301. ]]&gt;
  302. &lt;/body&gt;
  303. &lt;/method&gt;
  304. &lt;scxml initial=&quot;initializing&quot;&gt;
  305. &lt;state id=&quot;initializing&quot;&gt;
  306. &lt;transition target=&quot;../creating&quot;&gt;
  307. &lt;raise scope=&quot;cd&quot; event=&quot;create_instance&quot;&gt;
  308. &lt;parameter expr=&#39;&quot;trafficlight&quot;&#39; /&gt;
  309. &lt;parameter expr=&#39;&quot;TrafficLight&quot;&#39; /&gt;
  310. &lt;parameter expr=&quot;self.canvas&quot; /&gt;
  311. &lt;/raise&gt;
  312. &lt;/transition&gt;
  313. &lt;/state&gt;
  314. &lt;state id=&quot;creating&quot;&gt;
  315. &lt;transition event=&quot;instance_created&quot; target=&quot;../initialized&quot;&gt;
  316. &lt;parameter name=&quot;association_name&quot; type=&quot;string&quot;/&gt;
  317. &lt;raise scope=&quot;cd&quot; event=&quot;start_instance&quot;&gt;
  318. &lt;parameter expr=&quot;association_name&quot; /&gt;
  319. &lt;/raise&gt;
  320. &lt;raise scope=&quot;narrow&quot; event=&quot;set_association_name&quot; target=&quot;association_name&quot;&gt;
  321. &lt;parameter expr=&quot;association_name&quot; /&gt;
  322. &lt;/raise&gt;
  323. &lt;/transition&gt;
  324. &lt;/state&gt;
  325. &lt;state id=&quot;initialized&quot;&gt;
  326. &lt;/state&gt;
  327. &lt;/scxml&gt;
  328. &lt;/class&gt;
  329. &lt;class name=&quot;TrafficLight&quot;&gt;
  330. &lt;relationships&gt;
  331. &lt;/relationships&gt;
  332. &lt;method name=&quot;TrafficLight&quot;&gt;
  333. &lt;parameter name=&quot;canvas&quot; /&gt;
  334. &lt;body&gt;
  335. &lt;![CDATA[
  336. size = 100;
  337. offset = size+5;
  338. self.RED = 0;
  339. self.YELLOW = 1;
  340. self.GREEN = 2;
  341. self.colors = [&#39;#f00&#39;,&#39;#ff0&#39;,&#39;#0f0&#39;]
  342. self.lights = [
  343. canvas.add_rectangle(size/2, size/2, size, size, {&#39;fill&#39;:&#39;#000&#39;}),
  344. canvas.add_rectangle(size/2, size/2+offset, size, size, {&#39;fill&#39;:&#39;#000&#39;}),
  345. canvas.add_rectangle(size/2, size/2+2*offset, size, size, {&#39;fill&#39;:&#39;#000&#39;})];
  346. ]]&gt;
  347. &lt;/body&gt;
  348. &lt;/method&gt;
  349. &lt;method name=&quot;clear&quot;&gt;
  350. &lt;body&gt;
  351. &lt;![CDATA[
  352. self.lights[self.RED].set_color(&#39;#000&#39;);
  353. self.lights[self.YELLOW].set_color(&#39;#000&#39;);
  354. self.lights[self.GREEN].set_color(&#39;#000&#39;);
  355. ]]&gt;
  356. &lt;/body&gt;
  357. &lt;/method&gt;
  358. &lt;method name=&quot;setGreen&quot;&gt;
  359. &lt;body&gt;
  360. &lt;![CDATA[
  361. self.clear();
  362. self.lights[self.GREEN].set_color(self.colors[self.GREEN]);
  363. ]]&gt;
  364. &lt;/body&gt;
  365. &lt;/method&gt;
  366. &lt;method name=&quot;setYellow&quot;&gt;
  367. &lt;body&gt;
  368. &lt;![CDATA[
  369. self.clear();
  370. self.lights[self.YELLOW].set_color(self.colors[self.YELLOW]);
  371. ]]&gt;
  372. &lt;/body&gt;
  373. &lt;/method&gt;
  374. &lt;method name=&quot;setRed&quot;&gt;
  375. &lt;body&gt;
  376. &lt;![CDATA[
  377. self.clear();
  378. self.lights[self.RED].set_color(self.colors[self.RED]);
  379. ]]&gt;
  380. &lt;/body&gt;
  381. &lt;/method&gt;
  382. &lt;scxml initial=&quot;on&quot;&gt;
  383. &lt;state id=&quot;on&quot; initial=&quot;normal&quot;&gt;
  384. &lt;state id=&quot;normal&quot; initial=&quot;red&quot;&gt;
  385. &lt;state id=&quot;red&quot;&gt;
  386. &lt;onentry&gt;
  387. &lt;script&gt;
  388. &lt;![CDATA[
  389. self.setRed();
  390. ]]&gt;
  391. &lt;/script&gt;
  392. &lt;/onentry&gt;
  393. &lt;transition after=&#39;3&#39; target=&#39;../green&#39;/&gt;
  394. &lt;/state&gt;
  395. &lt;state id=&quot;green&quot;&gt;
  396. &lt;onentry&gt;
  397. &lt;script&gt;
  398. &lt;![CDATA[
  399. self.setGreen();
  400. ]]&gt;
  401. &lt;/script&gt;
  402. &lt;/onentry&gt;
  403. &lt;transition after=&#39;2&#39; target=&#39;../yellow&#39;/&gt;
  404. &lt;/state&gt;
  405. &lt;state id=&quot;yellow&quot;&gt;
  406. &lt;onentry&gt;
  407. &lt;script&gt;
  408. &lt;![CDATA[
  409. self.setYellow();
  410. ]]&gt;
  411. &lt;/script&gt;
  412. &lt;/onentry&gt;
  413. &lt;transition after=&#39;1&#39; target=&#39;../red&#39;/&gt;
  414. &lt;/state&gt;
  415. &lt;transition event=&#39;police_interrupt_clicked&#39; port=&#39;ui&#39; target=&#39;../interrupted&#39;/&gt;
  416. &lt;history id=&quot;history&quot;/&gt;
  417. &lt;/state&gt;
  418. &lt;state id=&quot;interrupted&quot; initial=&quot;yellow&quot;&gt;
  419. &lt;state id=&quot;yellow&quot;&gt;
  420. &lt;onentry&gt;
  421. &lt;script&gt;
  422. &lt;![CDATA[
  423. self.setYellow();
  424. ]]&gt;
  425. &lt;/script&gt;
  426. &lt;/onentry&gt;
  427. &lt;transition after=&#39;.5&#39; target=&#39;../black&#39;/&gt;
  428. &lt;/state&gt;
  429. &lt;state id=&quot;black&quot;&gt;
  430. &lt;onentry&gt;
  431. &lt;script&gt;
  432. &lt;![CDATA[
  433. self.clear();
  434. ]]&gt;
  435. &lt;/script&gt;
  436. &lt;/onentry&gt;
  437. &lt;transition after=&#39;.5&#39; target=&#39;../yellow&#39;/&gt;
  438. &lt;/state&gt;
  439. &lt;transition event=&#39;police_interrupt_clicked&#39; port=&#39;ui&#39; target=&#39;../normal/history&#39;/&gt;
  440. &lt;/state&gt;
  441. &lt;transition event=&#39;quit_clicked&#39; port=&#39;ui&#39; target=&#39;../off&#39;/&gt;
  442. &lt;/state&gt;
  443. &lt;state id=&quot;off&quot;&gt;
  444. &lt;onentry&gt;
  445. &lt;script&gt;
  446. &lt;![CDATA[
  447. self.clear();
  448. ]]&gt;
  449. &lt;/script&gt;
  450. &lt;/onentry&gt;
  451. &lt;/state&gt;
  452. &lt;/scxml&gt;
  453. &lt;/class&gt;
  454. &lt;/diagram&gt;
  455. </pre></div>
  456. </div>
  457. <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>
  458. <p>Then, the following file will run the model:</p>
  459. <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>
  460. <span class="kn">import</span> <span class="nn">trafficlight</span>
  461. <span class="kn">from</span> <span class="nn">sccd.runtime.libs.ui</span> <span class="k">import</span> <span class="n">ui</span>
  462. <span class="kn">from</span> <span class="nn">sccd.runtime.statecharts_core</span> <span class="k">import</span> <span class="n">Event</span>
  463. <span class="kn">from</span> <span class="nn">sccd.runtime.tkinter_eventloop</span> <span class="k">import</span> <span class="o">*</span>
  464. <span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
  465. <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>
  466. <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>
  467. <span class="n">controller</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
  468. <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>
  469. </pre></div>
  470. </div>
  471. </div>
  472. <div class="section" id="javascript">
  473. <h3>Javascript<a class="headerlink" href="#javascript" title="Permalink to this headline">¶</a></h3>
  474. <p>The SCCD model:</p>
  475. <div class="highlight-default"><div class="highlight"><pre>&lt;?xml version=&quot;1.0&quot; ?&gt;
  476. &lt;diagram author=&quot;Raphael Mannadiar&quot; name=&quot;Traffic_Light_JavaScript_Version&quot;&gt;
  477. &lt;inport name=&quot;ui&quot; /&gt;
  478. &lt;class name=&quot;MainApp&quot; default=&quot;true&quot;&gt;
  479. &lt;relationships&gt;
  480. &lt;association name=&quot;trafficlight&quot; class=&quot;TrafficLight&quot; /&gt;
  481. &lt;/relationships&gt;
  482. &lt;method name=&quot;MainApp&quot;&gt;
  483. &lt;body&gt;
  484. &lt;![CDATA[
  485. this.canvas = ui.append_canvas(ui.window,100,310,{&#39;background&#39;:&#39;#eee&#39;});
  486. var police_button = ui.append_button(ui.window, &#39;Police interrupt&#39;);
  487. var quit_button = ui.append_button(ui.window, &#39;Quit&#39;);
  488. ui.bind_event(police_button.element, ui.EVENTS.MOUSE_CLICK, this.controller, &#39;police_interrupt_clicked&#39;);
  489. ui.bind_event(quit_button.element, ui.EVENTS.MOUSE_CLICK, this.controller, &#39;quit_clicked&#39;);
  490. ]]&gt;
  491. &lt;/body&gt;
  492. &lt;/method&gt;
  493. &lt;scxml initial=&quot;initializing&quot;&gt;
  494. &lt;state id=&quot;initializing&quot;&gt;
  495. &lt;transition target=&quot;../creating&quot;&gt;
  496. &lt;raise scope=&quot;cd&quot; event=&quot;create_instance&quot;&gt;
  497. &lt;parameter expr=&#39;&quot;trafficlight&quot;&#39; /&gt;
  498. &lt;parameter expr=&#39;&quot;TrafficLight&quot;&#39; /&gt;
  499. &lt;parameter expr=&quot;this.canvas&quot; /&gt;
  500. &lt;/raise&gt;
  501. &lt;/transition&gt;
  502. &lt;/state&gt;
  503. &lt;state id=&quot;creating&quot;&gt;
  504. &lt;transition event=&quot;instance_created&quot; target=&quot;../initialized&quot;&gt;
  505. &lt;parameter name=&quot;association_name&quot; type=&quot;string&quot;/&gt;
  506. &lt;raise scope=&quot;cd&quot; event=&quot;start_instance&quot;&gt;
  507. &lt;parameter expr=&quot;association_name&quot; /&gt;
  508. &lt;/raise&gt;
  509. &lt;raise scope=&quot;narrow&quot; event=&quot;set_association_name&quot; target=&quot;association_name&quot;&gt;
  510. &lt;parameter expr=&quot;association_name&quot; /&gt;
  511. &lt;/raise&gt;
  512. &lt;/transition&gt;
  513. &lt;/state&gt;
  514. &lt;state id=&quot;initialized&quot;&gt;
  515. &lt;/state&gt;
  516. &lt;/scxml&gt;
  517. &lt;/class&gt;
  518. &lt;class name=&quot;TrafficLight&quot;&gt;
  519. &lt;relationships&gt;
  520. &lt;/relationships&gt;
  521. &lt;method name=&quot;TrafficLight&quot;&gt;
  522. &lt;parameter name=&quot;canvas&quot; /&gt;
  523. &lt;body&gt;
  524. &lt;![CDATA[
  525. var size = 100;
  526. var offset = size+5;
  527. this.RED = 0;
  528. this.YELLOW = 1;
  529. this.GREEN = 2;
  530. this.colors = [&#39;#f00&#39;,&#39;#ff0&#39;,&#39;#0f0&#39;]
  531. this.lights = [canvas.add_rectangle(size/2, size/2, size, size, {&#39;fill&#39;:&#39;#000&#39;}),
  532. canvas.add_rectangle(size/2, size/2+offset, size, size, {&#39;fill&#39;:&#39;#000&#39;}),
  533. canvas.add_rectangle(size/2, size/2+2*offset, size, size, {&#39;fill&#39;:&#39;#000&#39;})];
  534. ]]&gt;
  535. &lt;/body&gt;
  536. &lt;/method&gt;
  537. &lt;method name=&quot;clear&quot;&gt;
  538. &lt;body&gt;
  539. &lt;![CDATA[
  540. this.lights[this.RED].set_color(&#39;#000&#39;);
  541. this.lights[this.YELLOW].set_color(&#39;#000&#39;);
  542. this.lights[this.GREEN].set_color(&#39;#000&#39;);
  543. ]]&gt;
  544. &lt;/body&gt;
  545. &lt;/method&gt;
  546. &lt;method name=&quot;setGreen&quot;&gt;
  547. &lt;body&gt;
  548. &lt;![CDATA[
  549. this.clear();
  550. this.lights[this.GREEN].set_color(this.colors[this.GREEN]);
  551. ]]&gt;
  552. &lt;/body&gt;
  553. &lt;/method&gt;
  554. &lt;method name=&quot;setYellow&quot;&gt;
  555. &lt;body&gt;
  556. &lt;![CDATA[
  557. this.clear();
  558. this.lights[this.YELLOW].set_color(this.colors[this.YELLOW]);
  559. ]]&gt;
  560. &lt;/body&gt;
  561. &lt;/method&gt;
  562. &lt;method name=&quot;setRed&quot;&gt;
  563. &lt;body&gt;
  564. &lt;![CDATA[
  565. this.clear();
  566. this.lights[this.RED].set_color(this.colors[this.RED]);
  567. ]]&gt;
  568. &lt;/body&gt;
  569. &lt;/method&gt;
  570. &lt;scxml initial=&quot;on&quot;&gt;
  571. &lt;state id=&quot;on&quot; initial=&quot;normal&quot;&gt;
  572. &lt;state id=&quot;normal&quot; initial=&quot;red&quot;&gt;
  573. &lt;state id=&quot;red&quot;&gt;
  574. &lt;onentry&gt;
  575. &lt;script&gt;
  576. &lt;![CDATA[
  577. this.setRed();
  578. ]]&gt;
  579. &lt;/script&gt;
  580. &lt;/onentry&gt;
  581. &lt;transition after=&#39;3&#39; target=&#39;../green&#39;/&gt;
  582. &lt;/state&gt;
  583. &lt;state id=&quot;green&quot;&gt;
  584. &lt;onentry&gt;
  585. &lt;script&gt;
  586. &lt;![CDATA[
  587. this.setGreen();
  588. ]]&gt;
  589. &lt;/script&gt;
  590. &lt;/onentry&gt;
  591. &lt;transition after=&#39;2&#39; target=&#39;../yellow&#39;/&gt;
  592. &lt;/state&gt;
  593. &lt;state id=&quot;yellow&quot;&gt;
  594. &lt;onentry&gt;
  595. &lt;script&gt;
  596. &lt;![CDATA[
  597. this.setYellow();
  598. ]]&gt;
  599. &lt;/script&gt;
  600. &lt;/onentry&gt;
  601. &lt;transition after=&#39;1&#39; target=&#39;../red&#39;/&gt;
  602. &lt;/state&gt;
  603. &lt;transition event=&#39;police_interrupt_clicked&#39; port=&#39;ui&#39; target=&#39;../interrupted&#39;/&gt;
  604. &lt;history id=&quot;history&quot;/&gt;
  605. &lt;/state&gt;
  606. &lt;state id=&quot;interrupted&quot; initial=&quot;yellow&quot;&gt;
  607. &lt;state id=&quot;yellow&quot;&gt;
  608. &lt;onentry&gt;
  609. &lt;script&gt;
  610. &lt;![CDATA[
  611. this.setYellow();
  612. ]]&gt;
  613. &lt;/script&gt;
  614. &lt;/onentry&gt;
  615. &lt;transition after=&#39;.5&#39; target=&#39;../black&#39;/&gt;
  616. &lt;/state&gt;
  617. &lt;state id=&quot;black&quot;&gt;
  618. &lt;onentry&gt;
  619. &lt;script&gt;
  620. &lt;![CDATA[
  621. this.clear();
  622. ]]&gt;
  623. &lt;/script&gt;
  624. &lt;/onentry&gt;
  625. &lt;transition after=&#39;.5&#39; target=&#39;../yellow&#39;/&gt;
  626. &lt;/state&gt;
  627. &lt;transition event=&#39;police_interrupt_clicked&#39; port=&#39;ui&#39; target=&#39;../normal/history&#39;/&gt;
  628. &lt;/state&gt;
  629. &lt;transition event=&#39;quit_clicked&#39; port=&#39;ui&#39; target=&#39;../off&#39;/&gt;
  630. &lt;/state&gt;
  631. &lt;state id=&quot;off&quot;&gt;
  632. &lt;onentry&gt;
  633. &lt;script&gt;
  634. &lt;![CDATA[
  635. this.clear();
  636. ]]&gt;
  637. &lt;/script&gt;
  638. &lt;/onentry&gt;
  639. &lt;/state&gt;
  640. &lt;/scxml&gt;
  641. &lt;/class&gt;
  642. &lt;/diagram&gt;
  643. </pre></div>
  644. </div>
  645. <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>
  646. <p>Then, the following file will run the model:</p>
  647. <div class="highlight-default"><div class="highlight"><pre><span class="o">&lt;</span><span class="n">div</span><span class="o">&gt;</span>
  648. <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/HackTimer.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  649. <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/statecharts_core.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  650. <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/utils.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  651. <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/svg.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  652. <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;https://msdl.uantwerpen.be/git/simon/SCCD/raw/v0.9/src/javascript_sccd_runtime/libs/ui.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  653. <span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;trafficlight.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  654. <span class="o">&lt;</span><span class="n">script</span><span class="o">&gt;</span>
  655. <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>
  656. <span class="n">controller</span><span class="o">.</span><span class="n">start</span><span class="p">();</span>
  657. <span class="o">&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
  658. <span class="o">&lt;/</span><span class="n">div</span><span class="o">&gt;</span>
  659. </pre></div>
  660. </div>
  661. </div>
  662. </div>
  663. </div>
  664. </div>
  665. </div>
  666. </div>
  667. <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
  668. <div class="sphinxsidebarwrapper">
  669. <h3><a href="index.html">Table Of Contents</a></h3>
  670. <ul>
  671. <li><a class="reference internal" href="#">Examples</a><ul>
  672. <li><a class="reference internal" href="#timer">Timer</a><ul>
  673. <li><a class="reference internal" href="#threads-python">Threads (Python)</a></li>
  674. <li><a class="reference internal" href="#eventloop-python">Eventloop (Python)</a></li>
  675. <li><a class="reference internal" href="#eventloop-javascript">Eventloop (Javascript)</a></li>
  676. </ul>
  677. </li>
  678. <li><a class="reference internal" href="#traffic-lights">Traffic Lights</a><ul>
  679. <li><a class="reference internal" href="#python">Python</a></li>
  680. <li><a class="reference internal" href="#javascript">Javascript</a></li>
  681. </ul>
  682. </li>
  683. </ul>
  684. </li>
  685. </ul>
  686. <h4>Previous topic</h4>
  687. <p class="topless"><a href="runtime_platforms.html"
  688. title="previous chapter">Runtime Platforms</a></p>
  689. <h4>Next topic</h4>
  690. <p class="topless"><a href="semantic_options.html"
  691. title="next chapter">Semantic Options</a></p>
  692. <div role="note" aria-label="source link">
  693. <h3>This Page</h3>
  694. <ul class="this-page-menu">
  695. <li><a href="_sources/examples.txt"
  696. rel="nofollow">Show Source</a></li>
  697. </ul>
  698. </div>
  699. <div id="searchbox" style="display: none" role="search">
  700. <h3>Quick search</h3>
  701. <form class="search" action="search.html" method="get">
  702. <div><input type="text" name="q" /></div>
  703. <div><input type="submit" value="Go" /></div>
  704. <input type="hidden" name="check_keywords" value="yes" />
  705. <input type="hidden" name="area" value="default" />
  706. </form>
  707. </div>
  708. <script type="text/javascript">$('#searchbox').show(0);</script>
  709. </div>
  710. </div>
  711. <div class="clearer"></div>
  712. </div>
  713. <div class="related" role="navigation" aria-label="related navigation">
  714. <h3>Navigation</h3>
  715. <ul>
  716. <li class="right" style="margin-right: 10px">
  717. <a href="genindex.html" title="General Index"
  718. >index</a></li>
  719. <li class="right" >
  720. <a href="py-modindex.html" title="Python Module Index"
  721. >modules</a> |</li>
  722. <li class="right" >
  723. <a href="semantic_options.html" title="Semantic Options"
  724. >next</a> |</li>
  725. <li class="right" >
  726. <a href="runtime_platforms.html" title="Runtime Platforms"
  727. >previous</a> |</li>
  728. <li class="nav-item nav-item-0"><a href="index.html">SCCD 0.9 documentation</a> &#187;</li>
  729. </ul>
  730. </div>
  731. <div class="footer" role="contentinfo">
  732. &#169; Copyright 2016, Simon Van Mierlo.
  733. Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.4.6.
  734. </div>
  735. </body>
  736. </html>