Lab 3 Part 4

Dependencies:   mbed wave_player mbed-rtos 4DGL-uLCD-SE SDFileSystem

Committer:
glanier9
Date:
Tue Mar 02 15:24:05 2021 +0000
Revision:
15:e406620ee8af
Parent:
14:ae63fb7c2d06
Child:
16:f31b20cfeebc
Final version. All threads integrated.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:491820ee784d 1 #include "mbed.h"
mbed_official 11:0309bef74ba8 2 #include "rtos.h"
glanier9 12:94b16c66c09a 3 #include "Speaker.h"
glanier9 12:94b16c66c09a 4 #include "uLCD_4DGL.h"
glanier9 12:94b16c66c09a 5 #include "SDFileSystem.h"
glanier9 12:94b16c66c09a 6 #include "wave_player.h"
glanier9 12:94b16c66c09a 7
glanier9 13:8987c75dfe41 8 char setting = '1';
glanier9 12:94b16c66c09a 9
glanier9 12:94b16c66c09a 10 BusOut myled(LED1,LED2,LED3,LED4);
glanier9 12:94b16c66c09a 11
glanier9 12:94b16c66c09a 12 Serial blue(p13,p14);
glanier9 12:94b16c66c09a 13
glanier9 12:94b16c66c09a 14 AnalogOut DACout(p18);
glanier9 12:94b16c66c09a 15
glanier9 12:94b16c66c09a 16 wave_player waver(&DACout);
glanier9 12:94b16c66c09a 17
glanier9 12:94b16c66c09a 18 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
glanier9 12:94b16c66c09a 19
glanier9 12:94b16c66c09a 20 Mutex stdio_mutex;
glanier9 14:ae63fb7c2d06 21 Mutex get_mutex;
glanier9 12:94b16c66c09a 22
glanier9 12:94b16c66c09a 23 uLCD_4DGL uLCD(p28,p27,p30); // serial tx, serial rx, reset pin;
glanier9 12:94b16c66c09a 24
glanier9 12:94b16c66c09a 25 PwmOut rLED(p21); // Light up Red LED with p21
glanier9 12:94b16c66c09a 26 PwmOut gLED(p22); // Light up Green LED with p22
glanier9 12:94b16c66c09a 27 PwmOut bLED(p23); // Light up Blue LED with p23
glanier9 12:94b16c66c09a 28
glanier9 12:94b16c66c09a 29 Thread thread1;
glanier9 12:94b16c66c09a 30 Thread thread2;
glanier9 12:94b16c66c09a 31 Thread thread3;
glanier9 12:94b16c66c09a 32 Thread thread4;
glanier9 12:94b16c66c09a 33
glanier9 15:e406620ee8af 34 Semaphore semled(0);
glanier9 15:e406620ee8af 35 Semaphore semlcd1(0);
glanier9 15:e406620ee8af 36 Semaphore semlcd2(0);
glanier9 15:e406620ee8af 37 Semaphore sem_check(0);
glanier9 14:ae63fb7c2d06 38
glanier9 14:ae63fb7c2d06 39 ///* The Terminator 53. Coming to theatres this summer!!!!!! */
glanier9 14:ae63fb7c2d06 40 //void the_terminator()
glanier9 14:ae63fb7c2d06 41 //{
glanier9 14:ae63fb7c2d06 42 //
glanier9 14:ae63fb7c2d06 43 //}
glanier9 14:ae63fb7c2d06 44
glanier9 12:94b16c66c09a 45 /* Threads */
glanier9 12:94b16c66c09a 46 void led_thread()
glanier9 12:94b16c66c09a 47 {
glanier9 12:94b16c66c09a 48 while(1) {
glanier9 15:e406620ee8af 49 /* Setting 1: Red and Blue */
glanier9 13:8987c75dfe41 50 if(setting == '1') {
glanier9 13:8987c75dfe41 51 bLED = 0;
glanier9 13:8987c75dfe41 52 rLED = 1;
glanier9 13:8987c75dfe41 53 gLED = 0;
glanier9 15:e406620ee8af 54 //Thread::wait(750);
glanier9 15:e406620ee8af 55 semled.wait();
glanier9 13:8987c75dfe41 56 rLED = 0;
glanier9 13:8987c75dfe41 57 bLED = 1;
glanier9 13:8987c75dfe41 58 gLED = 0;
glanier9 15:e406620ee8af 59 //Thread::wait(750);
glanier9 15:e406620ee8af 60 semled.wait();
glanier9 13:8987c75dfe41 61 }
glanier9 15:e406620ee8af 62
glanier9 15:e406620ee8af 63 /* Setting 2: Purple and Green */
glanier9 15:e406620ee8af 64 else if (setting == '2') {
glanier9 13:8987c75dfe41 65 bLED = 1;
glanier9 13:8987c75dfe41 66 rLED = 1;
glanier9 13:8987c75dfe41 67 gLED = 0;
glanier9 15:e406620ee8af 68 //Thread::wait(750);
glanier9 15:e406620ee8af 69 semled.wait();
glanier9 13:8987c75dfe41 70 rLED = 0;
glanier9 13:8987c75dfe41 71 bLED = 0;
glanier9 13:8987c75dfe41 72 gLED = 1;
glanier9 15:e406620ee8af 73 //Thread::wait(750);
glanier9 15:e406620ee8af 74 semled.wait();
glanier9 13:8987c75dfe41 75 }
glanier9 15:e406620ee8af 76
glanier9 15:e406620ee8af 77 /* Setting 3: Yellow and Cyan*/
glanier9 15:e406620ee8af 78 else if(setting == '3') {
glanier9 15:e406620ee8af 79 bLED = 0;
glanier9 15:e406620ee8af 80 rLED = 1;
glanier9 15:e406620ee8af 81 gLED = 1;
glanier9 15:e406620ee8af 82 //Thread::wait(750);
glanier9 15:e406620ee8af 83 semled.wait();
glanier9 15:e406620ee8af 84 rLED = 0;
glanier9 15:e406620ee8af 85 bLED = 1;
glanier9 15:e406620ee8af 86 gLED = 1;
glanier9 15:e406620ee8af 87 //Thread::wait(750);
glanier9 15:e406620ee8af 88 semled.wait();
glanier9 14:ae63fb7c2d06 89 }
glanier9 15:e406620ee8af 90
glanier9 15:e406620ee8af 91 /* Setting 4: Black and White */
glanier9 15:e406620ee8af 92 else if(setting == '4') {
glanier9 15:e406620ee8af 93 bLED = 0;
glanier9 15:e406620ee8af 94 rLED = 0;
glanier9 15:e406620ee8af 95 gLED = 0;
glanier9 15:e406620ee8af 96 //Thread::wait(750);
glanier9 15:e406620ee8af 97 semled.wait();
glanier9 15:e406620ee8af 98 rLED = 1;
glanier9 15:e406620ee8af 99 bLED = 1;
glanier9 15:e406620ee8af 100 gLED = 1;
glanier9 15:e406620ee8af 101 //Thread::wait(750);
glanier9 15:e406620ee8af 102 semled.wait();
glanier9 15:e406620ee8af 103 }
glanier9 15:e406620ee8af 104
emilmont 1:491820ee784d 105 }
emilmont 1:491820ee784d 106 }
glanier9 12:94b16c66c09a 107
glanier9 12:94b16c66c09a 108 void speaker_thread()
glanier9 12:94b16c66c09a 109 {
glanier9 12:94b16c66c09a 110 while(1) {
glanier9 15:e406620ee8af 111
glanier9 15:e406620ee8af 112 /* Setting 1: WeeWoo Wagon */
glanier9 15:e406620ee8af 113 if(setting == '1') {
glanier9 15:e406620ee8af 114 FILE *wave_file;
glanier9 15:e406620ee8af 115 wave_file=fopen("/sd/WEEWOO.wav","r");
glanier9 15:e406620ee8af 116 waver.play(wave_file);
glanier9 15:e406620ee8af 117 fclose(wave_file);
glanier9 15:e406620ee8af 118 }
glanier9 15:e406620ee8af 119
glanier9 15:e406620ee8af 120 /* Setting 2: */
glanier9 15:e406620ee8af 121 if(setting == '2') {
glanier9 15:e406620ee8af 122 FILE *wave_file;
glanier9 15:e406620ee8af 123 wave_file=fopen("/sd/dank_export.wav","r");
glanier9 15:e406620ee8af 124 waver.play(wave_file);
glanier9 15:e406620ee8af 125 fclose(wave_file);
glanier9 15:e406620ee8af 126 }
glanier9 15:e406620ee8af 127
glanier9 15:e406620ee8af 128 /* Setting 3: */
glanier9 15:e406620ee8af 129 if(setting == '3') {
glanier9 15:e406620ee8af 130 FILE *wave_file;
glanier9 15:e406620ee8af 131 wave_file=fopen("/sd/crickets_exp.wav","r");
glanier9 15:e406620ee8af 132 waver.play(wave_file);
glanier9 15:e406620ee8af 133 fclose(wave_file);
glanier9 15:e406620ee8af 134 }
glanier9 15:e406620ee8af 135
glanier9 15:e406620ee8af 136 /* Setting 4: */
glanier9 15:e406620ee8af 137 if(setting == '4') {
glanier9 15:e406620ee8af 138 FILE *wave_file;
glanier9 15:e406620ee8af 139 wave_file=fopen("/sd/static_exp.wav","r");
glanier9 15:e406620ee8af 140 waver.play(wave_file);
glanier9 15:e406620ee8af 141 fclose(wave_file);
glanier9 15:e406620ee8af 142 }
glanier9 15:e406620ee8af 143
glanier9 12:94b16c66c09a 144 }
glanier9 12:94b16c66c09a 145 }
glanier9 12:94b16c66c09a 146
glanier9 12:94b16c66c09a 147 void lcd1_thread()
glanier9 12:94b16c66c09a 148 {
glanier9 12:94b16c66c09a 149 while(1) {
glanier9 15:e406620ee8af 150
glanier9 15:e406620ee8af 151 /* Setting 1: Red */
glanier9 15:e406620ee8af 152 if(setting == '1') {
glanier9 15:e406620ee8af 153 // Top Red Box
glanier9 15:e406620ee8af 154 stdio_mutex.lock();
glanier9 15:e406620ee8af 155 uLCD.filled_rectangle(0, 0, 127, 63, RED);
glanier9 15:e406620ee8af 156 stdio_mutex.unlock();
glanier9 15:e406620ee8af 157 Thread::wait(750);
glanier9 15:e406620ee8af 158 semled.release();
glanier9 15:e406620ee8af 159 semlcd2.release();
glanier9 15:e406620ee8af 160 // Top Black Box
glanier9 15:e406620ee8af 161 stdio_mutex.lock();
glanier9 15:e406620ee8af 162 uLCD.filled_rectangle(0, 0, 127, 63, BLACK);
glanier9 15:e406620ee8af 163 stdio_mutex.unlock();
glanier9 15:e406620ee8af 164 Thread::wait(750);
glanier9 15:e406620ee8af 165 sem_check.release();
glanier9 15:e406620ee8af 166 semlcd1.wait();
glanier9 15:e406620ee8af 167 semled.release();
glanier9 15:e406620ee8af 168 semlcd2.release();
glanier9 15:e406620ee8af 169 }
glanier9 15:e406620ee8af 170
glanier9 15:e406620ee8af 171 /* Setting 2: Purple */
glanier9 15:e406620ee8af 172 else if(setting == '2') {
glanier9 15:e406620ee8af 173 // Top Red Box
glanier9 15:e406620ee8af 174 stdio_mutex.lock();
glanier9 15:e406620ee8af 175 uLCD.filled_rectangle(0, 0, 127, 63, 0xFF00FF);
glanier9 15:e406620ee8af 176 stdio_mutex.unlock();
glanier9 15:e406620ee8af 177 Thread::wait(750);
glanier9 15:e406620ee8af 178 semled.release();
glanier9 15:e406620ee8af 179 semlcd2.release();
glanier9 15:e406620ee8af 180 // Top Black Box
glanier9 15:e406620ee8af 181 stdio_mutex.lock();
glanier9 15:e406620ee8af 182 uLCD.filled_rectangle(0, 0, 127, 63, BLACK);
glanier9 15:e406620ee8af 183 stdio_mutex.unlock();
glanier9 15:e406620ee8af 184 Thread::wait(750);
glanier9 15:e406620ee8af 185 sem_check.release();
glanier9 15:e406620ee8af 186 semlcd1.wait();
glanier9 15:e406620ee8af 187 semled.release();
glanier9 15:e406620ee8af 188 semlcd2.release();
glanier9 15:e406620ee8af 189 }
glanier9 15:e406620ee8af 190
glanier9 15:e406620ee8af 191 /* Setting 3: Yellow */
glanier9 15:e406620ee8af 192 else if(setting == '3') {
glanier9 15:e406620ee8af 193 // Top Red Box
glanier9 15:e406620ee8af 194 stdio_mutex.lock();
glanier9 15:e406620ee8af 195 uLCD.filled_rectangle(0, 0, 127, 63, 0xFFFF00);
glanier9 15:e406620ee8af 196 stdio_mutex.unlock();
glanier9 15:e406620ee8af 197 Thread::wait(750);
glanier9 15:e406620ee8af 198 semled.release();
glanier9 15:e406620ee8af 199 semlcd2.release();
glanier9 15:e406620ee8af 200 // Top Black Box
glanier9 15:e406620ee8af 201 stdio_mutex.lock();
glanier9 15:e406620ee8af 202 uLCD.filled_rectangle(0, 0, 127, 63, BLACK);
glanier9 15:e406620ee8af 203 stdio_mutex.unlock();
glanier9 15:e406620ee8af 204 Thread::wait(750);
glanier9 15:e406620ee8af 205 sem_check.release();
glanier9 15:e406620ee8af 206 semlcd1.wait();
glanier9 15:e406620ee8af 207 semled.release();
glanier9 15:e406620ee8af 208 semlcd2.release();
glanier9 15:e406620ee8af 209 }
glanier9 15:e406620ee8af 210
glanier9 15:e406620ee8af 211 /* Setting 4: Black and White */
glanier9 15:e406620ee8af 212 else if(setting == '4') {
glanier9 15:e406620ee8af 213 // Top Red Box
glanier9 15:e406620ee8af 214 stdio_mutex.lock();
glanier9 15:e406620ee8af 215 uLCD.filled_rectangle(0, 0, 127, 63, BLACK);
glanier9 15:e406620ee8af 216 stdio_mutex.unlock();
glanier9 15:e406620ee8af 217 Thread::wait(250);
glanier9 15:e406620ee8af 218 semled.release();
glanier9 15:e406620ee8af 219 semlcd2.release();
glanier9 15:e406620ee8af 220 // Top Black Box
glanier9 15:e406620ee8af 221 stdio_mutex.lock();
glanier9 15:e406620ee8af 222 uLCD.filled_rectangle(0, 0, 127, 63, WHITE);
glanier9 15:e406620ee8af 223 stdio_mutex.unlock();
glanier9 15:e406620ee8af 224 Thread::wait(250);
glanier9 15:e406620ee8af 225 sem_check.release();
glanier9 15:e406620ee8af 226 semlcd1.wait();
glanier9 15:e406620ee8af 227 semled.release();
glanier9 15:e406620ee8af 228 semlcd2.release();
glanier9 15:e406620ee8af 229 }
glanier9 12:94b16c66c09a 230 }
glanier9 12:94b16c66c09a 231 }
glanier9 12:94b16c66c09a 232
glanier9 12:94b16c66c09a 233 void lcd2_thread()
glanier9 12:94b16c66c09a 234 {
glanier9 12:94b16c66c09a 235 while(1) {
glanier9 15:e406620ee8af 236
glanier9 15:e406620ee8af 237 /* Setting 1: Blue */
glanier9 15:e406620ee8af 238 if(setting == '1') {
glanier9 15:e406620ee8af 239 // Bottom Black Box
glanier9 15:e406620ee8af 240 stdio_mutex.lock();
glanier9 15:e406620ee8af 241 uLCD.filled_rectangle(0, 63, 127, 127, BLACK);
glanier9 15:e406620ee8af 242 stdio_mutex.unlock();
glanier9 15:e406620ee8af 243 //Thread::wait(750);
glanier9 15:e406620ee8af 244 semlcd2.wait();
glanier9 15:e406620ee8af 245 // Bottom Blue Box
glanier9 15:e406620ee8af 246 stdio_mutex.lock();
glanier9 15:e406620ee8af 247 uLCD.filled_rectangle(0, 63, 127, 127, BLUE);
glanier9 15:e406620ee8af 248 stdio_mutex.unlock();
glanier9 15:e406620ee8af 249 //Thread::wait(750);
glanier9 15:e406620ee8af 250 semlcd2.wait();
glanier9 15:e406620ee8af 251 }
glanier9 15:e406620ee8af 252
glanier9 15:e406620ee8af 253 /* Setting 2: Green */
glanier9 15:e406620ee8af 254 else if(setting == '2') {
glanier9 15:e406620ee8af 255 // Bottom Black Box
glanier9 15:e406620ee8af 256 stdio_mutex.lock();
glanier9 15:e406620ee8af 257 uLCD.filled_rectangle(0, 63, 127, 127, BLACK);
glanier9 15:e406620ee8af 258 stdio_mutex.unlock();
glanier9 15:e406620ee8af 259 //Thread::wait(750);
glanier9 15:e406620ee8af 260 semlcd2.wait();
glanier9 15:e406620ee8af 261 // Bottom Blue Box
glanier9 15:e406620ee8af 262 stdio_mutex.lock();
glanier9 15:e406620ee8af 263 uLCD.filled_rectangle(0, 63, 127, 127, GREEN);
glanier9 15:e406620ee8af 264 stdio_mutex.unlock();
glanier9 15:e406620ee8af 265 //Thread::wait(750);
glanier9 15:e406620ee8af 266 semlcd2.wait();
glanier9 15:e406620ee8af 267 }
glanier9 15:e406620ee8af 268
glanier9 15:e406620ee8af 269 /* Setting 3: Cyan */
glanier9 15:e406620ee8af 270 else if(setting == '3') {
glanier9 15:e406620ee8af 271 // Bottom Black Box
glanier9 15:e406620ee8af 272 stdio_mutex.lock();
glanier9 15:e406620ee8af 273 uLCD.filled_rectangle(0, 63, 127, 127, BLACK);
glanier9 15:e406620ee8af 274 stdio_mutex.unlock();
glanier9 15:e406620ee8af 275 //Thread::wait(750);
glanier9 15:e406620ee8af 276 semlcd2.wait();
glanier9 15:e406620ee8af 277 // Bottom Blue Box
glanier9 15:e406620ee8af 278 stdio_mutex.lock();
glanier9 15:e406620ee8af 279 uLCD.filled_rectangle(0, 63, 127, 127, 0x00FFFF);
glanier9 15:e406620ee8af 280 stdio_mutex.unlock();
glanier9 15:e406620ee8af 281 //Thread::wait(750);
glanier9 15:e406620ee8af 282 semlcd2.wait();
glanier9 15:e406620ee8af 283 }
glanier9 15:e406620ee8af 284
glanier9 15:e406620ee8af 285 /* Setting 4: Black and White */
glanier9 15:e406620ee8af 286 else if(setting == '4') {
glanier9 15:e406620ee8af 287 // Bottom Black Box
glanier9 15:e406620ee8af 288 stdio_mutex.lock();
glanier9 15:e406620ee8af 289 uLCD.filled_rectangle(0, 63, 127, 127, BLACK);
glanier9 15:e406620ee8af 290 stdio_mutex.unlock();
glanier9 15:e406620ee8af 291 //Thread::wait(750);
glanier9 15:e406620ee8af 292 semlcd2.wait();
glanier9 15:e406620ee8af 293 // Bottom Blue Box
glanier9 15:e406620ee8af 294 stdio_mutex.lock();
glanier9 15:e406620ee8af 295 uLCD.filled_rectangle(0, 63, 127, 127, WHITE);
glanier9 15:e406620ee8af 296 stdio_mutex.unlock();
glanier9 15:e406620ee8af 297 //Thread::wait(750);
glanier9 15:e406620ee8af 298 semlcd2.wait();
glanier9 15:e406620ee8af 299 }
glanier9 12:94b16c66c09a 300 }
glanier9 12:94b16c66c09a 301 }
glanier9 12:94b16c66c09a 302
glanier9 15:e406620ee8af 303
glanier9 12:94b16c66c09a 304 int main()
glanier9 12:94b16c66c09a 305 {
glanier9 12:94b16c66c09a 306 rLED = 0;
glanier9 12:94b16c66c09a 307 gLED = 0;
glanier9 12:94b16c66c09a 308 bLED = 0;
glanier9 13:8987c75dfe41 309
glanier9 14:ae63fb7c2d06 310 /* Wait for user to press a setting button */
glanier9 12:94b16c66c09a 311 char bnum=0;
glanier9 12:94b16c66c09a 312 while(1) {
glanier9 12:94b16c66c09a 313 if (blue.readable() && blue.getc()=='!') {
glanier9 12:94b16c66c09a 314 if (blue.getc()=='B') { //button data
glanier9 12:94b16c66c09a 315 bnum = blue.getc(); //button number
glanier9 13:8987c75dfe41 316 if ((bnum>='1')&&(bnum<='4')) { //is a number button 1..4
glanier9 13:8987c75dfe41 317 setting = bnum;// Change setting based on button input to set start setting. Check for chars
glanier9 12:94b16c66c09a 318 break; //turn on/off that num LED
glanier9 13:8987c75dfe41 319 }
glanier9 12:94b16c66c09a 320 }
glanier9 12:94b16c66c09a 321 }
glanier9 14:ae63fb7c2d06 322 }
glanier9 13:8987c75dfe41 323
glanier9 14:ae63fb7c2d06 324 /* Start all threads */
glanier9 12:94b16c66c09a 325 thread1.start(led_thread);
glanier9 12:94b16c66c09a 326 thread2.start(speaker_thread);
glanier9 12:94b16c66c09a 327 thread3.start(lcd1_thread);
glanier9 12:94b16c66c09a 328 thread4.start(lcd2_thread);
glanier9 13:8987c75dfe41 329
glanier9 14:ae63fb7c2d06 330 /* Infinite Loop, let threads run */
glanier9 15:e406620ee8af 331 while (1) {
glanier9 15:e406620ee8af 332
glanier9 15:e406620ee8af 333 sem_check.wait();
glanier9 15:e406620ee8af 334
glanier9 15:e406620ee8af 335 if (blue.readable() && blue.getc()=='!') {
glanier9 15:e406620ee8af 336 if (blue.getc()=='B') { //button data
glanier9 15:e406620ee8af 337 char bnum = blue.getc(); //button number
glanier9 15:e406620ee8af 338 if ((bnum>='1')&&(bnum<='4')) { //is a number button 1..4
glanier9 15:e406620ee8af 339 setting = bnum;// Change setting based on button input to set start setting. Check for chars
glanier9 15:e406620ee8af 340 }
glanier9 15:e406620ee8af 341 }
glanier9 15:e406620ee8af 342 }
glanier9 15:e406620ee8af 343
glanier9 15:e406620ee8af 344 semlcd1.release();
emilmont 1:491820ee784d 345 }
emilmont 1:491820ee784d 346 }