Datman:
se la condizione è vera, l'esecuzione salta dove previsto, senza controllare ulteriormente se la condizione è vera
La domanda era un po' ambigua anche se più o meno si poteva intuire. E si, in una logica a stati/tempi discreti non parallela le cose avvengono solo in un certo momento, per cui una condizione viene valutata solo nell'esatto momento in cui viene valutata ed è solo in quell'istante che diventa determinante per il corso degli eventi immediatamente successivo.
Se interessa fare qualcosa al variare della condizione questa va valutata continuamente (che è il modo normale di procedere nei programmi per PLC o nei programmi a stati non bloccanti, dove tutte le condizioni vengono testate decine, centinaia o migliaia di volte al secondo).
Ad esempio questa è la parte relativa alla regolazione ora/minuti con un encoder che sto sperimentando in questi giorni. Il case è eseguito migliaia di volte al secondo. Una pressione lunga fa ritornare alla maschera principale (fase=0). Ruota destra/sinistra (eventi onUp/onDn) modificano il valore. Con clic si avanza da regolazione ore a regolazione minuti a conferma. Se non si tocca nulla per 60 secondi si torna alla maschera principale.
case REGORA:
if (primo) // prima esecuzione del case
{
s = 0; // 0 = regola ora, 1 minuti
modHour = now.hour;
modMinute = now.minute;
displayModHour(s, modHour, modMinute);
modify = false;
t = gmillis;
}
if (onLpress) { fase = PRINCIPALE; beepLpress(); break; } // abbandono
if (onUp)
{
if (0 == s) { modHour = (modHour + 1) % 24; }
else if (1 == s) { modMinute = (modMinute + 1) % 60; }
beepUp();
modify = true;
displayModHour(s, modHour, modMinute);
t = gmillis;
}
else if (onDn)
{
if (0 == s) { modHour = (modHour > 0) ? modHour-1 : 23; }
else if (1 == s) { modMinute = (modMinute > 0) ? modMinute-1 : 59; }
beepDn();
modify = true;
displayModHour(s, modHour, modMinute);
t = gmillis;
}
if (onClic) { beepClic(); t = gmillis; }
if (onClic && 0 == s) // avanza a regolazione minuti
{
s = 1;
displayModHour(s, modHour, modMinute);
}
else if (onClic && 1 == s) // conferma, salva ed esce
{
fase = 0;
if (modify)
{
now.hour = modHour;
now.minute = modMinute;
setHour();
}
}
if ((uint16_t)gmillis-t > 60000) { fase = PRINCIPALE; } // timeout inattivita`
break;