Advertisement
Guest User

Untitled

a guest
Mar 30th, 2020
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.20 KB | None | 0 0
  1. // HEADSTATE MACHINE /// !!!(@@@@
  2. // --- ATTRIBUTES --- //
  3.  
  4. int headState; // What state the machine is currently on
  5. boolean readyToChange; // Check if state is done and can go back to idle
  6.  
  7. const int TRAFFIC_IDLE = 0;
  8. const int TRAFFIC_LEFT = 1;
  9. const int TRAFFIC_RIGHT = 2;
  10. const int TRAFFIC_PASSAGE = 3;
  11. const int NIGHT_TIME = 4;
  12.  
  13. const byte STOP = B10110111; // STOP SIGN
  14. const byte WALK = B00011100; // WALK SIGN
  15. const byte WARNING = B01101111; // WARNING SIGN
  16.  
  17. const int RED = 0;
  18. const int ORANGE = 1;
  19. const int GREEN = 2;
  20.  
  21. const int LEFT = 0; // LEFT TRAFFIC LIGHT
  22. const int RIGHT = 1; // RIGHT TRAFFIC LIGHT
  23.  
  24. const int FAST = 250; // FAST INTERVAL FOR BUZZER
  25. const int SLOW = 1000; // SLOW INTERVAL FOR BUZZER
  26.  
  27. const int CAR_LEFT = 0;
  28. const int CAR_RIGHT = 1;
  29. const int PASSAGE_MIDDLE = 2;
  30.  
  31. // --- SETUP --- //
  32.  
  33. void headStateMachineSetup() {
  34.   // put your setup code here, to run once:
  35.   readyToChange = false;
  36.  
  37.   headState = TRAFFIC_IDLE;
  38.   TRAFFIC_IDLE_entry();
  39. }
  40.  
  41. // --- FUNCTIONS --- //
  42.  
  43. void headStateMachineLoop() {
  44.   // put your main code here, to run repeatedly:
  45.   switch (headState) {
  46.     case TRAFFIC_IDLE :
  47.       buttonLoop();
  48.       TRAFFIC_IDLE_do();
  49.       Serial.println("im still here");
  50.       if (buttonWasPressed(CAR_LEFT)) {
  51.         TRAFFIC_IDLE_exit();
  52.         headState = TRAFFIC_LEFT;
  53.         TRAFFIC_LEFT_entry();
  54.       } else if (buttonWasPressed(CAR_RIGHT)) {
  55.         TRAFFIC_IDLE_exit();
  56.         headState = TRAFFIC_RIGHT;
  57.         TRAFFIC_RIGHT_entry();
  58.       } else if (buttonWasPressed(PASSAGE_MIDDLE)) {
  59.         TRAFFIC_IDLE_exit();
  60.         headState = TRAFFIC_PASSAGE;
  61.         TRAFFIC_PASSAGE_entry();
  62.       }
  63.       break;
  64.     case TRAFFIC_LEFT :
  65.       TRAFFIC_LEFT_do();
  66.       if (readyToChange) {
  67.         TRAFFIC_LEFT_exit();
  68.         headState = TRAFFIC_IDLE;
  69.         TRAFFIC_IDLE_entry();
  70.       }
  71.       break;
  72.     case TRAFFIC_RIGHT :
  73.       TRAFFIC_RIGHT_do();
  74.       if (readyToChange) {
  75.         TRAFFIC_RIGHT_exit();
  76.         headState = TRAFFIC_IDLE;
  77.         TRAFFIC_IDLE_entry();
  78.       }
  79.       break;
  80.     case TRAFFIC_PASSAGE :
  81.       TRAFFIC_PASSAGE_do();
  82.       if (readyToChange) {
  83.         TRAFFIC_RIGHT_exit();
  84.         headState = TRAFFIC_IDLE;
  85.         TRAFFIC_IDLE_entry();
  86.       }
  87.       break;
  88.       //    case NIGHT_TIME :
  89.       //      NIGHT_TIME_do();
  90.       //      if (isNotNight){
  91.       //        NIGHT_TIME_exit();
  92.       //        headStateMachineSetup();
  93.       //      }
  94.       //      break;
  95.   }
  96. }
  97.  
  98.  
  99.  
  100. // --- SETTERS --- //
  101.  
  102. // --- GETTERS --- //
  103.  
  104. int getFastIntervalBuzzer() {
  105.   return FAST;
  106. }
  107. int getSlowIntervalBuzzer() {
  108.   return SLOW;
  109. }
  110. byte getStopSign() {
  111.   return STOP;
  112. }
  113. byte getWalkSign() {
  114.   return WALK;
  115. }
  116. byte getWarningSign() {
  117.   return WARNING;
  118. }
  119.  
  120. // --- ENTRY | DO | EXIT --- //
  121.  
  122. // || -- TRAFFIC IDLE -- || //
  123. void TRAFFIC_IDLE_entry() {
  124.   trafficSetLights(RED);
  125.   myfnUpdateDisplay(STOP);
  126. }
  127. void TRAFFIC_IDLE_do() {
  128.   buzzerTicking(SLOW); // Buzzer ticks slowly
  129. }
  130. void TRAFFIC_IDLE_exit() {
  131.   /*NOTHING*/
  132. }
  133.  
  134. // || -- TRAFFIC LEFT -- || //
  135. void TRAFFIC_LEFT_entry() {
  136.   Serial.println("LEFT");
  137.   subStateMachineTrafficSetup(LEFT);
  138. }
  139. void TRAFFIC_LEFT_do() {
  140.   subStateMachineTrafficLoop(LEFT);
  141. }
  142. void TRAFFIC_LEFT_exit() {
  143.   /*NOTHING*/
  144. }
  145.  
  146. // || -- TRAFFIC RIGHT -- || //
  147. void TRAFFIC_RIGHT_entry() {
  148.   Serial.println("RIGHT");
  149.   subStateMachineTrafficSetup(RIGHT);
  150. }
  151. void TRAFFIC_RIGHT_do() {
  152.   myfnUpdateDisplay(STOP);
  153.   subStateMachineTrafficLoop(RIGHT);
  154. }
  155. void TRAFFIC_RIGHT_exit() {
  156.   /*NOTHING*/
  157. }
  158.  
  159. // || -- TRAFFIC PASSAGE -- || //
  160. void TRAFFIC_PASSAGE_entry() {
  161.   Serial.println("PASSAGE");
  162.   subStateMachinePassageSetup();
  163. }
  164. void TRAFFIC_PASSAGE_do() {
  165.   subStateMachinePassageLoop();
  166. }
  167. void TRAFFIC_PASSAGE_exit() {
  168.   headStateMachineSetup();
  169. }
  170. // || -- NIGHT TIME -- || //
  171. void NIGHT_TIME_entry() {
  172.   setServoUp(); // Opens the servo
  173.   myfnUpdateDisplay(getStopSign()); // Displays a stop sign on the 7-segment display
  174.   buzzerTicking(SLOW); // Buzzer ticks slowly
  175. }
  176. void NIGHT_TIME_do() {
  177.   trafficLightBlink(); // Both traffic lights start blinking yellow
  178.   setBuzzerOff(); // Buzzer is turned off
  179. }
  180. void NIGHT_TIME_exit() {
  181.   setServoDown(); // Closes the servo
  182.   myfnUpdateDisplay(getStopSign()); // Displays a stop sign on the 7-segment display
  183.   buzzerTicking(SLOW); // Buzzer ticks slowly
  184.   for (int i = 0; i < getMaxLights; i++) {
  185.     trafficSetLights(ORANGE); // Yellow lamps stop blinking and keep staying on
  186.   }
  187. }
  188.  
  189. // (@#*### BUTTON STATE MACHINE // @*(#&#
  190.  
  191.  
  192. // --- ATTRIBUTES --- //
  193.  
  194. const int NR_OF_BUTTONS = 3;
  195.  
  196. const int BUTTON_RELEASED = 1; // STATE 1
  197. const int BUTTON_CHECK_PRESSED = 2; // STATE 2
  198. const int BUTTON_PRESSED = 3; // STATE 3
  199. const int BUTTON_CHECK_RELEASED = 4; // STATE 4
  200.  
  201. int buttonState[NR_OF_BUTTONS];
  202.  
  203. const int BUTTON_INTERVAL = 10; // INTERVAL BUTTON
  204. unsigned long buttonPreviousMillis[NR_OF_BUTTONS]; // PREVIOUS MILLIS BUTTON
  205.  
  206. boolean buttonPressed[NR_OF_BUTTONS];
  207.  
  208. // --- SETUP --- //
  209.  
  210. void buttonSetup() {
  211.   buttonHardwareSetup(NR_OF_BUTTONS);
  212.   for (int buttonNumber = 0; buttonNumber < NR_OF_BUTTONS; buttonNumber++) {
  213.     buttonPreviousMillis[buttonNumber] = 0 - BUTTON_INTERVAL; // Set timer
  214.     buttonPressed[buttonNumber] = false;  // Set button switch
  215.     buttonState[buttonNumber] = BUTTON_RELEASED; // Start button state
  216.     BUTTON_RELEASED_entry(buttonNumber); // Start button entry
  217.   }
  218. }
  219.  
  220. // --- FUNCTIONS --- //
  221. void buttonLoop() {
  222.   for (int buttonNumber = 0; buttonNumber < NR_OF_BUTTONS; buttonNumber++) {
  223.     buttonSwitch(buttonNumber);
  224.   }
  225. }
  226.  
  227. void buttonSwitch(int buttonNumber) {
  228.   switch (buttonState[buttonNumber]) {
  229.     case BUTTON_RELEASED:
  230.       BUTTON_RELEASED_do(buttonNumber);
  231.       if (buttonHardwareDown(buttonNumber)) {
  232.         BUTTON_RELEASED_exit(buttonNumber);
  233.         buttonState[buttonNumber] = BUTTON_CHECK_PRESSED;
  234.         BUTTON_CHECK_PRESSED_entry(buttonNumber);
  235.       }
  236.       break;
  237.     case BUTTON_CHECK_PRESSED:
  238.       BUTTON_CHECK_PRESSED_do(buttonNumber);
  239.       if (buttonHardwareUp(buttonNumber)) {
  240.         BUTTON_CHECK_PRESSED_exit(buttonNumber);
  241.         buttonState[buttonNumber] = BUTTON_RELEASED;
  242.         BUTTON_RELEASED_entry(buttonNumber);
  243.       }
  244.       else if ((buttonHardwareDown(buttonNumber)) && (millis() - BUTTON_INTERVAL >= buttonPreviousMillis[buttonNumber])) { // Button down && interval over
  245.         BUTTON_CHECK_PRESSED_exit(buttonNumber);
  246.         buttonState[buttonNumber] = BUTTON_PRESSED;
  247.         BUTTON_PRESSED_entry(buttonNumber);
  248.       }
  249.       break;
  250.     case BUTTON_PRESSED:
  251.       BUTTON_PRESSED_do(buttonNumber);
  252.       if (buttonHardwareUp(buttonNumber)) {
  253.         BUTTON_CHECK_PRESSED_exit(buttonNumber);
  254.         buttonState[buttonNumber] = BUTTON_CHECK_RELEASED;
  255.         BUTTON_CHECK_RELEASED_entry(buttonNumber);
  256.       }
  257.       break;
  258.     case BUTTON_CHECK_RELEASED:
  259.       BUTTON_CHECK_RELEASED_do(buttonNumber);
  260.       if (buttonHardwareDown(buttonNumber)) {
  261.         BUTTON_CHECK_RELEASED_exit(buttonNumber);
  262.         buttonState[buttonNumber] = BUTTON_PRESSED;
  263.         BUTTON_PRESSED_entry(buttonNumber);
  264.       }
  265.       else if ((buttonHardwareUp(buttonNumber)) && (millis() - BUTTON_INTERVAL >= buttonPreviousMillis[buttonNumber])) { // Button up && interval over
  266.         BUTTON_CHECK_RELEASED_exit(buttonNumber);
  267.         buttonState[buttonNumber] = BUTTON_RELEASED;
  268.         BUTTON_RELEASED_entry(buttonNumber);
  269.       }
  270.       break;
  271.   }
  272. }
  273.  
  274. // --- ENTRY | DO | EXIT --- //
  275.  
  276. // --- BUTTON RELEASED --- //
  277. void BUTTON_RELEASED_entry(int buttonNumber) {
  278.   // <nothing>
  279. }
  280.  
  281. void BUTTON_RELEASED_do(int buttonNumber) {
  282.   // <nothing>
  283. }
  284.  
  285. void BUTTON_RELEASED_exit(int buttonNumber) {
  286.   // <nothing>
  287. }
  288.  
  289. // --- BUTTON CHECK PRESSED  --- //
  290. void BUTTON_CHECK_PRESSED_entry(int buttonNumber) {
  291.   buttonPreviousMillis[buttonNumber] = millis(); // Reset button timer
  292. }
  293.  
  294. void BUTTON_CHECK_PRESSED_do(int buttonNumber) {
  295.   // <nothing>
  296. }
  297.  
  298. void BUTTON_CHECK_PRESSED_exit(int buttonNumber) {
  299.   // <nothing>
  300. }
  301.  
  302. // --- BUTTON PRESSED --- //
  303. void BUTTON_PRESSED_entry(int buttonNumber) {
  304.   // <nothing>
  305. }
  306.  
  307. void BUTTON_PRESSED_do(int buttonNumber) {
  308.   // <nothing>
  309. }
  310.  
  311. void BUTTON_PRESSED_exit(int buttonNumber) {
  312.   // <nothing>
  313. }
  314.  
  315. // --- BUTTON_STATE_CHECK_RELEASED --- //
  316. void BUTTON_CHECK_RELEASED_entry(int buttonNumber) {
  317.   buttonPreviousMillis[buttonNumber] = millis(); // Reset button timer
  318. }
  319.  
  320. void BUTTON_CHECK_RELEASED_do(int buttonNumber) {
  321.   // <nothing>
  322. }
  323.  
  324. void BUTTON_CHECK_RELEASED_exit(int buttonNumber) {
  325.   buttonPressed[buttonNumber] = true; // Button state is set on true
  326. }
  327.  
  328. // --- Event -----------
  329. boolean buttonWasPressed(int buttonNumber) { // Returns true if button is pressed && resets button
  330.   if (buttonPressed[buttonNumber]) {
  331.     buttonPressed[buttonNumber] = false;
  332.     return true;
  333.   }
  334.   else return false;
  335. }
  336.  
  337. // RIGHT ? LEFT SUBSTATEMACHINE @@@
  338.  
  339.  
  340. // --- ATTRIBUTES --- //
  341.  
  342. int subStateMachineTraffic;
  343. boolean subStateMachineTrafficBusy = false; // Is the substateBusy?
  344. boolean canBeChangedSubTraffic;
  345.  
  346. const int TRAFFIC_OPEN = 0;
  347. const int TRAFFIC_CLOSING = 1;
  348. const int TRAFFIC_CLOSED = 2;
  349.  
  350. // --- SETUP --- //
  351.  
  352. void subStateMachineTrafficSetup(int trafficLight) {
  353.   subStateMachineTrafficBusy = true;
  354.   canBeChangedSubTraffic = false;
  355.  
  356.   subStateMachineTraffic = TRAFFIC_OPEN;
  357.   TRAFFIC_OPEN_entry(trafficLight);
  358. }
  359.  
  360. // --- FUNCTIONS --- //
  361.  
  362. void subStateMachineTrafficLoop(int trafficLight) {
  363.   switch (subStateMachineTraffic)  {
  364.     case TRAFFIC_OPEN :
  365.       TRAFFIC_OPEN_do();
  366.       if (canBeChangedSubTraffic){
  367.         TRAFFIC_OPEN_exit();
  368.         subStateMachineTraffic = TRAFFIC_CLOSING;
  369.         TRAFFIC_CLOSING_entry(trafficLight);
  370.       }
  371.       break;
  372.     case TRAFFIC_CLOSING :
  373.       TRAFFIC_CLOSING_do();
  374.       if (canBeChangedSubTraffic){
  375.         TRAFFIC_CLOSING_exit();
  376.         subStateMachineTraffic = TRAFFIC_CLOSED;
  377.         TRAFFIC_CLOSED_entry(trafficLight);
  378.       }
  379.       break;
  380.     case TRAFFIC_CLOSED :
  381.       TRAFFIC_CLOSED_do();
  382.       if (canBeChangedSubTraffic){
  383.         TRAFFIC_CLOSED_exit();
  384.       }
  385.       break;
  386.   }
  387. }
  388.  
  389. // --- SETTERS --- //
  390. void setCanBeChanged() {
  391.   canBeChangedSubTraffic = true;
  392. }
  393. void setCantBeChanged() {
  394.   canBeChangedSubTraffic = false;
  395. }
  396.  
  397.  
  398. // --- ENTRY | DO | EXIT --- //
  399.  
  400. // || -- TRAFFIC OPEN -- || //
  401. void TRAFFIC_OPEN_entry( int trafficLight){
  402.   trafficSetLights(GREEN);
  403. }
  404. void TRAFFIC_OPEN_do()
  405. {
  406.   buzzerTicking(SLOW); // Buzzer ticks slowly
  407.   myfnUpdateDisplay(getStopSign()); // Displays a stop sign on the 7-segment display
  408.   setCanBeChanged();
  409. }
  410. void TRAFFIC_OPEN_exit()
  411. {
  412.   setCantBeChanged();
  413. }
  414.  
  415. // || -- TRAFFIC CLOSING -- || //
  416. void TRAFFIC_CLOSING_entry(int trafficLight)
  417. {
  418.   trafficSetLights(ORANGE);
  419. }
  420. void TRAFFIC_CLOSING_do()
  421. {
  422.   buzzerTicking(SLOW); // Buzzer ticks slowly
  423.   setCanBeChanged();
  424. }
  425. void TRAFFIC_CLOSING_exit()
  426. {
  427.   setCantBeChanged();
  428. }
  429.  
  430. // || -- TRAFFIC CLOSED -- || //
  431. void TRAFFIC_CLOSED_entry(int trafficLight)
  432. {
  433.   trafficSetLights(RED);
  434. }
  435. void TRAFFIC_CLOSED_do()
  436. {
  437.   buzzerTicking(SLOW); // Buzzer ticks slowly
  438.   setCanBeChanged();
  439. }
  440. void TRAFFIC_CLOSED_exit()
  441. {
  442.   if (getDeadTimer())
  443.   {
  444.     subStateMachineTrafficBusy = false;
  445.   }
  446. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement