target.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 3: Test if the composite state works as expected
  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.associations = {}
  14. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  15. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  16. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  17. self.semantics.priority = StatechartSemantics.SourceParent
  18. self.semantics.concurrency = StatechartSemantics.Single
  19. # build Statechart structure
  20. self.build_statechart_structure()
  21. # call user defined constructor
  22. MainAppInstance.user_defined_constructor(self)
  23. port_name = addInputPort("<narrow_cast>", start_port_id)
  24. atomdevs.addInPort(port_name)
  25. atomdevs.state.port_mappings[port_name] = id
  26. def user_defined_constructor(self):
  27. pass
  28. def user_defined_destructor(self):
  29. pass
  30. # builds Statechart structure
  31. def build_statechart_structure(self):
  32. # state <root>
  33. self.states[""] = State(0, "", self)
  34. # state /state1
  35. self.states["/state1"] = State(1, "/state1", self)
  36. # state /state1/state10
  37. self.states["/state1/state10"] = State(2, "/state1/state10", self)
  38. # state /state1/state11
  39. self.states["/state1/state11"] = State(3, "/state1/state11", self)
  40. # state /state1/state12
  41. self.states["/state1/state12"] = State(4, "/state1/state12", self)
  42. # state /state2
  43. self.states["/state2"] = State(5, "/state2", self)
  44. # add children
  45. self.states[""].addChild(self.states["/state1"])
  46. self.states[""].addChild(self.states["/state2"])
  47. self.states["/state1"].addChild(self.states["/state1/state10"])
  48. self.states["/state1"].addChild(self.states["/state1/state11"])
  49. self.states["/state1"].addChild(self.states["/state1/state12"])
  50. self.states[""].fixTree()
  51. self.states[""].default_state = self.states["/state1"]
  52. self.states["/state1"].default_state = self.states["/state1/state11"]
  53. # transition /state1/state10
  54. _state1_state10_0 = Transition(self, self.states["/state1/state10"], [self.states["/state1/state10"]])
  55. _state1_state10_0.setTrigger(None)
  56. self.states["/state1/state10"].addTransition(_state1_state10_0)
  57. # transition /state1/state11
  58. _state1_state11_0 = Transition(self, self.states["/state1/state11"], [self.states["/state1/state12"]])
  59. _state1_state11_0.setTrigger(None)
  60. self.states["/state1/state11"].addTransition(_state1_state11_0)
  61. # transition /state1/state12
  62. _state1_state12_0 = Transition(self, self.states["/state1/state12"], [self.states["/state2"]])
  63. _state1_state12_0.setTrigger(None)
  64. self.states["/state1/state12"].addTransition(_state1_state12_0)
  65. def initializeStatechart(self):
  66. # enter default state
  67. self.default_targets = self.states["/state1"].getEffectiveTargetStates()
  68. RuntimeClassBase.initializeStatechart(self)
  69. class MainApp(ClassBase):
  70. def __init__(self, name):
  71. ClassBase.__init__(self, name)
  72. self.input = self.addInPort("input")
  73. new_instance = self.constructObject(0, 0, [])
  74. self.state.instances[new_instance.instance_id] = new_instance
  75. self.state.next_instance = self.state.next_instance + 1
  76. def constructObject(self, id, start_port_id, parameters):
  77. new_instance = MainAppInstance(self, id, start_port_id)
  78. return new_instance
  79. class Dummy(ObjectManagerState):
  80. def __init__(self):
  81. ObjectManagerState.__init__(self)
  82. def instantiate(self, class_name, construct_params):
  83. instance = {}
  84. instance["name"] = class_name
  85. if class_name == "MainApp":
  86. self.narrow_cast_id = self.narrow_cast_id + 0
  87. instance["associations"] = {}
  88. else:
  89. raise Exception("Cannot instantiate class " + class_name)
  90. return instance
  91. class ObjectManager(ObjectManagerBase):
  92. def __init__(self, name):
  93. ObjectManagerBase.__init__(self, name)
  94. self.state = Dummy()
  95. self.input = self.addInPort("input")
  96. self.output["MainApp"] = self.addOutPort()
  97. self.state.createInstance("MainApp", [])
  98. self.state.to_send.append((("MainApp", 0), ("MainApp", 0), Event("start_instance", None, ["MainApp[0]"])))
  99. class Controller(CoupledDEVS):
  100. def __init__(self, name):
  101. CoupledDEVS.__init__(self, name)
  102. self.objectmanager = self.addSubModel(ObjectManager("ObjectManager"))
  103. self.atomics = []
  104. self.atomics.append(self.addSubModel(MainApp("MainApp")))
  105. self.connectPorts(self.atomics[0].obj_manager_out, self.objectmanager.input)
  106. self.connectPorts(self.objectmanager.output["MainApp"], self.atomics[0].obj_manager_in)