Dependencies: PixelArray WS2812 mbed
[OLD - NOT FINISHED CODE]
Final code for the Pong Table Code can be found here: https://developer.mbed.org/teams/ASE/code/frdm_pong_table_controller/
main.cpp@1:58c735e369b1, 2017-02-22 (annotated)
- Committer:
- benswindell
- Date:
- Wed Feb 22 11:44:36 2017 +0000
- Revision:
- 1:58c735e369b1
- Parent:
- 0:e610b1d38e80
Added code for sensors and a second goal array;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
benswindell | 1:58c735e369b1 | 1 | |
alikin01 | 0:e610b1d38e80 | 2 | #include "mbed.h" |
alikin01 | 0:e610b1d38e80 | 3 | #include "WS2812.h" |
alikin01 | 0:e610b1d38e80 | 4 | #include "PixelArray.h" |
alikin01 | 0:e610b1d38e80 | 5 | |
alikin01 | 0:e610b1d38e80 | 6 | Serial pc(USBTX, USBRX); |
benswindell | 1:58c735e369b1 | 7 | DigitalOut led_green(LED_GREEN, 1); |
benswindell | 1:58c735e369b1 | 8 | AnalogIn sensor1(PTB2); |
benswindell | 1:58c735e369b1 | 9 | AnalogIn sensor2(A0); |
alikin01 | 0:e610b1d38e80 | 10 | |
alikin01 | 0:e610b1d38e80 | 11 | |
alikin01 | 0:e610b1d38e80 | 12 | #define WS2812_BUF 112 |
alikin01 | 0:e610b1d38e80 | 13 | #define NUM_COLORS 6 |
alikin01 | 0:e610b1d38e80 | 14 | #define NUM_LEDS_PER_COLOR 1 |
alikin01 | 0:e610b1d38e80 | 15 | |
alikin01 | 0:e610b1d38e80 | 16 | //-------- Colours ----------- |
alikin01 | 0:e610b1d38e80 | 17 | #define RED 0x2f0000 |
alikin01 | 0:e610b1d38e80 | 18 | #define YELLOW 0x2f2f00 |
benswindell | 1:58c735e369b1 | 19 | #define GREEN 0x002f00 // Player has conceded a goal |
alikin01 | 0:e610b1d38e80 | 20 | #define LIGHTBLUE 0x002f2f |
benswindell | 1:58c735e369b1 | 21 | #define DARKBLUE 0x00002f // Player scored a goal |
alikin01 | 0:e610b1d38e80 | 22 | #define PINK 0x2f002f |
alikin01 | 0:e610b1d38e80 | 23 | #define OFF 0x000000 |
alikin01 | 0:e610b1d38e80 | 24 | #define WHITE 0xffffff |
alikin01 | 0:e610b1d38e80 | 25 | #define ARMBLUE 0x128BAB |
alikin01 | 0:e610b1d38e80 | 26 | |
benswindell | 1:58c735e369b1 | 27 | // Parameters |
benswindell | 1:58c735e369b1 | 28 | const int READ_FREQUENCY = 20; |
benswindell | 1:58c735e369b1 | 29 | const int BUFFER_SIZE = 2*READ_FREQUENCY; // in seconds |
benswindell | 1:58c735e369b1 | 30 | const float VOLTAGE_REF = 5.000f; // V |
benswindell | 1:58c735e369b1 | 31 | const int DEVIATION = 100; // mV |
benswindell | 1:58c735e369b1 | 32 | const int DEFAULT_DATA = -1; |
alikin01 | 0:e610b1d38e80 | 33 | |
alikin01 | 0:e610b1d38e80 | 34 | bool seg1A, seg1B, seg1C, seg1D, seg1E, seg1F, seg1G; |
alikin01 | 0:e610b1d38e80 | 35 | int seg1Array[112]; |
benswindell | 1:58c735e369b1 | 36 | int MainArray[11][122]; |
alikin01 | 0:e610b1d38e80 | 37 | |
alikin01 | 0:e610b1d38e80 | 38 | //void write_8Seg(int num); |
alikin01 | 0:e610b1d38e80 | 39 | PixelArray px(WS2812_BUF); |
alikin01 | 0:e610b1d38e80 | 40 | |
alikin01 | 0:e610b1d38e80 | 41 | // See the program page for information on the timing numbers |
alikin01 | 0:e610b1d38e80 | 42 | // The given numbers are for the K64F |
alikin01 | 0:e610b1d38e80 | 43 | WS2812 ws(D9, WS2812_BUF, 0, 5, 5, 0); |
benswindell | 1:58c735e369b1 | 44 | WS2812 ws2(D8,WS2812_BUF, 0, 5, 5, 0); |
benswindell | 1:58c735e369b1 | 45 | WS2812 ws3(D7,WS2812_BUF, 0, 5, 5, 0); |
benswindell | 1:58c735e369b1 | 46 | WS2812 ws4(D6,WS2812_BUF, 0, 5, 5, 0); |
alikin01 | 0:e610b1d38e80 | 47 | |
alikin01 | 0:e610b1d38e80 | 48 | |
benswindell | 1:58c735e369b1 | 49 | // Score counters |
benswindell | 1:58c735e369b1 | 50 | int p1Score; |
benswindell | 1:58c735e369b1 | 51 | int p2Score; |
benswindell | 1:58c735e369b1 | 52 | int ScoreLimit = 5; |
benswindell | 1:58c735e369b1 | 53 | bool FinishedGame = false; |
benswindell | 1:58c735e369b1 | 54 | int EndFlashes = 0; |
benswindell | 1:58c735e369b1 | 55 | int NumFlashes; |
benswindell | 1:58c735e369b1 | 56 | |
benswindell | 1:58c735e369b1 | 57 | // Create timers |
benswindell | 1:58c735e369b1 | 58 | Ticker pollTicker1; |
benswindell | 1:58c735e369b1 | 59 | Ticker pollTicker2; |
benswindell | 1:58c735e369b1 | 60 | Timer t; |
benswindell | 1:58c735e369b1 | 61 | |
benswindell | 1:58c735e369b1 | 62 | int readings[BUFFER_SIZE]; // array of readings |
benswindell | 1:58c735e369b1 | 63 | int reading = 0; // index into above |
benswindell | 1:58c735e369b1 | 64 | int min = DEFAULT_DATA; |
benswindell | 1:58c735e369b1 | 65 | int max = DEFAULT_DATA; |
benswindell | 1:58c735e369b1 | 66 | int average = DEFAULT_DATA; |
benswindell | 1:58c735e369b1 | 67 | |
benswindell | 1:58c735e369b1 | 68 | void readSensor(); |
benswindell | 1:58c735e369b1 | 69 | void handleGoal(); |
benswindell | 1:58c735e369b1 | 70 | void reset(); |
benswindell | 1:58c735e369b1 | 71 | |
benswindell | 1:58c735e369b1 | 72 | void setup() |
benswindell | 1:58c735e369b1 | 73 | { |
benswindell | 1:58c735e369b1 | 74 | // Turn on green LED |
benswindell | 1:58c735e369b1 | 75 | led_green = 1; |
benswindell | 1:58c735e369b1 | 76 | |
benswindell | 1:58c735e369b1 | 77 | // Fills 2D array with data |
benswindell | 1:58c735e369b1 | 78 | for(int i=0; i<10; i++) { |
benswindell | 1:58c735e369b1 | 79 | write_7Seg(i); |
benswindell | 1:58c735e369b1 | 80 | } |
benswindell | 1:58c735e369b1 | 81 | |
benswindell | 1:58c735e369b1 | 82 | p1Score = 0; |
benswindell | 1:58c735e369b1 | 83 | p2Score = 0; |
benswindell | 1:58c735e369b1 | 84 | NumFlashes = 0; |
alikin01 | 0:e610b1d38e80 | 85 | |
benswindell | 1:58c735e369b1 | 86 | // Set LEDS to start values |
benswindell | 1:58c735e369b1 | 87 | write_pbbuf(p1Score); |
benswindell | 1:58c735e369b1 | 88 | write_pbbuf2(p2Score); |
benswindell | 1:58c735e369b1 | 89 | write_goal1(WHITE); |
benswindell | 1:58c735e369b1 | 90 | write_goal2(WHITE); |
benswindell | 1:58c735e369b1 | 91 | wait_ms(1000); |
benswindell | 1:58c735e369b1 | 92 | write_goal1(OFF); |
benswindell | 1:58c735e369b1 | 93 | write_goal2(OFF); |
benswindell | 1:58c735e369b1 | 94 | |
benswindell | 1:58c735e369b1 | 95 | // Fill buffer with default data |
benswindell | 1:58c735e369b1 | 96 | for (int i=0; i<BUFFER_SIZE; i++) { |
benswindell | 1:58c735e369b1 | 97 | readings[i] = DEFAULT_DATA; |
benswindell | 1:58c735e369b1 | 98 | } |
benswindell | 1:58c735e369b1 | 99 | |
benswindell | 1:58c735e369b1 | 100 | pollTicker1.attach(&readSensor1,(float)1/READ_FREQUENCY); |
benswindell | 1:58c735e369b1 | 101 | pollTicker2.attach(&readSensor2,(float)1/READ_FREQUENCY); |
benswindell | 1:58c735e369b1 | 102 | |
benswindell | 1:58c735e369b1 | 103 | // Turn off green LED |
benswindell | 1:58c735e369b1 | 104 | led_green = 0; |
benswindell | 1:58c735e369b1 | 105 | } |
benswindell | 1:58c735e369b1 | 106 | |
benswindell | 1:58c735e369b1 | 107 | // Set segment variables |
benswindell | 1:58c735e369b1 | 108 | void write_7Seg(int num) |
benswindell | 1:58c735e369b1 | 109 | { |
benswindell | 1:58c735e369b1 | 110 | switch (num) { |
benswindell | 1:58c735e369b1 | 111 | case 0 : |
benswindell | 1:58c735e369b1 | 112 | // Off |
benswindell | 1:58c735e369b1 | 113 | seg1A = 1; |
benswindell | 1:58c735e369b1 | 114 | seg1B = 1; |
benswindell | 1:58c735e369b1 | 115 | seg1C = 1; |
benswindell | 1:58c735e369b1 | 116 | seg1D = 1; |
benswindell | 1:58c735e369b1 | 117 | seg1E = 1; |
benswindell | 1:58c735e369b1 | 118 | seg1F = 1; |
benswindell | 1:58c735e369b1 | 119 | seg1G = 0; |
benswindell | 1:58c735e369b1 | 120 | |
benswindell | 1:58c735e369b1 | 121 | setLEDArray(0); |
benswindell | 1:58c735e369b1 | 122 | |
alikin01 | 0:e610b1d38e80 | 123 | break; |
benswindell | 1:58c735e369b1 | 124 | |
benswindell | 1:58c735e369b1 | 125 | case 1 : |
alikin01 | 0:e610b1d38e80 | 126 | // 1 |
alikin01 | 0:e610b1d38e80 | 127 | seg1A = 0; |
alikin01 | 0:e610b1d38e80 | 128 | seg1B = 1; |
alikin01 | 0:e610b1d38e80 | 129 | seg1C = 1; |
alikin01 | 0:e610b1d38e80 | 130 | seg1D = 0; |
alikin01 | 0:e610b1d38e80 | 131 | seg1E = 0; |
alikin01 | 0:e610b1d38e80 | 132 | seg1F = 0; |
benswindell | 1:58c735e369b1 | 133 | seg1G = 0; |
alikin01 | 0:e610b1d38e80 | 134 | |
benswindell | 1:58c735e369b1 | 135 | setLEDArray(1); |
alikin01 | 0:e610b1d38e80 | 136 | break; |
benswindell | 1:58c735e369b1 | 137 | |
benswindell | 1:58c735e369b1 | 138 | case 2 : |
alikin01 | 0:e610b1d38e80 | 139 | // 2 |
alikin01 | 0:e610b1d38e80 | 140 | seg1A = 1; |
alikin01 | 0:e610b1d38e80 | 141 | seg1B = 1; |
alikin01 | 0:e610b1d38e80 | 142 | seg1C = 0; |
alikin01 | 0:e610b1d38e80 | 143 | seg1D = 1; |
alikin01 | 0:e610b1d38e80 | 144 | seg1E = 1; |
alikin01 | 0:e610b1d38e80 | 145 | seg1F = 0; |
benswindell | 1:58c735e369b1 | 146 | seg1G = 1; |
alikin01 | 0:e610b1d38e80 | 147 | |
benswindell | 1:58c735e369b1 | 148 | setLEDArray(2); |
benswindell | 1:58c735e369b1 | 149 | |
alikin01 | 0:e610b1d38e80 | 150 | break; |
benswindell | 1:58c735e369b1 | 151 | |
alikin01 | 0:e610b1d38e80 | 152 | case 3 : |
alikin01 | 0:e610b1d38e80 | 153 | // 3 |
alikin01 | 0:e610b1d38e80 | 154 | seg1A = 1; |
alikin01 | 0:e610b1d38e80 | 155 | seg1B = 1; |
alikin01 | 0:e610b1d38e80 | 156 | seg1C = 1; |
alikin01 | 0:e610b1d38e80 | 157 | seg1D = 1; |
alikin01 | 0:e610b1d38e80 | 158 | seg1E = 0; |
alikin01 | 0:e610b1d38e80 | 159 | seg1F = 0; |
alikin01 | 0:e610b1d38e80 | 160 | seg1G = 1; |
alikin01 | 0:e610b1d38e80 | 161 | |
benswindell | 1:58c735e369b1 | 162 | setLEDArray(3); |
alikin01 | 0:e610b1d38e80 | 163 | break; |
benswindell | 1:58c735e369b1 | 164 | |
alikin01 | 0:e610b1d38e80 | 165 | case 4: |
alikin01 | 0:e610b1d38e80 | 166 | // 4 |
alikin01 | 0:e610b1d38e80 | 167 | seg1A = 0; |
alikin01 | 0:e610b1d38e80 | 168 | seg1B = 1; |
alikin01 | 0:e610b1d38e80 | 169 | seg1C = 1; |
alikin01 | 0:e610b1d38e80 | 170 | seg1D = 0; |
alikin01 | 0:e610b1d38e80 | 171 | seg1E = 0; |
alikin01 | 0:e610b1d38e80 | 172 | seg1F = 1; |
benswindell | 1:58c735e369b1 | 173 | seg1G = 1; |
alikin01 | 0:e610b1d38e80 | 174 | |
benswindell | 1:58c735e369b1 | 175 | setLEDArray(4); |
benswindell | 1:58c735e369b1 | 176 | |
alikin01 | 0:e610b1d38e80 | 177 | break; |
benswindell | 1:58c735e369b1 | 178 | |
alikin01 | 0:e610b1d38e80 | 179 | case 5: |
alikin01 | 0:e610b1d38e80 | 180 | // 5 |
alikin01 | 0:e610b1d38e80 | 181 | seg1A = 1; |
alikin01 | 0:e610b1d38e80 | 182 | seg1B = 0; |
alikin01 | 0:e610b1d38e80 | 183 | seg1C = 1; |
alikin01 | 0:e610b1d38e80 | 184 | seg1D = 1; |
alikin01 | 0:e610b1d38e80 | 185 | seg1E = 0; |
alikin01 | 0:e610b1d38e80 | 186 | seg1F = 1; |
benswindell | 1:58c735e369b1 | 187 | seg1G = 1; |
alikin01 | 0:e610b1d38e80 | 188 | |
benswindell | 1:58c735e369b1 | 189 | setLEDArray(5); |
benswindell | 1:58c735e369b1 | 190 | |
alikin01 | 0:e610b1d38e80 | 191 | break; |
benswindell | 1:58c735e369b1 | 192 | |
alikin01 | 0:e610b1d38e80 | 193 | case 6: |
alikin01 | 0:e610b1d38e80 | 194 | // 6 |
alikin01 | 0:e610b1d38e80 | 195 | seg1A = 1; |
alikin01 | 0:e610b1d38e80 | 196 | seg1B = 0; |
alikin01 | 0:e610b1d38e80 | 197 | seg1C = 1; |
alikin01 | 0:e610b1d38e80 | 198 | seg1D = 1; |
alikin01 | 0:e610b1d38e80 | 199 | seg1E = 1; |
alikin01 | 0:e610b1d38e80 | 200 | seg1F = 1; |
alikin01 | 0:e610b1d38e80 | 201 | seg1G = 1; |
benswindell | 1:58c735e369b1 | 202 | |
benswindell | 1:58c735e369b1 | 203 | setLEDArray(6); |
alikin01 | 0:e610b1d38e80 | 204 | |
alikin01 | 0:e610b1d38e80 | 205 | break; |
benswindell | 1:58c735e369b1 | 206 | |
alikin01 | 0:e610b1d38e80 | 207 | case 7: |
alikin01 | 0:e610b1d38e80 | 208 | // 7 |
alikin01 | 0:e610b1d38e80 | 209 | seg1A = 1; |
alikin01 | 0:e610b1d38e80 | 210 | seg1B = 1; |
alikin01 | 0:e610b1d38e80 | 211 | seg1C = 1; |
alikin01 | 0:e610b1d38e80 | 212 | seg1D = 0; |
alikin01 | 0:e610b1d38e80 | 213 | seg1E = 0; |
alikin01 | 0:e610b1d38e80 | 214 | seg1F = 0; |
benswindell | 1:58c735e369b1 | 215 | seg1G = 0; |
alikin01 | 0:e610b1d38e80 | 216 | |
benswindell | 1:58c735e369b1 | 217 | setLEDArray(7); |
benswindell | 1:58c735e369b1 | 218 | |
alikin01 | 0:e610b1d38e80 | 219 | break; |
benswindell | 1:58c735e369b1 | 220 | |
alikin01 | 0:e610b1d38e80 | 221 | case 8: |
alikin01 | 0:e610b1d38e80 | 222 | // 8 |
alikin01 | 0:e610b1d38e80 | 223 | seg1A = 1; |
alikin01 | 0:e610b1d38e80 | 224 | seg1B = 1; |
alikin01 | 0:e610b1d38e80 | 225 | seg1C = 1; |
alikin01 | 0:e610b1d38e80 | 226 | seg1D = 1; |
alikin01 | 0:e610b1d38e80 | 227 | seg1E = 1; |
alikin01 | 0:e610b1d38e80 | 228 | seg1F = 1; |
benswindell | 1:58c735e369b1 | 229 | seg1G = 1; |
alikin01 | 0:e610b1d38e80 | 230 | |
benswindell | 1:58c735e369b1 | 231 | setLEDArray(8); |
alikin01 | 0:e610b1d38e80 | 232 | break; |
benswindell | 1:58c735e369b1 | 233 | |
alikin01 | 0:e610b1d38e80 | 234 | case 9: |
alikin01 | 0:e610b1d38e80 | 235 | // 9 |
alikin01 | 0:e610b1d38e80 | 236 | seg1A = 1; |
alikin01 | 0:e610b1d38e80 | 237 | seg1B = 1; |
alikin01 | 0:e610b1d38e80 | 238 | seg1C = 1; |
alikin01 | 0:e610b1d38e80 | 239 | seg1D = 0; |
alikin01 | 0:e610b1d38e80 | 240 | seg1E = 0; |
alikin01 | 0:e610b1d38e80 | 241 | seg1F = 1; |
benswindell | 1:58c735e369b1 | 242 | seg1G = 1; |
benswindell | 1:58c735e369b1 | 243 | |
benswindell | 1:58c735e369b1 | 244 | setLEDArray(9); |
benswindell | 1:58c735e369b1 | 245 | break; |
benswindell | 1:58c735e369b1 | 246 | |
benswindell | 1:58c735e369b1 | 247 | case 10: |
benswindell | 1:58c735e369b1 | 248 | // OFF |
benswindell | 1:58c735e369b1 | 249 | seg1A = 0; |
benswindell | 1:58c735e369b1 | 250 | seg1B = 0; |
benswindell | 1:58c735e369b1 | 251 | seg1C = 0; |
benswindell | 1:58c735e369b1 | 252 | seg1D = 0; |
benswindell | 1:58c735e369b1 | 253 | seg1E = 0; |
benswindell | 1:58c735e369b1 | 254 | seg1F = 0; |
benswindell | 1:58c735e369b1 | 255 | seg1G = 0; |
benswindell | 1:58c735e369b1 | 256 | |
benswindell | 1:58c735e369b1 | 257 | setLEDArray(10); |
benswindell | 1:58c735e369b1 | 258 | break; |
benswindell | 1:58c735e369b1 | 259 | |
benswindell | 1:58c735e369b1 | 260 | default : |
benswindell | 1:58c735e369b1 | 261 | |
benswindell | 1:58c735e369b1 | 262 | break; |
benswindell | 1:58c735e369b1 | 263 | |
benswindell | 1:58c735e369b1 | 264 | } |
benswindell | 1:58c735e369b1 | 265 | } |
benswindell | 1:58c735e369b1 | 266 | |
benswindell | 1:58c735e369b1 | 267 | // Write segment config to main array |
benswindell | 1:58c735e369b1 | 268 | void setLEDArray(int x) |
benswindell | 1:58c735e369b1 | 269 | { |
benswindell | 1:58c735e369b1 | 270 | for (int i = 0; i < WS2812_BUF; i++) { |
benswindell | 1:58c735e369b1 | 271 | if (i < 16) { |
benswindell | 1:58c735e369b1 | 272 | MainArray[x][i] = seg1A; |
benswindell | 1:58c735e369b1 | 273 | } |
benswindell | 1:58c735e369b1 | 274 | |
benswindell | 1:58c735e369b1 | 275 | if ( i >= 16 && i < 32) { |
benswindell | 1:58c735e369b1 | 276 | MainArray[x][i] = seg1B; |
benswindell | 1:58c735e369b1 | 277 | } |
benswindell | 1:58c735e369b1 | 278 | |
benswindell | 1:58c735e369b1 | 279 | if (i >= 32 && i < 48) { |
benswindell | 1:58c735e369b1 | 280 | MainArray[x][i] = seg1C; |
benswindell | 1:58c735e369b1 | 281 | } |
benswindell | 1:58c735e369b1 | 282 | |
benswindell | 1:58c735e369b1 | 283 | if (i >= 48 && i < 64) { |
benswindell | 1:58c735e369b1 | 284 | MainArray[x][i]= seg1D; |
benswindell | 1:58c735e369b1 | 285 | } |
benswindell | 1:58c735e369b1 | 286 | |
benswindell | 1:58c735e369b1 | 287 | if ( i >= 64 && i < 80) { |
benswindell | 1:58c735e369b1 | 288 | MainArray[x][i] = seg1E; |
benswindell | 1:58c735e369b1 | 289 | } |
alikin01 | 0:e610b1d38e80 | 290 | |
benswindell | 1:58c735e369b1 | 291 | if (i >= 80 && i < 96) { |
benswindell | 1:58c735e369b1 | 292 | MainArray[x][i] = seg1F; |
benswindell | 1:58c735e369b1 | 293 | } |
benswindell | 1:58c735e369b1 | 294 | |
benswindell | 1:58c735e369b1 | 295 | if ( i >= 96 && i < 112) { |
benswindell | 1:58c735e369b1 | 296 | MainArray[x][i] = seg1G; |
benswindell | 1:58c735e369b1 | 297 | } |
benswindell | 1:58c735e369b1 | 298 | }// FOR LOOP |
benswindell | 1:58c735e369b1 | 299 | } |
benswindell | 1:58c735e369b1 | 300 | |
benswindell | 1:58c735e369b1 | 301 | // Write to player 1 LED (ROBOT) |
benswindell | 1:58c735e369b1 | 302 | void write_pbbuf(int line_num) |
benswindell | 1:58c735e369b1 | 303 | { |
benswindell | 1:58c735e369b1 | 304 | write_px(line_num); |
benswindell | 1:58c735e369b1 | 305 | ws.write(px.getBuf()); |
benswindell | 1:58c735e369b1 | 306 | } |
benswindell | 1:58c735e369b1 | 307 | |
benswindell | 1:58c735e369b1 | 308 | // Write to player 2 LED (HUMAN) |
benswindell | 1:58c735e369b1 | 309 | void write_pbbuf2(int line_num) |
benswindell | 1:58c735e369b1 | 310 | { |
benswindell | 1:58c735e369b1 | 311 | write_px(line_num); |
benswindell | 1:58c735e369b1 | 312 | ws2.write(px2.getBuf()); |
benswindell | 1:58c735e369b1 | 313 | } |
benswindell | 1:58c735e369b1 | 314 | |
benswindell | 1:58c735e369b1 | 315 | // Write pixel array |
benswindell | 1:58c735e369b1 | 316 | void write_px(int line_num) |
benswindell | 1:58c735e369b1 | 317 | { |
benswindell | 1:58c735e369b1 | 318 | for (int i = 0; i < WS2812_BUF; i++) { |
benswindell | 1:58c735e369b1 | 319 | if (MainArray[line_num][i] == 0) { |
benswindell | 1:58c735e369b1 | 320 | px.Set(i,OFF); |
benswindell | 1:58c735e369b1 | 321 | } |
benswindell | 1:58c735e369b1 | 322 | |
benswindell | 1:58c735e369b1 | 323 | if (MainArray[line_num][i] == 1) { |
benswindell | 1:58c735e369b1 | 324 | px.Set(i,LIGHTBLUE); |
benswindell | 1:58c735e369b1 | 325 | } |
benswindell | 1:58c735e369b1 | 326 | } |
benswindell | 1:58c735e369b1 | 327 | } |
benswindell | 1:58c735e369b1 | 328 | |
benswindell | 1:58c735e369b1 | 329 | // Read goal sensor 1 (ROBOT) |
benswindell | 1:58c735e369b1 | 330 | void readSensor1() |
benswindell | 1:58c735e369b1 | 331 | { |
benswindell | 1:58c735e369b1 | 332 | // Convert readings to mV |
benswindell | 1:58c735e369b1 | 333 | readings[reading] = (int)(sensor1.read() * 1000 * VOLTAGE_REF); |
benswindell | 1:58c735e369b1 | 334 | analyseReadings(0); |
benswindell | 1:58c735e369b1 | 335 | } |
benswindell | 1:58c735e369b1 | 336 | |
benswindell | 1:58c735e369b1 | 337 | // Read goal sensor 2 (HUMAN) |
benswindell | 1:58c735e369b1 | 338 | void readSensor2() |
benswindell | 1:58c735e369b1 | 339 | { |
benswindell | 1:58c735e369b1 | 340 | // Convert readings to mV |
benswindell | 1:58c735e369b1 | 341 | readings[reading] = (int)(sensor2.read() * 1000 * VOLTAGE_REF); |
benswindell | 1:58c735e369b1 | 342 | analyseReadings(1); |
alikin01 | 0:e610b1d38e80 | 343 | } |
alikin01 | 0:e610b1d38e80 | 344 | |
benswindell | 1:58c735e369b1 | 345 | // Analyse sensor readings |
benswindell | 1:58c735e369b1 | 346 | void analyseReadings(bool player) |
benswindell | 1:58c735e369b1 | 347 | { |
benswindell | 1:58c735e369b1 | 348 | min = DEFAULT_DATA; |
benswindell | 1:58c735e369b1 | 349 | max = DEFAULT_DATA; |
benswindell | 1:58c735e369b1 | 350 | int sum = 0; |
benswindell | 1:58c735e369b1 | 351 | int count = 0; |
benswindell | 1:58c735e369b1 | 352 | |
benswindell | 1:58c735e369b1 | 353 | for (int i=0; i<BUFFER_SIZE; i++) { |
benswindell | 1:58c735e369b1 | 354 | if (readings[i] == DEFAULT_DATA) { |
benswindell | 1:58c735e369b1 | 355 | // ignore default values |
benswindell | 1:58c735e369b1 | 356 | break; |
benswindell | 1:58c735e369b1 | 357 | } |
benswindell | 1:58c735e369b1 | 358 | |
benswindell | 1:58c735e369b1 | 359 | if ((min == DEFAULT_DATA) || (readings[i] < min)) { |
benswindell | 1:58c735e369b1 | 360 | min = readings[i]; |
benswindell | 1:58c735e369b1 | 361 | } |
benswindell | 1:58c735e369b1 | 362 | |
benswindell | 1:58c735e369b1 | 363 | if ((max == DEFAULT_DATA) || (readings[i] > max)) { |
benswindell | 1:58c735e369b1 | 364 | max = readings[i]; |
benswindell | 1:58c735e369b1 | 365 | } |
benswindell | 1:58c735e369b1 | 366 | |
benswindell | 1:58c735e369b1 | 367 | sum += readings[i]; |
benswindell | 1:58c735e369b1 | 368 | count++; |
benswindell | 1:58c735e369b1 | 369 | } |
benswindell | 1:58c735e369b1 | 370 | |
benswindell | 1:58c735e369b1 | 371 | if (count == 0) { |
benswindell | 1:58c735e369b1 | 372 | // No data yet |
benswindell | 1:58c735e369b1 | 373 | return; |
benswindell | 1:58c735e369b1 | 374 | } |
benswindell | 1:58c735e369b1 | 375 | |
benswindell | 1:58c735e369b1 | 376 | average = sum/count; |
benswindell | 1:58c735e369b1 | 377 | |
benswindell | 1:58c735e369b1 | 378 | // Goal detected if current reading deviates from average by more than 'deviation' |
benswindell | 1:58c735e369b1 | 379 | if ((readings[reading] < (average - DEVIATION)) || (readings[reading] > (average + DEVIATION))) { |
benswindell | 1:58c735e369b1 | 380 | incrementScore(!player); // Increase player score opposite the player whose goal's sensor reported a goal |
benswindell | 1:58c735e369b1 | 381 | } |
benswindell | 1:58c735e369b1 | 382 | |
benswindell | 1:58c735e369b1 | 383 | reading = (reading + 1) % BUFFER_SIZE; |
benswindell | 1:58c735e369b1 | 384 | } |
benswindell | 1:58c735e369b1 | 385 | |
benswindell | 1:58c735e369b1 | 386 | // Increment score |
benswindell | 1:58c735e369b1 | 387 | void incrementScore(bool isPlayer1) |
benswindell | 1:58c735e369b1 | 388 | { |
benswindell | 1:58c735e369b1 | 389 | // Player 1 sensor reported goal, increase player 2 score |
benswindell | 1:58c735e369b1 | 390 | if(isPlayer1 == 1) { |
benswindell | 1:58c735e369b1 | 391 | if(p2Score < ScoreLimit) { |
benswindell | 1:58c735e369b1 | 392 | p2Score++; |
benswindell | 1:58c735e369b1 | 393 | write_goal(GREEN, isPlayer1); |
benswindell | 1:58c735e369b1 | 394 | write_goal(DARKBLUE, !isPlayer1); |
benswindell | 1:58c735e369b1 | 395 | t.start(); |
benswindell | 1:58c735e369b1 | 396 | } else if(Score == ScoreLimit) { |
benswindell | 1:58c735e369b1 | 397 | FinishedGame = true; |
benswindell | 1:58c735e369b1 | 398 | } |
benswindell | 1:58c735e369b1 | 399 | |
benswindell | 1:58c735e369b1 | 400 | write_pbbuf2(p2Score); |
benswindell | 1:58c735e369b1 | 401 | |
benswindell | 1:58c735e369b1 | 402 | } |
benswindell | 1:58c735e369b1 | 403 | |
benswindell | 1:58c735e369b1 | 404 | // Player 2 sensor reported goal, increase player 1 score |
benswindell | 1:58c735e369b1 | 405 | if(isPlayer1 == 0) { |
benswindell | 1:58c735e369b1 | 406 | if(p1Score < ScoreLimit) { |
benswindell | 1:58c735e369b1 | 407 | p1Score++; |
benswindell | 1:58c735e369b1 | 408 | write_goal(DARKBLUE,isPlayer1); |
benswindell | 1:58c735e369b1 | 409 | write_goal(GREEN,!isPlayer1); |
benswindell | 1:58c735e369b1 | 410 | t.start(); |
benswindell | 1:58c735e369b1 | 411 | } else if(p1Score == ScoreLimit) { |
benswindell | 1:58c735e369b1 | 412 | FinishedGame = true; |
benswindell | 1:58c735e369b1 | 413 | } |
benswindell | 1:58c735e369b1 | 414 | |
benswindell | 1:58c735e369b1 | 415 | write_pbbuf(p1Score); |
benswindell | 1:58c735e369b1 | 416 | } |
benswindell | 1:58c735e369b1 | 417 | t.start(); |
benswindell | 1:58c735e369b1 | 418 | } |
benswindell | 1:58c735e369b1 | 419 | |
benswindell | 1:58c735e369b1 | 420 | // Write goal LED |
benswindell | 1:58c735e369b1 | 421 | void write_goal(unsigned int Colour, bool player1Goal) |
benswindell | 1:58c735e369b1 | 422 | { |
benswindell | 1:58c735e369b1 | 423 | for (int i = 0; i < WS2812_BUF; i++) { |
benswindell | 1:58c735e369b1 | 424 | px.Set(i,Colour); |
benswindell | 1:58c735e369b1 | 425 | } |
benswindell | 1:58c735e369b1 | 426 | |
benswindell | 1:58c735e369b1 | 427 | if(player1Goal == 1) { |
benswindell | 1:58c735e369b1 | 428 | ws4.write(px.getBuf()); |
benswindell | 1:58c735e369b1 | 429 | } else if (player1Goal == 0) { |
benswindell | 1:58c735e369b1 | 430 | ws3.write(px.getBuf()); |
benswindell | 1:58c735e369b1 | 431 | } |
benswindell | 1:58c735e369b1 | 432 | |
benswindell | 1:58c735e369b1 | 433 | } |
benswindell | 1:58c735e369b1 | 434 | |
benswindell | 1:58c735e369b1 | 435 | // Turn off goal LEDS |
benswindell | 1:58c735e369b1 | 436 | void turn_off_goal(unsigned int Colour) |
benswindell | 1:58c735e369b1 | 437 | { |
benswindell | 1:58c735e369b1 | 438 | for (int i = 0; i < WS2812_BUF; i++) { |
benswindell | 1:58c735e369b1 | 439 | px.Set(i,Colour); |
benswindell | 1:58c735e369b1 | 440 | } |
benswindell | 1:58c735e369b1 | 441 | ws4.write(px.getBuf()); |
benswindell | 1:58c735e369b1 | 442 | |
benswindell | 1:58c735e369b1 | 443 | for (int i = 0; i < WS2812_BUF; i++) { |
benswindell | 1:58c735e369b1 | 444 | px.Set(i,Colour); |
benswindell | 1:58c735e369b1 | 445 | } |
benswindell | 1:58c735e369b1 | 446 | ws4.write(px.getBuf()); |
alikin01 | 0:e610b1d38e80 | 447 | } |
alikin01 | 0:e610b1d38e80 | 448 | |
alikin01 | 0:e610b1d38e80 | 449 | |
benswindell | 1:58c735e369b1 | 450 | int main() |
benswindell | 1:58c735e369b1 | 451 | { |
benswindell | 1:58c735e369b1 | 452 | // Set brightness of the 4 LED strips |
benswindell | 1:58c735e369b1 | 453 | ws.setII(0xFF); |
benswindell | 1:58c735e369b1 | 454 | ws.useII(WS2812::GLOBAL); |
benswindell | 1:58c735e369b1 | 455 | ws2.setII(0xFF); |
benswindell | 1:58c735e369b1 | 456 | ws2.useII(WS2812::GLOBAL); |
benswindell | 1:58c735e369b1 | 457 | ws3.setII(0xFF); |
benswindell | 1:58c735e369b1 | 458 | ws3.useII(WS2812::GLOBAL); |
benswindell | 1:58c735e369b1 | 459 | ws4.setII(0xFF); |
benswindell | 1:58c735e369b1 | 460 | ws4.useII(WS2812::GLOBAL); |
benswindell | 1:58c735e369b1 | 461 | setup(); |
benswindell | 1:58c735e369b1 | 462 | |
benswindell | 1:58c735e369b1 | 463 | while(1) { |
benswindell | 1:58c735e369b1 | 464 | wait(1.0f); |
benswindell | 1:58c735e369b1 | 465 | // Check timer to see if 3s or 5s has elapsed |
benswindell | 1:58c735e369b1 | 466 | if(t.read() >= 3.0f && FinishedGame == false) { |
benswindell | 1:58c735e369b1 | 467 | turn_off_goal(OFF); |
benswindell | 1:58c735e369b1 | 468 | t.stop(); |
benswindell | 1:58c735e369b1 | 469 | t.reset(); |
benswindell | 1:58c735e369b1 | 470 | } else if(t.read() >= 5.0f && FinishedGame == true) { |
benswindell | 1:58c735e369b1 | 471 | /* Some finished game code here */ |
benswindell | 1:58c735e369b1 | 472 | t.stop(); |
benswindell | 1:58c735e369b1 | 473 | t.reset(); |
benswindell | 1:58c735e369b1 | 474 | } |
alikin01 | 0:e610b1d38e80 | 475 | } |
alikin01 | 0:e610b1d38e80 | 476 | } |
alikin01 | 0:e610b1d38e80 | 477 | |
alikin01 | 0:e610b1d38e80 | 478 | |
alikin01 | 0:e610b1d38e80 | 479 | |
benswindell | 1:58c735e369b1 | 480 | |
benswindell | 1:58c735e369b1 | 481 |