Robert_l

fsm simple v1

Mar 10th, 2022 (edited)
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.92 KB | None | 0 0
  1. #include <stdio.h> // define the header file
  2. #include <stdint.h>
  3.  
  4. void zle()
  5. {
  6.     static uint8_t state = 0;
  7.     uint8_t flag = 0;
  8.     switch (state)
  9.     {
  10.     case 0:
  11.         if (flag)
  12.         {
  13.             state = 1;
  14.             // init_vars_in_state_1();
  15.         }
  16.         break;
  17.     case 1:
  18.         /* code */
  19.         break;
  20.     case 2:
  21.         if (flag)
  22.         {
  23.             state = 1;
  24.             // again_init_vars_in_state_1();
  25.         }
  26.         break;
  27.     default:
  28.         break;
  29.     }
  30. }
  31.  
  32. void lepiej()
  33. {
  34.     static uint8_t state = 0;
  35.     uint8_t flag = 0;
  36.     uint8_t stateChanged = 0;
  37.     switch (state)
  38.     {
  39.     case 0:
  40.         if (flag)
  41.         {
  42.             state = 1;
  43.             stateChanged = 1;
  44.         }
  45.         break;
  46.     case 1:
  47.         if (stateChanged)
  48.         {
  49.             // init_vars_in_state_1();
  50.             stateChanged = 0;
  51.         }
  52.         break;
  53.     case 2:
  54.         if (flag)
  55.         {
  56.             state = 1;
  57.             stateChanged = 1;
  58.         }
  59.         break;
  60.     default:
  61.         break;
  62.     }
  63. }
  64.  
  65. typedef struct FSM_td FSM_t;
  66. typedef void (*fsm_cb)(FSM_t *fsm);
  67. typedef enum
  68. {
  69.     FSM_STATE_RUN,
  70.     FSM_STATE_ENTERED,
  71.     FSM_STATE_LEAVE
  72. } FSM_STATE;
  73.  
  74. struct FSM_td
  75. {
  76.     fsm_cb currentStateCb;   // callback for current state
  77.     fsm_cb nextStateCb;      // callback for next state
  78.     FSM_STATE executionStep; // state status for callback
  79.     void *userParam;         // not used by library
  80. } FSM_td;
  81.  
  82. // void fsmTask_old(FSM_t* FSM){//
  83. //     if (FSM->nextStateCb != NULL) {
  84. //         FSM->executionStep = FSM_STATE_LEAVE;
  85. //         if (FSM->currentStateCb != NULL){
  86. //             FSM->currentStateCb(FSM);
  87. //         }
  88. //         FSM->currentStateCb = FSM->nextStateCb;
  89. //         FSM->nextStateCb = NULL;
  90. //         FSM->executionStep = FSM_STATE_ENTERED;
  91. //         FSM->currentStateCb(FSM);
  92. //         FSM->executionStep = FSM_STATE_RUN;
  93. //     }else{
  94. //         if (FSM->currentStateCb != NULL){
  95. //             FSM->currentStateCb(FSM);
  96. //         }
  97. //     }
  98. // }
  99.  
  100. /*
  101. call only one callback per execution
  102. if state change in FSM_STATE_ENTERED, next call will be FSM_STATE_LEAVE
  103. */
  104. void fsmRun(FSM_t *FSM)
  105. {
  106.     if (FSM->nextStateCb != NULL)
  107.     { // pendind state change
  108.         if (FSM->currentStateCb != NULL)
  109.         { // current state not terminated, telave it
  110.             FSM->executionStep = FSM_STATE_LEAVE;
  111.         }
  112.         else
  113.         {
  114.             FSM->executionStep = FSM_STATE_ENTERED; // current state == NULL, init next state
  115.         }
  116.     }
  117.     else
  118.     {
  119.         FSM->executionStep = FSM_STATE_RUN; // no pending state change
  120.     }
  121.  
  122.     switch (FSM->executionStep)
  123.     {
  124.     case FSM_STATE_RUN:
  125.         if (FSM->currentStateCb != NULL)
  126.         { // current state should be initialized to null
  127.             FSM->currentStateCb(FSM);
  128.         }
  129.         break;
  130.  
  131.     case FSM_STATE_ENTERED:
  132.         FSM->currentStateCb = FSM->nextStateCb; // current state terminated, get new state and init
  133.         FSM->nextStateCb = NULL;
  134.         FSM->currentStateCb(FSM);
  135.         break;
  136.  
  137.     case FSM_STATE_LEAVE:
  138.         FSM->currentStateCb(FSM);
  139.         FSM->currentStateCb = NULL; // terminate current state
  140.         break;
  141.     default:
  142.         break;
  143.     }
  144. }
  145.  
  146. /*
  147. run all state changes until normal execution occurs, no timeout
  148. */
  149. void fsmRunUntinState_RUN(FSM_t *FSM)
  150. {
  151.     printf("->");
  152.     do
  153.     {
  154.         fsmRun(FSM);
  155.     } while (FSM->executionStep != FSM_STATE_RUN || FSM->nextStateCb != NULL);
  156. }
  157.  
  158. // init fsm or change state
  159. void fsmGo(FSM_t *FSM, fsm_cb nextStateClb)
  160. {
  161.     FSM->nextStateCb = nextStateClb;
  162. }
  163.  
  164. FSM_t fsm;
  165. void state1(FSM_t *fsm);
  166. void state2(FSM_t *fsm);
  167.  
  168. void state1(FSM_t *fsm)
  169. {
  170.     static int cnt = 0;
  171.     if (fsm->executionStep == FSM_STATE_ENTERED)
  172.     {
  173.         printf(" state1 entered\n");
  174.         cnt = 0;
  175.     }
  176.     if (fsm->executionStep == FSM_STATE_LEAVE)
  177.         printf(" state1 Leave\n");
  178.     if (fsm->executionStep == FSM_STATE_RUN)
  179.     {
  180.         printf(" state1 run\n");
  181.         if (++cnt >= 5)
  182.             fsmGo(fsm, state2);
  183.     }
  184. }
  185.  
  186. void state2(FSM_t *fsm)
  187. {
  188.     if (fsm->executionStep == FSM_STATE_ENTERED)
  189.         printf(" state2 entered\n");
  190.     if (fsm->executionStep == FSM_STATE_LEAVE)
  191.         printf(" state2 Leave\n");
  192.     if (fsm->executionStep == FSM_STATE_RUN)
  193.         printf(" state2 run\n");
  194.     fsmGo(fsm, state1);
  195. }
  196. /*
  197. run log:
  198.  state1 entered
  199.  state1 run
  200.  state1 run
  201.  state1 run
  202.  state1 run
  203.  state1 run
  204.  state1 Leave
  205.  state2 entered  !!!
  206.  state2 Leave  !!!
  207.  state1 entered
  208.  state1 run
  209. end
  210. */
  211. int main() // define the main function
  212. {
  213.     fsmRun(&fsm);
  214.     fsmRun(&fsm);
  215.     fsmRun(&fsm);
  216.     fsmRun(&fsm);
  217.  
  218.     fsmGo(&fsm, state1);
  219.  
  220.     for (size_t v = 0; v <= 10; v += 1)
  221.     {
  222.         // fsmRunUntinState_RUN(&fsm);
  223.         fsmRun(&fsm);
  224.     }
  225.     printf("end"); // print the statement.
  226.     return 0;
  227. }
  228.  
Add Comment
Please, Sign In to add comment