GUI: add button to obstruct door + add figures and such to assignment HTML

This commit is contained in:
Joeri Exelmans 2024-11-29 11:14:13 +01:00
parent fffd65370f
commit 8ffb3e097f
15 changed files with 497 additions and 8 deletions

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:sgraph="http://www.yakindu.org/sct/sgraph/2.0.0">
<sgraph:Statechart xmi:id="_KuVP4GBDEe2R-oGCKnTAVw" specification="// DO NOT CHANGE&#xA;@EventDriven&#xA;@SuperSteps(no)&#xA;@ParentFirstExecution&#xA;&#xA;// DO NOT CHANGE THE SEMANTICS&#xA;@EventDriven&#xA;@SuperSteps(no)&#xA;@ParentFirstExecution&#xA;&#xA;&#xA;interface:&#xA;&#x9;// DOT CHANGE THE INTERFACE&#xA;&#xA;&#x9;// You can use these values in your Statechart&#xA;&#x9;// and in your tests:&#xA;&#x9;const LOW: integer = 0&#xA;&#x9;const HIGH: integer = 1 &#xA;&#x9;const LOW_LVL: integer = 500&#xA;&#x9;const HIGH_LVL: integer = 1500&#xA;&#xA;&#x9;in event requestLvlChange&#xA;&#x9;in event waterLvl: integer&#xA;&#x9;in event resume&#xA;&#x9;&#xA;&#x9;in event doorObstructed: integer&#xA;&#xA;&#x9;out event setRequestPending: boolean&#xA;&#x9;out event setSensorBroken&#xA;&#x9;out event openFlow: integer&#xA;&#x9;out event closeFlow: integer&#xA;&#x9;out event openDoors: integer&#xA;&#x9;out event closeDoors: integer&#xA;&#x9;out event greenLight: integer&#xA;&#x9;out event redLight: integer&#xA;&#x9;&#xA;internal:&#xA;&#x9;// You are allowed (and probably should)&#xA;&#x9;// declare internal events and internal variables&#xA;&#x9;// in this section..." name="LockController">
<sgraph:Statechart xmi:id="_KuVP4GBDEe2R-oGCKnTAVw" specification="// DO NOT CHANGE&#xA;@EventDriven&#xA;@SuperSteps(no)&#xA;@ParentFirstExecution&#xA;&#xA;// DO NOT CHANGE THE SEMANTICS&#xA;@EventDriven&#xA;@SuperSteps(no)&#xA;@ParentFirstExecution&#xA;&#xA;&#xA;interface:&#xA;&#x9;// DOT CHANGE THE INTERFACE&#xA;&#xA;&#x9;// You can use these values in your Statechart&#xA;&#x9;// and in your tests:&#xA;&#x9;const LOW: integer = 0&#xA;&#x9;const HIGH: integer = 1 &#xA;&#x9;const LOW_LVL: integer = 500&#xA;&#x9;const HIGH_LVL: integer = 1500&#xA;&#xA;&#x9;in event requestLvlChange&#xA;&#x9;in event waterLvl: integer&#xA;&#x9;in event resume&#xA;&#x9;&#xA;&#x9;in event doorObstructed&#xA;&#xA;&#x9;out event setRequestPending: boolean&#xA;&#x9;out event setSensorBroken&#xA;&#x9;out event openFlow: integer&#xA;&#x9;out event closeFlow: integer&#xA;&#x9;out event openDoors: integer&#xA;&#x9;out event closeDoors: integer&#xA;&#x9;out event greenLight: integer&#xA;&#x9;out event redLight: integer&#xA;&#x9;&#xA;internal:&#xA;&#x9;// You are allowed (and probably should)&#xA;&#x9;// declare internal events and internal variables&#xA;&#x9;// in this section..." name="LockController">
<regions xmi:id="_Kuavc2BDEe2R-oGCKnTAVw" name="main region">
<vertices xsi:type="sgraph:State" xmi:id="_BZTF4GTzEe22Ao6AjWtBXA" name="O" incomingTransitions="_dzToYGTzEe22Ao6AjWtBXA">
<regions xmi:id="_BZTs8mTzEe22Ao6AjWtBXA" name="r1">

View file

@ -114,6 +114,7 @@ class GUI:
sim_frame.pack(side=tkinter.LEFT)
request_frame = tkinter.LabelFrame(toplevel, text="Actions")
self.button_obstruct = tkinter.Button(request_frame, text="Obstruct door", command=lambda: sim.add_input_now(self.sc, "door_obstructed"), width=18).pack()
self.button_change_lvl = tkinter.Button(request_frame, command=lambda: self.sim.add_input_now(self.sc, "request_lvl_change"), width=18)
self.button_change_lvl.pack()
self.button_resume = tkinter.Button(request_frame, text="Resume (make sure sensor is repaired first!)",
@ -196,7 +197,7 @@ class GUI:
if value:
self.button_change_lvl.config(state=tkinter.DISABLED, text="Change requested")
else:
self.button_change_lvl.config(state=tkinter.NORMAL, text="Change water level")
self.button_change_lvl.config(state=tkinter.NORMAL, text="Request water lvl change")
def on_water_level_reading(self, water_level):
# the measured water level - can be nonsense if sensor is broken

View file

@ -229,4 +229,4 @@ INITIAL = [
]
if __name__ == "__main__":
run_scenarios(SCENARIOS, LockController, INITIAL, IDEMPOTENT)
run_scenarios(SCENARIOS, LockController, INITIAL, IDEMPOTENT, verbose=False)

View file

@ -41,7 +41,6 @@ class LockController:
self.water_lvl_value = None
self.resume = None
self.door_obstructed = None
self.door_obstructed_value = None
self.set_request_pending = None
self.set_request_pending_value = None
self.set_request_pending_observable = Observable()
@ -174,17 +173,16 @@ class LockController:
"""
self.resume = True
def raise_door_obstructed(self, value):
def raise_door_obstructed(self):
"""Raise method for event door_obstructed.
"""
self.in_event_queue.put(lambda: self.__raise_door_obstructed_call(value))
self.in_event_queue.put(self.__raise_door_obstructed_call)
self.run_cycle()
def __raise_door_obstructed_call(self, value):
def __raise_door_obstructed_call(self):
"""Raise callback for event door_obstructed.
"""
self.door_obstructed = True
self.door_obstructed_value = value
def __entry_action_main_region_o_r1_a(self):
"""Entry action for state 'A'..