Sto creando un FSM in python (è un sequenziatore di passi e un sample pad basato su un Raspberry Pi 2).
In questo momento ci sono due stati e il terzo è il Menu. Questo è gestito da un sistema di classe che gestisce tutti gli stati. Lo stato del menu deve modificare gli attributi degli altri stati, quindi ho passato gli altri stati al suo costruttore.
class State(object):
def buttonPress(self, numberButton):
raise NotImplementedError
class StepSequencer(State):
def buttonPress(self, numberButton):
...
class SamplePad(State):
def buttonPress(self, numberButton):
...
class Menu(State):
def __init__(self,stepSequencer,samplePad):
self.stepsequencer = stepSequencer
self.samplepad = samplePad
def buttonPress(self, numberButton):
...
def setMenuItem(self, currentMenuItem):
self.currentMenuItem = currentMenuItem
class MenuItem(object):
def __init__(self, text):
self.text = text
class System(object):
def __init__(self):
self.stepsequencer = StepSequencer()
self.samplepad = SamplePad()
self.menu = Menu(self.stepsequencer, self.samplepad)
def setState(self,state):
self.state = state
def buttonPress(self, numberButton):
self.state.buttonPress(numberButton)
Non riesco a capire come creare la struttura per il menu. Ho pensato di creare una classe MenuItem per ogni voce di menu in modo che lo stato Menu contenga tutti questi oggetti e possa modificare il MenuItem corrente, tuttavia, ci sono alcune cose che non posso superare:
-
come posso dichiarare tutte le voci di menu e passarle nello stato Menu per creare dinamicamente la struttura del menu?
-
con questo menu:
Step Sequencer settings: Set samples Set volume Sample Pad setting: Set samples Set volume
per esempio, se voglio avere un cursore che imposta il volume, devo creare un altro stato per gestirlo? Questo stato può essere un altro stato del sistema o deve essere un sottostato dello stato del menu?
-
posso eseguire il codice di ogni stato usando questa logica? :
while(system.state = system.stepsequencer): ... while(system.state = system.menu): ...
Lo stato viene modificato da un listener in un'altra discussione. Questo sembra un modo molto non ortodosso di gestire gli stati, ma sembra funzionare. Se questo è efficace, come posso gestire i sottostati di Menu?