sccd.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. <?xml version="1.0" ?>
  2. <diagram>
  3. <inport name="tkinter_input" />
  4. <class name="Train" default="true">
  5. <relationships>
  6. </relationships>
  7. <constructor>
  8. <parameter name="root" />
  9. <body>
  10. <![CDATA[
  11. self.root, self.acceleration, self.velocity = root, 0.0, 0.0
  12. self.root.trainIs(self)
  13. ]]>
  14. </body>
  15. </constructor>
  16. <method name="updateState">
  17. <body>
  18. <![CDATA[
  19. self.root.updateState()
  20. ]]>
  21. </body>
  22. </method>
  23. <method name="openDoors">
  24. <body>
  25. <![CDATA[
  26. self.root.openDoors()
  27. ]]>
  28. </body>
  29. </method>
  30. <method name="closeDoors">
  31. <body>
  32. <![CDATA[
  33. self.root.closeDoors()
  34. ]]>
  35. </body>
  36. </method>
  37. <method name="notify">
  38. <parameter name="message" />
  39. <parameter name="color" />
  40. <body>
  41. <![CDATA[
  42. self.root.notify(message, color)
  43. ]]>
  44. </body>
  45. </method>
  46. <scxml initial="paused" priority="source_child">
  47. <state id="normal_operation" initial="for_history">
  48. <parallel id="for_history">
  49. <state id="train" initial="train">
  50. <state id="train" initial="stopped">
  51. <state id="stopped" initial="ready_to_leave">
  52. <onentry>
  53. <script>
  54. <![CDATA[
  55. self.speed = 0.0
  56. self.acceleration = 0.0
  57. ]]>
  58. </script>
  59. </onentry>
  60. <state id="opened_doors">
  61. <onentry>
  62. <script>
  63. <![CDATA[self.notify("Please wait before closing doors", "white")]]>
  64. </script>
  65. </onentry>
  66. <transition after="5" target="./../allow_closing" />
  67. </state>
  68. <state id="in_station">
  69. <transition event="open" port="tkinter_input" target="./../opened_doors">
  70. <script>
  71. <![CDATA[
  72. self.openDoors()
  73. ]]>
  74. </script>
  75. </transition>
  76. </state>
  77. <state id="allow_closing">
  78. <onentry>
  79. <script>
  80. <![CDATA[
  81. self.notify("You can now close the doors!", "white")
  82. ]]>
  83. </script>
  84. </onentry>
  85. <transition event="close" port="tkinter_input" target="./../ready_to_leave">
  86. <script>
  87. <![CDATA[
  88. self.closeDoors()
  89. ]]>
  90. </script>
  91. </transition>
  92. </state>
  93. <state id="ready_to_leave">
  94. <transition event="accel" port="tkinter_input" cond="value &gt; 0" target="./../../driving">
  95. <parameter name="value" />
  96. <script>
  97. <![CDATA[
  98. self.acceleration = value
  99. ]]>
  100. </script>
  101. </transition>
  102. </state>
  103. </state>
  104. <state id="approaching_station">
  105. <transition cond="self.speed &lt;= 0" target="./../stopped/in_station" />
  106. <transition event="accel" port="tkinter_input" target=".">
  107. <parameter name="value" />
  108. <script>
  109. <![CDATA[
  110. self.acceleration = value
  111. ]]>
  112. </script>
  113. </transition>
  114. <transition event="leave" port="tkinter_input" target=".">
  115. <script>
  116. <![CDATA[
  117. self.notify("Left station without stopping", "red")
  118. ]]>
  119. </script>
  120. <raise event="error" scope="broad" />
  121. </transition>
  122. </state>
  123. <state id="driving">
  124. <transition event="enter" port="tkinter_input" cond="self.speed &lt;= 50" target="./../approaching_station" />
  125. <transition cond="self.speed &gt;= 100 and self.acceleration &gt; 0" target="./../max_speed" />
  126. <transition event="accel" port="tkinter_input" target="." >
  127. <parameter name="value" />
  128. <script>
  129. <![CDATA[
  130. self.acceleration = value
  131. ]]>
  132. </script>
  133. </transition>
  134. <transition cond="self.speed &lt;= 0 and self.acceleration &lt; 0" target="./../stopped/ready_to_leave" />
  135. <transition event="enter" cond="self.speed &gt; 50" target="./../approaching_station">
  136. <script>
  137. <![CDATA[
  138. self.notify("Entered station too fast", "red")
  139. ]]>
  140. </script>
  141. <raise event="error" scope="broad" />
  142. </transition>
  143. </state>
  144. <state id="max_speed">
  145. <onentry>
  146. <script>
  147. <![CDATA[
  148. self.speed = 120.0
  149. self.acceleration = 0.0
  150. print("MAX")
  151. ]]>
  152. </script>
  153. </onentry>
  154. <onexit>
  155. <script>
  156. <![CDATA[print("LEAVE MAX")]]>
  157. </script>
  158. </onexit>
  159. <transition event="accel" port="tkinter_input" cond="value &lt; 0" target="./../driving" >
  160. <parameter name="value" />
  161. <script>
  162. <![CDATA[
  163. self.acceleration = value
  164. ]]>
  165. </script>
  166. </transition>
  167. <transition event="enter" port="tkinter_input" target="." >
  168. <script>
  169. <![CDATA[
  170. self.notify("Entered station at maximum speed!", "red")
  171. ]]>
  172. </script>
  173. <raise event="error" scope="broad" />
  174. </transition>
  175. </state>
  176. </state>
  177. </state>
  178. <state id="GUI_update" initial="S_">
  179. <state id="S_" initial="updating">
  180. <state id="updating">
  181. <transition after="0.02" target="." >
  182. <script>
  183. <![CDATA[
  184. self.updateState()
  185. ]]>
  186. </script>
  187. </transition>
  188. </state>
  189. </state>
  190. </state>
  191. <state id="polling" initial="S_">
  192. <state id="S_" initial="okay">
  193. <state id="okay">
  194. <transition after="20.0" target="./../warn">
  195. <script>
  196. <![CDATA[
  197. self.notify("Please press button!", "yellow")
  198. ]]>
  199. </script>
  200. </transition>
  201. </state>
  202. <state id="warn">
  203. <transition event="awake" port="tkinter_input" target="./../okay">
  204. <script>
  205. <![CDATA[
  206. self.notify("", "gray")
  207. ]]>
  208. </script>
  209. </transition>
  210. <transition after="10.0" target="." >
  211. <script>
  212. <![CDATA[
  213. self.notify("Did not press the button in time", "red")
  214. ]]>
  215. </script>
  216. <raise event="error" scope="broad" />
  217. </transition>
  218. </state>
  219. </state>
  220. </state>
  221. </parallel>
  222. <history id="H" type="deep" />
  223. <transition event="red_light" port="tkinter_input" target="./../emergency_stop">
  224. <script>
  225. <![CDATA[
  226. self.notify("Passed red light", "red")
  227. ]]>
  228. </script>
  229. </transition>
  230. <transition event="yellow_light" port="tkinter_input" cond="self.speed &gt; 50" target="./../emergency_stop">
  231. <script>
  232. <![CDATA[
  233. self.notify("Passed yellow light while driving too fast", "red")
  234. ]]>
  235. </script>
  236. </transition>
  237. <transition event="error" target="./../emergency_stop" />
  238. <transition event="pause" port="tkinter_input" target="./../paused">
  239. <script>
  240. <![CDATA[
  241. self.notify("Paused", "white")
  242. ]]>
  243. </script>
  244. </transition>
  245. </state>
  246. <state id="emergency_stop" >
  247. <onentry>
  248. <script>
  249. <![CDATA[
  250. self.acceleration = -1
  251. ]]>
  252. </script>
  253. </onentry>
  254. <transition cond="self.speed &lt;= 0" target="./../finished" />\
  255. <transition after="0.02" target="." >
  256. <script>
  257. <![CDATA[
  258. self.updateState()
  259. ]]>
  260. </script>
  261. </transition>
  262. </state>
  263. <state id="finished">
  264. <onentry>
  265. <script>
  266. <![CDATA[
  267. self.acceleration = 0.0
  268. self.speed = 0.0
  269. ]]>
  270. </script>
  271. </onentry>
  272. </state>
  273. <state id="paused">
  274. <transition event="continue" port="tkinter_input" target="./../normal_operation/H" >
  275. <script>
  276. <![CDATA[self.notify("", "gray")]]>
  277. </script>
  278. </transition>
  279. </state>
  280. </scxml>
  281. </class>
  282. </diagram>