123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- <single_instance_cd>
- <delta>1 ms</delta>
- <statechart>
- <semantics
- big_step_maximality="take_one"
- internal_event_lifeline="reMainder"
- input_event_lifeline="whole"
- enabledness_memory_protocol="small_step"
- assignment_memory_protocol="small_step"
- />
- <datamodel>
- import sccd.action_lang.lib.utils;
-
- import lib.network_client;
- import lib.ui;
- import lib.utils;
- # Statechart's variables
- curr_server = 0;
- room_number = 0;
- reconnecting = False;
- </datamodel>
- <inport name="network">
- <event name="connected"/>
- <event name="disconnected"/>
- <event name="joined"/>
- <event name="left"/>
- <event name="receive_message"/>
- <event name="alive"/>
- </inport>
- <inport name="ui">
- <event name="input"/>
- </inport>
- <outport name="network">
- <event name="connect"/>
- <event name="disconnect"/>
- <event name="join"/>
- <event name="leave"/>
- <event name="send_message"/>
- <event name="poll"/>
- </outport>
- <root>
- <parallel id="P">
- <!-- Main orthogonal region: all user interaction and Main window state -->
- <state id="Main" initial="Connecting">
- <state id="Connecting" initial="Initial">
- <onentry>
- <code> input_command(); </code>
- </onentry>
- <state id="Initial">
- <transition after="100 ms" target="../TryingConnect">
- <code> add_message("trying to connect to server " + get_server(curr_server), "info"); </code>
- <raise event="connect">
- <param expr="get_server(curr_server)"/>
- </raise>
- </transition>
- </state>
- <state id="TryingConnect">
- <transition event="connected" target="/P/Main/Connected/H">
- <code> add_message("connected to server " + get_server(curr_server), "info"); </code>
- </transition>
- <transition after="5 s" target="../Initial">
- <code>
- add_message("unable to connect to server " + get_server(curr_server), "info");
- if (not reconnecting) {
- curr_server = (curr_server + 1) % get_nr_of_servers();
- }
- </code>
- </transition>
- </state>
- </state>
- <state id="Connected" initial="LeavingOrLeft">
- <transition event="timeout" target="/P/Main/Connecting">
- <code>
- add_message("disconnected", "info");
- reconnecting = True;
- </code>
- </transition>
- <state id="LeavingOrLeft" initial="NotJoined">
- <state id="NotJoined">
- <transition event="input(char: str)" cond='char == "j"' target="../GettingRoomNumber">
- <code> input_join(); </code>
- </transition>
- </state>
- <state id="GettingRoomNumber">
- <transition event="input(char: str)" cond="is_backspace(char)" target=".">
- <code> remove_last_in_buffer(); </code>
- </transition>
- <transition event="input(char: str)" cond="is_enter(char)" target="../../JoiningOrJoined">
- <code>
- room_number = stoi(get_buffer());
- clear_input();
- input_command();
- </code>
- </transition>
- <transition event="input(char: str)" cond="is_numerical(char)" target=".">
- <code> append_to_buffer(char); </code>
- </transition>
- <transition event="input(char: str)" cond="not is_numerical(char)" target=".">
- <code> add_message("only numerical input allowed!", "warning"); </code>
- </transition>
- </state>
- <state id="Leaving">
- <transition event="left" target="../NotJoined">
- <code> add_message("left room", "info"); </code>
- </transition>
- </state>
- </state>
- <state id="JoiningOrJoined" initial="Joining">
- <state id="Joining">
- <onentry>
- <raise event="join">
- <param expr="room_number"/>
- </raise>
- </onentry>
- <onexit>
- </onexit>
- <transition event="joined" target="../Joined/H">
- <code> add_message("joined room " + int_to_str(room_number), "info"); </code>
- </transition>
- </state>
- <state id="Joined" initial="Initial">
- <state id="Initial">
- <transition event="input(char: str)" cond='char == "m"' target="../EnteringMessage"/>
- <transition event="input(char: str)" cond='char == "l"' target="/P/Main/Connected/LeavingOrLeft/Leaving">
- <raise event="leave"/>
- <code> input_command(); </code>
- </transition>
- </state>
- <state id="EnteringMessage">
- <onentry>
- <code> input_msg(); </code>
- </onentry>
- <!-- explicit (document order) priority used here: -->
- <transition event="input(char: str)" cond="is_backspace(char)" target=".">
- <code> remove_last_in_buffer(); </code>
- </transition>
- <transition event="input(char: str)" cond="is_enter(char)" target="../Initial">
- <raise event="send_message">
- <param expr="get_buffer()"/>
- </raise>
- <code>
- add_message(get_buffer(), "local_message");
- clear_input();
- input_command();
- </code>
- </transition>
- <transition event="input(char: str)" target=".">
- <code> append_to_buffer(char); </code>
- </transition>
- </state>
- <history id="H" type="shallow"/>
- </state>
- </state>
- <history id="H" type="shallow"/>
- </state>
- </state>
- <!-- pinging orthogonal region -->
- <state id="Pinging" initial="Initial">
- <state id="Initial">
- <transition event="connected" target="../Pinging"/>
- </state>
- <state id="Pinging">
- <transition after="1 s" target="../ExpectingAnswer">
- <raise event="poll"/>
- <!-- <code> print("sent POLL"); </code> -->
- </transition>
- </state>
- <state id="ExpectingAnswer">
- <transition event="alive" target="../Pinging">
- <!-- <code> print("got ALIVE"); </code> -->
- </transition>
- <transition after="2 s" target="../Initial">
- <raise event="timeout"/>
- <code> print("polling timeout... disconnect"); </code>
- </transition>
- </state>
- </state>
- <!-- listening orthogonal region -->
- <state id="Receiving">
- <state id="Receiving">
- <transition event="receive_message(msg:str)" target=".">
- <code> add_message(msg, "remote_message"); </code>
- </transition>
- </state>
- </state>
- </parallel>
- </root>
- </statechart>
- </single_instance_cd>
|