|
@@ -14,7 +14,7 @@ import time
|
|
|
CANVAS_DIMS = (800, 550)
|
|
|
FLOOR_LENGTH = 350
|
|
|
FLOOR_SPACE = 50
|
|
|
-FLOORS = 4
|
|
|
+FLOORS = 3
|
|
|
|
|
|
# package "Elevator Balls"
|
|
|
|
|
@@ -23,6 +23,7 @@ class MainAppInstance(RuntimeClassBase):
|
|
|
RuntimeClassBase.__init__(self, atomdevs)
|
|
|
self.associations = {}
|
|
|
self.associations["floor"] = Association("Floor", 2, -1)
|
|
|
+ self.associations["controls"] = Association("ElevatorControls", 1, 1)
|
|
|
self.associations["elevator"] = Association("Elevator", 1, 1)
|
|
|
|
|
|
self.semantics.big_step_maximality = StatechartSemantics.TakeMany
|
|
@@ -76,20 +77,28 @@ class MainAppInstance(RuntimeClassBase):
|
|
|
# state /wait
|
|
|
self.states["/wait"] = State(4, "/wait", self)
|
|
|
|
|
|
+ # state /create_controls
|
|
|
+ self.states["/create_controls"] = State(5, "/create_controls", self)
|
|
|
+
|
|
|
+ # state /creating_controls
|
|
|
+ self.states["/creating_controls"] = State(6, "/creating_controls", self)
|
|
|
+
|
|
|
# state /create_elevator
|
|
|
- self.states["/create_elevator"] = State(5, "/create_elevator", self)
|
|
|
+ self.states["/create_elevator"] = State(7, "/create_elevator", self)
|
|
|
|
|
|
# state /creating
|
|
|
- self.states["/creating"] = State(6, "/creating", self)
|
|
|
+ self.states["/creating"] = State(8, "/creating", self)
|
|
|
|
|
|
# state /waiting
|
|
|
- self.states["/waiting"] = State(7, "/waiting", self)
|
|
|
+ self.states["/waiting"] = State(9, "/waiting", self)
|
|
|
|
|
|
# add children
|
|
|
self.states[""].addChild(self.states["/creating_window"])
|
|
|
self.states[""].addChild(self.states["/creating_canvas"])
|
|
|
self.states[""].addChild(self.states["/create_floors"])
|
|
|
self.states[""].addChild(self.states["/wait"])
|
|
|
+ self.states[""].addChild(self.states["/create_controls"])
|
|
|
+ self.states[""].addChild(self.states["/creating_controls"])
|
|
|
self.states[""].addChild(self.states["/create_elevator"])
|
|
|
self.states[""].addChild(self.states["/creating"])
|
|
|
self.states[""].addChild(self.states["/waiting"])
|
|
@@ -109,7 +118,7 @@ class MainAppInstance(RuntimeClassBase):
|
|
|
self.states["/creating_canvas"].addTransition(_creating_canvas_0)
|
|
|
|
|
|
# transition /create_floors
|
|
|
- _create_floors_0 = Transition(self, self.states["/create_floors"], [self.states["/create_elevator"]])
|
|
|
+ _create_floors_0 = Transition(self, self.states["/create_floors"], [self.states["/create_controls"]])
|
|
|
_create_floors_0.setTrigger(None)
|
|
|
_create_floors_0.setGuard(self._create_floors_0_guard)
|
|
|
self.states["/create_floors"].addTransition(_create_floors_0)
|
|
@@ -128,6 +137,18 @@ class MainAppInstance(RuntimeClassBase):
|
|
|
_wait_1.setTrigger(Event("instance_started", None))
|
|
|
self.states["/wait"].addTransition(_wait_1)
|
|
|
|
|
|
+ # transition /create_controls
|
|
|
+ _create_controls_0 = Transition(self, self.states["/create_controls"], [self.states["/creating_controls"]])
|
|
|
+ _create_controls_0.setAction(self._create_controls_0_exec)
|
|
|
+ _create_controls_0.setTrigger(None)
|
|
|
+ self.states["/create_controls"].addTransition(_create_controls_0)
|
|
|
+
|
|
|
+ # transition /creating_controls
|
|
|
+ _creating_controls_0 = Transition(self, self.states["/creating_controls"], [self.states["/create_elevator"]])
|
|
|
+ _creating_controls_0.setAction(self._creating_controls_0_exec)
|
|
|
+ _creating_controls_0.setTrigger(Event("instance_created", None))
|
|
|
+ self.states["/creating_controls"].addTransition(_creating_controls_0)
|
|
|
+
|
|
|
# transition /create_elevator
|
|
|
_create_elevator_0 = Transition(self, self.states["/create_elevator"], [self.states["/creating"]])
|
|
|
_create_elevator_0.setAction(self._create_elevator_0_exec)
|
|
@@ -170,6 +191,13 @@ class MainAppInstance(RuntimeClassBase):
|
|
|
association_name = parameters[0]
|
|
|
self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
|
|
|
|
|
|
+ def _create_controls_0_exec(self, parameters):
|
|
|
+ self.big_step.outputEventOM(Event("create_instance", None, [self, "controls", "ElevatorControls", self.canvas_id]))
|
|
|
+
|
|
|
+ def _creating_controls_0_exec(self, parameters):
|
|
|
+ association_name = parameters[0]
|
|
|
+ self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
|
|
|
+
|
|
|
def _create_elevator_0_exec(self, parameters):
|
|
|
self.big_step.outputEventOM(Event("create_instance", None, [self, "elevator", "Elevator", self.canvas_id]))
|
|
|
|
|
@@ -189,6 +217,7 @@ class MainApp(ObjectManagerBase):
|
|
|
self.input = self.addInPort("input")
|
|
|
self.output = self.addOutPort("ui")
|
|
|
self.outputs["floor"] = self.addOutPort("floor")
|
|
|
+ self.outputs["controls"] = self.addOutPort("controls")
|
|
|
self.outputs["elevator"] = self.addOutPort("elevator")
|
|
|
self.field_ui = self.addInPort("field_ui")
|
|
|
self.instances[self.next_instance] = MainAppInstance(self)
|
|
@@ -281,10 +310,6 @@ class FloorInstance(RuntimeClassBase):
|
|
|
_running_create_random_ball_0.setAction(self._running_create_random_ball_0_exec)
|
|
|
_running_create_random_ball_0.setTrigger(Event("_0after"))
|
|
|
self.states["/running/create_random_ball"].addTransition(_running_create_random_ball_0)
|
|
|
- _running_create_random_ball_1 = Transition(self, self.states["/running/create_random_ball"], [self.states["/running/create_random_ball"]])
|
|
|
- _running_create_random_ball_1.setAction(self._running_create_random_ball_1_exec)
|
|
|
- _running_create_random_ball_1.setTrigger(Event("delete_ball", None))
|
|
|
- self.states["/running/create_random_ball"].addTransition(_running_create_random_ball_1)
|
|
|
|
|
|
# transition /running/wait
|
|
|
_running_wait_0 = Transition(self, self.states["/running/wait"], [self.states["/running/create_random_ball"]])
|
|
@@ -304,10 +329,6 @@ class FloorInstance(RuntimeClassBase):
|
|
|
def _running_create_random_ball_0_exec(self, parameters):
|
|
|
self.big_step.outputEventOM(Event("create_instance", None, [self, "balls", "Ball", self.canvas_id, self.floor_num, 10, self.pos['y']]))
|
|
|
|
|
|
- def _running_create_random_ball_1_exec(self, parameters):
|
|
|
- association_name = parameters[0]
|
|
|
- self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
|
|
|
-
|
|
|
def _running_wait_0_exec(self, parameters):
|
|
|
association_name = parameters[0]
|
|
|
self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
|
|
@@ -331,6 +352,271 @@ class Floor(ObjectManagerBase):
|
|
|
new_instance = FloorInstance(self, parameters[2], parameters[3])
|
|
|
return new_instance
|
|
|
|
|
|
+class ElevatorControlsInstance(RuntimeClassBase):
|
|
|
+ def __init__(self, atomdevs, canvas_id):
|
|
|
+ RuntimeClassBase.__init__(self, atomdevs)
|
|
|
+ self.associations = {}
|
|
|
+ self.associations["button"] = Association("ElevatorButton", 0, -1)
|
|
|
+ self.associations["balls"] = Association("Ball", 0, -1)
|
|
|
+ self.associations["parent"] = Association("Elevator", 1, 1)
|
|
|
+
|
|
|
+ self.semantics.big_step_maximality = StatechartSemantics.TakeMany
|
|
|
+ self.semantics.internal_event_lifeline = StatechartSemantics.Queue
|
|
|
+ self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
|
|
|
+ self.semantics.priority = StatechartSemantics.SourceParent
|
|
|
+ self.semantics.concurrency = StatechartSemantics.Single
|
|
|
+
|
|
|
+ # build Statechart structure
|
|
|
+ self.build_statechart_structure()
|
|
|
+
|
|
|
+ # call user defined constructor
|
|
|
+ ElevatorControlsInstance.user_defined_constructor(self, canvas_id)
|
|
|
+ port_name = Ports.addInputPort("<narrow_cast>", self)
|
|
|
+ atomdevs.addInPort(port_name)
|
|
|
+ port_name = Ports.addInputPort("control_ui", self)
|
|
|
+ atomdevs.addInPort(port_name)
|
|
|
+ atomdevs.port_mappings[port_name] = atomdevs.next_instance
|
|
|
+ self.inports["control_ui"] = port_name
|
|
|
+
|
|
|
+ def user_defined_constructor(self, canvas_id):
|
|
|
+ self.canvas_id = canvas_id;
|
|
|
+ self.button_num = FLOORS;
|
|
|
+ self.dim = {'x': 120, 'y': (50 + (FLOORS * 30))}
|
|
|
+ self.pos = {'x': CANVAS_DIMS[0] - ((self.dim['x'] / 2) + 10), 'y': (self.dim['y'] / 2) + 10}
|
|
|
+
|
|
|
+ def user_defined_destructor(self):
|
|
|
+ pass
|
|
|
+
|
|
|
+
|
|
|
+ # builds Statechart structure
|
|
|
+ def build_statechart_structure(self):
|
|
|
+
|
|
|
+ # state <root>
|
|
|
+ self.states[""] = State(0, "", self)
|
|
|
+
|
|
|
+ # state /creating
|
|
|
+ self.states["/creating"] = State(1, "/creating", self)
|
|
|
+
|
|
|
+ # state /creating/create_rect
|
|
|
+ self.states["/creating/create_rect"] = State(2, "/creating/create_rect", self)
|
|
|
+ self.states["/creating/create_rect"].setEnter(self._creating_create_rect_enter)
|
|
|
+
|
|
|
+ # state /creating/create_buttons
|
|
|
+ self.states["/creating/create_buttons"] = State(3, "/creating/create_buttons", self)
|
|
|
+
|
|
|
+ # state /creating/create_buttons/create_a_button
|
|
|
+ self.states["/creating/create_buttons/create_a_button"] = State(4, "/creating/create_buttons/create_a_button", self)
|
|
|
+ self.states["/creating/create_buttons/create_a_button"].setEnter(self._creating_create_buttons_create_a_button_enter)
|
|
|
+
|
|
|
+ # state /creating/create_buttons/start_a_button
|
|
|
+ self.states["/creating/create_buttons/start_a_button"] = State(5, "/creating/create_buttons/start_a_button", self)
|
|
|
+
|
|
|
+ # state /creating/create_buttons/check_next
|
|
|
+ self.states["/creating/create_buttons/check_next"] = State(6, "/creating/create_buttons/check_next", self)
|
|
|
+
|
|
|
+ # state /running
|
|
|
+ self.states["/running"] = State(7, "/running", self)
|
|
|
+
|
|
|
+ # add children
|
|
|
+ self.states[""].addChild(self.states["/creating"])
|
|
|
+ self.states[""].addChild(self.states["/running"])
|
|
|
+ self.states["/creating"].addChild(self.states["/creating/create_rect"])
|
|
|
+ self.states["/creating"].addChild(self.states["/creating/create_buttons"])
|
|
|
+ self.states["/creating/create_buttons"].addChild(self.states["/creating/create_buttons/create_a_button"])
|
|
|
+ self.states["/creating/create_buttons"].addChild(self.states["/creating/create_buttons/start_a_button"])
|
|
|
+ self.states["/creating/create_buttons"].addChild(self.states["/creating/create_buttons/check_next"])
|
|
|
+ self.states[""].fixTree()
|
|
|
+ self.states[""].default_state = self.states["/creating"]
|
|
|
+ self.states["/creating"].default_state = self.states["/creating/create_rect"]
|
|
|
+ self.states["/creating/create_buttons"].default_state = self.states["/creating/create_buttons/create_a_button"]
|
|
|
+
|
|
|
+ # transition /creating/create_rect
|
|
|
+ _creating_create_rect_0 = Transition(self, self.states["/creating/create_rect"], [self.states["/creating/create_buttons"]])
|
|
|
+ _creating_create_rect_0.setTrigger(None)
|
|
|
+ self.states["/creating/create_rect"].addTransition(_creating_create_rect_0)
|
|
|
+
|
|
|
+ # transition /creating/create_buttons/create_a_button
|
|
|
+ _creating_create_buttons_create_a_button_0 = Transition(self, self.states["/creating/create_buttons/create_a_button"], [self.states["/creating/create_buttons/start_a_button"]])
|
|
|
+ _creating_create_buttons_create_a_button_0.setAction(self._creating_create_buttons_create_a_button_0_exec)
|
|
|
+ _creating_create_buttons_create_a_button_0.setTrigger(Event("instance_created", None))
|
|
|
+ self.states["/creating/create_buttons/create_a_button"].addTransition(_creating_create_buttons_create_a_button_0)
|
|
|
+
|
|
|
+ # transition /creating/create_buttons/start_a_button
|
|
|
+ _creating_create_buttons_start_a_button_0 = Transition(self, self.states["/creating/create_buttons/start_a_button"], [self.states["/creating/create_buttons/check_next"]])
|
|
|
+ _creating_create_buttons_start_a_button_0.setTrigger(Event("instance_started", None))
|
|
|
+ self.states["/creating/create_buttons/start_a_button"].addTransition(_creating_create_buttons_start_a_button_0)
|
|
|
+
|
|
|
+ # transition /creating/create_buttons/check_next
|
|
|
+ _creating_create_buttons_check_next_0 = Transition(self, self.states["/creating/create_buttons/check_next"], [self.states["/creating/create_buttons/create_a_button"]])
|
|
|
+ _creating_create_buttons_check_next_0.setAction(self._creating_create_buttons_check_next_0_exec)
|
|
|
+ _creating_create_buttons_check_next_0.setTrigger(None)
|
|
|
+ _creating_create_buttons_check_next_0.setGuard(self._creating_create_buttons_check_next_0_guard)
|
|
|
+ self.states["/creating/create_buttons/check_next"].addTransition(_creating_create_buttons_check_next_0)
|
|
|
+ _creating_create_buttons_check_next_1 = Transition(self, self.states["/creating/create_buttons/check_next"], [self.states["/running"]])
|
|
|
+ _creating_create_buttons_check_next_1.setTrigger(None)
|
|
|
+ _creating_create_buttons_check_next_1.setGuard(self._creating_create_buttons_check_next_1_guard)
|
|
|
+ self.states["/creating/create_buttons/check_next"].addTransition(_creating_create_buttons_check_next_1)
|
|
|
+
|
|
|
+ # transition /running
|
|
|
+ _running_0 = Transition(self, self.states["/running"], [self.states["/running"]])
|
|
|
+ _running_0.setAction(self._running_0_exec)
|
|
|
+ _running_0.setTrigger(Event("button_pressed", None))
|
|
|
+ self.states["/running"].addTransition(_running_0)
|
|
|
+
|
|
|
+ def _creating_create_rect_enter(self):
|
|
|
+ self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, self.pos['x'], self.pos['y'], self.dim['x'], self.dim['y'], {'fill':'grey', 'outline': 'black'}, self.inports['control_ui']]))
|
|
|
+ self.big_step.outputEvent(Event("create_text", self.getOutPortName("ui"), [self.canvas_id, self.pos['x'], 20, 'Elevator Controls', self.inports['control_ui']]))
|
|
|
+ self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [self.canvas_id, ui.EVENTS.MOUSE_MOVE, 'mouse_move', self.inports['control_ui']]))
|
|
|
+
|
|
|
+ def _creating_create_buttons_create_a_button_enter(self):
|
|
|
+ self.big_step.outputEventOM(Event("create_instance", None, [self, "button", "ElevatorButton", self.canvas_id, self.button_num]))
|
|
|
+
|
|
|
+ def _creating_create_buttons_create_a_button_0_exec(self, parameters):
|
|
|
+ association_name = parameters[0]
|
|
|
+ self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
|
|
|
+
|
|
|
+ def _creating_create_buttons_check_next_0_exec(self, parameters):
|
|
|
+ self.button_num -= 1
|
|
|
+
|
|
|
+ def _creating_create_buttons_check_next_0_guard(self, parameters):
|
|
|
+ return self.button_num != 0
|
|
|
+
|
|
|
+ def _creating_create_buttons_check_next_1_guard(self, parameters):
|
|
|
+ return self.button_num == 0
|
|
|
+
|
|
|
+ def _running_0_exec(self, parameters):
|
|
|
+ floor = parameters[0]
|
|
|
+ self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("move_elevator", None, [0])]))
|
|
|
+
|
|
|
+ def initializeStatechart(self):
|
|
|
+ # enter default state
|
|
|
+ self.default_targets = self.states["/creating"].getEffectiveTargetStates()
|
|
|
+ RuntimeClassBase.initializeStatechart(self)
|
|
|
+
|
|
|
+class ElevatorControls(ObjectManagerBase):
|
|
|
+ def __init__(self, name):
|
|
|
+ ObjectManagerBase.__init__(self, name)
|
|
|
+ self.input = self.addInPort("input")
|
|
|
+ self.output = self.addOutPort("ui")
|
|
|
+ self.outputs["button"] = self.addOutPort("button")
|
|
|
+ self.outputs["balls"] = self.addOutPort("balls")
|
|
|
+ self.outputs["parent"] = self.addOutPort("parent")
|
|
|
+ self.control_ui = self.addInPort("control_ui")
|
|
|
+
|
|
|
+ def constructObject(self, parameters):
|
|
|
+ new_instance = ElevatorControlsInstance(self, parameters[2])
|
|
|
+ return new_instance
|
|
|
+
|
|
|
+class ElevatorButtonInstance(RuntimeClassBase):
|
|
|
+ def __init__(self, atomdevs, canvas_id, number):
|
|
|
+ RuntimeClassBase.__init__(self, atomdevs)
|
|
|
+ self.associations = {}
|
|
|
+ self.associations["parent"] = Association("ElevatorControls", 1, 1)
|
|
|
+
|
|
|
+ self.semantics.big_step_maximality = StatechartSemantics.TakeMany
|
|
|
+ self.semantics.internal_event_lifeline = StatechartSemantics.Queue
|
|
|
+ self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
|
|
|
+ self.semantics.priority = StatechartSemantics.SourceParent
|
|
|
+ self.semantics.concurrency = StatechartSemantics.Single
|
|
|
+
|
|
|
+ # build Statechart structure
|
|
|
+ self.build_statechart_structure()
|
|
|
+
|
|
|
+ # call user defined constructor
|
|
|
+ ElevatorButtonInstance.user_defined_constructor(self, canvas_id, number)
|
|
|
+ port_name = Ports.addInputPort("<narrow_cast>", self)
|
|
|
+ atomdevs.addInPort(port_name)
|
|
|
+ port_name = Ports.addInputPort("button_ui", self)
|
|
|
+ atomdevs.addInPort(port_name)
|
|
|
+ atomdevs.port_mappings[port_name] = atomdevs.next_instance
|
|
|
+ self.inports["button_ui"] = port_name
|
|
|
+
|
|
|
+ def user_defined_constructor(self, canvas_id, number):
|
|
|
+ self.canvas_id = canvas_id;
|
|
|
+ self.button_id = None;
|
|
|
+
|
|
|
+ self.dim = {'x': 120, 'y': (50 + (FLOORS * 30))}
|
|
|
+ self.pos = {'x': CANVAS_DIMS[0] - ((self.dim['x'] / 2) + 10), 'y': (self.dim['y'] / 2) + 10}
|
|
|
+ self.r = 10
|
|
|
+ self.number = number;
|
|
|
+
|
|
|
+ def user_defined_destructor(self):
|
|
|
+ pass
|
|
|
+
|
|
|
+
|
|
|
+ # builds Statechart structure
|
|
|
+ def build_statechart_structure(self):
|
|
|
+
|
|
|
+ # state <root>
|
|
|
+ self.states[""] = State(0, "", self)
|
|
|
+
|
|
|
+ # state /creating
|
|
|
+ self.states["/creating"] = State(1, "/creating", self)
|
|
|
+ self.states["/creating"].setEnter(self._creating_enter)
|
|
|
+
|
|
|
+ # state /running
|
|
|
+ self.states["/running"] = State(2, "/running", self)
|
|
|
+
|
|
|
+ # add children
|
|
|
+ self.states[""].addChild(self.states["/creating"])
|
|
|
+ self.states[""].addChild(self.states["/running"])
|
|
|
+ self.states[""].fixTree()
|
|
|
+ self.states[""].default_state = self.states["/creating"]
|
|
|
+
|
|
|
+ # transition /creating
|
|
|
+ _creating_0 = Transition(self, self.states["/creating"], [self.states["/running"]])
|
|
|
+ _creating_0.setAction(self._creating_0_exec)
|
|
|
+ _creating_0.setTrigger(Event("circle_created", None))
|
|
|
+ self.states["/creating"].addTransition(_creating_0)
|
|
|
+
|
|
|
+ # transition /running
|
|
|
+ _running_0 = Transition(self, self.states["/running"], [self.states["/running"]])
|
|
|
+ _running_0.setAction(self._running_0_exec)
|
|
|
+ _running_0.setTrigger(Event("button_click", self.getInPortName("button_ui")))
|
|
|
+ _running_0.setGuard(self._running_0_guard)
|
|
|
+ self.states["/running"].addTransition(_running_0)
|
|
|
+
|
|
|
+ def _creating_enter(self):
|
|
|
+ self.big_step.outputEvent(Event("create_circle", self.getOutPortName("ui"), [self.canvas_id, CANVAS_DIMS[0] - 70, 45 + (30 * (FLOORS - self.number)) , 10, {'fill':'black', 'outline': 'black'}, self.inports['button_ui']]))
|
|
|
+ self.big_step.outputEvent(Event("create_text", self.getOutPortName("ui"), [self.canvas_id, CANVAS_DIMS[0] - 70, 45 + (30 * (FLOORS - self.number)) , str(self.number), self.inports['button_ui']]))
|
|
|
+
|
|
|
+ def _creating_0_exec(self, parameters):
|
|
|
+ canvas_id = parameters[0]
|
|
|
+ circle_id = parameters[1]
|
|
|
+ self.button_id = circle_id
|
|
|
+ self.big_step.outputEvent(Event("bind_canvas_event", self.getOutPortName("ui"), [canvas_id, circle_id, ui.EVENTS.MOUSE_PRESS, 'button_click', self.inports['button_ui']]))
|
|
|
+ self.big_step.outputEvent(Event("bind_canvas_event", self.getOutPortName("ui"), [self.canvas_id, circle_id, ui.EVENTS.MOUSE_MOVE, 'mouse_move', self.inports['button_ui']]))
|
|
|
+
|
|
|
+ def _running_0_exec(self, parameters):
|
|
|
+ x = parameters[0]
|
|
|
+ y = parameters[1]
|
|
|
+ button = parameters[2]
|
|
|
+ self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("button_pressed", None, [self.number])]))
|
|
|
+ self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.button_id, '#ff0']))
|
|
|
+
|
|
|
+ def _running_0_guard(self, parameters):
|
|
|
+ x = parameters[0]
|
|
|
+ y = parameters[1]
|
|
|
+ button = parameters[2]
|
|
|
+ return button == ui.MOUSE_BUTTONS.LEFT
|
|
|
+
|
|
|
+ def initializeStatechart(self):
|
|
|
+ # enter default state
|
|
|
+ self.default_targets = self.states["/creating"].getEffectiveTargetStates()
|
|
|
+ RuntimeClassBase.initializeStatechart(self)
|
|
|
+
|
|
|
+class ElevatorButton(ObjectManagerBase):
|
|
|
+ def __init__(self, name):
|
|
|
+ ObjectManagerBase.__init__(self, name)
|
|
|
+ self.input = self.addInPort("input")
|
|
|
+ self.output = self.addOutPort("ui")
|
|
|
+ self.outputs["parent"] = self.addOutPort("parent")
|
|
|
+ self.button_ui = self.addInPort("button_ui")
|
|
|
+
|
|
|
+ def constructObject(self, parameters):
|
|
|
+ new_instance = ElevatorButtonInstance(self, parameters[2], parameters[3])
|
|
|
+ return new_instance
|
|
|
+
|
|
|
class ElevatorInstance(RuntimeClassBase):
|
|
|
def __init__(self, atomdevs, canvas_id):
|
|
|
RuntimeClassBase.__init__(self, atomdevs)
|
|
@@ -363,19 +649,14 @@ class ElevatorInstance(RuntimeClassBase):
|
|
|
|
|
|
def user_defined_constructor(self, canvas_id):
|
|
|
self.canvas_id = canvas_id;
|
|
|
- self.button_ids = {
|
|
|
- 'up': None,
|
|
|
- 'down': None,
|
|
|
- 'open': None
|
|
|
- };
|
|
|
- self.open_button = None;
|
|
|
+
|
|
|
self.is_open = False;
|
|
|
|
|
|
elevator_height = (CANVAS_DIMS[1] - ((FLOORS - 1) * FLOOR_SPACE)) / FLOORS
|
|
|
|
|
|
self.dim = {'x': elevator_height, 'y': elevator_height};
|
|
|
- self.vel = {'x': 0, 'y': -2};
|
|
|
- self.pos = {'x': FLOOR_LENGTH + (elevator_height / 2), 'y': 75};
|
|
|
+ self.vel = -2;
|
|
|
+ self.pos = {'x': FLOOR_LENGTH + (elevator_height / 2), 'y': (CANVAS_DIMS[1] - (elevator_height / 2))};
|
|
|
self.smooth = 0.6; # value between 0 and 1
|
|
|
|
|
|
def user_defined_destructor(self):
|
|
@@ -400,17 +681,26 @@ class ElevatorInstance(RuntimeClassBase):
|
|
|
|
|
|
# state /root/running
|
|
|
self.states["/root/running"] = State(4, "/root/running", self)
|
|
|
- self.states["/root/running"].setEnter(self._root_running_enter)
|
|
|
- self.states["/root/running"].setExit(self._root_running_exit)
|
|
|
+
|
|
|
+ # state /root/running/waiting
|
|
|
+ self.states["/root/running/waiting"] = State(5, "/root/running/waiting", self)
|
|
|
+
|
|
|
+ # state /root/running/move
|
|
|
+ self.states["/root/running/move"] = State(6, "/root/running/move", self)
|
|
|
+ self.states["/root/running/move"].setEnter(self._root_running_move_enter)
|
|
|
+ self.states["/root/running/move"].setExit(self._root_running_move_exit)
|
|
|
|
|
|
# add children
|
|
|
self.states[""].addChild(self.states["/root"])
|
|
|
self.states["/root"].addChild(self.states["/root/waiting"])
|
|
|
self.states["/root"].addChild(self.states["/root/creating_elevator"])
|
|
|
self.states["/root"].addChild(self.states["/root/running"])
|
|
|
+ self.states["/root/running"].addChild(self.states["/root/running/waiting"])
|
|
|
+ self.states["/root/running"].addChild(self.states["/root/running/move"])
|
|
|
self.states[""].fixTree()
|
|
|
self.states[""].default_state = self.states["/root"]
|
|
|
self.states["/root"].default_state = self.states["/root/waiting"]
|
|
|
+ self.states["/root/running"].default_state = self.states["/root/running/waiting"]
|
|
|
|
|
|
# transition /root/waiting
|
|
|
_root_waiting_0 = Transition(self, self.states["/root/waiting"], [self.states["/root/creating_elevator"]])
|
|
@@ -424,27 +714,28 @@ class ElevatorInstance(RuntimeClassBase):
|
|
|
_root_creating_elevator_0.setTrigger(Event("rectangle_created", None))
|
|
|
self.states["/root/creating_elevator"].addTransition(_root_creating_elevator_0)
|
|
|
|
|
|
- # transition /root/running
|
|
|
- _root_running_0 = Transition(self, self.states["/root/running"], [self.states["/root/running"]])
|
|
|
- _root_running_0.setAction(self._root_running_0_exec)
|
|
|
- _root_running_0.setTrigger(Event("_0after"))
|
|
|
- self.states["/root/running"].addTransition(_root_running_0)
|
|
|
- _root_running_1 = Transition(self, self.states["/root/running"], [self.states["/root/running"]])
|
|
|
- _root_running_1.setAction(self._root_running_1_exec)
|
|
|
- _root_running_1.setTrigger(Event("right_click", self.getInPortName("elevator_ui")))
|
|
|
- self.states["/root/running"].addTransition(_root_running_1)
|
|
|
- _root_running_2 = Transition(self, self.states["/root/running"], [self.states["/root/running"]])
|
|
|
- _root_running_2.setAction(self._root_running_2_exec)
|
|
|
- _root_running_2.setTrigger(Event("instance_created", None))
|
|
|
- self.states["/root/running"].addTransition(_root_running_2)
|
|
|
+ # transition /root/running/waiting
|
|
|
+ _root_running_waiting_0 = Transition(self, self.states["/root/running/waiting"], [self.states["/root/running/move"]])
|
|
|
+ _root_running_waiting_0.setTrigger(Event("move_elevator", None))
|
|
|
+ self.states["/root/running/waiting"].addTransition(_root_running_waiting_0)
|
|
|
+
|
|
|
+ # transition /root/running/move
|
|
|
+ _root_running_move_0 = Transition(self, self.states["/root/running/move"], [self.states["/root/running/move"]])
|
|
|
+ _root_running_move_0.setAction(self._root_running_move_0_exec)
|
|
|
+ _root_running_move_0.setTrigger(Event("_0after"))
|
|
|
+ self.states["/root/running/move"].addTransition(_root_running_move_0)
|
|
|
+ _root_running_move_1 = Transition(self, self.states["/root/running/move"], [self.states["/root/running/waiting"]])
|
|
|
+ _root_running_move_1.setTrigger(None)
|
|
|
+ _root_running_move_1.setGuard(self._root_running_move_1_guard)
|
|
|
+ self.states["/root/running/move"].addTransition(_root_running_move_1)
|
|
|
|
|
|
def _root_creating_elevator_enter(self):
|
|
|
self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, self.pos['x'], self.pos['y'], self.dim['x'], self.dim['y'], {'fill':'white', 'outline': 'black'}, self.inports['elevator_ui']]))
|
|
|
|
|
|
- def _root_running_enter(self):
|
|
|
+ def _root_running_move_enter(self):
|
|
|
self.addTimer(0, 0.02)
|
|
|
|
|
|
- def _root_running_exit(self):
|
|
|
+ def _root_running_move_exit(self):
|
|
|
self.removeTimer(0)
|
|
|
|
|
|
def _root_waiting_0_exec(self, parameters):
|
|
@@ -459,27 +750,13 @@ class ElevatorInstance(RuntimeClassBase):
|
|
|
canvas_id = parameters[0]
|
|
|
rect_id = parameters[1]
|
|
|
self.elevator_id = rect_id
|
|
|
- self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_RIGHT_CLICK, 'right_click', self.inports['elevator_ui']]))
|
|
|
|
|
|
- def _root_running_0_exec(self, parameters):
|
|
|
- # Invert velocity when colliding with canvas border:
|
|
|
- if self.pos['y']-(self.dim['y']/2) <= 0 or self.pos['y']+(self.dim['y']/2) >= CANVAS_DIMS[1]:
|
|
|
- self.vel['y'] = -self.vel['y'];
|
|
|
- self.big_step.outputEvent(Event("move_element", self.getOutPortName("ui"), [self.canvas_id, self.elevator_id, self.vel['x'], self.vel['y']]))
|
|
|
- self.pos['x'] += self.vel['x']
|
|
|
- self.pos['y'] += self.vel['y']
|
|
|
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'balls', Event("update_bounds", None, [self.pos, self.dim, self.vel])]))
|
|
|
-
|
|
|
- def _root_running_1_exec(self, parameters):
|
|
|
- x = parameters[0]
|
|
|
- y = parameters[1]
|
|
|
- button = parameters[2]
|
|
|
- self.big_step.outputEventOM(Event("create_instance", None, [self, "balls", "Ball", self.canvas_id, -1, x, y]))
|
|
|
+ def _root_running_move_0_exec(self, parameters):
|
|
|
+ self.big_step.outputEvent(Event("set_element_pos", self.getOutPortName("ui"), [self.canvas_id, self.elevator_id, self.pos['x'], self.pos['y']]))
|
|
|
+ self.pos['y'] += self.vel
|
|
|
|
|
|
- def _root_running_2_exec(self, parameters):
|
|
|
- association_name = parameters[0]
|
|
|
- self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
|
|
|
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
|
|
|
+ def _root_running_move_1_guard(self, parameters):
|
|
|
+ return (self.pos['y'] - (self.dim['y']/2)) < 0
|
|
|
|
|
|
def initializeStatechart(self):
|
|
|
# enter default state
|
|
@@ -566,8 +843,11 @@ class BallInstance(RuntimeClassBase):
|
|
|
# state /main_behaviour/selected
|
|
|
self.states["/main_behaviour/selected"] = State(6, "/main_behaviour/selected", self)
|
|
|
|
|
|
+ # state /main_behaviour/ball_delete
|
|
|
+ self.states["/main_behaviour/ball_delete"] = State(7, "/main_behaviour/ball_delete", self)
|
|
|
+
|
|
|
# state /deleted
|
|
|
- self.states["/deleted"] = State(7, "/deleted", self)
|
|
|
+ self.states["/deleted"] = State(8, "/deleted", self)
|
|
|
|
|
|
# add children
|
|
|
self.states[""].addChild(self.states["/main_behaviour"])
|
|
@@ -577,6 +857,7 @@ class BallInstance(RuntimeClassBase):
|
|
|
self.states["/main_behaviour"].addChild(self.states["/main_behaviour/bouncing"])
|
|
|
self.states["/main_behaviour"].addChild(self.states["/main_behaviour/dragging"])
|
|
|
self.states["/main_behaviour"].addChild(self.states["/main_behaviour/selected"])
|
|
|
+ self.states["/main_behaviour"].addChild(self.states["/main_behaviour/ball_delete"])
|
|
|
self.states[""].fixTree()
|
|
|
self.states[""].default_state = self.states["/main_behaviour"]
|
|
|
self.states["/main_behaviour"].default_state = self.states["/main_behaviour/initializing"]
|
|
@@ -598,8 +879,7 @@ class BallInstance(RuntimeClassBase):
|
|
|
_main_behaviour_bouncing_0.setAction(self._main_behaviour_bouncing_0_exec)
|
|
|
_main_behaviour_bouncing_0.setTrigger(Event("_0after"))
|
|
|
self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_0)
|
|
|
- _main_behaviour_bouncing_1 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/bouncing"]])
|
|
|
- _main_behaviour_bouncing_1.setAction(self._main_behaviour_bouncing_1_exec)
|
|
|
+ _main_behaviour_bouncing_1 = Transition(self, self.states["/main_behaviour/bouncing"], [self.states["/main_behaviour/ball_delete"]])
|
|
|
_main_behaviour_bouncing_1.setTrigger(None)
|
|
|
_main_behaviour_bouncing_1.setGuard(self._main_behaviour_bouncing_1_guard)
|
|
|
self.states["/main_behaviour/bouncing"].addTransition(_main_behaviour_bouncing_1)
|
|
@@ -629,10 +909,12 @@ class BallInstance(RuntimeClassBase):
|
|
|
_main_behaviour_selected_0.setTrigger(Event("mouse_press", self.getInPortName("ball_ui")))
|
|
|
_main_behaviour_selected_0.setGuard(self._main_behaviour_selected_0_guard)
|
|
|
self.states["/main_behaviour/selected"].addTransition(_main_behaviour_selected_0)
|
|
|
- _main_behaviour_selected_1 = Transition(self, self.states["/main_behaviour/selected"], [self.states["/deleted"]])
|
|
|
- _main_behaviour_selected_1.setAction(self._main_behaviour_selected_1_exec)
|
|
|
- _main_behaviour_selected_1.setTrigger(Event("delete_self", None))
|
|
|
- self.states["/main_behaviour/selected"].addTransition(_main_behaviour_selected_1)
|
|
|
+
|
|
|
+ # transition /main_behaviour/ball_delete
|
|
|
+ _main_behaviour_ball_delete_0 = Transition(self, self.states["/main_behaviour/ball_delete"], [self.states["/deleted"]])
|
|
|
+ _main_behaviour_ball_delete_0.setAction(self._main_behaviour_ball_delete_0_exec)
|
|
|
+ _main_behaviour_ball_delete_0.setTrigger(Event("delete_self", None))
|
|
|
+ self.states["/main_behaviour/ball_delete"].addTransition(_main_behaviour_ball_delete_0)
|
|
|
|
|
|
def _main_behaviour_creating_circle_enter(self):
|
|
|
self.big_step.outputEvent(Event("create_circle", self.getOutPortName("ui"), [self.canvas_id, self.pos['x'], self.pos['y'], self.r, {'fill':'#000'}, self.inports['ball_ui']]))
|
|
@@ -694,11 +976,8 @@ class BallInstance(RuntimeClassBase):
|
|
|
self.pos['x'] += self.vel['x']
|
|
|
self.pos['y'] += self.vel['y']
|
|
|
|
|
|
- def _main_behaviour_bouncing_1_exec(self, parameters):
|
|
|
- self.big_step.outputEvent(Event("destroy_element", self.getOutPortName("ui"), [self.canvas_id, self.circle_id]))
|
|
|
-
|
|
|
def _main_behaviour_bouncing_1_guard(self, parameters):
|
|
|
- return self.pos['x'] - self.r < 6
|
|
|
+ return self.pos['x'] - self.r < 2
|
|
|
|
|
|
def _main_behaviour_bouncing_2_exec(self, parameters):
|
|
|
x = parameters[0]
|
|
@@ -756,9 +1035,9 @@ class BallInstance(RuntimeClassBase):
|
|
|
button = parameters[2]
|
|
|
return button == ui.MOUSE_BUTTONS.LEFT
|
|
|
|
|
|
- def _main_behaviour_selected_1_exec(self, parameters):
|
|
|
+ def _main_behaviour_ball_delete_0_exec(self, parameters):
|
|
|
self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_ball", None, [self.association_name])]))
|
|
|
- self.big_step.outputEvent(Event("destroy_element", self.getOutPortName("ui"), [self.canvas_id, self.element_id]))
|
|
|
+ self.big_step.outputEvent(Event("destroy_element", self.getOutPortName("ui"), [self.canvas_id, self.circle_id]))
|
|
|
|
|
|
def initializeStatechart(self):
|
|
|
# enter default state
|
|
@@ -788,6 +1067,8 @@ class ObjectManager(TheObjectManager):
|
|
|
self.input = self.addInPort("input")
|
|
|
self.output["MainApp"] = self.addOutPort()
|
|
|
self.output["Floor"] = self.addOutPort()
|
|
|
+ self.output["ElevatorControls"] = self.addOutPort()
|
|
|
+ self.output["ElevatorButton"] = self.addOutPort()
|
|
|
self.output["Elevator"] = self.addOutPort()
|
|
|
self.output["Ball"] = self.addOutPort()
|
|
|
|
|
@@ -801,24 +1082,37 @@ class Controller(CoupledDEVS):
|
|
|
self.objectmanager = self.addSubModel(ObjectManager("ObjectManager"))
|
|
|
self.atomic0 = self.addSubModel(MainApp("MainApp"))
|
|
|
self.atomic1 = self.addSubModel(Floor("Floor"))
|
|
|
- self.atomic2 = self.addSubModel(Elevator("Elevator"))
|
|
|
- self.atomic3 = self.addSubModel(Ball("Ball"))
|
|
|
+ self.atomic2 = self.addSubModel(ElevatorControls("ElevatorControls"))
|
|
|
+ self.atomic3 = self.addSubModel(ElevatorButton("ElevatorButton"))
|
|
|
+ self.atomic4 = self.addSubModel(Elevator("Elevator"))
|
|
|
+ self.atomic5 = self.addSubModel(Ball("Ball"))
|
|
|
self.connectPorts(self.atomic0.obj_manager_out, self.objectmanager.input)
|
|
|
self.connectPorts(self.objectmanager.output["MainApp"], self.atomic0.obj_manager_in)
|
|
|
self.connectPorts(self.atomic0.outputs["floor"], self.atomic1.input)
|
|
|
- self.connectPorts(self.atomic0.outputs["elevator"], self.atomic2.input)
|
|
|
+ self.connectPorts(self.atomic0.outputs["controls"], self.atomic2.input)
|
|
|
+ self.connectPorts(self.atomic0.outputs["elevator"], self.atomic4.input)
|
|
|
self.connectPorts(self.atomic1.obj_manager_out, self.objectmanager.input)
|
|
|
self.connectPorts(self.objectmanager.output["Floor"], self.atomic1.obj_manager_in)
|
|
|
- self.connectPorts(self.atomic1.outputs["balls"], self.atomic3.input)
|
|
|
+ self.connectPorts(self.atomic1.outputs["balls"], self.atomic5.input)
|
|
|
self.connectPorts(self.atomic1.outputs["parent"], self.atomic0.input)
|
|
|
self.connectPorts(self.atomic2.obj_manager_out, self.objectmanager.input)
|
|
|
- self.connectPorts(self.objectmanager.output["Elevator"], self.atomic2.obj_manager_in)
|
|
|
- self.connectPorts(self.atomic2.outputs["balls"], self.atomic3.input)
|
|
|
- self.connectPorts(self.atomic2.outputs["parent"], self.atomic0.input)
|
|
|
+ self.connectPorts(self.objectmanager.output["ElevatorControls"], self.atomic2.obj_manager_in)
|
|
|
+ self.connectPorts(self.atomic2.outputs["button"], self.atomic3.input)
|
|
|
+ self.connectPorts(self.atomic2.outputs["balls"], self.atomic5.input)
|
|
|
+ self.connectPorts(self.atomic2.outputs["parent"], self.atomic4.input)
|
|
|
self.connectPorts(self.atomic3.obj_manager_out, self.objectmanager.input)
|
|
|
- self.connectPorts(self.objectmanager.output["Ball"], self.atomic3.obj_manager_in)
|
|
|
- self.connectPorts(self.atomic3.outputs["parent"], self.atomic0.input)
|
|
|
+ self.connectPorts(self.objectmanager.output["ElevatorButton"], self.atomic3.obj_manager_in)
|
|
|
+ self.connectPorts(self.atomic3.outputs["parent"], self.atomic2.input)
|
|
|
+ self.connectPorts(self.atomic4.obj_manager_out, self.objectmanager.input)
|
|
|
+ self.connectPorts(self.objectmanager.output["Elevator"], self.atomic4.obj_manager_in)
|
|
|
+ self.connectPorts(self.atomic4.outputs["balls"], self.atomic5.input)
|
|
|
+ self.connectPorts(self.atomic4.outputs["parent"], self.atomic0.input)
|
|
|
+ self.connectPorts(self.atomic5.obj_manager_out, self.objectmanager.input)
|
|
|
+ self.connectPorts(self.objectmanager.output["Ball"], self.atomic5.obj_manager_in)
|
|
|
+ self.connectPorts(self.atomic5.outputs["parent"], self.atomic0.input)
|
|
|
self.connectPorts(self.atomic0.output, self.out_ui)
|
|
|
self.connectPorts(self.atomic1.output, self.out_ui)
|
|
|
self.connectPorts(self.atomic2.output, self.out_ui)
|
|
|
- self.connectPorts(self.atomic3.output, self.out_ui)
|
|
|
+ self.connectPorts(self.atomic3.output, self.out_ui)
|
|
|
+ self.connectPorts(self.atomic4.output, self.out_ui)
|
|
|
+ self.connectPorts(self.atomic5.output, self.out_ui)
|