A função switch, associada a máquina de estado ( state machine ), simplifica o código e facilita a manutenção, substituindo os vários “IF” aninhados, também conhecido como cascata de “IF”.
Não raro durante o desenvolvimento de um código, é necessário tomar decisões sobre vários eventos para que o fluxo prossiga na direção correta.
A máquina de estado também é conhecida como :
- finite-state machine (FSM)
- finite-state automaton (FSA)
- autômato finito
Porque utilizar a máquina de estado?
Implementar código usando uma máquina de estado é uma técnica de design extremamente útil para resolver problemas complexos de engenharia.
As máquinas de estado dividem o projeto em uma série de etapas, ou o que é chamado de estados no jargão da máquina de estado.
Cada estado executa alguma tarefa estritamente definida.
Os eventos, por outro lado, são os estímulos que fazem com que a máquina de estado se mova, ou transite, entre estados.
Como a máquina de estado opera?
Cada máquina de estado tem o conceito de “estado atual”.
Este é o estado que a máquina de estado ocupa naquele momento.
Em qualquer momento, a máquina de estado pode estar em apenas um único estado.
Cada instância de um estado particular da máquina de estado, pode redefinir o estado inicial, ou o próximo estado.
Entretanto, o estado inicial não é executado imediatamente pela máquina de estado, quando o programa for iniciado.
Somente após receber um evento, a máquina de estado executa uma função que estava associada ao evento.
Desta forma, as várias etapas, ou estados, são executados quando cada evento é recebido e avaliado pela máquina de estado.
Devido a forma de operar da função switch, ela é perfeita para navegação entre os estados de uma máquina de estado.
Imagine criar uma máquina de estado, utilizando “IF” !
Em relação ao uso de “IF”, as principais vantagens da função switch são :
- Código legível
- Facilidade de manutenção
- Facilidade de alteração : inclusão / remoção de opções ( estados )
- Rapidez na seleção do trecho de código a ser executado
Função switch e a máquina de estado
Abaixo temos um exemplo real da aplicação da função switch usada para determinar a frequência da rede AC.
Posteriormente este código será comentado com mais detalhes, no artigo referente ao Monitor AC.
// // Calculate frequency // if(freqEnabled) { freqSampleVAC = sampleVAC - 512; switch(freqSM) { case 1: if(freqSampleVAC < 0) { // wait for zero to start counting cycles freqSM = 2; } break; case 2: if(freqSampleVAC >= 0) // wait for positive cycle { freqStartTime = micros(); freqSM = 3; } break; case 3: if(freqSampleVAC < 0 ) // wait for zero crossing { freqSM = 4; } break; case 4: if(freqSampleVAC >=0 ) // one cycle is completed { freqSample++; // count number of cycles and wait for another one freqSM = 3; } break; } if(freqSample == ACFreq) { acFrequency = 1000000 / ((float)(micros() - freqStartTime) / freqSample); freqSample = 0; freqSM = 1; freqEnabled = false; // now frequency info can be used freq_activity = !freq_activity; } }
Referência :
Artigos relacionados :
arduino – como melhorar a precisão da entrada analógica
Linguagem C dicas sobre programação
IoT – protocolo MQTT – introdução
Image by Arek Socha from Pixabay