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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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. 'DeleteSound'
  83. ]
  84. for s in state_list:
  85. self.FSM.AddState(s, getattr(StatesProg, s)(self.FSM))
  86. t = 'to' + s
  87. self.FSM.AddTransition(t, Transition(s))
  88. if self.FSM.curState == None:
  89. self.FSM.SetState('Startup')
  90. def Execute(self):
  91. self.FSM.Execute(self.owner)
  92. #===================================
  93. class DefenderFSM(Char):
  94. def __init__(self, owner):
  95. self.FSM = FSM(self, owner)
  96. self.owner = owner
  97. state_list = [
  98. 'Startup',
  99. 'Intro',
  100. 'Main',
  101. 'BlueFade',
  102. 'GreyFade',
  103. 'GameOver',
  104. 'HighScore',
  105. 'NewHighScore',
  106. 'EnterText'
  107. ]
  108. for s in state_list:
  109. self.FSM.AddState(s, getattr(StatesDefender, s)(self.FSM))
  110. t = 'to' + s
  111. self.FSM.AddTransition(t, Transition(s))
  112. if self.FSM.curState == None:
  113. self.FSM.SetState('Startup')
  114. def Execute(self):
  115. self.FSM.Execute(self.owner)
  116. #===================================