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 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import StatesProg
  2. #====================================
  3. class Transition(object):
  4. def __init__(self, toState):
  5. self.toState = toState
  6. def Execute(self):
  7. pass
  8. #===================================
  9. class FSM(object):
  10. def __init__ (self, character, owner):
  11. self.char = character
  12. self.states = {}
  13. self.transitions = {}
  14. self.curState = None
  15. self.prevState = None
  16. self.trans = None
  17. self.stateLife = 0
  18. self.owner = owner
  19. self.name = None
  20. self.last_state_notes = None
  21. def AddTransition(self, transName, transition):
  22. self.transitions[transName] = transition
  23. def AddState(self, stateName, state):
  24. self.states[stateName] = state
  25. self.states[stateName].name = state
  26. def SetState(self, stateName):
  27. self.prevState = self.curState
  28. self.curState = self.states[stateName]
  29. def ToTransition(self, toTrans):
  30. self.trans = self.transitions[toTrans]
  31. def Execute(self, owner):
  32. if (self.trans):
  33. self.owner = owner
  34. self.curState.Exit()
  35. self.trans.Execute()
  36. self.SetState(self.trans.toState)
  37. self.curState.Enter()
  38. self.trans = None
  39. self.curState.Execute()
  40. #====================================
  41. Char = type("Char",(object,),{})
  42. #===================================
  43. #===================================
  44. class ProgFSM(Char):
  45. def __init__(self, owner):
  46. self.FSM = FSM(self, owner)
  47. self.owner = owner
  48. state_list = [
  49. 'Example',
  50. 'Main',
  51. 'Startup',
  52. 'Intro',
  53. 'LoadDefault',
  54. 'PadPlayer',
  55. 'SeqPlayer',
  56. 'SelectSound',
  57. 'SelectPattern',
  58. 'EditSoundSequence',
  59. 'EditSong',
  60. 'Util',
  61. 'File',
  62. 'Ball',
  63. 'Clock',
  64. 'Exit',
  65. 'SelTheme',
  66. 'OpenSong',
  67. 'EnterText'
  68. ]
  69. for s in state_list:
  70. self.FSM.AddState(s, getattr(StatesProg, s)(self.FSM))
  71. t = 'to' + s
  72. self.FSM.AddTransition(t, Transition(s))
  73. if self.FSM.curState == None:
  74. self.FSM.SetState('Startup')
  75. def Execute(self):
  76. self.FSM.Execute(self.owner)
  77. #===================================