raspberry pi zero based drum machine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

FSM.py 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import StatesProg
  2. import StatesDefender
  3. #====================================
  4. class Transition(object):
  5. def __init__(self, toState):
  6. self.toState = toState
  7. def Execute(self):
  8. pass
  9. #===================================-
  10. class FSM(object):
  11. def __init__ (self, character, owner):
  12. self.char = character
  13. self.states = {}
  14. self.transitions = {}
  15. self.curState = None
  16. self.prevState = None
  17. self.trans = None
  18. self.stateLife = 0
  19. self.owner = owner
  20. self.name = None
  21. self.last_state_notes = None
  22. self.queued_state = None
  23. def AddTransition(self, transName, transition):
  24. self.transitions[transName] = transition
  25. def AddState(self, stateName, state):
  26. self.states[stateName] = state
  27. self.states[stateName].name = state
  28. def SetState(self, stateName):
  29. self.prevState = self.curState
  30. self.curState = self.states[stateName]
  31. def ToTransition(self, toTrans):
  32. self.trans = self.transitions[toTrans]
  33. def Execute(self, owner):
  34. if (self.trans):
  35. self.owner = owner
  36. self.curState.Exit()
  37. self.trans.Execute()
  38. self.SetState(self.trans.toState)
  39. self.curState.Enter()
  40. self.trans = None
  41. self.curState.Execute()
  42. #====================================
  43. Char = type("Char",(object,),{})
  44. #===================================
  45. #===================================
  46. class ProgFSM(Char):
  47. def __init__(self, owner):
  48. self.FSM = FSM(self, owner)
  49. self.owner = owner
  50. state_list = [
  51. 'Example',
  52. 'Main',
  53. 'Startup',
  54. 'Intro',
  55. 'LoadDefault',
  56. 'PadPlayer',
  57. 'SeqPlayer',
  58. 'SelectSound',
  59. 'SelectPattern',
  60. 'EditSoundSequence',
  61. 'EditSong',
  62. 'Util',
  63. 'File',
  64. 'Ball',
  65. 'Clock',
  66. 'Exit',
  67. 'SelTheme',
  68. 'OpenSong',
  69. 'EnterText',
  70. 'LoadSound',
  71. 'Shutdown',
  72. 'Reboot',
  73. 'Ping',
  74. 'Wifi',
  75. 'Defender',
  76. 'Update',
  77. 'Calculator',
  78. 'About',
  79. 'SelectFolder',
  80. 'NewDir',
  81. 'WifiSSID'
  82. ]
  83. for s in state_list:
  84. self.FSM.AddState(s, getattr(StatesProg, s)(self.FSM))
  85. t = 'to' + s
  86. self.FSM.AddTransition(t, Transition(s))
  87. if self.FSM.curState == None:
  88. self.FSM.SetState('Startup')
  89. def Execute(self):
  90. self.FSM.Execute(self.owner)
  91. #===================================
  92. class DefenderFSM(Char):
  93. def __init__(self, owner):
  94. self.FSM = FSM(self, owner)
  95. self.owner = owner
  96. state_list = [
  97. 'Startup',
  98. 'Intro',
  99. 'Main',
  100. 'BlueFade',
  101. 'GreyFade',
  102. 'GameOver',
  103. 'HighScore',
  104. 'NewHighScore',
  105. 'EnterText'
  106. ]
  107. for s in state_list:
  108. self.FSM.AddState(s, getattr(StatesDefender, s)(self.FSM))
  109. t = 'to' + s
  110. self.FSM.AddTransition(t, Transition(s))
  111. if self.FSM.curState == None:
  112. self.FSM.SetState('Startup')
  113. def Execute(self):
  114. self.FSM.Execute(self.owner)
  115. #===================================