Jake Greaves
/
Laser_Maze_State_Machine
Laserzsssss
main.cpp@3:1c6031fd2b93, 2018-12-13 (annotated)
- Committer:
- ADIJake
- Date:
- Thu Dec 13 14:25:43 2018 +0000
- Revision:
- 3:1c6031fd2b93
- Parent:
- 2:70e7b1b88824
Sean sucks;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mfitzpa2 | 0:0056220d84ea | 1 | #include "mbed.h" |
mfitzpa2 | 0:0056220d84ea | 2 | |
mfitzpa2 | 0:0056220d84ea | 3 | #define TERMINATOR '\n' |
mfitzpa2 | 0:0056220d84ea | 4 | #define SEPARATOR ',' |
ADIJake | 3:1c6031fd2b93 | 5 | #define OFFSET 500 //mV |
mfitzpa2 | 0:0056220d84ea | 6 | #define RECEIVER_COUNT 5 |
mfitzpa2 | 0:0056220d84ea | 7 | #define BUTTON_COUNT 4 |
mfitzpa2 | 0:0056220d84ea | 8 | |
mfitzpa2 | 0:0056220d84ea | 9 | // Analog input solar cells corresponding to digital output leds. |
mfitzpa2 | 0:0056220d84ea | 10 | /* |
mfitzpa2 | 0:0056220d84ea | 11 | DigitalOut red_leds[5] = {PC_10, PC_12, PA_13, PA_14, PA_15}; |
mfitzpa2 | 0:0056220d84ea | 12 | DigitalOut green_leds[5] = {PB_7, PC_13, PC_14, PC_15, PH_0}; |
mfitzpa2 | 0:0056220d84ea | 13 | DigitalOut blue_leds[5] = {PH_1, PC_2, PC_3, PC_11, PD_2}; |
mfitzpa2 | 0:0056220d84ea | 14 | */ |
mfitzpa2 | 0:0056220d84ea | 15 | |
ADIJake | 1:d076e5ad070b | 16 | DigitalOut red_leds[] = {PB_9, PB_6, PA_8, PB_5, PC_4}; |
ADIJake | 1:d076e5ad070b | 17 | DigitalOut green_leds[] = {PA_6, PC_7, PB_10, PB_3, PB_13}; |
ADIJake | 1:d076e5ad070b | 18 | DigitalOut blue_leds[] = {PA_5, PA_7, PA_9, PB_4, PA_10}; |
mfitzpa2 | 0:0056220d84ea | 19 | |
mfitzpa2 | 0:0056220d84ea | 20 | //DigitalIn buttons[] = {PA_3, PA_2, PA_10, PB_3}; //order: easy, medium, hard, expert |
mfitzpa2 | 0:0056220d84ea | 21 | DigitalIn buttons[] = {PC_10, PC_12, PA_13, PA_14}; |
mfitzpa2 | 0:0056220d84ea | 22 | bool buttons_state[BUTTON_COUNT]; |
mfitzpa2 | 0:0056220d84ea | 23 | bool buttons_state_prev[BUTTON_COUNT] = {1, 1, 1, 1}; |
mfitzpa2 | 0:0056220d84ea | 24 | |
ADIJake | 3:1c6031fd2b93 | 25 | AnalogIn solarCells[] = {PC_1, PB_0, PA_4, PA_1, PA_0}; |
mfitzpa2 | 0:0056220d84ea | 26 | bool solarCellsState[RECEIVER_COUNT]; |
mfitzpa2 | 0:0056220d84ea | 27 | uint16_t solarCellsThreshold[RECEIVER_COUNT]; |
mfitzpa2 | 0:0056220d84ea | 28 | int active_receivers[RECEIVER_COUNT] = {0, 0, 0, 0, 0}; |
mfitzpa2 | 0:0056220d84ea | 29 | int prev_state[RECEIVER_COUNT] = {0, 0, 0, 0, 0}; |
mfitzpa2 | 0:0056220d84ea | 30 | //float initialValues[RECEIVER_COUNT]; |
mfitzpa2 | 0:0056220d84ea | 31 | |
mfitzpa2 | 0:0056220d84ea | 32 | Serial serial(PA_2, PA_3); |
mfitzpa2 | 0:0056220d84ea | 33 | //Serial serial(PA_11, PA_12); |
mfitzpa2 | 0:0056220d84ea | 34 | |
mfitzpa2 | 0:0056220d84ea | 35 | int level_static; |
mfitzpa2 | 0:0056220d84ea | 36 | |
mfitzpa2 | 0:0056220d84ea | 37 | char pcBuffer[256]; |
mfitzpa2 | 0:0056220d84ea | 38 | uint8_t pcBufferIndex = 0; |
mfitzpa2 | 0:0056220d84ea | 39 | bool messageReceived = false; |
mfitzpa2 | 0:0056220d84ea | 40 | |
mfitzpa2 | 0:0056220d84ea | 41 | enum States { |
mfitzpa2 | 0:0056220d84ea | 42 | IDLE, |
mfitzpa2 | 0:0056220d84ea | 43 | CALIBRATE, |
mfitzpa2 | 0:0056220d84ea | 44 | START, |
mfitzpa2 | 0:0056220d84ea | 45 | RUNNING, |
mfitzpa2 | 0:0056220d84ea | 46 | STOP, |
mfitzpa2 | 0:0056220d84ea | 47 | MAX_STATES |
mfitzpa2 | 0:0056220d84ea | 48 | }; |
mfitzpa2 | 0:0056220d84ea | 49 | |
ADIJake | 1:d076e5ad070b | 50 | enum States state = CALIBRATE; |
ADIJake | 1:d076e5ad070b | 51 | //enum States state = START; |
mfitzpa2 | 0:0056220d84ea | 52 | |
mfitzpa2 | 0:0056220d84ea | 53 | /* |
mfitzpa2 | 0:0056220d84ea | 54 | void callback(void) { |
mfitzpa2 | 0:0056220d84ea | 55 | pcBuffer[pcBufferIndex] = serial.getc(); |
mfitzpa2 | 0:0056220d84ea | 56 | |
mfitzpa2 | 0:0056220d84ea | 57 | if(pcBuffer[pcBufferIndex] == TERMINATOR) { |
mfitzpa2 | 0:0056220d84ea | 58 | pcBufferIndex = 0; |
mfitzpa2 | 0:0056220d84ea | 59 | messageReceived = true; |
mfitzpa2 | 0:0056220d84ea | 60 | } |
mfitzpa2 | 0:0056220d84ea | 61 | } |
mfitzpa2 | 0:0056220d84ea | 62 | */ |
mfitzpa2 | 0:0056220d84ea | 63 | |
mfitzpa2 | 0:0056220d84ea | 64 | void EnablePullups(void) { |
mfitzpa2 | 0:0056220d84ea | 65 | /* |
mfitzpa2 | 0:0056220d84ea | 66 | for (uint8_t i = 0; i > (sizeof(buttons)); i++) { |
mfitzpa2 | 0:0056220d84ea | 67 | buttons[i].mode(PullUp); |
mfitzpa2 | 0:0056220d84ea | 68 | } |
mfitzpa2 | 0:0056220d84ea | 69 | */ |
mfitzpa2 | 0:0056220d84ea | 70 | //serial.printf("Pullup functions"); |
mfitzpa2 | 0:0056220d84ea | 71 | buttons[0].mode(PullUp); |
mfitzpa2 | 0:0056220d84ea | 72 | buttons[1].mode(PullUp); |
mfitzpa2 | 0:0056220d84ea | 73 | buttons[2].mode(PullUp); |
mfitzpa2 | 0:0056220d84ea | 74 | buttons[3].mode(PullUp); |
mfitzpa2 | 0:0056220d84ea | 75 | |
mfitzpa2 | 0:0056220d84ea | 76 | } |
mfitzpa2 | 0:0056220d84ea | 77 | |
mfitzpa2 | 0:0056220d84ea | 78 | int ReadSolarCell(int index) { |
mfitzpa2 | 0:0056220d84ea | 79 | //check all analog channels and set digital channels appropriately |
mfitzpa2 | 0:0056220d84ea | 80 | //for(int i = 0; i < sizeof(solarCells); i++) { |
mfitzpa2 | 0:0056220d84ea | 81 | //find channels current value |
mfitzpa2 | 0:0056220d84ea | 82 | float meas; |
mfitzpa2 | 0:0056220d84ea | 83 | meas = solarCells[index].read(); // Converts and read the analog input value (value from 0.0 to 1.0) |
mfitzpa2 | 0:0056220d84ea | 84 | meas = meas * 3300; // Change the value to be in the 0 to 3300 range |
mfitzpa2 | 0:0056220d84ea | 85 | //serial.printf("measure %d = %.0f mV\n", index, meas); |
mfitzpa2 | 0:0056220d84ea | 86 | if (meas > solarCellsThreshold[index]) { // If the value is greater than 2V then switch the LED on |
mfitzpa2 | 0:0056220d84ea | 87 | return 1; |
mfitzpa2 | 0:0056220d84ea | 88 | } |
mfitzpa2 | 0:0056220d84ea | 89 | else { |
mfitzpa2 | 0:0056220d84ea | 90 | return 0; |
mfitzpa2 | 0:0056220d84ea | 91 | } |
mfitzpa2 | 0:0056220d84ea | 92 | //} |
mfitzpa2 | 0:0056220d84ea | 93 | } |
mfitzpa2 | 0:0056220d84ea | 94 | |
ADIJake | 1:d076e5ad070b | 95 | void PuzzleSelector(int level) { |
mfitzpa2 | 0:0056220d84ea | 96 | level_static = level; //so the level can be accessed in other functions |
mfitzpa2 | 0:0056220d84ea | 97 | |
ADIJake | 1:d076e5ad070b | 98 | for (int i = 0; i < RECEIVER_COUNT; i++) { |
ADIJake | 1:d076e5ad070b | 99 | active_receivers[i] = 0; |
ADIJake | 1:d076e5ad070b | 100 | } |
ADIJake | 1:d076e5ad070b | 101 | |
ADIJake | 1:d076e5ad070b | 102 | if (level == 2) { |
mfitzpa2 | 0:0056220d84ea | 103 | //myInt1 = rand() % (max_number + 1 - min_number) + min_number; //debug |
ADIJake | 1:d076e5ad070b | 104 | |
ADIJake | 1:d076e5ad070b | 105 | for (int i = 0; i < 1; i++) { |
ADIJake | 1:d076e5ad070b | 106 | active_receivers[i] = 1; |
ADIJake | 1:d076e5ad070b | 107 | } |
ADIJake | 1:d076e5ad070b | 108 | serial.printf("e"); |
ADIJake | 1:d076e5ad070b | 109 | } |
ADIJake | 1:d076e5ad070b | 110 | else if (level == 3) { |
ADIJake | 1:d076e5ad070b | 111 | for (int i = 0; i < 2; i++) { |
ADIJake | 1:d076e5ad070b | 112 | active_receivers[i] = 1; |
ADIJake | 1:d076e5ad070b | 113 | } |
ADIJake | 1:d076e5ad070b | 114 | serial.printf("m"); |
mfitzpa2 | 0:0056220d84ea | 115 | } |
mfitzpa2 | 0:0056220d84ea | 116 | else if (level == 1) { |
ADIJake | 1:d076e5ad070b | 117 | for (int i = 0; i < 3; i++) { |
ADIJake | 1:d076e5ad070b | 118 | active_receivers[i] = 1; |
ADIJake | 1:d076e5ad070b | 119 | } |
ADIJake | 1:d076e5ad070b | 120 | serial.printf("h"); |
mfitzpa2 | 0:0056220d84ea | 121 | } |
mfitzpa2 | 0:0056220d84ea | 122 | else { |
ADIJake | 3:1c6031fd2b93 | 123 | for (int i = 0; i < 4; i++) { |
ADIJake | 1:d076e5ad070b | 124 | active_receivers[i] = 1; |
ADIJake | 1:d076e5ad070b | 125 | } |
ADIJake | 1:d076e5ad070b | 126 | serial.printf("x"); |
mfitzpa2 | 0:0056220d84ea | 127 | } |
mfitzpa2 | 0:0056220d84ea | 128 | |
mfitzpa2 | 0:0056220d84ea | 129 | //return active_receivers; |
mfitzpa2 | 0:0056220d84ea | 130 | } |
mfitzpa2 | 0:0056220d84ea | 131 | |
ADIJake | 1:d076e5ad070b | 132 | //DigitalOut test(D0); |
ADIJake | 1:d076e5ad070b | 133 | |
mfitzpa2 | 0:0056220d84ea | 134 | int main() { |
mfitzpa2 | 0:0056220d84ea | 135 | EnablePullups(); |
mfitzpa2 | 0:0056220d84ea | 136 | |
mfitzpa2 | 0:0056220d84ea | 137 | bool buttonPressed = false; |
mfitzpa2 | 0:0056220d84ea | 138 | |
mfitzpa2 | 0:0056220d84ea | 139 | for(uint8_t i = 0; i < RECEIVER_COUNT; i++) { |
mfitzpa2 | 0:0056220d84ea | 140 | solarCellsState[i] = false; |
ADIJake | 1:d076e5ad070b | 141 | solarCellsThreshold[i] = 0; |
mfitzpa2 | 0:0056220d84ea | 142 | } |
mfitzpa2 | 0:0056220d84ea | 143 | |
mfitzpa2 | 0:0056220d84ea | 144 | while(true) { |
mfitzpa2 | 0:0056220d84ea | 145 | |
ADIJake | 1:d076e5ad070b | 146 | /*while(true) { |
ADIJake | 1:d076e5ad070b | 147 | for (uint8_t i = 0; i < 5; i++) { |
ADIJake | 1:d076e5ad070b | 148 | red_leds[i] = 1; |
ADIJake | 1:d076e5ad070b | 149 | blue_leds[i] = 0; |
ADIJake | 1:d076e5ad070b | 150 | green_leds[i] = 0; |
ADIJake | 1:d076e5ad070b | 151 | //test = 1; |
ADIJake | 1:d076e5ad070b | 152 | } |
ADIJake | 1:d076e5ad070b | 153 | }*/ |
ADIJake | 1:d076e5ad070b | 154 | |
mfitzpa2 | 0:0056220d84ea | 155 | switch(state) { |
mfitzpa2 | 0:0056220d84ea | 156 | case IDLE: { |
ADIJake | 3:1c6031fd2b93 | 157 | //serial.printf("State = IDLE\n\r"); |
ADIJake | 3:1c6031fd2b93 | 158 | while(serial.getc() != 's'); |
ADIJake | 3:1c6031fd2b93 | 159 | |
ADIJake | 3:1c6031fd2b93 | 160 | for (uint8_t i = 0; i < RECEIVER_COUNT; i++) { |
ADIJake | 3:1c6031fd2b93 | 161 | red_leds[i] = 0; |
ADIJake | 3:1c6031fd2b93 | 162 | blue_leds[i] = 0; |
ADIJake | 3:1c6031fd2b93 | 163 | green_leds[i] = 0; |
ADIJake | 3:1c6031fd2b93 | 164 | } |
ADIJake | 3:1c6031fd2b93 | 165 | |
mfitzpa2 | 0:0056220d84ea | 166 | while (buttonPressed == false) { |
mfitzpa2 | 0:0056220d84ea | 167 | for (uint8_t i = 0; i < BUTTON_COUNT; i++) { |
mfitzpa2 | 0:0056220d84ea | 168 | //serial.printf("Waiting for button...\n"); |
mfitzpa2 | 0:0056220d84ea | 169 | //while (loopcount < 100) { |
mfitzpa2 | 0:0056220d84ea | 170 | buttons_state[i] = buttons[i].read(); |
ADIJake | 1:d076e5ad070b | 171 | //serial.printf("Button %i state is %i\n\r", i, buttons_state[i]); |
ADIJake | 1:d076e5ad070b | 172 | wait(0.05); |
mfitzpa2 | 0:0056220d84ea | 173 | //loopcount = loopcount++; |
mfitzpa2 | 0:0056220d84ea | 174 | //buttonPressed = true; |
mfitzpa2 | 0:0056220d84ea | 175 | //} |
ADIJake | 1:d076e5ad070b | 176 | if (buttons_state[i] == 0) { |
ADIJake | 1:d076e5ad070b | 177 | //serial.printf("Button %i pressed\n\r", i); |
mfitzpa2 | 0:0056220d84ea | 178 | //call puzzle selector function |
mfitzpa2 | 0:0056220d84ea | 179 | PuzzleSelector(i); |
mfitzpa2 | 0:0056220d84ea | 180 | buttonPressed = true; |
mfitzpa2 | 0:0056220d84ea | 181 | } |
mfitzpa2 | 0:0056220d84ea | 182 | } |
mfitzpa2 | 0:0056220d84ea | 183 | } |
ADIJake | 1:d076e5ad070b | 184 | buttonPressed = false; |
mfitzpa2 | 0:0056220d84ea | 185 | state = START; |
mfitzpa2 | 0:0056220d84ea | 186 | break; |
mfitzpa2 | 0:0056220d84ea | 187 | } |
mfitzpa2 | 0:0056220d84ea | 188 | |
mfitzpa2 | 0:0056220d84ea | 189 | case CALIBRATE: { |
ADIJake | 1:d076e5ad070b | 190 | //serial.printf("State = CALIBRATE\n\r"); |
mfitzpa2 | 0:0056220d84ea | 191 | //calibrate to ambient light, adding offset to find the thresholds |
mfitzpa2 | 0:0056220d84ea | 192 | for(int i = 0; i < RECEIVER_COUNT; i++) { |
mfitzpa2 | 0:0056220d84ea | 193 | //serial.printf("i= %i",i); |
mfitzpa2 | 0:0056220d84ea | 194 | solarCellsThreshold[i] = (solarCells[i].read() * 3300) + OFFSET; |
ADIJake | 1:d076e5ad070b | 195 | //serial.printf("initial %d = %.0f mV\n", i, solarCellsThreshold[i]); |
mfitzpa2 | 0:0056220d84ea | 196 | } |
mfitzpa2 | 0:0056220d84ea | 197 | |
mfitzpa2 | 0:0056220d84ea | 198 | state = IDLE; |
mfitzpa2 | 0:0056220d84ea | 199 | |
mfitzpa2 | 0:0056220d84ea | 200 | break; |
mfitzpa2 | 0:0056220d84ea | 201 | } |
mfitzpa2 | 0:0056220d84ea | 202 | |
mfitzpa2 | 0:0056220d84ea | 203 | case START: { |
ADIJake | 1:d076e5ad070b | 204 | //serial.printf("State = START\n\r"); |
mfitzpa2 | 0:0056220d84ea | 205 | //serial.printf("%c", TERMINATOR); |
mfitzpa2 | 0:0056220d84ea | 206 | for (uint8_t i = 0; i < RECEIVER_COUNT; i++) { |
mfitzpa2 | 0:0056220d84ea | 207 | if (active_receivers[i] == 1) { |
mfitzpa2 | 0:0056220d84ea | 208 | red_leds[i] = 1; |
ADIJake | 1:d076e5ad070b | 209 | blue_leds[i] = 0; |
ADIJake | 1:d076e5ad070b | 210 | green_leds[i] = 0; |
ADIJake | 1:d076e5ad070b | 211 | } |
ADIJake | 1:d076e5ad070b | 212 | else { |
ADIJake | 1:d076e5ad070b | 213 | red_leds[i] = 0; |
ADIJake | 1:d076e5ad070b | 214 | blue_leds[i] = 0; |
ADIJake | 1:d076e5ad070b | 215 | green_leds[i] = 0; |
mfitzpa2 | 0:0056220d84ea | 216 | } |
mfitzpa2 | 0:0056220d84ea | 217 | } |
mfitzpa2 | 0:0056220d84ea | 218 | state = RUNNING; |
mfitzpa2 | 0:0056220d84ea | 219 | break; |
mfitzpa2 | 0:0056220d84ea | 220 | } |
mfitzpa2 | 0:0056220d84ea | 221 | |
mfitzpa2 | 0:0056220d84ea | 222 | case RUNNING: { |
ADIJake | 1:d076e5ad070b | 223 | //serial.printf("State = RUNNING\n\r"); |
mfitzpa2 | 0:0056220d84ea | 224 | // Update solarCellsState. |
mfitzpa2 | 0:0056220d84ea | 225 | for(uint8_t i = 0; i < RECEIVER_COUNT; i++) { |
ADIJake | 1:d076e5ad070b | 226 | solarCellsState[i] = 0; |
mfitzpa2 | 0:0056220d84ea | 227 | } |
mfitzpa2 | 0:0056220d84ea | 228 | |
ADIJake | 1:d076e5ad070b | 229 | for(uint8_t i = 0; i < RECEIVER_COUNT; i++) { |
ADIJake | 1:d076e5ad070b | 230 | if(active_receivers[i]) { |
ADIJake | 1:d076e5ad070b | 231 | //solarCellsState[i] = (solarCells[i].read() >= solarCellsThreshold[i]); |
ADIJake | 1:d076e5ad070b | 232 | solarCellsState[i] = ReadSolarCell(i); |
ADIJake | 1:d076e5ad070b | 233 | green_leds[i] = solarCellsState[i]; |
ADIJake | 1:d076e5ad070b | 234 | red_leds[i] = !solarCellsState[i]; |
ADIJake | 1:d076e5ad070b | 235 | } |
mfitzpa2 | 0:0056220d84ea | 236 | } |
ADIJake | 1:d076e5ad070b | 237 | bool test = 1; |
mfitzpa2 | 0:0056220d84ea | 238 | for(uint8_t i = 0; i < RECEIVER_COUNT; i++) { |
ADIJake | 1:d076e5ad070b | 239 | test &= (active_receivers[i] == solarCellsState[i]); |
mfitzpa2 | 0:0056220d84ea | 240 | } |
ADIJake | 1:d076e5ad070b | 241 | if(test == 1) { |
ADIJake | 1:d076e5ad070b | 242 | state = STOP; |
mfitzpa2 | 0:0056220d84ea | 243 | } |
mfitzpa2 | 0:0056220d84ea | 244 | break; |
mfitzpa2 | 0:0056220d84ea | 245 | } |
ADIJake | 1:d076e5ad070b | 246 | case STOP: { |
mfitzpa2 | 0:0056220d84ea | 247 | |
ADIJake | 1:d076e5ad070b | 248 | serial.printf("z"); |
mfitzpa2 | 0:0056220d84ea | 249 | state = IDLE; |
mfitzpa2 | 0:0056220d84ea | 250 | break; |
mfitzpa2 | 0:0056220d84ea | 251 | } |
mfitzpa2 | 0:0056220d84ea | 252 | |
mfitzpa2 | 0:0056220d84ea | 253 | default: { |
mfitzpa2 | 0:0056220d84ea | 254 | break; |
mfitzpa2 | 0:0056220d84ea | 255 | } |
ADIJake | 1:d076e5ad070b | 256 | } |
mfitzpa2 | 0:0056220d84ea | 257 | } //while loop parethesis |
mfitzpa2 | 0:0056220d84ea | 258 | } //main parenthesis |
mfitzpa2 | 0:0056220d84ea | 259 |