model_chatclient.xml 7.8 KB

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