model_02_hierarchical_door.xml 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <single_instance_cd>
  2. <!-- Safety feature extension through hierarchical state: microwave can't be running while door is open -->
  3. <delta>1 ms</delta>
  4. <statechart>
  5. <semantics
  6. big_step_maximality="take_many"
  7. combo_step_maximality="take_one"
  8. input_event_lifeline="first_combo_step"
  9. hierarchical_priority="source_parent"
  10. same_source_priority="explicit"
  11. />
  12. <datamodel>
  13. import GUI;
  14. time = 0;
  15. checkStartTime = func {
  16. if (time == 0) {
  17. time = 30;
  18. display_time(time);
  19. }
  20. };
  21. </datamodel>
  22. <inport name="in">
  23. <event name="start"/>
  24. <event name="stop"/>
  25. <event name="increase_time"/>
  26. <event name="door_opened"/>
  27. <event name="door_closed"/>
  28. </inport>
  29. <outport name="out">
  30. <event name="micro_on"/>
  31. <event name="micro_off"/>
  32. <event name="bell"/>
  33. </outport>
  34. <root initial="DoorClosed">
  35. <state id="DoorClosed" initial="NotRunning">
  36. <transition port="in" event="door_opened" target="../DoorOpen"/>
  37. <state id="Running">
  38. <onentry> <raise port="out" event="micro_on"/> </onentry>
  39. <onexit> <raise port="out" event="micro_off"/> </onexit>
  40. <transition port="in" event="stop" target="../NotRunning"/>
  41. <state id="Inner">
  42. <transition after="1 s" target=".">
  43. <code> time -= 1; display_time(time); </code>
  44. </transition>
  45. </state>
  46. <transition cond="time == 0" target="../NotRunning"/>
  47. <transition port="in" event="increase_time" target=".">
  48. <code> time += 10; display_time(time); </code>
  49. </transition>
  50. </state>
  51. <state id="NotRunning">
  52. <transition port="in" event="start" target="../Running">
  53. <code> checkStartTime(); </code>
  54. </transition>
  55. <transition port="in" event="stop" target=".">
  56. <code> time = 0; display_time(time); </code>
  57. </transition>
  58. <transition port="in" event="increase_time" target=".">
  59. <code> time += 10; display_time(time); </code>
  60. </transition>
  61. </state>
  62. </state>
  63. <state id="DoorOpen">
  64. <transition port="in" event="door_closed" target="../DoorClosed"/>
  65. <transition port="in" event="increase_time" target=".">
  66. <code> time += 10; display_time(time); </code>
  67. </transition>
  68. </state>
  69. </root>
  70. </statechart>
  71. </single_instance_cd>