target.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration) and Sam Pieters (DEVS)
  3. Model author: Sam Pieters
  4. Model name: TrafficLight
  5. Model description:
  6. Tkinter frame with Traffic light in a single statechart.
  7. """
  8. from sccd.runtime.DEVS_statecharts_core import *
  9. from sccd.runtime.libs import ui_v2 as ui
  10. CANVAS_DIMS = (100, 350)
  11. # package "TrafficLight"
  12. class MainAppInstance(RuntimeClassBase):
  13. def __init__(self, atomdevs, id, start_port_id):
  14. RuntimeClassBase.__init__(self, atomdevs, id)
  15. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  16. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  17. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  18. self.semantics.priority = StatechartSemantics.SourceParent
  19. self.semantics.concurrency = StatechartSemantics.Single
  20. # build Statechart structure
  21. self.build_statechart_structure()
  22. # user defined attributes
  23. self.window_id = None
  24. self.canvas_id = None
  25. self.green_id = None
  26. self.yellow_id = None
  27. self.red_id = None
  28. self.police_button_id = None
  29. # call user defined constructor
  30. MainAppInstance.user_defined_constructor(self)
  31. port_name = addInputPort("ui", start_port_id, True)
  32. atomdevs.state.port_mappings[port_name] = id
  33. port_name = addInputPort("<narrow_cast>", start_port_id)
  34. atomdevs.state.port_mappings[port_name] = id
  35. port_name = addInputPort("field_ui", start_port_id + 1)
  36. atomdevs.state.port_mappings[port_name] = id
  37. self.inports["field_ui"] = port_name
  38. def user_defined_constructor(self):
  39. pass
  40. def user_defined_destructor(self):
  41. pass
  42. # builds Statechart structure
  43. def build_statechart_structure(self):
  44. # state <root>
  45. self.states[""] = State(0, "", self)
  46. # state /create_ui
  47. self.states["/create_ui"] = State(1, "/create_ui", self)
  48. # state /create_ui/creating_window
  49. self.states["/create_ui/creating_window"] = State(2, "/create_ui/creating_window", self)
  50. self.states["/create_ui/creating_window"].setEnter(self._create_ui_creating_window_enter)
  51. # state /create_ui/creating_canvas
  52. self.states["/create_ui/creating_canvas"] = State(3, "/create_ui/creating_canvas", self)
  53. self.states["/create_ui/creating_canvas"].setEnter(self._create_ui_creating_canvas_enter)
  54. # state /create_ui/creating_trafficlight
  55. self.states["/create_ui/creating_trafficlight"] = State(4, "/create_ui/creating_trafficlight", self)
  56. # state /create_ui/creating_trafficlight/creating_greenlight
  57. self.states["/create_ui/creating_trafficlight/creating_greenlight"] = State(5, "/create_ui/creating_trafficlight/creating_greenlight", self)
  58. self.states["/create_ui/creating_trafficlight/creating_greenlight"].setEnter(self._create_ui_creating_trafficlight_creating_greenlight_enter)
  59. # state /create_ui/creating_trafficlight/creating_yellowlight
  60. self.states["/create_ui/creating_trafficlight/creating_yellowlight"] = State(6, "/create_ui/creating_trafficlight/creating_yellowlight", self)
  61. self.states["/create_ui/creating_trafficlight/creating_yellowlight"].setEnter(self._create_ui_creating_trafficlight_creating_yellowlight_enter)
  62. # state /create_ui/creating_trafficlight/creating_redlight
  63. self.states["/create_ui/creating_trafficlight/creating_redlight"] = State(7, "/create_ui/creating_trafficlight/creating_redlight", self)
  64. self.states["/create_ui/creating_trafficlight/creating_redlight"].setEnter(self._create_ui_creating_trafficlight_creating_redlight_enter)
  65. # state /create_ui/creating_interrupt_button
  66. self.states["/create_ui/creating_interrupt_button"] = State(8, "/create_ui/creating_interrupt_button", self)
  67. self.states["/create_ui/creating_interrupt_button"].setEnter(self._create_ui_creating_interrupt_button_enter)
  68. # state /create_ui/creating_quit_button
  69. self.states["/create_ui/creating_quit_button"] = State(9, "/create_ui/creating_quit_button", self)
  70. self.states["/create_ui/creating_quit_button"].setEnter(self._create_ui_creating_quit_button_enter)
  71. # state /on
  72. self.states["/on"] = State(10, "/on", self)
  73. # state /on/normal
  74. self.states["/on/normal"] = State(11, "/on/normal", self)
  75. # state /on/normal/red
  76. self.states["/on/normal/red"] = State(12, "/on/normal/red", self)
  77. self.states["/on/normal/red"].setEnter(self._on_normal_red_enter)
  78. self.states["/on/normal/red"].setExit(self._on_normal_red_exit)
  79. # state /on/normal/green
  80. self.states["/on/normal/green"] = State(13, "/on/normal/green", self)
  81. self.states["/on/normal/green"].setEnter(self._on_normal_green_enter)
  82. self.states["/on/normal/green"].setExit(self._on_normal_green_exit)
  83. # state /on/normal/yellow
  84. self.states["/on/normal/yellow"] = State(14, "/on/normal/yellow", self)
  85. self.states["/on/normal/yellow"].setEnter(self._on_normal_yellow_enter)
  86. self.states["/on/normal/yellow"].setExit(self._on_normal_yellow_exit)
  87. # state /on/interrupted
  88. self.states["/on/interrupted"] = State(15, "/on/interrupted", self)
  89. # state /on/interrupted/yellow
  90. self.states["/on/interrupted/yellow"] = State(16, "/on/interrupted/yellow", self)
  91. self.states["/on/interrupted/yellow"].setEnter(self._on_interrupted_yellow_enter)
  92. self.states["/on/interrupted/yellow"].setExit(self._on_interrupted_yellow_exit)
  93. # state /on/interrupted/black
  94. self.states["/on/interrupted/black"] = State(17, "/on/interrupted/black", self)
  95. self.states["/on/interrupted/black"].setEnter(self._on_interrupted_black_enter)
  96. self.states["/on/interrupted/black"].setExit(self._on_interrupted_black_exit)
  97. # state /off
  98. self.states["/off"] = State(18, "/off", self)
  99. self.states["/off"].setEnter(self._off_enter)
  100. # state /deleted
  101. self.states["/deleted"] = State(19, "/deleted", self)
  102. # add children
  103. self.states[""].addChild(self.states["/create_ui"])
  104. self.states[""].addChild(self.states["/on"])
  105. self.states[""].addChild(self.states["/off"])
  106. self.states[""].addChild(self.states["/deleted"])
  107. self.states["/create_ui"].addChild(self.states["/create_ui/creating_window"])
  108. self.states["/create_ui"].addChild(self.states["/create_ui/creating_canvas"])
  109. self.states["/create_ui"].addChild(self.states["/create_ui/creating_trafficlight"])
  110. self.states["/create_ui"].addChild(self.states["/create_ui/creating_interrupt_button"])
  111. self.states["/create_ui"].addChild(self.states["/create_ui/creating_quit_button"])
  112. self.states["/create_ui/creating_trafficlight"].addChild(self.states["/create_ui/creating_trafficlight/creating_greenlight"])
  113. self.states["/create_ui/creating_trafficlight"].addChild(self.states["/create_ui/creating_trafficlight/creating_yellowlight"])
  114. self.states["/create_ui/creating_trafficlight"].addChild(self.states["/create_ui/creating_trafficlight/creating_redlight"])
  115. self.states["/on"].addChild(self.states["/on/normal"])
  116. self.states["/on"].addChild(self.states["/on/interrupted"])
  117. self.states["/on/normal"].addChild(self.states["/on/normal/red"])
  118. self.states["/on/normal"].addChild(self.states["/on/normal/green"])
  119. self.states["/on/normal"].addChild(self.states["/on/normal/yellow"])
  120. self.states["/on/interrupted"].addChild(self.states["/on/interrupted/yellow"])
  121. self.states["/on/interrupted"].addChild(self.states["/on/interrupted/black"])
  122. self.states[""].fixTree()
  123. self.states[""].default_state = self.states["/create_ui"]
  124. self.states["/create_ui"].default_state = self.states["/create_ui/creating_window"]
  125. self.states["/create_ui/creating_trafficlight"].default_state = self.states["/create_ui/creating_trafficlight/creating_greenlight"]
  126. self.states["/on"].default_state = self.states["/on/normal"]
  127. self.states["/on/normal"].default_state = self.states["/on/normal/red"]
  128. self.states["/on/interrupted"].default_state = self.states["/on/interrupted/yellow"]
  129. # transition /create_ui/creating_window
  130. _create_ui_creating_window_0 = Transition(self, self.states["/create_ui/creating_window"], [self.states["/create_ui/creating_canvas"]])
  131. _create_ui_creating_window_0.setAction(self._create_ui_creating_window_0_exec)
  132. _create_ui_creating_window_0.setTrigger(Event("window_created", None))
  133. self.states["/create_ui/creating_window"].addTransition(_create_ui_creating_window_0)
  134. # transition /create_ui/creating_canvas
  135. _create_ui_creating_canvas_0 = Transition(self, self.states["/create_ui/creating_canvas"], [self.states["/create_ui/creating_trafficlight"]])
  136. _create_ui_creating_canvas_0.setAction(self._create_ui_creating_canvas_0_exec)
  137. _create_ui_creating_canvas_0.setTrigger(Event("canvas_created", None))
  138. self.states["/create_ui/creating_canvas"].addTransition(_create_ui_creating_canvas_0)
  139. # transition /create_ui/creating_trafficlight/creating_greenlight
  140. _create_ui_creating_trafficlight_creating_greenlight_0 = Transition(self, self.states["/create_ui/creating_trafficlight/creating_greenlight"], [self.states["/create_ui/creating_trafficlight/creating_yellowlight"]])
  141. _create_ui_creating_trafficlight_creating_greenlight_0.setAction(self._create_ui_creating_trafficlight_creating_greenlight_0_exec)
  142. _create_ui_creating_trafficlight_creating_greenlight_0.setTrigger(Event("rectangle_created", None))
  143. self.states["/create_ui/creating_trafficlight/creating_greenlight"].addTransition(_create_ui_creating_trafficlight_creating_greenlight_0)
  144. # transition /create_ui/creating_trafficlight/creating_yellowlight
  145. _create_ui_creating_trafficlight_creating_yellowlight_0 = Transition(self, self.states["/create_ui/creating_trafficlight/creating_yellowlight"], [self.states["/create_ui/creating_trafficlight/creating_redlight"]])
  146. _create_ui_creating_trafficlight_creating_yellowlight_0.setAction(self._create_ui_creating_trafficlight_creating_yellowlight_0_exec)
  147. _create_ui_creating_trafficlight_creating_yellowlight_0.setTrigger(Event("rectangle_created", None))
  148. self.states["/create_ui/creating_trafficlight/creating_yellowlight"].addTransition(_create_ui_creating_trafficlight_creating_yellowlight_0)
  149. # transition /create_ui/creating_trafficlight/creating_redlight
  150. _create_ui_creating_trafficlight_creating_redlight_0 = Transition(self, self.states["/create_ui/creating_trafficlight/creating_redlight"], [self.states["/create_ui/creating_interrupt_button"]])
  151. _create_ui_creating_trafficlight_creating_redlight_0.setAction(self._create_ui_creating_trafficlight_creating_redlight_0_exec)
  152. _create_ui_creating_trafficlight_creating_redlight_0.setTrigger(Event("rectangle_created", None))
  153. self.states["/create_ui/creating_trafficlight/creating_redlight"].addTransition(_create_ui_creating_trafficlight_creating_redlight_0)
  154. # transition /create_ui/creating_interrupt_button
  155. _create_ui_creating_interrupt_button_0 = Transition(self, self.states["/create_ui/creating_interrupt_button"], [self.states["/create_ui/creating_quit_button"]])
  156. _create_ui_creating_interrupt_button_0.setAction(self._create_ui_creating_interrupt_button_0_exec)
  157. _create_ui_creating_interrupt_button_0.setTrigger(Event("button_created", None))
  158. self.states["/create_ui/creating_interrupt_button"].addTransition(_create_ui_creating_interrupt_button_0)
  159. # transition /create_ui/creating_quit_button
  160. _create_ui_creating_quit_button_0 = Transition(self, self.states["/create_ui/creating_quit_button"], [self.states["/on"]])
  161. _create_ui_creating_quit_button_0.setAction(self._create_ui_creating_quit_button_0_exec)
  162. _create_ui_creating_quit_button_0.setTrigger(Event("button_created", None))
  163. self.states["/create_ui/creating_quit_button"].addTransition(_create_ui_creating_quit_button_0)
  164. # transition /on/normal/red
  165. _on_normal_red_0 = Transition(self, self.states["/on/normal/red"], [self.states["/on/normal/green"]])
  166. _on_normal_red_0.setTrigger(Event("_0after"))
  167. self.states["/on/normal/red"].addTransition(_on_normal_red_0)
  168. # transition /on/normal/green
  169. _on_normal_green_0 = Transition(self, self.states["/on/normal/green"], [self.states["/on/normal/yellow"]])
  170. _on_normal_green_0.setTrigger(Event("_1after"))
  171. self.states["/on/normal/green"].addTransition(_on_normal_green_0)
  172. # transition /on/normal/yellow
  173. _on_normal_yellow_0 = Transition(self, self.states["/on/normal/yellow"], [self.states["/on/normal/red"]])
  174. _on_normal_yellow_0.setTrigger(Event("_2after"))
  175. self.states["/on/normal/yellow"].addTransition(_on_normal_yellow_0)
  176. # transition /on/interrupted/yellow
  177. _on_interrupted_yellow_0 = Transition(self, self.states["/on/interrupted/yellow"], [self.states["/on/interrupted/black"]])
  178. _on_interrupted_yellow_0.setTrigger(Event("_3after"))
  179. self.states["/on/interrupted/yellow"].addTransition(_on_interrupted_yellow_0)
  180. # transition /on/interrupted/black
  181. _on_interrupted_black_0 = Transition(self, self.states["/on/interrupted/black"], [self.states["/on/interrupted/yellow"]])
  182. _on_interrupted_black_0.setTrigger(Event("_4after"))
  183. self.states["/on/interrupted/black"].addTransition(_on_interrupted_black_0)
  184. # transition /on/normal
  185. _on_normal_0 = Transition(self, self.states["/on/normal"], [self.states["/deleted"]])
  186. _on_normal_0.setAction(self._on_normal_0_exec)
  187. _on_normal_0.setTrigger(Event("window_close", self.getInPortName("field_ui")))
  188. self.states["/on/normal"].addTransition(_on_normal_0)
  189. _on_normal_1 = Transition(self, self.states["/on/normal"], [self.states["/off"]])
  190. _on_normal_1.setTrigger(Event("quit_clicked", self.getInPortName("field_ui")))
  191. _on_normal_1.setGuard(self._on_normal_1_guard)
  192. self.states["/on/normal"].addTransition(_on_normal_1)
  193. _on_normal_2 = Transition(self, self.states["/on/normal"], [self.states["/on/interrupted"]])
  194. _on_normal_2.setAction(self._on_normal_2_exec)
  195. _on_normal_2.setTrigger(Event("interrupt_clicked", self.getInPortName("field_ui")))
  196. _on_normal_2.setGuard(self._on_normal_2_guard)
  197. self.states["/on/normal"].addTransition(_on_normal_2)
  198. # transition /on/interrupted
  199. _on_interrupted_0 = Transition(self, self.states["/on/interrupted"], [self.states["/on/normal"]])
  200. _on_interrupted_0.setTrigger(Event("interrupt_clicked", self.getInPortName("field_ui")))
  201. _on_interrupted_0.setGuard(self._on_interrupted_0_guard)
  202. self.states["/on/interrupted"].addTransition(_on_interrupted_0)
  203. def _create_ui_creating_window_enter(self):
  204. self.big_step.outputEvent(Event("create_window", self.getOutPortName("ui"), [CANVAS_DIMS[0], CANVAS_DIMS[1], "Traffic Light (history)", self.inports['field_ui']]))
  205. def _create_ui_creating_canvas_enter(self):
  206. self.big_step.outputEvent(Event("create_canvas", self.getOutPortName("ui"), [self.window_id, CANVAS_DIMS[0], CANVAS_DIMS[1] - 100, {'background':'#222222'}, self.inports['field_ui']]))
  207. def _create_ui_creating_trafficlight_creating_greenlight_enter(self):
  208. self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, 50, 50, 50, 50, {'fill':'#000'}, self.inports['field_ui']]))
  209. def _create_ui_creating_trafficlight_creating_yellowlight_enter(self):
  210. self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, 50, 110, 50, 50, {'fill':'#000'}, self.inports['field_ui']]))
  211. def _create_ui_creating_trafficlight_creating_redlight_enter(self):
  212. self.big_step.outputEvent(Event("create_rectangle", self.getOutPortName("ui"), [self.canvas_id, 50, 170, 50, 50, {'fill':'#000'}, self.inports['field_ui']]))
  213. def _create_ui_creating_interrupt_button_enter(self):
  214. self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, 'Police Interrupt', self.inports['field_ui']]))
  215. def _create_ui_creating_quit_button_enter(self):
  216. self.big_step.outputEvent(Event("create_button", self.getOutPortName("ui"), [self.window_id, 'Quit', self.inports['field_ui']]))
  217. def _on_normal_red_enter(self):
  218. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'black']))
  219. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.red_id, 'red']))
  220. self.addTimer(0, 3)
  221. def _on_normal_red_exit(self):
  222. self.removeTimer(0)
  223. def _on_normal_green_enter(self):
  224. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.red_id, 'black']))
  225. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.green_id, 'green']))
  226. self.addTimer(1, 2)
  227. def _on_normal_green_exit(self):
  228. self.removeTimer(1)
  229. def _on_normal_yellow_enter(self):
  230. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.green_id, 'black']))
  231. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'yellow']))
  232. self.addTimer(2, 1)
  233. def _on_normal_yellow_exit(self):
  234. self.removeTimer(2)
  235. def _on_interrupted_yellow_enter(self):
  236. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'yellow']))
  237. self.addTimer(3, .5)
  238. def _on_interrupted_yellow_exit(self):
  239. self.removeTimer(3)
  240. def _on_interrupted_black_enter(self):
  241. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'black']))
  242. self.addTimer(4, .5)
  243. def _on_interrupted_black_exit(self):
  244. self.removeTimer(4)
  245. def _off_enter(self):
  246. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.green_id, 'black']))
  247. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'black']))
  248. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.red_id, 'black']))
  249. def _on_normal_0_exec(self, parameters):
  250. self.big_step.outputEvent(Event("destroy_all", self.getOutPortName("ui"), []))
  251. def _on_normal_1_guard(self, parameters):
  252. x = parameters[0]
  253. y = parameters[1]
  254. button = parameters[2]
  255. return button == ui.MOUSE_BUTTONS.LEFT
  256. def _on_normal_2_exec(self, parameters):
  257. x = parameters[0]
  258. y = parameters[1]
  259. button = parameters[2]
  260. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.green_id, 'black']))
  261. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.yellow_id, 'black']))
  262. self.big_step.outputEvent(Event("set_element_color", self.getOutPortName("ui"), [self.canvas_id, self.red_id, 'black']))
  263. def _on_normal_2_guard(self, parameters):
  264. x = parameters[0]
  265. y = parameters[1]
  266. button = parameters[2]
  267. return button == ui.MOUSE_BUTTONS.LEFT
  268. def _on_interrupted_0_guard(self, parameters):
  269. x = parameters[0]
  270. y = parameters[1]
  271. button = parameters[2]
  272. return button == ui.MOUSE_BUTTONS.LEFT
  273. def _create_ui_creating_window_0_exec(self, parameters):
  274. window_id = parameters[0]
  275. self.window_id = window_id
  276. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [window_id, ui.EVENTS.WINDOW_CLOSE, 'window_close', self.inports['field_ui']]))
  277. def _create_ui_creating_canvas_0_exec(self, parameters):
  278. canvas_id = parameters[0]
  279. self.canvas_id = canvas_id
  280. def _create_ui_creating_trafficlight_creating_greenlight_0_exec(self, parameters):
  281. canvas_id = parameters[0]
  282. green_id = parameters[1]
  283. self.green_id = green_id
  284. def _create_ui_creating_trafficlight_creating_yellowlight_0_exec(self, parameters):
  285. canvas_id = parameters[0]
  286. yellow_id = parameters[1]
  287. self.yellow_id = yellow_id
  288. def _create_ui_creating_trafficlight_creating_redlight_0_exec(self, parameters):
  289. canvas_id = parameters[0]
  290. red_id = parameters[1]
  291. self.red_id = red_id
  292. def _create_ui_creating_interrupt_button_0_exec(self, parameters):
  293. button_id = parameters[0]
  294. self.police_button_id = button_id
  295. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [button_id, ui.EVENTS.MOUSE_CLICK, "interrupt_clicked", self.inports['field_ui']]))
  296. def _create_ui_creating_quit_button_0_exec(self, parameters):
  297. button_id = parameters[0]
  298. self.quit_button_id = button_id
  299. self.big_step.outputEvent(Event("bind_event", self.getOutPortName("ui"), [button_id, ui.EVENTS.MOUSE_CLICK, "quit_clicked", self.inports['field_ui']]))
  300. def initializeStatechart(self):
  301. # enter default state
  302. self.default_targets = self.states["/create_ui"].getEffectiveTargetStates()
  303. RuntimeClassBase.initializeStatechart(self)
  304. class MainApp(ClassBase):
  305. def __init__(self, name):
  306. ClassBase.__init__(self, name)
  307. self.input = self.addInPort("input")
  308. self.glob_outputs["ui"] = self.addOutPort("ui")
  309. self.field_ui = self.addInPort("field_ui")
  310. new_instance = self.constructObject(0, 0, [])
  311. self.state.instances[new_instance.instance_id] = new_instance
  312. new_instance.start()
  313. self.state.next_time = 0
  314. def constructObject(self, id, start_port_id, parameters):
  315. new_instance = MainAppInstance(self, id, start_port_id)
  316. return new_instance
  317. def instantiate(self, class_name, construct_params):
  318. instance = {}
  319. instance["name"] = class_name
  320. if class_name == "MainApp":
  321. self.narrow_cast_id = self.narrow_cast_id + 1
  322. instance["associations"] = {}
  323. else:
  324. raise Exception("Cannot instantiate class " + class_name)
  325. return instance
  326. ObjectManagerState.instantiate = instantiate
  327. class ObjectManager(ObjectManagerBase):
  328. def __init__(self, name):
  329. ObjectManagerBase.__init__(self, name)
  330. self.state = ObjectManagerState()
  331. self.input = self.addInPort("input")
  332. self.output["MainApp"] = self.addOutPort()
  333. self.state.createInstance("MainApp", [])
  334. class Controller(CoupledDEVS):
  335. def __init__(self, name):
  336. CoupledDEVS.__init__(self, name)
  337. self.in_ui = self.addInPort("ui")
  338. self.out_ui = self.addOutPort("ui")
  339. self.objectmanager = self.addSubModel(ObjectManager("ObjectManager"))
  340. self.atomics = []
  341. self.atomics.append(self.addSubModel(MainApp("MainApp")))
  342. self.connectPorts(self.atomics[0].obj_manager_out, self.objectmanager.input)
  343. self.connectPorts(self.objectmanager.output["MainApp"], self.atomics[0].obj_manager_in)
  344. self.connectPorts(self.atomics[0].glob_outputs["ui"], self.out_ui)
  345. self.connectPorts(self.in_ui, self.atomics[0].input)