Potresti implementare la tua lavatrice come macchina a stati, ma c'è tanto potenziale per la proliferazione dello stato quanto per le dichiarazioni di if
se non fai le cose con attenzione.
Lavorare negli stati richiede una mentalità diversa in cui si pensa in termini di stati (dove ci si trova), stimoli (ciò che si ottiene dall'esterno) e azioni (ciò che si fa). In questo contesto, diamo un'occhiata ad alcune cose nel tuo modello:
A running state, either on or off.
Questi sono i tuoi due stati, che chiamerò WASHING
e STOPPED
. Aggiungerò un terzo chiamato READY_TO_WASH
, che è uno stato arrestato ma pronto per l'esecuzione che vedrai in seguito.
It has a door state that should be open or closed
Questo non è realmente uno stato, ma due stimoli che ottieni da un sensore sulla macchina, che chiamerò door_opened
e door_closed
. Supponiamo che quando viene applicata la potenza per la prima volta, la lavatrice rileverà lo stato in cui si trova la porta e invierà uno di quegli stiumuli.
Prevent the door from being set to 'open' while the machine is 'on'.
Ciò implicherebbe che oltre al sensore che genera stimoli quando la porta viene aperta o chiusa, c'è anche un fermo che puoi programmare per impedire fisicamente l'apertura della porta. Chiamiamo le azioni che lo controllano door_lock()
e door_unlock()
.
Prevent the running state from changing from 'off' to 'on' when the door is 'open'
Il passaggio da off a on è basato su uno stimolo proveniente dall'esterno, forse quando l'utente preme i pulsanti corrispondenti sul pannello frontale. Chiamiamo gli stimoli ottenuti da quei pulsanti wash_start
e wash_stop
.
Per completezza, diciamo anche che c'è un motore nella macchina che esegue il lavaggio effettivo ed è controllabile usando azioni chiamate motor_start()
e motor_stop()
.
Tutto qui sopra ci fornisce un set completo di informazioni su quali sono gli stati della lavatrice, su quali parti della lavatrice può essere detta e quali stimoli possiamo ottenere dall'esterno. Questo è sufficiente per costruire una macchina a stati, che fai guardando a ciascuno stato e capendo cosa fare in risposta a ogni stimolo.
Lo stato di STOPPED
(questo è lo stato "ground", o lo stato che l'FSM immette quando inizializzato):
- Entrando in questo stato: fai azioni
motor_stop()
e door_unlock()
. Questo mette la lavatrice in uno stato conosciuto, sano di mente.
- On
door_open
: non fare nulla. Non ci interessa se la porta è aperta quando è ferma.
- On
door_closed
: transizione allo stato READY_TO_WASH
.
- On
wash_start
: non fare nulla. La porta potrebbe essere aperta. Se è chiuso, non saremo comunque in questo stato.
- On
wash_stop
: non fare nulla. Siamo già fermati.
Lo stato READY_TO_WASH
:
- Entrando in questo stato: fai azioni
motor_stop()
e door_unlock()
. Di nuovo, questo assicura che la lavatrice sia in uno stato normale.
- On
door_open
: transizione allo stato STOPPED
. Se la porta è aperta, non siamo pronti per il lavaggio.
- On
door_closed
: non fare nulla. Siamo già pronti e dovremmo essere già inseriti in questo stato.
- On
wash_start
: transizione allo stato WASHING
.
- On
wash_stop
: non fare nulla. Siamo già fermati.
Lo stato WASHING
:
- Entrando in questo stato: fai azioni
door_lock()
e motor_start()
.
- On
door_open
: transizione allo stato STOPPED
. Non dovremmo ricevere stimoli per le porte in questo stato perché il fermo lo impedisce. Se il latch fallisce e qualcuno apre la porta, ciò fornisce un po 'di sicurezza.
- On
door_closed
: come door_open
.
- On
wash_start
: non fare nulla. Stiamo già lavando.
- On
wash_stop
: transizione allo stato READY_TO_WASH
. La porta sarà ancora chiusa, quindi siamo tecnicamente pronti a lavarne ancora.