|
@@ -11,7 +11,7 @@ from sccd.runtime.DEVS_statecharts_core import *
|
|
|
from pypdevs.DEVS import *
|
|
|
from pypdevs.infinity import *
|
|
|
from pypdevs.simulator import *
|
|
|
-from sccd.runtime.libs.DEVui import ui
|
|
|
+from sccd.runtime.libs import ui_v2 as ui
|
|
|
from sccd.runtime.libs.utils import utils
|
|
|
import random
|
|
|
|
|
@@ -154,7 +154,7 @@ class MainAppInstance(RuntimeClassBase):
|
|
|
self.removeTimer(0)
|
|
|
|
|
|
def _running_root_0_exec(self, parameters):
|
|
|
- ui.close_window(ui.window)
|
|
|
+ self.big_step.outputEvent(Event("destroy_all", self.getOutPortName("ui"), []))
|
|
|
|
|
|
def _running_root_main_behaviour_initializing_0_exec(self, parameters):
|
|
|
self.raiseInternalEvent(Event("create_field", None, []))
|
|
@@ -200,19 +200,17 @@ class MainApp(AtomicDEVS, ObjectManagerBase):
|
|
|
AtomicDEVS.__init__(self, name)
|
|
|
ObjectManagerBase.__init__(self)
|
|
|
self.elapsed = 0
|
|
|
- self.obj_manager_in = self.addInPort("obj_manager_in")
|
|
|
+ self.name = "MainApp"
|
|
|
self.obj_manager_out = self.addOutPort("obj_manager_out")
|
|
|
- self.input = self.addInPort("input")
|
|
|
self.outputs = {}
|
|
|
self.outputs["fields"] = self.addOutPort("fields")
|
|
|
self.obj_manager_in = self.addInPort("obj_manager_in")
|
|
|
self.input = self.addInPort("input")
|
|
|
self.instances.add(MainAppInstance(self))
|
|
|
-
|
|
|
- self.name = "MainApp"
|
|
|
+ self.next_time = INFINITY
|
|
|
|
|
|
def extTransition(self, inputs):
|
|
|
- self.simulated_time = (self.simulated_time + self.elapsed)
|
|
|
+ self.next_time = 0
|
|
|
all_inputs = []
|
|
|
if self.obj_manager_in in inputs:
|
|
|
all_inputs.extend(inputs[self.obj_manager_in])
|
|
@@ -224,22 +222,22 @@ class MainApp(AtomicDEVS, ObjectManagerBase):
|
|
|
self.addInput(tem)
|
|
|
if input[3].name == "create_instance":
|
|
|
self.instances.add(MainAppInstance(self))
|
|
|
- ev = Event("instance_created", None, parameters=[f"{input[0]}[{len(self.instances)-1}]"])
|
|
|
- self.to_send.append(("MainApp", TODO, input[2], ev))
|
|
|
+ ev = Event("instance_created", None, parameters=[f"{input[3].parameters[0]}[{len(self.instances)-1}]"])
|
|
|
+ self.to_send.append((self.name, input[1], input[2], ev))
|
|
|
elif input[3].name == "start_instance":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.start()
|
|
|
- ev = Event("instance_started", None, parameters=[])
|
|
|
- self.to_send.append(("MainApp", input[1], input[2], ev))
|
|
|
+ ev = Event("instance_started", None, parameters=[f"{input[0]}[{input[2]}]"])
|
|
|
+ self.to_send.append((input[0], input[1], input[2], ev))
|
|
|
elif input[3].name == "delete_instance":
|
|
|
ev = Event("instance_deleted", None, parameters=[TODO])
|
|
|
- self.to_send.append(("MainApp", TODO, TODO, ev))
|
|
|
+ self.to_send.append((self.name, TODO, TODO, ev))
|
|
|
elif input[3].name == "associate_instance":
|
|
|
ev = Event("instance_associated", None, parameters=[TODO])
|
|
|
- self.to_send.append(("MainApp", TODO, TODO, ev))
|
|
|
+ self.to_send.append((self.name, TODO, TODO, ev))
|
|
|
elif input[3].name == "disassociate_instance":
|
|
|
ev = Event("instance_disassociated", None, parameters=[TODO])
|
|
|
- self.to_send.append(("MainApp", TODO, TODO, ev))
|
|
|
+ self.to_send.append((self.name, TODO, TODO, ev))
|
|
|
elif input[3].name == "instance_created":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
@@ -247,28 +245,35 @@ class MainApp(AtomicDEVS, ObjectManagerBase):
|
|
|
elif input[3].name == "instance_started":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
|
- #instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
elif input[3].name == "instance_deleted":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
|
- instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
elif input[3].name == "instance_associated":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
|
- instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
elif input[3].name == "instance_disassociated":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
|
- instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
elif input[3].name == "set_association_name":
|
|
|
ev = input[3]
|
|
|
self.addInput(ev, force_internal=True)
|
|
|
return self.instances
|
|
|
|
|
|
def intTransition(self):
|
|
|
+ earliest = min(self.getEarliestEventTime(), self.input_queue.getEarliestTime())
|
|
|
+ if not (earliest == INFINITY):
|
|
|
+ self.simulated_time = earliest
|
|
|
self.to_send = []
|
|
|
self.handleInput()
|
|
|
self.stepAll()
|
|
|
+ next_earliest = min(self.getEarliestEventTime(), self.input_queue.getEarliestTime())
|
|
|
+
|
|
|
+ if len(self.to_send) != 0:
|
|
|
+ self.next_time = 0
|
|
|
+ elif next_earliest == INFINITY:
|
|
|
+ self.next_time = INFINITY
|
|
|
+ else:
|
|
|
+ self.next_time = next_earliest - earliest
|
|
|
return self.instances
|
|
|
|
|
|
def outputFnc(self):
|
|
@@ -291,9 +296,7 @@ class MainApp(AtomicDEVS, ObjectManagerBase):
|
|
|
return to_dict
|
|
|
|
|
|
def timeAdvance(self):
|
|
|
- if not (len(self.to_send) == 0):
|
|
|
- return 0
|
|
|
- return self.getEarliestEventTime()
|
|
|
+ return self.next_time
|
|
|
|
|
|
class FieldInstance(RuntimeClassBase):
|
|
|
def __init__(self, atomdevs):
|
|
@@ -313,23 +316,27 @@ class FieldInstance(RuntimeClassBase):
|
|
|
self.build_statechart_structure()
|
|
|
|
|
|
# user defined attributes
|
|
|
- self.canvas = None
|
|
|
- self.field_window = None
|
|
|
+ self.window_id = None
|
|
|
+ self.canvas_id = None
|
|
|
|
|
|
# call user defined constructor
|
|
|
FieldInstance.user_defined_constructor(self)
|
|
|
|
|
|
def user_defined_constructor(self):
|
|
|
- self.field_window = ui.new_window(800,600,"BouncingBalls");
|
|
|
- self.canvas = ui.append_canvas(self.field_window,800,550,{'background':'#eee'});
|
|
|
- ui.bind_event(self.field_window, ui.EVENTS.WINDOW_CLOSE, self.controller, 'window_close', 'field_ui');
|
|
|
- ui.bind_event(self.field_window, ui.EVENTS.KEY_PRESS, self.controller, 'key_press', 'field_ui');
|
|
|
- ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_RIGHT_CLICK, self.controller, 'right_click', 'field_ui');
|
|
|
- ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_MOVE, self.controller, 'mouse_move', 'field_ui');
|
|
|
- ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_RELEASE, self.controller, 'mouse_release', 'field_ui');
|
|
|
+ # All of these TkInter calls have been converted to in/out-events:
|
|
|
+ #self.field_window = ui.new_window(800,600,"BouncingBalls");
|
|
|
+ #self.canvas = ui.append_canvas(self.field_window,800,550,{'background':'#eee'});
|
|
|
+ #ui.bind_event(self.field_window, ui.EVENTS.WINDOW_CLOSE, self.controller, 'window_close', self.inports['field_ui']);
|
|
|
+ #ui.bind_event(self.field_window, ui.EVENTS.KEY_PRESS, self.controller, 'key_press', self.inports['field_ui']);
|
|
|
+ #ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_RIGHT_CLICK, self.controller, 'right_click', self.inports['field_ui']);
|
|
|
+ #ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_MOVE, self.controller, 'mouse_move', self.inports['field_ui']);
|
|
|
+ #ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_RELEASE, self.controller, 'mouse_release', self.inports['field_ui']);
|
|
|
+ print("created field")
|
|
|
+ pass
|
|
|
|
|
|
def user_defined_destructor(self):
|
|
|
- ui.close_window(self.field_window);
|
|
|
+ # ui.close_window(self.field_window);
|
|
|
+ pass
|
|
|
|
|
|
|
|
|
# builds Statechart structure
|
|
@@ -344,14 +351,17 @@ class FieldInstance(RuntimeClassBase):
|
|
|
# state /root/waiting
|
|
|
self.states["/root/waiting"] = State(2, "/root/waiting", self)
|
|
|
|
|
|
- # state /root/initializing
|
|
|
- self.states["/root/initializing"] = State(3, "/root/initializing", self)
|
|
|
+ # state /root/creating_window
|
|
|
+ self.states["/root/creating_window"] = State(3, "/root/creating_window", self)
|
|
|
+ self.states["/root/creating_window"].setEnter(self._root_creating_window_enter)
|
|
|
|
|
|
- # state /root/creating
|
|
|
- self.states["/root/creating"] = State(4, "/root/creating", self)
|
|
|
+ # state /root/creating_canvas
|
|
|
+ self.states["/root/creating_canvas"] = State(4, "/root/creating_canvas", self)
|
|
|
+ self.states["/root/creating_canvas"].setEnter(self._root_creating_canvas_enter)
|
|
|
|
|
|
- # state /root/packing
|
|
|
- self.states["/root/packing"] = State(5, "/root/packing", self)
|
|
|
+ # state /root/creating_button
|
|
|
+ self.states["/root/creating_button"] = State(5, "/root/creating_button", self)
|
|
|
+ self.states["/root/creating_button"].setEnter(self._root_creating_button_enter)
|
|
|
|
|
|
# state /root/running
|
|
|
self.states["/root/running"] = ParallelState(6, "/root/running", self)
|
|
@@ -362,8 +372,8 @@ class FieldInstance(RuntimeClassBase):
|
|
|
# state /root/running/main_behaviour/running
|
|
|
self.states["/root/running/main_behaviour/running"] = State(8, "/root/running/main_behaviour/running", self)
|
|
|
|
|
|
- # state /root/running/main_behaviour/creating
|
|
|
- self.states["/root/running/main_behaviour/creating"] = State(9, "/root/running/main_behaviour/creating", self)
|
|
|
+ # state /root/running/main_behaviour/creating_ball
|
|
|
+ self.states["/root/running/main_behaviour/creating_ball"] = State(9, "/root/running/main_behaviour/creating_ball", self)
|
|
|
|
|
|
# state /root/running/deleting_behaviour
|
|
|
self.states["/root/running/deleting_behaviour"] = State(10, "/root/running/deleting_behaviour", self)
|
|
@@ -392,9 +402,9 @@ class FieldInstance(RuntimeClassBase):
|
|
|
# add children
|
|
|
self.states[""].addChild(self.states["/root"])
|
|
|
self.states["/root"].addChild(self.states["/root/waiting"])
|
|
|
- self.states["/root"].addChild(self.states["/root/initializing"])
|
|
|
- self.states["/root"].addChild(self.states["/root/creating"])
|
|
|
- self.states["/root"].addChild(self.states["/root/packing"])
|
|
|
+ self.states["/root"].addChild(self.states["/root/creating_window"])
|
|
|
+ self.states["/root"].addChild(self.states["/root/creating_canvas"])
|
|
|
+ self.states["/root"].addChild(self.states["/root/creating_button"])
|
|
|
self.states["/root"].addChild(self.states["/root/running"])
|
|
|
self.states["/root"].addChild(self.states["/root/deleting"])
|
|
|
self.states["/root"].addChild(self.states["/root/deleted"])
|
|
@@ -403,7 +413,7 @@ class FieldInstance(RuntimeClassBase):
|
|
|
self.states["/root/running"].addChild(self.states["/root/running/child_behaviour"])
|
|
|
self.states["/root/running"].addChild(self.states["/root/running/deleting_balls_behaviour"])
|
|
|
self.states["/root/running/main_behaviour"].addChild(self.states["/root/running/main_behaviour/running"])
|
|
|
- self.states["/root/running/main_behaviour"].addChild(self.states["/root/running/main_behaviour/creating"])
|
|
|
+ self.states["/root/running/main_behaviour"].addChild(self.states["/root/running/main_behaviour/creating_ball"])
|
|
|
self.states["/root/running/deleting_behaviour"].addChild(self.states["/root/running/deleting_behaviour/running"])
|
|
|
self.states["/root/running/child_behaviour"].addChild(self.states["/root/running/child_behaviour/listening"])
|
|
|
self.states["/root/running/deleting_balls_behaviour"].addChild(self.states["/root/running/deleting_balls_behaviour/listening"])
|
|
@@ -416,39 +426,40 @@ class FieldInstance(RuntimeClassBase):
|
|
|
self.states["/root/running/deleting_balls_behaviour"].default_state = self.states["/root/running/deleting_balls_behaviour/listening"]
|
|
|
|
|
|
# transition /root/waiting
|
|
|
- _root_waiting_0 = Transition(self, self.states["/root/waiting"], [self.states["/root/initializing"]])
|
|
|
+ _root_waiting_0 = Transition(self, self.states["/root/waiting"], [self.states["/root/creating_window"]])
|
|
|
_root_waiting_0.setAction(self._root_waiting_0_exec)
|
|
|
_root_waiting_0.setTrigger(Event("set_association_name", None))
|
|
|
self.states["/root/waiting"].addTransition(_root_waiting_0)
|
|
|
|
|
|
- # transition /root/initializing
|
|
|
- _root_initializing_0 = Transition(self, self.states["/root/initializing"], [self.states["/root/creating"]])
|
|
|
- _root_initializing_0.setAction(self._root_initializing_0_exec)
|
|
|
- _root_initializing_0.setTrigger(None)
|
|
|
- self.states["/root/initializing"].addTransition(_root_initializing_0)
|
|
|
+ # transition /root/creating_window
|
|
|
+ _root_creating_window_0 = Transition(self, self.states["/root/creating_window"], [self.states["/root/creating_canvas"]])
|
|
|
+ _root_creating_window_0.setAction(self._root_creating_window_0_exec)
|
|
|
+ _root_creating_window_0.setTrigger(Event("window_created", None))
|
|
|
+ self.states["/root/creating_window"].addTransition(_root_creating_window_0)
|
|
|
|
|
|
- # transition /root/creating
|
|
|
- _root_creating_0 = Transition(self, self.states["/root/creating"], [self.states["/root/packing"]])
|
|
|
- _root_creating_0.setAction(self._root_creating_0_exec)
|
|
|
- _root_creating_0.setTrigger(Event("instance_created", None))
|
|
|
- self.states["/root/creating"].addTransition(_root_creating_0)
|
|
|
+ # transition /root/creating_canvas
|
|
|
+ _root_creating_canvas_0 = Transition(self, self.states["/root/creating_canvas"], [self.states["/root/creating_button"]])
|
|
|
+ _root_creating_canvas_0.setAction(self._root_creating_canvas_0_exec)
|
|
|
+ _root_creating_canvas_0.setTrigger(Event("canvas_created", None))
|
|
|
+ self.states["/root/creating_canvas"].addTransition(_root_creating_canvas_0)
|
|
|
|
|
|
- # transition /root/packing
|
|
|
- _root_packing_0 = Transition(self, self.states["/root/packing"], [self.states["/root/running"]])
|
|
|
- _root_packing_0.setTrigger(Event("button_created", None))
|
|
|
- self.states["/root/packing"].addTransition(_root_packing_0)
|
|
|
+ # transition /root/creating_button
|
|
|
+ _root_creating_button_0 = Transition(self, self.states["/root/creating_button"], [self.states["/root/running"]])
|
|
|
+ _root_creating_button_0.setAction(self._root_creating_button_0_exec)
|
|
|
+ _root_creating_button_0.setTrigger(Event("instance_created", None))
|
|
|
+ self.states["/root/creating_button"].addTransition(_root_creating_button_0)
|
|
|
|
|
|
# transition /root/running/main_behaviour/running
|
|
|
- _root_running_main_behaviour_running_0 = Transition(self, self.states["/root/running/main_behaviour/running"], [self.states["/root/running/main_behaviour/creating"]])
|
|
|
+ _root_running_main_behaviour_running_0 = Transition(self, self.states["/root/running/main_behaviour/running"], [self.states["/root/running/main_behaviour/creating_ball"]])
|
|
|
_root_running_main_behaviour_running_0.setAction(self._root_running_main_behaviour_running_0_exec)
|
|
|
_root_running_main_behaviour_running_0.setTrigger(Event("right_click", self.getInPortName("field_ui")))
|
|
|
self.states["/root/running/main_behaviour/running"].addTransition(_root_running_main_behaviour_running_0)
|
|
|
|
|
|
- # transition /root/running/main_behaviour/creating
|
|
|
- _root_running_main_behaviour_creating_0 = Transition(self, self.states["/root/running/main_behaviour/creating"], [self.states["/root/running/main_behaviour/running"]])
|
|
|
- _root_running_main_behaviour_creating_0.setAction(self._root_running_main_behaviour_creating_0_exec)
|
|
|
- _root_running_main_behaviour_creating_0.setTrigger(Event("instance_created", None))
|
|
|
- self.states["/root/running/main_behaviour/creating"].addTransition(_root_running_main_behaviour_creating_0)
|
|
|
+ # transition /root/running/main_behaviour/creating_ball
|
|
|
+ _root_running_main_behaviour_creating_ball_0 = Transition(self, self.states["/root/running/main_behaviour/creating_ball"], [self.states["/root/running/main_behaviour/running"]])
|
|
|
+ _root_running_main_behaviour_creating_ball_0.setAction(self._root_running_main_behaviour_creating_ball_0_exec)
|
|
|
+ _root_running_main_behaviour_creating_ball_0.setTrigger(Event("instance_created", None))
|
|
|
+ self.states["/root/running/main_behaviour/creating_ball"].addTransition(_root_running_main_behaviour_creating_ball_0)
|
|
|
|
|
|
# transition /root/running/deleting_behaviour/running
|
|
|
_root_running_deleting_behaviour_running_0 = Transition(self, self.states["/root/running/deleting_behaviour/running"], [self.states["/root/running/deleting_behaviour/running"]])
|
|
@@ -481,6 +492,15 @@ class FieldInstance(RuntimeClassBase):
|
|
|
_root_running_0.setTrigger(Event("window_close", self.getInPortName("field_ui")))
|
|
|
self.states["/root/running"].addTransition(_root_running_0)
|
|
|
|
|
|
+ def _root_creating_window_enter(self):
|
|
|
+ self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [800, 600, "BouncingBalls", self.inports['field_ui']]))
|
|
|
+
|
|
|
+ def _root_creating_canvas_enter(self):
|
|
|
+ self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, 800, 550, {'background':'#eee'}, self.inports['field_ui']]))
|
|
|
+
|
|
|
+ def _root_creating_button_enter(self):
|
|
|
+ self.big_step.outputEventOM(Event("create_instance", None, [self, "buttons", "Button", self.window_id, 'create_new_field', 'Spawn New Window']))
|
|
|
+
|
|
|
def _root_running_0_exec(self, parameters):
|
|
|
self.big_step.outputEventOM(Event("delete_instance", None, [self, "buttons"]))
|
|
|
self.big_step.outputEventOM(Event("delete_instance", None, [self, "balls"]))
|
|
@@ -489,10 +509,20 @@ class FieldInstance(RuntimeClassBase):
|
|
|
association_name = parameters[0]
|
|
|
self.association_name = association_name
|
|
|
|
|
|
- def _root_initializing_0_exec(self, parameters):
|
|
|
- self.big_step.outputEventOM(Event("create_instance", None, [self, "buttons", "Button", self.field_window, 'create_new_field', 'Spawn New Window']))
|
|
|
+ def _root_creating_window_0_exec(self, parameters):
|
|
|
+ window_id = parameters[0]
|
|
|
+ self.window_id = window_id
|
|
|
+ self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.WINDOW_CLOSE, 'window_close', self.inports['field_ui']]))
|
|
|
+ self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.KEY_PRESS, 'key_press', self.inports['field_ui']]))
|
|
|
+
|
|
|
+ def _root_creating_canvas_0_exec(self, parameters):
|
|
|
+ canvas_id = parameters[0]
|
|
|
+ self.canvas_id = canvas_id
|
|
|
+ self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_RIGHT_CLICK, 'right_click', self.inports['field_ui']]))
|
|
|
+ self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_MOVE, 'mouse_move', self.inports['field_ui']]))
|
|
|
+ self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [canvas_id, ui.EVENTS.MOUSE_RELEASE, 'mouse_release', self.inports['field_ui']]))
|
|
|
|
|
|
- def _root_creating_0_exec(self, parameters):
|
|
|
+ def _root_creating_button_0_exec(self, parameters):
|
|
|
association_name = parameters[0]
|
|
|
self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
|
|
|
|
|
@@ -502,7 +532,7 @@ class FieldInstance(RuntimeClassBase):
|
|
|
button = parameters[2]
|
|
|
self.big_step.outputEventOM(Event("create_instance", None, [self, "balls", "Ball", self.canvas, x, y]))
|
|
|
|
|
|
- def _root_running_main_behaviour_creating_0_exec(self, parameters):
|
|
|
+ def _root_running_main_behaviour_creating_ball_0_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])]))
|
|
@@ -525,6 +555,7 @@ class FieldInstance(RuntimeClassBase):
|
|
|
|
|
|
def _root_deleting_0_exec(self, parameters):
|
|
|
self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_field", None, [self.association_name])]))
|
|
|
+ self.big_step.outputEvent(Event("destroy_window", self.getOutPortName("ui"), [self.window_id]))
|
|
|
|
|
|
def initializeStatechart(self):
|
|
|
# enter default state
|
|
@@ -536,9 +567,8 @@ class Field(AtomicDEVS, ObjectManagerBase):
|
|
|
AtomicDEVS.__init__(self, name)
|
|
|
ObjectManagerBase.__init__(self)
|
|
|
self.elapsed = 0
|
|
|
- self.obj_manager_in = self.addInPort("obj_manager_in")
|
|
|
+ self.name = "Field"
|
|
|
self.obj_manager_out = self.addOutPort("obj_manager_out")
|
|
|
- self.input = self.addInPort("input")
|
|
|
self.outputs = {}
|
|
|
self.outputs["balls"] = self.addOutPort("balls")
|
|
|
self.outputs["buttons"] = self.addOutPort("buttons")
|
|
@@ -546,9 +576,10 @@ class Field(AtomicDEVS, ObjectManagerBase):
|
|
|
self.field_ui = self.addInPort("field_ui")
|
|
|
self.obj_manager_in = self.addInPort("obj_manager_in")
|
|
|
self.input = self.addInPort("input")
|
|
|
+ self.next_time = INFINITY
|
|
|
|
|
|
def extTransition(self, inputs):
|
|
|
- self.simulated_time = (self.simulated_time + self.elapsed)
|
|
|
+ self.next_time = 0
|
|
|
all_inputs = []
|
|
|
if self.field_ui in inputs:
|
|
|
all_inputs.extend(inputs[self.field_ui])
|
|
@@ -560,11 +591,10 @@ class Field(AtomicDEVS, ObjectManagerBase):
|
|
|
if isinstance(input, str):
|
|
|
tem = eval(input)
|
|
|
self.addInput(tem)
|
|
|
- elif input[3].name == "create_instance":
|
|
|
+ if input[3].name == "create_instance":
|
|
|
self.instances.add(FieldInstance(self))
|
|
|
ev = Event("instance_created", None, parameters=[f"{input[3].parameters[0]}[{len(self.instances)-1}]"])
|
|
|
- # TODO: changed, first elemenet is not "MainApp" anymore but None
|
|
|
- self.to_send.append((self.name, input[0] , input[2], ev))
|
|
|
+ self.to_send.append((input[1], input[0], input[2], ev))
|
|
|
elif input[3].name == "start_instance":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.start()
|
|
@@ -572,17 +602,17 @@ class Field(AtomicDEVS, ObjectManagerBase):
|
|
|
self.to_send.append((input[0], input[1], input[2], ev))
|
|
|
elif input[3].name == "delete_instance":
|
|
|
ev = Event("instance_deleted", None, parameters=[TODO])
|
|
|
- self.to_send.append((TODO, TODO, TODO, ev))
|
|
|
+ self.to_send.append((self.name, TODO, TODO, ev))
|
|
|
elif input[3].name == "associate_instance":
|
|
|
ev = Event("instance_associated", None, parameters=[TODO])
|
|
|
- self.to_send.append((TODO, TODO, TODO, ev))
|
|
|
+ self.to_send.append((self.name, TODO, TODO, ev))
|
|
|
elif input[3].name == "disassociate_instance":
|
|
|
ev = Event("instance_disassociated", None, parameters=[TODO])
|
|
|
- self.to_send.append((TODO, TODO, TODO, ev))
|
|
|
+ self.to_send.append((self.name, TODO, TODO, ev))
|
|
|
elif input[3].name == "instance_created":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
|
- instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
+ #instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
elif input[3].name == "instance_started":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
@@ -601,16 +631,27 @@ class Field(AtomicDEVS, ObjectManagerBase):
|
|
|
return self.instances
|
|
|
|
|
|
def intTransition(self):
|
|
|
+ earliest = min(self.getEarliestEventTime(), self.input_queue.getEarliestTime())
|
|
|
+ if not (earliest == INFINITY):
|
|
|
+ self.simulated_time = earliest
|
|
|
self.to_send = []
|
|
|
self.handleInput()
|
|
|
self.stepAll()
|
|
|
+ next_earliest = min(self.getEarliestEventTime(), self.input_queue.getEarliestTime())
|
|
|
+ if next_earliest == INFINITY:
|
|
|
+ self.next_time = INFINITY
|
|
|
+ else:
|
|
|
+ self.next_time = next_earliest - earliest
|
|
|
return self.instances
|
|
|
|
|
|
def outputFnc(self):
|
|
|
to_dict = {}
|
|
|
for sending in self.to_send:
|
|
|
if sending[3].port == None:
|
|
|
- to_dict[self.obj_manager_out] = [sending]
|
|
|
+ if self.obj_manager_out in to_dict:
|
|
|
+ to_dict[self.obj_manager_out].append(sending)
|
|
|
+ else:
|
|
|
+ to_dict[self.obj_manager_out] = [sending]
|
|
|
else:
|
|
|
the_port = None
|
|
|
for port in self.OPorts:
|
|
@@ -623,13 +664,10 @@ class Field(AtomicDEVS, ObjectManagerBase):
|
|
|
return to_dict
|
|
|
|
|
|
def timeAdvance(self):
|
|
|
- if not (len(self.to_send) == 0):
|
|
|
- return 0
|
|
|
- return self.getEarliestEventTime()
|
|
|
+ return self.next_time
|
|
|
|
|
|
class ButtonInstance(RuntimeClassBase):
|
|
|
- # TODO: Add parameters to constructor __init__
|
|
|
- def __init__(self, atomdevs, tkparent, event_name, button_text):
|
|
|
+ def __init__(self, atomdevs, window_id, event_name, button_text):
|
|
|
RuntimeClassBase.__init__(self, atomdevs)
|
|
|
self.associations = {}
|
|
|
self.associations["parent"] = Association("Field", 1, 1)
|
|
@@ -643,13 +681,21 @@ class ButtonInstance(RuntimeClassBase):
|
|
|
# build Statechart structure
|
|
|
self.build_statechart_structure()
|
|
|
|
|
|
+ # user defined attributes
|
|
|
+ self.window_id = None
|
|
|
+ self.event_name = None
|
|
|
+ self.button_id = None
|
|
|
+
|
|
|
# call user defined constructor
|
|
|
- ButtonInstance.user_defined_constructor(self, tkparent, event_name, button_text)
|
|
|
+ ButtonInstance.user_defined_constructor(self, window_id, event_name, button_text)
|
|
|
|
|
|
- def user_defined_constructor(self, tkparent, event_name, button_text):
|
|
|
+ def user_defined_constructor(self, window_id, event_name, button_text):
|
|
|
+ self.window_id = window_id;
|
|
|
self.event_name = event_name;
|
|
|
- button = ui.append_button(tkparent, event_name);
|
|
|
- ui.bind_event(button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'mouse_click', self.inports['button_ui']);
|
|
|
+
|
|
|
+ # Translated to events:
|
|
|
+ #button = ui.append_button(tkparent, event_name);
|
|
|
+ #ui.bind_event(button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'mouse_click', self.inports['button_ui']);
|
|
|
|
|
|
def user_defined_destructor(self):
|
|
|
pass
|
|
@@ -661,23 +707,24 @@ class ButtonInstance(RuntimeClassBase):
|
|
|
# state <root>
|
|
|
self.states[""] = State(0, "", self)
|
|
|
|
|
|
- # state /initializing
|
|
|
- self.states["/initializing"] = State(1, "/initializing", self)
|
|
|
+ # state /creating_button
|
|
|
+ self.states["/creating_button"] = State(1, "/creating_button", self)
|
|
|
+ self.states["/creating_button"].setEnter(self._creating_button_enter)
|
|
|
|
|
|
# state /running
|
|
|
self.states["/running"] = State(2, "/running", self)
|
|
|
|
|
|
# add children
|
|
|
- self.states[""].addChild(self.states["/initializing"])
|
|
|
+ self.states[""].addChild(self.states["/creating_button"])
|
|
|
self.states[""].addChild(self.states["/running"])
|
|
|
self.states[""].fixTree()
|
|
|
- self.states[""].default_state = self.states["/initializing"]
|
|
|
+ self.states[""].default_state = self.states["/creating_button"]
|
|
|
|
|
|
- # transition /initializing
|
|
|
- _initializing_0 = Transition(self, self.states["/initializing"], [self.states["/running"]])
|
|
|
- _initializing_0.setAction(self._initializing_0_exec)
|
|
|
- _initializing_0.setTrigger(None)
|
|
|
- self.states["/initializing"].addTransition(_initializing_0)
|
|
|
+ # transition /creating_button
|
|
|
+ _creating_button_0 = Transition(self, self.states["/creating_button"], [self.states["/running"]])
|
|
|
+ _creating_button_0.setAction(self._creating_button_0_exec)
|
|
|
+ _creating_button_0.setTrigger(Event("button_created", None))
|
|
|
+ self.states["/creating_button"].addTransition(_creating_button_0)
|
|
|
|
|
|
# transition /running
|
|
|
_running_0 = Transition(self, self.states["/running"], [self.states["/running"]])
|
|
@@ -686,8 +733,13 @@ class ButtonInstance(RuntimeClassBase):
|
|
|
_running_0.setGuard(self._running_0_guard)
|
|
|
self.states["/running"].addTransition(_running_0)
|
|
|
|
|
|
- def _initializing_0_exec(self, parameters):
|
|
|
- self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("button_created", None, [])]))
|
|
|
+ def _creating_button_enter(self):
|
|
|
+ self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, self.event_name, self.inports['button_ui']]))
|
|
|
+
|
|
|
+ def _creating_button_0_exec(self, parameters):
|
|
|
+ button_id = parameters[0]
|
|
|
+ self.button_id = button_id
|
|
|
+ self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [button_id, ui.EVENTS.MOUSE_CLICK, "mouse_click", self.inports['button_ui']]))
|
|
|
|
|
|
def _running_0_exec(self, parameters):
|
|
|
x = parameters[0]
|
|
@@ -703,7 +755,7 @@ class ButtonInstance(RuntimeClassBase):
|
|
|
|
|
|
def initializeStatechart(self):
|
|
|
# enter default state
|
|
|
- self.default_targets = self.states["/initializing"].getEffectiveTargetStates()
|
|
|
+ self.default_targets = self.states["/creating_button"].getEffectiveTargetStates()
|
|
|
RuntimeClassBase.initializeStatechart(self)
|
|
|
|
|
|
class Button(AtomicDEVS, ObjectManagerBase):
|
|
@@ -711,17 +763,17 @@ class Button(AtomicDEVS, ObjectManagerBase):
|
|
|
AtomicDEVS.__init__(self, name)
|
|
|
ObjectManagerBase.__init__(self)
|
|
|
self.elapsed = 0
|
|
|
- self.obj_manager_in = self.addInPort("obj_manager_in")
|
|
|
+ self.name = "Button"
|
|
|
self.obj_manager_out = self.addOutPort("obj_manager_out")
|
|
|
- self.input = self.addInPort("input")
|
|
|
self.outputs = {}
|
|
|
self.outputs["parent"] = self.addOutPort("parent")
|
|
|
self.button_ui = self.addInPort("button_ui")
|
|
|
self.obj_manager_in = self.addInPort("obj_manager_in")
|
|
|
self.input = self.addInPort("input")
|
|
|
+ self.next_time = INFINITY
|
|
|
|
|
|
def extTransition(self, inputs):
|
|
|
- self.simulated_time = (self.simulated_time + self.elapsed)
|
|
|
+ self.next_time = 0
|
|
|
all_inputs = []
|
|
|
if self.button_ui in inputs:
|
|
|
all_inputs.extend(inputs[self.button_ui])
|
|
@@ -735,22 +787,22 @@ class Button(AtomicDEVS, ObjectManagerBase):
|
|
|
self.addInput(tem)
|
|
|
if input[3].name == "create_instance":
|
|
|
self.instances.add(ButtonInstance(self))
|
|
|
- ev = Event("instance_created", None, parameters=[f"{input[0]}[{len(self.instances)-1}]"])
|
|
|
- self.to_send.append(("Button", TODO, input[2], ev))
|
|
|
+ ev = Event("instance_created", None, parameters=[f"{input[3].parameters[0]}[{len(self.instances)-1}]"])
|
|
|
+ self.to_send.append((self.name, input[1], input[2], ev))
|
|
|
elif input[3].name == "start_instance":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.start()
|
|
|
- ev = Event("instance_started", None, parameters=[TODO])
|
|
|
+ ev = Event("instance_started", None, parameters=[f"{input[0]}[{input[2]}]"])
|
|
|
self.to_send.append((input[0], input[1], input[2], ev))
|
|
|
elif input[3].name == "delete_instance":
|
|
|
ev = Event("instance_deleted", None, parameters=[TODO])
|
|
|
- self.to_send.append((TODO, TODO, TODO, ev))
|
|
|
+ self.to_send.append((self.name, TODO, TODO, ev))
|
|
|
elif input[3].name == "associate_instance":
|
|
|
ev = Event("instance_associated", None, parameters=[TODO])
|
|
|
- self.to_send.append((TODO, TODO, TODO, ev))
|
|
|
+ self.to_send.append((self.name, TODO, TODO, ev))
|
|
|
elif input[3].name == "disassociate_instance":
|
|
|
ev = Event("instance_disassociated", None, parameters=[TODO])
|
|
|
- self.to_send.append((TODO, TODO, TODO, ev))
|
|
|
+ self.to_send.append((self.name, TODO, TODO, ev))
|
|
|
elif input[3].name == "instance_created":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
@@ -758,35 +810,42 @@ class Button(AtomicDEVS, ObjectManagerBase):
|
|
|
elif input[3].name == "instance_started":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
|
- instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
elif input[3].name == "instance_deleted":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
|
- instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
elif input[3].name == "instance_associated":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
|
- instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
elif input[3].name == "instance_disassociated":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
|
- instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
elif input[3].name == "set_association_name":
|
|
|
ev = input[3]
|
|
|
self.addInput(ev, force_internal=True)
|
|
|
return self.instances
|
|
|
|
|
|
def intTransition(self):
|
|
|
+ earliest = min(self.getEarliestEventTime(), self.input_queue.getEarliestTime())
|
|
|
+ if not (earliest == INFINITY):
|
|
|
+ self.simulated_time = earliest
|
|
|
self.to_send = []
|
|
|
self.handleInput()
|
|
|
self.stepAll()
|
|
|
+ next_earliest = min(self.getEarliestEventTime(), self.input_queue.getEarliestTime())
|
|
|
+ if next_earliest == INFINITY:
|
|
|
+ self.next_time = INFINITY
|
|
|
+ else:
|
|
|
+ self.next_time = next_earliest - earliest
|
|
|
return self.instances
|
|
|
|
|
|
def outputFnc(self):
|
|
|
to_dict = {}
|
|
|
for sending in self.to_send:
|
|
|
- if sending[0] == None:
|
|
|
- to_dict[self.obj_manager_out] = [sending]
|
|
|
+ if sending[3].port == None:
|
|
|
+ if self.obj_manager_out in to_dict:
|
|
|
+ to_dict[self.obj_manager_out].append(sending)
|
|
|
+ else:
|
|
|
+ to_dict[self.obj_manager_out] = [sending]
|
|
|
else:
|
|
|
the_port = None
|
|
|
for port in self.OPorts:
|
|
@@ -799,12 +858,10 @@ class Button(AtomicDEVS, ObjectManagerBase):
|
|
|
return to_dict
|
|
|
|
|
|
def timeAdvance(self):
|
|
|
- if not (len(self.to_send) == 0):
|
|
|
- return 0
|
|
|
- return self.getEarliestEventTime()
|
|
|
+ return self.next_time
|
|
|
|
|
|
class BallInstance(RuntimeClassBase):
|
|
|
- def __init__(self, atomdevs):
|
|
|
+ def __init__(self, atomdevs, canvas, x, y):
|
|
|
RuntimeClassBase.__init__(self, atomdevs)
|
|
|
self.associations = {}
|
|
|
self.associations["parent"] = Association("Field", 1, 1)
|
|
@@ -831,11 +888,12 @@ class BallInstance(RuntimeClassBase):
|
|
|
self.mouse_pos = {};
|
|
|
self.smooth = 0.4; # value between 0 and 1
|
|
|
|
|
|
- circle = self.canvas.add_circle(x, y, self.r, {'fill':'#000'});
|
|
|
- ui.bind_event(circle, ui.EVENTS.MOUSE_PRESS, self.controller, 'mouse_press', self.inports["ball_ui"]);
|
|
|
- ui.bind_event(circle, ui.EVENTS.MOUSE_MOVE, self.controller, 'mouse_move', self.inports['ball_ui']);
|
|
|
- ui.bind_event(circle, ui.EVENTS.MOUSE_RELEASE, self.controller, 'mouse_release', self.inports['ball_ui']);
|
|
|
- self.element = circle;
|
|
|
+ # TODO:
|
|
|
+ #circle = self.canvas.add_circle(x, y, self.r, {'fill':'#000'});
|
|
|
+ #ui.bind_event(circle, ui.EVENTS.MOUSE_PRESS, self.controller, 'mouse_press', self.inports["ball_ui"]);
|
|
|
+ #ui.bind_event(circle, ui.EVENTS.MOUSE_MOVE, self.controller, 'mouse_move', self.inports['ball_ui']);
|
|
|
+ #ui.bind_event(circle, ui.EVENTS.MOUSE_RELEASE, self.controller, 'mouse_release', self.inports['ball_ui']);
|
|
|
+ #self.element = circle;
|
|
|
|
|
|
def user_defined_destructor(self):
|
|
|
self.canvas.remove_element(self.element);
|
|
@@ -1002,17 +1060,17 @@ class Ball(AtomicDEVS, ObjectManagerBase):
|
|
|
AtomicDEVS.__init__(self, name)
|
|
|
ObjectManagerBase.__init__(self)
|
|
|
self.elapsed = 0
|
|
|
- self.obj_manager_in = self.addInPort("obj_manager_in")
|
|
|
+ self.name = "Ball"
|
|
|
self.obj_manager_out = self.addOutPort("obj_manager_out")
|
|
|
- self.input = self.addInPort("input")
|
|
|
self.outputs = {}
|
|
|
self.outputs["parent"] = self.addOutPort("parent")
|
|
|
self.ball_ui = self.addInPort("ball_ui")
|
|
|
self.obj_manager_in = self.addInPort("obj_manager_in")
|
|
|
self.input = self.addInPort("input")
|
|
|
+ self.next_time = INFINITY
|
|
|
|
|
|
def extTransition(self, inputs):
|
|
|
- self.simulated_time = (self.simulated_time + self.elapsed)
|
|
|
+ self.next_time = 0
|
|
|
all_inputs = []
|
|
|
if self.ball_ui in inputs:
|
|
|
all_inputs.extend(inputs[self.ball_ui])
|
|
@@ -1026,22 +1084,22 @@ class Ball(AtomicDEVS, ObjectManagerBase):
|
|
|
self.addInput(tem)
|
|
|
if input[3].name == "create_instance":
|
|
|
self.instances.add(BallInstance(self))
|
|
|
- ev = Event("instance_created", None, parameters=[f"{input[0]}[{len(self.instances)-1}]"])
|
|
|
- self.to_send.append(("Ball", TODO, input[2], ev))
|
|
|
+ ev = Event("instance_created", None, parameters=[f"{input[3].parameters[0]}[{len(self.instances)-1}]"])
|
|
|
+ self.to_send.append((self.name, input[1], input[2], ev))
|
|
|
elif input[3].name == "start_instance":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.start()
|
|
|
- ev = Event("instance_started", None, parameters=[TODO])
|
|
|
+ ev = Event("instance_started", None, parameters=[f"{input[0]}[{input[2]}]"])
|
|
|
self.to_send.append((input[0], input[1], input[2], ev))
|
|
|
elif input[3].name == "delete_instance":
|
|
|
ev = Event("instance_deleted", None, parameters=[TODO])
|
|
|
- self.to_send.append((TODO, TODO, TODO, ev))
|
|
|
+ self.to_send.append((self.name, TODO, TODO, ev))
|
|
|
elif input[3].name == "associate_instance":
|
|
|
ev = Event("instance_associated", None, parameters=[TODO])
|
|
|
- self.to_send.append((TODO, TODO, TODO, ev))
|
|
|
+ self.to_send.append((self.name, TODO, TODO, ev))
|
|
|
elif input[3].name == "disassociate_instance":
|
|
|
ev = Event("instance_disassociated", None, parameters=[TODO])
|
|
|
- self.to_send.append((TODO, TODO, TODO, ev))
|
|
|
+ self.to_send.append((self.name, TODO, TODO, ev))
|
|
|
elif input[3].name == "instance_created":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
@@ -1049,35 +1107,42 @@ class Ball(AtomicDEVS, ObjectManagerBase):
|
|
|
elif input[3].name == "instance_started":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
|
- instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
elif input[3].name == "instance_deleted":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
|
- instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
elif input[3].name == "instance_associated":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
|
- instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
elif input[3].name == "instance_disassociated":
|
|
|
instance = list(self.instances)[input[2]]
|
|
|
instance.addEvent(input[3])
|
|
|
- instance.associations['fields'].instances[0] = input[3].parameters[0]
|
|
|
elif input[3].name == "set_association_name":
|
|
|
ev = input[3]
|
|
|
self.addInput(ev, force_internal=True)
|
|
|
return self.instances
|
|
|
|
|
|
def intTransition(self):
|
|
|
+ earliest = min(self.getEarliestEventTime(), self.input_queue.getEarliestTime())
|
|
|
+ if not (earliest == INFINITY):
|
|
|
+ self.simulated_time = earliest
|
|
|
self.to_send = []
|
|
|
self.handleInput()
|
|
|
self.stepAll()
|
|
|
+ next_earliest = min(self.getEarliestEventTime(), self.input_queue.getEarliestTime())
|
|
|
+ if next_earliest == INFINITY:
|
|
|
+ self.next_time = INFINITY
|
|
|
+ else:
|
|
|
+ self.next_time = next_earliest - earliest
|
|
|
return self.instances
|
|
|
|
|
|
def outputFnc(self):
|
|
|
to_dict = {}
|
|
|
for sending in self.to_send:
|
|
|
- if sending[0] == None:
|
|
|
- to_dict[self.obj_manager_out] = [sending]
|
|
|
+ if sending[3].port == None:
|
|
|
+ if self.obj_manager_out in to_dict:
|
|
|
+ to_dict[self.obj_manager_out].append(sending)
|
|
|
+ else:
|
|
|
+ to_dict[self.obj_manager_out] = [sending]
|
|
|
else:
|
|
|
the_port = None
|
|
|
for port in self.OPorts:
|
|
@@ -1090,9 +1155,7 @@ class Ball(AtomicDEVS, ObjectManagerBase):
|
|
|
return to_dict
|
|
|
|
|
|
def timeAdvance(self):
|
|
|
- if not (len(self.to_send) == 0):
|
|
|
- return 0
|
|
|
- return self.getEarliestEventTime()
|
|
|
+ return self.next_time
|
|
|
|
|
|
class ObjectManagerState:
|
|
|
def __init__(self):
|
|
@@ -1137,6 +1200,7 @@ class Controller(CoupledDEVS):
|
|
|
def __init__(self, name):
|
|
|
CoupledDEVS.__init__(self, name)
|
|
|
self.ui = self.addInPort("ui")
|
|
|
+ self.addOutPort("ui")
|
|
|
self.objectmanager = self.addSubModel(ObjectManager("ObjectManager"))
|
|
|
self.atomic0 = self.addSubModel(MainApp("MainApp"))
|
|
|
self.atomic1 = self.addSubModel(Field("Field"))
|