model_chatclient.xml 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <single_instance_cd>
  2. <delta>1 ms</delta>
  3. <statechart>
  4. <semantics
  5. big_step_maximality="take_one"
  6. internal_event_lifeline="reMainder"
  7. input_event_lifeline="whole"
  8. enabledness_memory_protocol="small_step"
  9. assignment_memory_protocol="small_step"
  10. />
  11. <datamodel>
  12. import sccd.action_lang.lib.utils;
  13. import lib.network_client;
  14. import lib.ui;
  15. import lib.utils;
  16. # Statechart's variables
  17. curr_server = 0;
  18. room_number = 0;
  19. reconnecting = False;
  20. </datamodel>
  21. <inport name="network">
  22. <event name="connected"/>
  23. <event name="disconnected"/>
  24. <event name="joined"/>
  25. <event name="left"/>
  26. <event name="receive_message"/>
  27. <event name="alive"/>
  28. </inport>
  29. <inport name="ui">
  30. <event name="input"/>
  31. </inport>
  32. <outport name="network">
  33. <event name="connect"/>
  34. <event name="disconnect"/>
  35. <event name="join"/>
  36. <event name="leave"/>
  37. <event name="send_message"/>
  38. <event name="poll"/>
  39. </outport>
  40. <root>
  41. <parallel id="P">
  42. <!-- Main orthogonal region: all user interaction and Main window state -->
  43. <state id="Main" initial="Connecting">
  44. <state id="Connecting" initial="Initial">
  45. <onentry>
  46. <code> input_command(); </code>
  47. </onentry>
  48. <state id="Initial">
  49. <transition after="100 ms" target="../TryingConnect">
  50. <code> add_message("trying to connect to server " + get_server(curr_server), "info"); </code>
  51. <raise event="connect">
  52. <param expr="get_server(curr_server)"/>
  53. </raise>
  54. </transition>
  55. </state>
  56. <state id="TryingConnect">
  57. <transition event="connected" target="/P/Main/Connected/H">
  58. <code> add_message("connected to server " + get_server(curr_server), "info"); </code>
  59. </transition>
  60. <transition after="5 s" target="../Initial">
  61. <code>
  62. add_message("unable to connect to server " + get_server(curr_server), "info");
  63. if (not reconnecting) {
  64. curr_server = (curr_server + 1) % get_nr_of_servers();
  65. }
  66. </code>
  67. </transition>
  68. </state>
  69. </state>
  70. <state id="Connected" initial="LeavingOrLeft">
  71. <transition event="timeout" target="/P/Main/Connecting">
  72. <code>
  73. add_message("disconnected", "info");
  74. reconnecting = True;
  75. </code>
  76. </transition>
  77. <state id="LeavingOrLeft" initial="NotJoined">
  78. <state id="NotJoined">
  79. <transition event="input(char: str)" cond='char == "j"' target="../GettingRoomNumber">
  80. <code> input_join(); </code>
  81. </transition>
  82. </state>
  83. <state id="GettingRoomNumber">
  84. <transition event="input(char: str)" cond="is_backspace(char)" target=".">
  85. <code> remove_last_in_buffer(); </code>
  86. </transition>
  87. <transition event="input(char: str)" cond="is_enter(char)" target="../../JoiningOrJoined">
  88. <code>
  89. room_number = stoi(get_buffer());
  90. clear_input();
  91. input_command();
  92. </code>
  93. </transition>
  94. <transition event="input(char: str)" cond="is_numerical(char)" target=".">
  95. <code> append_to_buffer(char); </code>
  96. </transition>
  97. <transition event="input(char: str)" cond="not is_numerical(char)" target=".">
  98. <code> add_message("only numerical input allowed!", "warning"); </code>
  99. </transition>
  100. </state>
  101. <state id="Leaving">
  102. <transition event="left" target="../NotJoined">
  103. <code> add_message("left room", "info"); </code>
  104. </transition>
  105. </state>
  106. </state>
  107. <state id="JoiningOrJoined" initial="Joining">
  108. <state id="Joining">
  109. <onentry>
  110. <raise event="join">
  111. <param expr="room_number"/>
  112. </raise>
  113. </onentry>
  114. <onexit>
  115. </onexit>
  116. <transition event="joined" target="../Joined/H">
  117. <code> add_message("joined room " + int_to_str(room_number), "info"); </code>
  118. </transition>
  119. </state>
  120. <state id="Joined" initial="Initial">
  121. <state id="Initial">
  122. <transition event="input(char: str)" cond='char == "m"' target="../EnteringMessage"/>
  123. <transition event="input(char: str)" cond='char == "l"' target="/P/Main/Connected/LeavingOrLeft/Leaving">
  124. <raise event="leave"/>
  125. <code> input_command(); </code>
  126. </transition>
  127. </state>
  128. <state id="EnteringMessage">
  129. <onentry>
  130. <code> input_msg(); </code>
  131. </onentry>
  132. <!-- explicit (document order) priority used here: -->
  133. <transition event="input(char: str)" cond="is_backspace(char)" target=".">
  134. <code> remove_last_in_buffer(); </code>
  135. </transition>
  136. <transition event="input(char: str)" cond="is_enter(char)" target="../Initial">
  137. <raise event="send_message">
  138. <param expr="get_buffer()"/>
  139. </raise>
  140. <code>
  141. add_message(get_buffer(), "local_message");
  142. clear_input();
  143. input_command();
  144. </code>
  145. </transition>
  146. <transition event="input(char: str)" target=".">
  147. <code> append_to_buffer(char); </code>
  148. </transition>
  149. </state>
  150. <history id="H" type="shallow"/>
  151. </state>
  152. </state>
  153. <history id="H" type="shallow"/>
  154. </state>
  155. </state>
  156. <!-- pinging orthogonal region -->
  157. <state id="Pinging" initial="Initial">
  158. <state id="Initial">
  159. <transition event="connected" target="../Pinging"/>
  160. </state>
  161. <state id="Pinging">
  162. <transition after="1 s" target="../ExpectingAnswer">
  163. <raise event="poll"/>
  164. <!-- <code> print("sent POLL"); </code> -->
  165. </transition>
  166. </state>
  167. <state id="ExpectingAnswer">
  168. <transition event="alive" target="../Pinging">
  169. <!-- <code> print("got ALIVE"); </code> -->
  170. </transition>
  171. <transition after="2 s" target="../Initial">
  172. <raise event="timeout"/>
  173. <code> print("polling timeout... disconnect"); </code>
  174. </transition>
  175. </state>
  176. </state>
  177. <!-- listening orthogonal region -->
  178. <state id="Receiving">
  179. <state id="Receiving">
  180. <transition event="receive_message(msg:str)" target=".">
  181. <code> add_message(msg, "remote_message"); </code>
  182. </transition>
  183. </state>
  184. </state>
  185. </parallel>
  186. </root>
  187. </statechart>
  188. </single_instance_cd>