fsasimulator.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
  3. Date: Tue Oct 11 13:15:37 2016
  4. Model author: Sadaf Mustafiz and Bruno Barroca and Claudio Gomes
  5. Model name: FSASimulator
  6. Model description:
  7. An FSA simulator written in SCCD. It supports after and events.
  8. """
  9. from sccd.runtime.statecharts_core import *
  10. from sccd.runtime.libs.ui import *
  11. from sccd.runtime.libs.utils import *
  12. import fsaclasses
  13. # package "FSASimulator"
  14. class FSASimulator(RuntimeClassBase):
  15. def __init__(self, controller, amodel, events):
  16. RuntimeClassBase.__init__(self, controller)
  17. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  18. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  19. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  20. self.semantics.priority = StatechartSemantics.SourceParent
  21. self.semantics.concurrency = StatechartSemantics.Single
  22. # build Statechart structure
  23. self.build_statechart_structure()
  24. # user defined attributes
  25. self.elapsed = None
  26. self.super_step_completed = None
  27. self.model = None
  28. self.logicalTime = None
  29. self.timestep = None
  30. self.currentEvent = None
  31. self.selectedTransition = None
  32. self.eventList = None
  33. self.currentState = None
  34. # call user defined constructor
  35. FSASimulator.user_defined_constructor(self, amodel, events)
  36. def user_defined_constructor(self, amodel, events):
  37. self.model = amodel
  38. self.eventList = events
  39. def user_defined_destructor(self):
  40. pass
  41. # user defined method
  42. def processEvent(self, event):
  43. if (event != None):
  44. self.eventList.popEvent(event)
  45. event.processed = True
  46. # user defined method
  47. def getInputEventAt(self, time):
  48. return self.eventList.getInputAt(time)
  49. # builds Statechart structure
  50. def build_statechart_structure(self):
  51. # state <root>
  52. self.states[""] = State(0, self)
  53. # state /CheckTermination
  54. self.states["/CheckTermination"] = State(1, self)
  55. # state /CheckTermination/MacroStepProcessed
  56. self.states["/CheckTermination/MacroStepProcessed"] = State(2, self)
  57. # state /DoSimulation
  58. self.states["/DoSimulation"] = State(3, self)
  59. # state /DoSimulation/MicroStepPrepared
  60. self.states["/DoSimulation/MicroStepPrepared"] = State(4, self)
  61. # state /DoSimulation/MicroStepProcessed
  62. self.states["/DoSimulation/MicroStepProcessed"] = State(5, self)
  63. # state /DoSimulation/MacroStepPrepared
  64. self.states["/DoSimulation/MacroStepPrepared"] = State(6, self)
  65. # state /Initialized
  66. self.states["/Initialized"] = State(7, self)
  67. # state /Started
  68. self.states["/Started"] = State(8, self)
  69. # state /End
  70. self.states["/End"] = State(9, self)
  71. # add children
  72. self.states[""].addChild(self.states["/CheckTermination"])
  73. self.states[""].addChild(self.states["/DoSimulation"])
  74. self.states[""].addChild(self.states["/Initialized"])
  75. self.states[""].addChild(self.states["/Started"])
  76. self.states[""].addChild(self.states["/End"])
  77. self.states["/CheckTermination"].addChild(self.states["/CheckTermination/MacroStepProcessed"])
  78. self.states["/DoSimulation"].addChild(self.states["/DoSimulation/MicroStepPrepared"])
  79. self.states["/DoSimulation"].addChild(self.states["/DoSimulation/MicroStepProcessed"])
  80. self.states["/DoSimulation"].addChild(self.states["/DoSimulation/MacroStepPrepared"])
  81. self.states[""].fixTree()
  82. self.states[""].default_state = self.states["/Started"]
  83. self.states["/CheckTermination"].default_state = self.states["/CheckTermination/MacroStepProcessed"]
  84. self.states["/DoSimulation"].default_state = self.states["/DoSimulation/MacroStepPrepared"]
  85. # transition /CheckTermination/MacroStepProcessed
  86. _CheckTermination_MacroStepProcessed_0 = Transition(self, self.states["/CheckTermination/MacroStepProcessed"], [self.states["/End"]])
  87. _CheckTermination_MacroStepProcessed_0.setAction(self._CheckTermination_MacroStepProcessed_0_exec)
  88. _CheckTermination_MacroStepProcessed_0.setTrigger(None)
  89. _CheckTermination_MacroStepProcessed_0.setGuard(self._CheckTermination_MacroStepProcessed_0_guard)
  90. self.states["/CheckTermination/MacroStepProcessed"].addTransition(_CheckTermination_MacroStepProcessed_0)
  91. _CheckTermination_MacroStepProcessed_1 = Transition(self, self.states["/CheckTermination/MacroStepProcessed"], [self.states["/DoSimulation"]])
  92. _CheckTermination_MacroStepProcessed_1.setAction(self._CheckTermination_MacroStepProcessed_1_exec)
  93. _CheckTermination_MacroStepProcessed_1.setTrigger(None)
  94. _CheckTermination_MacroStepProcessed_1.setGuard(self._CheckTermination_MacroStepProcessed_1_guard)
  95. self.states["/CheckTermination/MacroStepProcessed"].addTransition(_CheckTermination_MacroStepProcessed_1)
  96. # transition /DoSimulation/MicroStepPrepared
  97. _DoSimulation_MicroStepPrepared_0 = Transition(self, self.states["/DoSimulation/MicroStepPrepared"], [self.states["/DoSimulation/MicroStepProcessed"]])
  98. _DoSimulation_MicroStepPrepared_0.setAction(self._DoSimulation_MicroStepPrepared_0_exec)
  99. _DoSimulation_MicroStepPrepared_0.setTrigger(None)
  100. self.states["/DoSimulation/MicroStepPrepared"].addTransition(_DoSimulation_MicroStepPrepared_0)
  101. # transition /DoSimulation/MicroStepProcessed
  102. _DoSimulation_MicroStepProcessed_0 = Transition(self, self.states["/DoSimulation/MicroStepProcessed"], [self.states["/DoSimulation/MicroStepPrepared"]])
  103. _DoSimulation_MicroStepProcessed_0.setAction(self._DoSimulation_MicroStepProcessed_0_exec)
  104. _DoSimulation_MicroStepProcessed_0.setTrigger(None)
  105. _DoSimulation_MicroStepProcessed_0.setGuard(self._DoSimulation_MicroStepProcessed_0_guard)
  106. self.states["/DoSimulation/MicroStepProcessed"].addTransition(_DoSimulation_MicroStepProcessed_0)
  107. _DoSimulation_MicroStepProcessed_1 = Transition(self, self.states["/DoSimulation/MicroStepProcessed"], [self.states["/CheckTermination"]])
  108. _DoSimulation_MicroStepProcessed_1.setAction(self._DoSimulation_MicroStepProcessed_1_exec)
  109. _DoSimulation_MicroStepProcessed_1.setTrigger(None)
  110. _DoSimulation_MicroStepProcessed_1.setGuard(self._DoSimulation_MicroStepProcessed_1_guard)
  111. self.states["/DoSimulation/MicroStepProcessed"].addTransition(_DoSimulation_MicroStepProcessed_1)
  112. # transition /DoSimulation/MacroStepPrepared
  113. _DoSimulation_MacroStepPrepared_0 = Transition(self, self.states["/DoSimulation/MacroStepPrepared"], [self.states["/DoSimulation/MicroStepProcessed"]])
  114. _DoSimulation_MacroStepPrepared_0.setAction(self._DoSimulation_MacroStepPrepared_0_exec)
  115. _DoSimulation_MacroStepPrepared_0.setTrigger(None)
  116. self.states["/DoSimulation/MacroStepPrepared"].addTransition(_DoSimulation_MacroStepPrepared_0)
  117. # transition /Initialized
  118. _Initialized_0 = Transition(self, self.states["/Initialized"], [self.states["/CheckTermination"]])
  119. _Initialized_0.setAction(self._Initialized_0_exec)
  120. _Initialized_0.setTrigger(None)
  121. self.states["/Initialized"].addTransition(_Initialized_0)
  122. # transition /Started
  123. _Started_0 = Transition(self, self.states["/Started"], [self.states["/Initialized"]])
  124. _Started_0.setAction(self._Started_0_exec)
  125. _Started_0.setTrigger(None)
  126. self.states["/Started"].addTransition(_Started_0)
  127. def _CheckTermination_MacroStepProcessed_0_exec(self, parameters):
  128. print('Going to End... ')
  129. def _CheckTermination_MacroStepProcessed_0_guard(self, parameters):
  130. return self.currentState.final
  131. def _CheckTermination_MacroStepProcessed_1_exec(self, parameters):
  132. print('Going to DoSimulation and reading events... ')
  133. self.currentEvent = self.getInputEventAt(self.logicalTime)
  134. self.selectedTransition = self.model.getTransitionFrom(self.currentState, self.currentEvent, self.elapsed)
  135. print(self.currentEvent)
  136. print(self.selectedTransition)
  137. def _CheckTermination_MacroStepProcessed_1_guard(self, parameters):
  138. return not self.currentState.final
  139. def _DoSimulation_MicroStepPrepared_0_exec(self, parameters):
  140. print('Going to MicroStepProcessed, taking transition and reading events... ')
  141. print('Transition to be taken: ' + str(self.selectedTransition))
  142. self.currentState = self.selectedTransition.target
  143. self.elapsed = 0
  144. self.processEvent(self.currentEvent)
  145. print('New state: ' + str(self.currentState))
  146. self.currentEvent = self.getInputEventAt(self.logicalTime)
  147. self.selectedTransition = self.model.getTransitionFrom(self.currentState, self.currentEvent, self.elapsed)
  148. print(self.currentEvent)
  149. print(self.selectedTransition)
  150. def _DoSimulation_MicroStepProcessed_0_exec(self, parameters):
  151. print('Going to MicroStepPrepared... ')
  152. def _DoSimulation_MicroStepProcessed_0_guard(self, parameters):
  153. return self.selectedTransition != None
  154. def _DoSimulation_MicroStepProcessed_1_exec(self, parameters):
  155. print('Going to CheckTermination and advancing time... ')
  156. self.logicalTime = self.logicalTime + self.timestep
  157. self.elapsed = self.elapsed + self.timestep
  158. print(self.logicalTime)
  159. print(self.elapsed)
  160. def _DoSimulation_MicroStepProcessed_1_guard(self, parameters):
  161. return self.selectedTransition == None
  162. def _DoSimulation_MacroStepPrepared_0_exec(self, parameters):
  163. print('Going to MicroStepProcessed... ')
  164. def _Initialized_0_exec(self, parameters):
  165. print('Going to MacroStepProcessed... ')
  166. def _Started_0_exec(self, parameters):
  167. print('Going to Initialized... ')
  168. self.logicalTime = 0
  169. self.elapsed = 0
  170. self.timestep = 1.0
  171. self.currentState = self.model.initialState
  172. def initializeStatechart(self):
  173. # enter default state
  174. self.default_targets = self.states["/Started"].getEffectiveTargetStates()
  175. RuntimeClassBase.initializeStatechart(self)
  176. class ObjectManager(ObjectManagerBase):
  177. def __init__(self, controller):
  178. ObjectManagerBase.__init__(self, controller)
  179. def instantiate(self, class_name, construct_params):
  180. if class_name == "FSASimulator":
  181. instance = FSASimulator(self.controller, construct_params[0], construct_params[1])
  182. instance.associations = {}
  183. else:
  184. raise Exception("Cannot instantiate class " + class_name)
  185. return instance
  186. class Controller(ThreadsControllerBase):
  187. def __init__(self, amodel, events, keep_running = None, behind_schedule_callback = None):
  188. if keep_running == None: keep_running = True
  189. if behind_schedule_callback == None: behind_schedule_callback = None
  190. ThreadsControllerBase.__init__(self, ObjectManager(self), keep_running, behind_schedule_callback)
  191. self.object_manager.createInstance("FSASimulator", [amodel, events])