Advertisement
RenabaReD

fsm tron

Nov 18th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define INTERVAL 100
  2.  
  3. typedef enum { INIT, RUN, LEFT, RIGHT, PAUSE, STOP } State ;
  4. bool line_l, line_r; // ligne sur la gauche/droite (capteur infrarouge)
  5. bool obstacle_f; // obstacle devant (capteur ultrason)
  6. bool turn, turn_l; // y a une proba de tourner au cours de la course (marche aléatoire), et une proba pour savoir si on tourne à gauche ou droite
  7. bool setting_up, fatal_error, success, start;
  8.  
  9. State state;
  10.  
  11. void setup() {
  12.   // put your setup code here, to run once:
  13.  
  14. }
  15.  
  16. void detect_IR()
  17. {
  18.   // capteurs infrarouges
  19. }
  20.  
  21. void detect_US()
  22. {
  23.   // capteurs ultrasons
  24. }
  25.  
  26. void refresh()
  27. {
  28.   // met à jour les globals (conditions)
  29.   detect_IR();
  30.   detect_US();
  31. }
  32.  
  33. void transition()
  34. {
  35.   if (fatal_error || success)
  36.     {
  37.       state = STOP;
  38.       return;
  39.     }
  40.   switch (state)
  41.   {
  42.     case INIT:
  43.       if (setting_up)
  44.       {
  45.         state = INIT;
  46.       }
  47.       else
  48.       {
  49.         if (!obstacle_f && !line_l && !line_r && !turn)
  50.         {
  51.           state = RUN;
  52.         }
  53.         else if (turn && turn_l)
  54.         {
  55.           state = LEFT;
  56.         }
  57.         else if (turn && !turn_l)
  58.         {
  59.           state = RIGHT;
  60.         }
  61.         else
  62.         {
  63.           state = STOP;
  64.         }
  65.       }
  66.       break;
  67.     case RUN:
  68.       if (!line_l && !line_r && !turn && !obstacle_f)
  69.       {
  70.         state = RUN;
  71.       }
  72.       else if (line_r || (!line_l && !line_r && turn && turn_l) && !obstacle_f)
  73.       {
  74.         state = LEFT;
  75.       }
  76.       else if (line_l || (!line_l && !line_r && turn && !turn_l) && !obstacle_f)
  77.       {
  78.         state = RIGHT;
  79.       }
  80.       else if (obstacle_f)
  81.       {
  82.         state = PAUSE;
  83.       }
  84.       else
  85.       {
  86.         state = STOP;
  87.       }
  88.       break;
  89.     case LEFT:
  90.       if (!line_l && !line_r && !obstacle_f)
  91.       {
  92.         state = RUN;
  93.       }
  94.       else if (line_l || line_r && !obstacle_f)
  95.       {
  96.         state = LEFT;
  97.       }
  98.       else if (obstacle_f)
  99.       {
  100.         state = PAUSE;
  101.       }
  102.       else
  103.       {
  104.         state = STOP;
  105.       }
  106.       break;
  107.     case RIGHT:
  108.       if (!line_l && !line_r && !obstacle_f)
  109.       {
  110.         state = RUN;
  111.       }
  112.       else if (line_l || line_r && !obstacle_f)
  113.       {
  114.         state = RIGHT;
  115.       }
  116.       else if (obstacle_f)
  117.       {
  118.         state = PAUSE;
  119.       }
  120.       else
  121.       {
  122.         state = STOP;
  123.       }
  124.       break;
  125.     case PAUSE:
  126.       if (!line_l && !line_r && !obstacle_f)
  127.       {
  128.         state = RUN;
  129.       }
  130.       else if (line_r && !obstacle_f)
  131.       {
  132.         state = LEFT;
  133.       }
  134.       else if (line_l && !obstacle_f)
  135.       {
  136.         state = RIGHT;
  137.       }
  138.       else if (obstacle_f)
  139.       {
  140.         state = PAUSE;
  141.       }
  142.       break;
  143.     case STOP:
  144.       if (start)
  145.       {
  146.         state = INIT;
  147.       }
  148.       else
  149.       {
  150.         state = STOP;
  151.       }
  152.       break;
  153.     default:
  154.       state = STOP;
  155.       break;
  156.   }
  157.  
  158. }
  159.  
  160. void loop() {
  161.   // put your main code here, to run repeatedly:
  162.   unsigned long t0=millis();
  163.   refresh();
  164.   transition();
  165.  
  166.   switch (state)
  167.   {
  168.     case INIT:
  169.       break;
  170.     case RUN:
  171.       break;
  172.     case LEFT:
  173.       break;
  174.     case RIGHT:
  175.       break;
  176.     case PAUSE:
  177.       break;
  178.     case STOP:
  179.       break;
  180.     default:
  181.       break;
  182.   }
  183.  
  184.   unsigned long elapsed=millis()-t0;
  185.   if (elapsed>INTERVAL) printf("Excessive execution time\n");
  186.   else delay(INTERVAL-elapsed);
  187.  
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement