Jake Greaves
/
Lazer_Maze_State_Machine
State machine implementation of lazer maze
main.cpp@0:b21aca784f5b, 2018-11-29 (annotated)
- Committer:
- ADIJake
- Date:
- Thu Nov 29 12:44:12 2018 +0000
- Revision:
- 0:b21aca784f5b
State Machine implimentation of lazer maze
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ADIJake | 0:b21aca784f5b | 1 | #include "mbed.h" |
ADIJake | 0:b21aca784f5b | 2 | /* |
ADIJake | 0:b21aca784f5b | 3 | #define TERMINATOR '\n' |
ADIJake | 0:b21aca784f5b | 4 | #define SEPERATOR ',' |
ADIJake | 0:b21aca784f5b | 5 | |
ADIJake | 0:b21aca784f5b | 6 | // Analog input solar cells corresponding to digital output leds. |
ADIJake | 0:b21aca784f5b | 7 | DigitalOut leds[] = {1,2,3,4,5}; |
ADIJake | 0:b21aca784f5b | 8 | AnalogIn solarCells[] = {1,2,3,4,5}; |
ADIJake | 0:b21aca784f5b | 9 | bool solarCellsState[sizeof(solarCells)]; |
ADIJake | 0:b21aca784f5b | 10 | uint16_t solarCellsThreshold[sizeof(solarCells)]; |
ADIJake | 0:b21aca784f5b | 11 | |
ADIJake | 0:b21aca784f5b | 12 | Serial serial(PA_2, PA_3); |
ADIJake | 0:b21aca784f5b | 13 | |
ADIJake | 0:b21aca784f5b | 14 | char pcBuffer[256]; |
ADIJake | 0:b21aca784f5b | 15 | uint8_t pcBufferIndex = 0; |
ADIJake | 0:b21aca784f5b | 16 | bool messageReceived = false; |
ADIJake | 0:b21aca784f5b | 17 | |
ADIJake | 0:b21aca784f5b | 18 | enum { |
ADIJake | 0:b21aca784f5b | 19 | IDLE, |
ADIJake | 0:b21aca784f5b | 20 | CALIBRATE, |
ADIJake | 0:b21aca784f5b | 21 | START, |
ADIJake | 0:b21aca784f5b | 22 | RUNNING, |
ADIJake | 0:b21aca784f5b | 23 | STOP, |
ADIJake | 0:b21aca784f5b | 24 | MAX_STATES |
ADIJake | 0:b21aca784f5b | 25 | } States; |
ADIJake | 0:b21aca784f5b | 26 | |
ADIJake | 0:b21aca784f5b | 27 | enum States state = IDLE; |
ADIJake | 0:b21aca784f5b | 28 | |
ADIJake | 0:b21aca784f5b | 29 | void callback(void) { |
ADIJake | 0:b21aca784f5b | 30 | pcBuffer[pcBufferIndex] = serial.getc(); |
ADIJake | 0:b21aca784f5b | 31 | |
ADIJake | 0:b21aca784f5b | 32 | if(pcBuffer[pcBufferIndex] == TERMINATOR) { |
ADIJake | 0:b21aca784f5b | 33 | pcBufferIndex = 0; |
ADIJake | 0:b21aca784f5b | 34 | messageReceived = true; |
ADIJake | 0:b21aca784f5b | 35 | } |
ADIJake | 0:b21aca784f5b | 36 | } |
ADIJake | 0:b21aca784f5b | 37 | */ |
ADIJake | 0:b21aca784f5b | 38 | int main() { |
ADIJake | 0:b21aca784f5b | 39 | /* |
ADIJake | 0:b21aca784f5b | 40 | serial.printf("Hello\n"); |
ADIJake | 0:b21aca784f5b | 41 | |
ADIJake | 0:b21aca784f5b | 42 | serial.attach(&callback); |
ADIJake | 0:b21aca784f5b | 43 | |
ADIJake | 0:b21aca784f5b | 44 | for(uint8_t i = 0; i < sizeof(solarCells); i++) { |
ADIJake | 0:b21aca784f5b | 45 | solarCellsState[i] = false; |
ADIJake | 0:b21aca784f5b | 46 | solarCellsThreshold[i] = 0; |
ADIJake | 0:b21aca784f5b | 47 | } |
ADIJake | 0:b21aca784f5b | 48 | |
ADIJake | 0:b21aca784f5b | 49 | while(true) { |
ADIJake | 0:b21aca784f5b | 50 | switch(state) { |
ADIJake | 0:b21aca784f5b | 51 | case IDLE: |
ADIJake | 0:b21aca784f5b | 52 | // If we have received a full message over UART. |
ADIJake | 0:b21aca784f5b | 53 | if(messageReceived) { |
ADIJake | 0:b21aca784f5b | 54 | // Clear flag. |
ADIJake | 0:b21aca784f5b | 55 | messageReceived = false; |
ADIJake | 0:b21aca784f5b | 56 | |
ADIJake | 0:b21aca784f5b | 57 | // Handle command by pointing to correct state. |
ADIJake | 0:b21aca784f5b | 58 | switch(pcBuffer[0]) { |
ADIJake | 0:b21aca784f5b | 59 | case "s": |
ADIJake | 0:b21aca784f5b | 60 | state = START; |
ADIJake | 0:b21aca784f5b | 61 | break; |
ADIJake | 0:b21aca784f5b | 62 | case "c": |
ADIJake | 0:b21aca784f5b | 63 | state = CALIBRATE; |
ADIJake | 0:b21aca784f5b | 64 | default: |
ADIJake | 0:b21aca784f5b | 65 | break; |
ADIJake | 0:b21aca784f5b | 66 | } |
ADIJake | 0:b21aca784f5b | 67 | } |
ADIJake | 0:b21aca784f5b | 68 | break; |
ADIJake | 0:b21aca784f5b | 69 | case CALIBRATE: |
ADIJake | 0:b21aca784f5b | 70 | // If no arguments were given. |
ADIJake | 0:b21aca784f5b | 71 | if(pcBuffer[1] == TERMINATOR) { |
ADIJake | 0:b21aca784f5b | 72 | // Read solar cells and return values. |
ADIJake | 0:b21aca784f5b | 73 | for(uint8_t i = 0; i < sizeof(solarCells); i++) { |
ADIJake | 0:b21aca784f5b | 74 | uint16_t val = solarCells[i].read(); |
ADIJake | 0:b21aca784f5b | 75 | serial.printf("%d%c", val, SEPERATOR); |
ADIJake | 0:b21aca784f5b | 76 | } |
ADIJake | 0:b21aca784f5b | 77 | serial.printf("%c", TERMINATOR); |
ADIJake | 0:b21aca784f5b | 78 | } |
ADIJake | 0:b21aca784f5b | 79 | else if(pcBuffer[1] == SEPERATOR) { |
ADIJake | 0:b21aca784f5b | 80 | // Store new thresholds. |
ADIJake | 0:b21aca784f5b | 81 | uint16_t i = 2; |
ADIJake | 0:b21aca784f5b | 82 | while(pcBuffer[i] != '\n') { |
ADIJake | 0:b21aca784f5b | 83 | |
ADIJake | 0:b21aca784f5b | 84 | } |
ADIJake | 0:b21aca784f5b | 85 | } |
ADIJake | 0:b21aca784f5b | 86 | else{ |
ADIJake | 0:b21aca784f5b | 87 | // Error. |
ADIJake | 0:b21aca784f5b | 88 | } |
ADIJake | 0:b21aca784f5b | 89 | break; |
ADIJake | 0:b21aca784f5b | 90 | case START: |
ADIJake | 0:b21aca784f5b | 91 | serial.printf("%c", TERMINATOR); |
ADIJake | 0:b21aca784f5b | 92 | state = RUNNING; |
ADIJake | 0:b21aca784f5b | 93 | break; |
ADIJake | 0:b21aca784f5b | 94 | case RUNNING: |
ADIJake | 0:b21aca784f5b | 95 | // Update solarCellsState. |
ADIJake | 0:b21aca784f5b | 96 | for(uint8_t i = 0; i < sizeof(solarCells); i++) { |
ADIJake | 0:b21aca784f5b | 97 | solarCellsState[i] = (solarCells[i].read() >= |
ADIJake | 0:b21aca784f5b | 98 | solarCellsThreshold[i]); |
ADIJake | 0:b21aca784f5b | 99 | } |
ADIJake | 0:b21aca784f5b | 100 | |
ADIJake | 0:b21aca784f5b | 101 | // Update leds. |
ADIJake | 0:b21aca784f5b | 102 | uint8_t activeLeds = 0; |
ADIJake | 0:b21aca784f5b | 103 | for(uint8_t i = 0; i < sizeof(leds); i++) { |
ADIJake | 0:b21aca784f5b | 104 | leds[i] = solarCellsState[i]; |
ADIJake | 0:b21aca784f5b | 105 | activeLeds += solarCellsState[i]; |
ADIJake | 0:b21aca784f5b | 106 | } |
ADIJake | 0:b21aca784f5b | 107 | |
ADIJake | 0:b21aca784f5b | 108 | if(activeLeds >= sizeof(leds)) { |
ADIJake | 0:b21aca784f5b | 109 | state = STOP; |
ADIJake | 0:b21aca784f5b | 110 | } |
ADIJake | 0:b21aca784f5b | 111 | else { |
ADIJake | 0:b21aca784f5b | 112 | state = RUNNING; |
ADIJake | 0:b21aca784f5b | 113 | } |
ADIJake | 0:b21aca784f5b | 114 | break; |
ADIJake | 0:b21aca784f5b | 115 | case STOP: |
ADIJake | 0:b21aca784f5b | 116 | serial.printf("%c", TERMINATOR); |
ADIJake | 0:b21aca784f5b | 117 | state = IDLE; |
ADIJake | 0:b21aca784f5b | 118 | break; |
ADIJake | 0:b21aca784f5b | 119 | default: |
ADIJake | 0:b21aca784f5b | 120 | break; |
ADIJake | 0:b21aca784f5b | 121 | |
ADIJake | 0:b21aca784f5b | 122 | } |
ADIJake | 0:b21aca784f5b | 123 | }*/ |
ADIJake | 0:b21aca784f5b | 124 | } |