target.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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: AfterTransitionTest
  5. Model description:
  6. Test 2: Check if a statechart transitions after a certain time.
  7. """
  8. from sccd.runtime.DEVS_statecharts_core import *
  9. # package "AfterTransitionTest"
  10. class MainAppInstance(RuntimeClassBase):
  11. def __init__(self, atomdevs, id, start_port_id):
  12. RuntimeClassBase.__init__(self, atomdevs, id)
  13. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  14. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  15. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  16. self.semantics.priority = StatechartSemantics.SourceParent
  17. self.semantics.concurrency = StatechartSemantics.Single
  18. # build Statechart structure
  19. self.build_statechart_structure()
  20. # call user defined constructor
  21. MainAppInstance.user_defined_constructor(self)
  22. port_name = addInputPort("<narrow_cast>", start_port_id)
  23. atomdevs.state.port_mappings[port_name] = id
  24. def user_defined_constructor(self):
  25. pass
  26. def user_defined_destructor(self):
  27. pass
  28. # builds Statechart structure
  29. def build_statechart_structure(self):
  30. # state <root>
  31. self.states[""] = State(0, "", self)
  32. # state /state1
  33. self.states["/state1"] = ParallelState(1, "/state1", self)
  34. # state /state1/state11
  35. self.states["/state1/state11"] = State(2, "/state1/state11", self)
  36. # state /state1/state11/state11
  37. self.states["/state1/state11/state11"] = State(3, "/state1/state11/state11", self)
  38. self.states["/state1/state11/state11"].setEnter(self._state1_state11_state11_enter)
  39. self.states["/state1/state11/state11"].setExit(self._state1_state11_state11_exit)
  40. # state /state1/state12
  41. self.states["/state1/state12"] = State(4, "/state1/state12", self)
  42. # state /state1/state12/state12
  43. self.states["/state1/state12/state12"] = State(5, "/state1/state12/state12", self)
  44. self.states["/state1/state12/state12"].setEnter(self._state1_state12_state12_enter)
  45. self.states["/state1/state12/state12"].setExit(self._state1_state12_state12_exit)
  46. # state /end_parallel
  47. self.states["/end_parallel"] = State(6, "/end_parallel", self)
  48. # add children
  49. self.states[""].addChild(self.states["/state1"])
  50. self.states[""].addChild(self.states["/end_parallel"])
  51. self.states["/state1"].addChild(self.states["/state1/state11"])
  52. self.states["/state1"].addChild(self.states["/state1/state12"])
  53. self.states["/state1/state11"].addChild(self.states["/state1/state11/state11"])
  54. self.states["/state1/state12"].addChild(self.states["/state1/state12/state12"])
  55. self.states[""].fixTree()
  56. self.states[""].default_state = self.states["/state1"]
  57. self.states["/state1/state11"].default_state = self.states["/state1/state11/state11"]
  58. self.states["/state1/state12"].default_state = self.states["/state1/state12/state12"]
  59. # transition /state1/state11/state11
  60. _state1_state11_state11_0 = Transition(self, self.states["/state1/state11/state11"], [self.states["/state1/state11/state11"]])
  61. _state1_state11_state11_0.setTrigger(Event("_0after"))
  62. self.states["/state1/state11/state11"].addTransition(_state1_state11_state11_0)
  63. # transition /state1/state12/state12
  64. _state1_state12_state12_0 = Transition(self, self.states["/state1/state12/state12"], [self.states["/state1/state12/state12"]])
  65. _state1_state12_state12_0.setTrigger(Event("_1after"))
  66. self.states["/state1/state12/state12"].addTransition(_state1_state12_state12_0)
  67. # transition /state1
  68. _state1_0 = Transition(self, self.states["/state1"], [self.states["/end_parallel"]])
  69. _state1_0.setTrigger(None)
  70. self.states["/state1"].addTransition(_state1_0)
  71. def _state1_state11_state11_enter(self):
  72. self.addTimer(0, 0.05)
  73. def _state1_state11_state11_exit(self):
  74. self.removeTimer(0)
  75. def _state1_state12_state12_enter(self):
  76. self.addTimer(1, 0.05)
  77. def _state1_state12_state12_exit(self):
  78. self.removeTimer(1)
  79. def initializeStatechart(self):
  80. # enter default state
  81. self.default_targets = self.states["/state1"].getEffectiveTargetStates()
  82. RuntimeClassBase.initializeStatechart(self)
  83. class MainApp(ClassBase):
  84. def __init__(self, name):
  85. ClassBase.__init__(self, name)
  86. self.input = self.addInPort("input")
  87. new_instance = self.constructObject(0, 0, [])
  88. self.state.instances[new_instance.instance_id] = new_instance
  89. new_instance.start()
  90. self.state.next_time = 0
  91. def constructObject(self, id, start_port_id, parameters):
  92. new_instance = MainAppInstance(self, id, start_port_id)
  93. return new_instance
  94. def instantiate(self, class_name, construct_params):
  95. instance = {}
  96. instance["name"] = class_name
  97. if class_name == "MainApp":
  98. self.narrow_cast_id = self.narrow_cast_id + 0
  99. instance["associations"] = {}
  100. else:
  101. raise Exception("Cannot instantiate class " + class_name)
  102. return instance
  103. ObjectManagerState.instantiate = instantiate
  104. class ObjectManager(ObjectManagerBase):
  105. def __init__(self, name):
  106. ObjectManagerBase.__init__(self, name)
  107. self.state = ObjectManagerState()
  108. self.input = self.addInPort("input")
  109. self.output["MainApp"] = self.addOutPort()
  110. self.state.createInstance("MainApp", [])
  111. class Controller(CoupledDEVS):
  112. def __init__(self, name):
  113. CoupledDEVS.__init__(self, name)
  114. self.objectmanager = self.addSubModel(ObjectManager("ObjectManager"))
  115. self.atomics = []
  116. self.atomics.append(self.addSubModel(MainApp("MainApp")))
  117. self.connectPorts(self.atomics[0].obj_manager_out, self.objectmanager.input)
  118. self.connectPorts(self.objectmanager.output["MainApp"], self.atomics[0].obj_manager_in)