Laserzsssss

Dependencies:   mbed

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?

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