Lo switch ha questa dote grazie al comando break. Prendo il case 1 commentando la if che decide di cambiare stato. Adesso il solo break una volta eseguito scarta tutti gli altri case e si arriva al return implicito della funzione loop, cioè la graffa di chiusura }. A questo punto il loop cede il controllo al chiamante che è la funzione main (non visibile poiché interna al core lib), main ha il controllo e chiama nuovamente la funzione loop.
La variabile stato ha conservato il valore 1 quindi lo switch seleziona il case 1. La storia si ripete all'infinito, hai introdotto nel main loop l'esecuzione del codice contenuto nel case1. Questo meccanismo è fondamentale per fare in modo di introdurre nel loop codice che deve essere sempre eseguito indipendentemente dalla variabile stato che può essere temporizzato e disabilitato/abilitato. Ci sarà sempre del codice che vuoi venga eseguito
in modo indipendente dallo switch, pensa solo al blink, che potresti abilitare/disabiitare, cambiare frequenza di lampeggio al fin di indicare una anomalia.
Pulsanti, sensori richiedono del codice e che questo venga eseguito ad intervalli regolari e l'unico posto dove inserirlo nel loop è alla fine o meglio all'inizio.
Adesso hai scritto codice che terminato il case 1, cede il controllo al loop sia che tu abbia selezionato il case 2 o meno grazie proprio al break. Così quando selezioni il case 2 da dentro il case 1 stai programmando cosa accadrà nel prossimo ciclo di loop (programmi il futuro). Però sostieni che dovrebbe rimanere confinato dentro lo switch case, cosa sconsigliata perché è strada che non spunta.
Ti fornisco dei link che però sarebbe bene li studiassi e smontassi il codice per capire come funziona, se devi aprire i link solo per dargli una occhiata lascia stare non aprirli proprio.
Sapevi che nella teoria delle state machine esistono gli entry state e gli exit state, l'entry state è utilissimo ed è facile usarlo, mente per gli exit state lo switch case non si presta molto per implementarlo.
Nota anche che se dentro un case non si presenta una o più condizioni per selezionare il prossimo case, si finisce per rimanere intrappolati senza potere eseguire il resto dei case. Quindi ad esempio si può uscire per tempo scaduto e salvare da qualche parte questa anomalia in modo che il case selezionato possa tenere in considerazione ciò, che tradotto significa che il case 2 si aspetta di essere selezionato da condizioni e non per timeout in tal caso case2 potrebbe comportarsi diversamente dal solito.
PS: trovare il numero di stati necessari e il loro nome e la semantica è lavoro complesso, che prende tanto tempo.
Ciao.