smb01 A state machine in CNO pointers - but instead a case switch construction raw smb01.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
// state dft
enum states {INIT,LEDON,LEDOFF};
// state functions
enum states init(void)
{
printf("\ninit\n");
sleep(1);
return LEDON; // return next state
}
enum states ledOn(void)
{
printf("\nledOn\n");
sleep(1);
return LEDOFF;
}
enum states ledOff(void)
{
printf("\nledOff\n");
sleep(1);
return LEDON;
}
int main()
{
enum states state = INIT;
while (1) {
switch (state) {
case INIT:
state = init();
break;
case LEDON:
state = ledOn();
break;
case LEDOFF:
state = ledOff();
break;
default:
state = INIT;
}
}
}
/**
* case-switch considerations
* Finding of the proper case can be carried out
* in two ways.
*
* 1) if (..) else if (..) ..
* So if you do have 100 case then in average you
* will do 50 if (...)
*
* 2) if you order your cases in numerical order like
* case 0:
* ...
* break;
* case 1:
* ...
* break;
* and so forth
* a jump table will be generated you just jump to the right case entry.
* so no performance lack even in a case with several 100 entries.
*
* By using the enum state above we are guaranteed the states are numbered 0,1,2,..
* Then you just need to code our case switch in numerical order.
*
*/
|