SCCD_all.mvc 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  1. include "primitives.alh"
  2. Diagram dynamic_trafficlight {
  3. name = "Dynamic Traffic Light"
  4. author = "Yentl Van Tendeloo"
  5. }
  6. Class manager {
  7. name = "Manager"
  8. default = True
  9. constructor_body = $
  10. Void function constructor(attributes : Element, parameters : Element):
  11. dict_add(attributes, "trafficlights", list_create())
  12. return !
  13. $
  14. {behaviour} CompositeState manager_main {
  15. name = "main"
  16. isInitial = True
  17. {composite_children} ParallelState manager_main_parallel {
  18. name = "parallel"
  19. isInitial = True
  20. {parallel_children} CompositeState manager_main_parallel_core {
  21. name = "core"
  22. isInitial = True
  23. {composite_children} BasicState manager_main_parallel_core_start {
  24. name = "start"
  25. isInitial = True
  26. }
  27. }
  28. {parallel_children} CompositeState manager_main_parallel_input {
  29. name = "input"
  30. isInitial = True
  31. {composite_children} BasicState manager_main_parallel_input_1 {
  32. name = "1"
  33. isInitial = True
  34. }
  35. {composite_children} BasicState manager_main_parallel_input_2 {
  36. name = "2"
  37. isInitial = False
  38. }
  39. {composite_children} BasicState manager_main_parallel_input_3 {
  40. name = "3"
  41. isInitial = False
  42. }
  43. {composite_children} BasicState manager_main_parallel_input_4 {
  44. name = "4"
  45. isInitial = False
  46. }
  47. {composite_children} BasicState manager_main_parallel_input_5 {
  48. name = "5"
  49. isInitial = False
  50. }
  51. {composite_children} BasicState manager_main_parallel_input_6 {
  52. name = "6"
  53. isInitial = False
  54. }
  55. {composite_children} BasicState manager_main_parallel_input_7 {
  56. name = "7"
  57. isInitial = False
  58. }
  59. {composite_children} BasicState manager_main_parallel_input_8 {
  60. name = "8"
  61. isInitial = False
  62. }
  63. {composite_children} BasicState manager_main_parallel_input_9 {
  64. name = "9"
  65. isInitial = False
  66. }
  67. {composite_children} BasicState manager_main_parallel_input_10 {
  68. name = "10"
  69. isInitial = False
  70. }
  71. {composite_children} BasicState manager_main_parallel_input_11 {
  72. name = "11"
  73. isInitial = False
  74. }
  75. {composite_children} BasicState manager_main_parallel_input_12 {
  76. name = "12"
  77. isInitial = False
  78. }
  79. }
  80. }
  81. }
  82. }
  83. transition (manager_main_parallel_input_1, manager_main_parallel_input_2) {
  84. name = ""
  85. after = $
  86. Element function after(attributes : Element):
  87. return 1.0!
  88. $
  89. {transition_raises} Raise {
  90. scope = "broad"
  91. event = "create"
  92. parameter = $
  93. Element function raise(attributes : Element, parameters : Element):
  94. return list_create()!
  95. $
  96. }
  97. }
  98. transition (manager_main_parallel_input_2, manager_main_parallel_input_3) {
  99. name = ""
  100. after = $
  101. Element function after(attributes : Element):
  102. return 4.0!
  103. $
  104. {transition_raises} Raise {
  105. scope = "broad"
  106. event = "toggle"
  107. parameter = $
  108. Element function raise(attributes : Element, parameters : Element):
  109. return list_create()!
  110. $
  111. }
  112. }
  113. transition (manager_main_parallel_input_3, manager_main_parallel_input_4) {
  114. name = ""
  115. after = $
  116. Element function after(attributes : Element):
  117. return 10.0!
  118. $
  119. {transition_raises} Raise {
  120. scope = "broad"
  121. event = "create"
  122. parameter = $
  123. Element function raise(attributes : Element, parameters : Element):
  124. return list_create()!
  125. $
  126. }
  127. }
  128. transition (manager_main_parallel_input_4, manager_main_parallel_input_5) {
  129. name = ""
  130. after = $
  131. Element function after(attributes : Element):
  132. return 5.0!
  133. $
  134. {transition_raises} Raise {
  135. scope = "broad"
  136. event = "police_interrupt"
  137. parameter = $
  138. Element function raise(attributes : Element, parameters : Element):
  139. return list_create()!
  140. $
  141. }
  142. }
  143. transition (manager_main_parallel_input_5, manager_main_parallel_input_6) {
  144. name = ""
  145. after = $
  146. Element function after(attributes : Element):
  147. return 9.4!
  148. $
  149. {transition_raises} Raise {
  150. scope = "broad"
  151. event = "toggle"
  152. parameter = $
  153. Element function raise(attributes : Element, parameters : Element):
  154. return list_create()!
  155. $
  156. }
  157. }
  158. transition (manager_main_parallel_input_6, manager_main_parallel_input_7) {
  159. name = ""
  160. after = $
  161. Element function after(attributes : Element):
  162. return 100.0!
  163. $
  164. {transition_raises} Raise {
  165. scope = "broad"
  166. event = "toggle"
  167. parameter = $
  168. Element function raise(attributes : Element, parameters : Element):
  169. return list_create()!
  170. $
  171. }
  172. }
  173. transition (manager_main_parallel_input_7, manager_main_parallel_input_8) {
  174. name = ""
  175. after = $
  176. Element function after(attributes : Element):
  177. return 10.0!
  178. $
  179. {transition_raises} Raise {
  180. scope = "broad"
  181. event = "police_interrupt"
  182. parameter = $
  183. Element function raise(attributes : Element, parameters : Element):
  184. return list_create()!
  185. $
  186. }
  187. }
  188. transition (manager_main_parallel_input_8, manager_main_parallel_input_9) {
  189. name = ""
  190. after = $
  191. Element function after(attributes : Element):
  192. return 5.0!
  193. $
  194. {transition_raises} Raise {
  195. scope = "broad"
  196. event = "delete"
  197. parameter = $
  198. Element function raise(attributes : Element, parameters : Element):
  199. return list_create()!
  200. $
  201. }
  202. }
  203. transition (manager_main_parallel_input_9, manager_main_parallel_input_10) {
  204. name = ""
  205. after = $
  206. Element function after(attributes : Element):
  207. return 4.0!
  208. $
  209. {transition_raises} Raise {
  210. scope = "broad"
  211. event = "delete"
  212. parameter = $
  213. Element function raise(attributes : Element, parameters : Element):
  214. return list_create()!
  215. $
  216. }
  217. }
  218. transition (manager_main_parallel_input_10, manager_main_parallel_input_11) {
  219. name = ""
  220. after = $
  221. Element function after(attributes : Element):
  222. return 5.0!
  223. $
  224. {transition_raises} Raise {
  225. scope = "broad"
  226. event = "exit"
  227. parameter = $
  228. Element function raise(attributes : Element, parameters : Element):
  229. return list_create()!
  230. $
  231. }
  232. }
  233. transition (manager_main_parallel_core_start, manager_main_parallel_core_start) {
  234. name = "create"
  235. event = "create"
  236. {transition_raises} Raise {
  237. scope = "cd"
  238. event = "create_instance"
  239. parameter = $
  240. Element function raise(attributes : Element, parameters : Element):
  241. Element result
  242. result = list_create()
  243. list_append(result, "trafficlights")
  244. list_append(result, "TrafficLight")
  245. list_append(result, read_root())
  246. return result!
  247. $
  248. }
  249. }
  250. transition (manager_main_parallel_core_start, manager_main_parallel_core_start) {
  251. name = "created"
  252. event = "instance_created"
  253. script = $
  254. Void function script(attributes : Element, parameters : Element):
  255. list_append(attributes["trafficlights"], parameters[0])
  256. return!
  257. $
  258. }
  259. transition (manager_main_parallel_core_start, manager_main_parallel_core_start) {
  260. name = "exit"
  261. event = "exit"
  262. {transition_raises} Raise {
  263. scope = "cd"
  264. event = "delete_instance"
  265. parameter = $
  266. Element function raise(attributes : Element, parameters : Element):
  267. Element result
  268. result = list_create()
  269. list_append(result, "0")
  270. return result!
  271. $
  272. }
  273. }
  274. transition (manager_main_parallel_core_start, manager_main_parallel_core_start) {
  275. name = "delete"
  276. event = "delete"
  277. {transition_raises} Raise {
  278. scope = "cd"
  279. event = "delete_instance"
  280. parameter = $
  281. Element function raise(attributes : Element, parameters : Element):
  282. Element result
  283. result = list_create()
  284. list_append(result, list_pop_final(attributes["trafficlights"]))
  285. return result!
  286. $
  287. }
  288. }
  289. Class trafficlight {
  290. name = "TrafficLight"
  291. default = False
  292. constructor_body = $
  293. Void function constructor(attributes : Element, parameters : Element):
  294. dict_add(attributes, "counter", 0)
  295. dict_add(attributes, "colour", "")
  296. return!
  297. $
  298. {behaviour} CompositeState trafficlight_main {
  299. name = "main"
  300. isInitial = True
  301. {composite_children} BasicState trafficlight_main_off {
  302. name = "off"
  303. isInitial = True
  304. }
  305. {composite_children} ParallelState trafficlight_main_main {
  306. name = "main"
  307. isInitial = False
  308. {onExitRaise} Raise {
  309. event = "displayNone"
  310. scope = "output"
  311. }
  312. {parallel_children} CompositeState trafficlight_main_main_trafficlight {
  313. name = "trafficlight"
  314. isInitial = False
  315. {composite_children} CompositeState trafficlight_main_main_trafficlight_normal {
  316. name = "normal"
  317. isInitial = True
  318. onExitScript = $
  319. Void function onexit(attributes : Element):
  320. dict_overwrite(attributes, "colour", "")
  321. return!
  322. $
  323. {composite_children} BasicState trafficlight_main_main_trafficlight_normal_red {
  324. name = "red"
  325. isInitial = True
  326. onEntryScript = $
  327. Void function onentry(attributes : Element):
  328. dict_overwrite(attributes, "counter", 60)
  329. dict_overwrite(attributes, "colour", "red")
  330. return!
  331. $
  332. {onEntryRaise} Raise {
  333. event = "displayRed"
  334. scope = "output"
  335. }
  336. {onEntryRaise} Raise {
  337. event = "resetTimer"
  338. scope = "output"
  339. }
  340. }
  341. {composite_children} BasicState trafficlight_main_main_trafficlight_normal_green {
  342. name = "green"
  343. isInitial = False
  344. onEntryScript = $
  345. Void function onentry(attributes : Element):
  346. dict_overwrite(attributes, "counter", 55)
  347. dict_overwrite(attributes, "colour", "green")
  348. return!
  349. $
  350. {onEntryRaise} Raise {
  351. event = "displayGreen"
  352. scope = "output"
  353. }
  354. {onEntryRaise} Raise {
  355. event = "resetTimer"
  356. scope = "output"
  357. }
  358. }
  359. {composite_children} BasicState trafficlight_main_main_trafficlight_normal_yellow {
  360. name = "yellow"
  361. isInitial = False
  362. onEntryScript = $
  363. Void function onentry(attributes : Element):
  364. dict_overwrite(attributes, "colour", "")
  365. return!
  366. $
  367. {onEntryRaise} Raise {
  368. event = "displayYellow"
  369. scope = "output"
  370. }
  371. {onEntryRaise} Raise {
  372. event = "disableTimer"
  373. scope = "output"
  374. }
  375. }
  376. {composite_children} HistoryState trafficlight_main_main_trafficlight_normal_hist {
  377. name = "hist"
  378. }
  379. }
  380. {composite_children} CompositeState trafficlight_main_main_trafficlight_interrupted {
  381. {composite_children} BasicState trafficlight_main_main_trafficlight_interrupted_yellow {
  382. name = "yellow"
  383. isInitial = True
  384. {onEntryRaise} Raise {
  385. event = "displayYellow"
  386. scope = "output"
  387. }
  388. }
  389. {composite_children} BasicState trafficlight_main_main_trafficlight_interrupted_black {
  390. name = "black"
  391. isInitial = False
  392. {onEntryRaise} Raise {
  393. event = "displayNone"
  394. scope = "output"
  395. }
  396. }
  397. }
  398. }
  399. {parallel_children} CompositeState trafficlight_main_main_timer {
  400. name = "timer"
  401. isInitial = False
  402. {composite_children} BasicState trafficlight_main_main_timer_disabled {
  403. name = "disabled"
  404. isInitial = False
  405. }
  406. {composite_children} CompositeState trafficlight_main_main_timer_running {
  407. name = "running"
  408. isInitial = True
  409. {onExitRaise} Raise {
  410. event = "updateTimerValue"
  411. scope = "output"
  412. parameter = $
  413. Element function parameter(attributes : Element):
  414. return -1!
  415. $
  416. }
  417. {composite_children} BasicState trafficlight_main_main_timer_running_decidingcolor {
  418. name = "decidingcolor"
  419. isInitial = True
  420. }
  421. {composite_children} BasicState trafficlight_main_main_timer_running_green {
  422. name = "green"
  423. isInitial = False
  424. {onEntryRaise} Raise {
  425. event = "updateTimerValue"
  426. scope = "output"
  427. parameter = $
  428. Element function raise(attributes : Element):
  429. return attributes["counter"]!
  430. $
  431. }
  432. }
  433. {composite_children} BasicState trafficlight_main_main_timer_running_red {
  434. name = "red"
  435. isInitial = False
  436. {onEntryRaise} Raise {
  437. event = "updateTimerValue"
  438. parameter = $
  439. Element function raise(attributes : Element):
  440. return attributes["counter"]!
  441. $
  442. }
  443. }
  444. }
  445. }
  446. }
  447. }
  448. }
  449. transition (trafficlight_main_off, trafficlight_main_main) {
  450. name = "toggle"
  451. event = "toggle"
  452. }
  453. transition (trafficlight_main_main, trafficlight_main_off) {
  454. name = "toggle"
  455. event = "toggle"
  456. }
  457. transition (trafficlight_main_main_trafficlight_normal, trafficlight_main_main_trafficlight_interrupted) {
  458. name = "police_interrupt / disableTimer"
  459. event = "police_interrupt"
  460. {transition_raises} Raise {
  461. event = "disableTimer"
  462. }
  463. }
  464. transition (trafficlight_main_main_trafficlight_interrupted, trafficlight_main_main_trafficlight_normal_hist) {
  465. name = "police_interrupt / enableTimer"
  466. event = "police_interrupt"
  467. {transition_raises} Raise {
  468. event = "enableTimer"
  469. }
  470. }
  471. transition (trafficlight_main_main_trafficlight_normal_red, trafficlight_main_main_trafficlight_normal_green) {
  472. name = "after 60s"
  473. after = $
  474. Float function after(attributes : Element):
  475. return 60.0!
  476. $
  477. }
  478. transition (trafficlight_main_main_trafficlight_normal_green, trafficlight_main_main_trafficlight_normal_yellow) {
  479. name = "after 55s"
  480. after = $
  481. Float function after(attributes : Element):
  482. return 55.0!
  483. $
  484. }
  485. transition (trafficlight_main_main_trafficlight_normal_yellow, trafficlight_main_main_trafficlight_normal_red) {
  486. name = "after 5s"
  487. after = $
  488. Float function after(attributes : Element):
  489. return 5.0!
  490. $
  491. {transition_raises} Raise {
  492. event = "enableTimer"
  493. }
  494. }
  495. transition (trafficlight_main_main_trafficlight_interrupted_yellow, trafficlight_main_main_trafficlight_interrupted_black) {
  496. name = "after 500ms"
  497. after = $
  498. Float function after(attributes : Element):
  499. return 0.5!
  500. $
  501. }
  502. transition (trafficlight_main_main_trafficlight_interrupted_black, trafficlight_main_main_trafficlight_interrupted_yellow) {
  503. name = "after 500ms"
  504. after = $
  505. Float function after(attributes : Element):
  506. return 0.5!
  507. $
  508. }
  509. transition (trafficlight_main_main_timer_disabled, trafficlight_main_main_timer_running) {
  510. name = "enableTimer"
  511. event = "enableTimer"
  512. }
  513. transition (trafficlight_main_main_timer_running, trafficlight_main_main_timer_disabled) {
  514. name = "disableTimer"
  515. event = "disableTimer"
  516. }
  517. transition (trafficlight_main_main_timer_running, trafficlight_main_main_timer_running) {
  518. name = "resetTimer"
  519. event = "resetTimer"
  520. }
  521. transition (trafficlight_main_main_timer_running_decidingcolor, trafficlight_main_main_timer_running_green) {
  522. name = "[green] / updateTimerColour"
  523. cond = $
  524. Boolean function cond(attributes : Element, parameters : Element):
  525. return value_eq(attributes["colour"], "green")!
  526. $
  527. {transition_raises} Raise {
  528. event = "updateTimerColour"
  529. scope = "output"
  530. parameter = $
  531. Element function param(attributes : Element, parameters : Element):
  532. return "green"!
  533. $
  534. }
  535. }
  536. transition (trafficlight_main_main_timer_running_decidingcolor, trafficlight_main_main_timer_running_red) {
  537. name = "[red] / updateTimerColour"
  538. cond = $
  539. Boolean function cond(attributes : Element, parameters : Element):
  540. return value_eq(attributes["colour"], "red")!
  541. $
  542. {transition_raises} Raise {
  543. event = "updateTimerColour"
  544. scope = "output"
  545. parameter = $
  546. Element function param(attributes : Element, parameters : Element):
  547. return "red"!
  548. $
  549. }
  550. }
  551. transition (trafficlight_main_main_timer_running_red, trafficlight_main_main_timer_running_red) {
  552. name = "after 1s / counter -= 1"
  553. after = $
  554. Float function after(attributes : Element):
  555. return 1.0!
  556. $
  557. script = $
  558. Void function script(attributes : Element, parameters : Element):
  559. dict_overwrite(attributes, "counter", integer_subtraction(attributes["counter"], 1))
  560. return!
  561. $
  562. {transition_raises} Raise {
  563. event = "updateTimerValue"
  564. scope = "output"
  565. parameter = $
  566. Element function param(attributes : Element, parameters : Element):
  567. return attributes["counter"]!
  568. $
  569. }
  570. }
  571. transition (trafficlight_main_main_timer_running_green, trafficlight_main_main_timer_running_green) {
  572. name = "after 1s / counter -= 1"
  573. after = $
  574. Float function after(attributes : Element):
  575. return 1.0!
  576. $
  577. script = $
  578. Void function script(attributes : Element, parameters : Element):
  579. dict_overwrite(attributes, "counter", integer_subtraction(attributes["counter"], 1))
  580. return!
  581. $
  582. {transition_raises} Raise {
  583. event = "updateTimerValue"
  584. scope = "output"
  585. parameter = $
  586. Element function param(attributes : Element, parameters : Element):
  587. return attributes["counter"]!
  588. $
  589. }
  590. }