SCCD_all.mvc 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678
  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 10.0!
  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 5.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. }
  311. {parallel_children} CompositeState trafficlight_main_main_trafficlight {
  312. name = "trafficlight"
  313. isInitial = False
  314. {composite_children} CompositeState trafficlight_main_main_trafficlight_normal {
  315. name = "normal"
  316. isInitial = True
  317. onExitScript = $
  318. Void function onexit(attributes : Element):
  319. dict_overwrite(attributes, "colour", "")
  320. return!
  321. $
  322. {composite_children} BasicState trafficlight_main_main_trafficlight_normal_red {
  323. name = "red"
  324. isInitial = True
  325. onEntryScript = $
  326. Void function onentry(attributes : Element):
  327. dict_overwrite(attributes, "counter", 60)
  328. dict_overwrite(attributes, "colour", "red")
  329. return!
  330. $
  331. {onEntryRaise} Raise {
  332. event = "displayRed"
  333. }
  334. {onEntryRaise} Raise {
  335. event = "resetTimer"
  336. }
  337. }
  338. {composite_children} BasicState trafficlight_main_main_trafficlight_normal_green {
  339. name = "green"
  340. isInitial = False
  341. onEntryScript = $
  342. Void function onentry(attributes : Element):
  343. dict_overwrite(attributes, "counter", 55)
  344. dict_overwrite(attributes, "colour", "green")
  345. return!
  346. $
  347. {onEntryRaise} Raise {
  348. event = "displayGreen"
  349. }
  350. {onEntryRaise} Raise {
  351. event = "resetTimer"
  352. }
  353. }
  354. {composite_children} BasicState trafficlight_main_main_trafficlight_normal_yellow {
  355. name = "yellow"
  356. isInitial = False
  357. onEntryScript = $
  358. Void function onentry(attributes : Element):
  359. dict_overwrite(attributes, "colour", "")
  360. return!
  361. $
  362. {onEntryRaise} Raise {
  363. event = "displayYellow"
  364. }
  365. {onEntryRaise} Raise {
  366. event = "disableTimer"
  367. }
  368. }
  369. {composite_children} HistoryState trafficlight_main_main_trafficlight_normal_hist {
  370. name = "hist"
  371. }
  372. }
  373. {composite_children} CompositeState trafficlight_main_main_trafficlight_interrupted {
  374. {composite_children} BasicState trafficlight_main_main_trafficlight_interrupted_yellow {
  375. name = "yellow"
  376. isInitial = True
  377. {onEntryRaise} Raise {
  378. event = "displayYellow"
  379. }
  380. }
  381. {composite_children} BasicState trafficlight_main_main_trafficlight_interrupted_black {
  382. name = "black"
  383. isInitial = False
  384. {onEntryRaise} Raise {
  385. event = "displayNone"
  386. }
  387. }
  388. }
  389. }
  390. {parallel_children} CompositeState trafficlight_main_main_timer {
  391. name = "timer"
  392. isInitial = False
  393. {composite_children} BasicState trafficlight_main_main_timer_disabled {
  394. name = "disabled"
  395. isInitial = False
  396. }
  397. {composite_children} CompositeState trafficlight_main_main_timer_running {
  398. name = "running"
  399. isInitial = True
  400. {onExitRaise} Raise {
  401. event = "updateTimerValue"
  402. parameter = $
  403. Element function parameter(attributes : Element):
  404. return -1!
  405. $
  406. }
  407. {composite_children} BasicState trafficlight_main_main_timer_running_decidingcolor {
  408. name = "decidingcolor"
  409. isInitial = True
  410. }
  411. {composite_children} BasicState trafficlight_main_main_timer_running_green {
  412. name = "green"
  413. isInitial = False
  414. {onEntryRaise} Raise {
  415. event = "updateTimerValue"
  416. parameter = $
  417. Element function raise(attributes : Element):
  418. return attributes["counter"]!
  419. $
  420. }
  421. }
  422. {composite_children} BasicState trafficlight_main_main_timer_running_red {
  423. name = "red"
  424. isInitial = False
  425. {onEntryRaise} Raise {
  426. event = "updateTimerValue"
  427. parameter = $
  428. Element function raise(attributes : Element):
  429. return attributes["counter"]!
  430. $
  431. }
  432. }
  433. }
  434. }
  435. }
  436. }
  437. }
  438. transition (trafficlight_main_off, trafficlight_main_main) {
  439. name = "toggle"
  440. event = "toggle"
  441. }
  442. transition (trafficlight_main_main, trafficlight_main_off) {
  443. name = "toggle"
  444. event = "toggle"
  445. }
  446. transition (trafficlight_main_main_trafficlight_normal, trafficlight_main_main_trafficlight_interrupted) {
  447. name = "police_interrupt / disableTimer"
  448. event = "police_interrupt"
  449. {transition_raises} Raise {
  450. event = "disableTimer"
  451. }
  452. }
  453. transition (trafficlight_main_main_trafficlight_interrupted, trafficlight_main_main_trafficlight_normal_hist) {
  454. name = "police_interrupt / enableTimer"
  455. event = "police_interrupt"
  456. {transition_raises} Raise {
  457. event = "enableTimer"
  458. }
  459. }
  460. transition (trafficlight_main_main_trafficlight_normal_red, trafficlight_main_main_trafficlight_normal_green) {
  461. name = "after 60s"
  462. after = $
  463. Float function after(attributes : Element):
  464. return 60.0!
  465. $
  466. }
  467. transition (trafficlight_main_main_trafficlight_normal_green, trafficlight_main_main_trafficlight_normal_yellow) {
  468. name = "after 55s"
  469. after = $
  470. Float function after(attributes : Element):
  471. return 55.0!
  472. $
  473. }
  474. transition (trafficlight_main_main_trafficlight_normal_yellow, trafficlight_main_main_trafficlight_normal_red) {
  475. name = "after 5s"
  476. after = $
  477. Float function after(attributes : Element):
  478. return 5.0!
  479. $
  480. {transition_raises} Raise {
  481. event = "enableTimer"
  482. }
  483. }
  484. transition (trafficlight_main_main_trafficlight_interrupted_yellow, trafficlight_main_main_trafficlight_interrupted_black) {
  485. name = "after 500ms"
  486. after = $
  487. Float function after(attributes : Element):
  488. return 0.5!
  489. $
  490. }
  491. transition (trafficlight_main_main_trafficlight_interrupted_black, trafficlight_main_main_trafficlight_interrupted_yellow) {
  492. name = "after 500ms"
  493. after = $
  494. Float function after(attributes : Element):
  495. return 0.5!
  496. $
  497. }
  498. transition (trafficlight_main_main_timer_disabled, trafficlight_main_main_timer_running) {
  499. name = "enableTimer"
  500. event = "enableTimer"
  501. }
  502. transition (trafficlight_main_main_timer_running, trafficlight_main_main_timer_disabled) {
  503. name = "disableTimer"
  504. event = "disableTimer"
  505. }
  506. transition (trafficlight_main_main_timer_running, trafficlight_main_main_timer_running) {
  507. name = "resetTimer"
  508. event = "resetTimer"
  509. }
  510. transition (trafficlight_main_main_timer_running_decidingcolor, trafficlight_main_main_timer_running_green) {
  511. name = "[green] / updateTimerColour"
  512. cond = $
  513. Boolean function cond(attributes : Element, parameters : Element):
  514. return value_eq(attributes["colour"], "green")!
  515. $
  516. {transition_raises} Raise {
  517. event = "updateTimerColour"
  518. scope = "output"
  519. parameter = $
  520. Element function param(attributes : Element, parameters : Element):
  521. return "green"!
  522. $
  523. }
  524. }
  525. transition (trafficlight_main_main_timer_running_decidingcolor, trafficlight_main_main_timer_running_red) {
  526. name = "[red] / updateTimerColour"
  527. cond = $
  528. Boolean function cond(attributes : Element, parameters : Element):
  529. return value_eq(attributes["colour"], "red")!
  530. $
  531. {transition_raises} Raise {
  532. event = "updateTimerColour"
  533. scope = "output"
  534. parameter = $
  535. Element function param(attributes : Element, parameters : Element):
  536. return "red"!
  537. $
  538. }
  539. }
  540. transition (trafficlight_main_main_timer_running_red, trafficlight_main_main_timer_running_red) {
  541. name = "after 1s / counter -= 1"
  542. after = $
  543. Float function after(attributes : Element):
  544. return 1.0!
  545. $
  546. script = $
  547. Void function script(attributes : Element, parameters : Element):
  548. dict_overwrite(attributes, "counter", integer_subtraction(attributes["counter"], 1))
  549. return!
  550. $
  551. {transition_raises} Raise {
  552. event = "updateTimer"
  553. scope = "output"
  554. parameter = $
  555. Element function param(attributes : Element, parameters : Element):
  556. return attributes["counter"]!
  557. $
  558. }
  559. }
  560. transition (trafficlight_main_main_timer_running_green, trafficlight_main_main_timer_running_green) {
  561. name = "after 1s / counter -= 1"
  562. after = $
  563. Float function after(attributes : Element):
  564. return 1.0!
  565. $
  566. script = $
  567. Void function script(attributes : Element, parameters : Element):
  568. dict_overwrite(attributes, "counter", integer_subtraction(attributes["counter"], 1))
  569. return!
  570. $
  571. {transition_raises} Raise {
  572. event = "updateTimer"
  573. scope = "output"
  574. parameter = $
  575. Element function param(attributes : Element, parameters : Element):
  576. return attributes["counter"]!
  577. $
  578. }
  579. }