State machine implementation of lazer maze

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }