ECE 4180 Lab 3 Part 4

Dependencies:   4DGL-uLCD-SE USBHost mbed wave_player_appbd

Fork of AppBoard_Waveplayer by jim hamblen

Revision:
10:afef0a518c8b
Parent:
9:f1aebfbe7e78
--- a/main.cpp	Fri Nov 01 15:30:47 2013 +0000
+++ b/main.cpp	Tue Oct 16 00:25:32 2018 +0000
@@ -1,21 +1,150 @@
 #include "mbed.h"
 #include "USBHostMSD.h"
 #include "wave_player.h"
-//mbed Application board waveplayer demo
-//Plays the wave file "sample.wav" on the USB flash drive
-//Outputs to onboard speaker (but at very low volume)
-//and the Audio Out jack for connection to a set of amplified PC speakers (at higher volume)
-//Needs a USB flash drive inserted with the wav file on it to run
+#include "uLCD_4DGL.h"
 
-//Analog Out Jack
 AnalogOut DACout(p18);
-//On Board Speaker
 PwmOut PWMout(p26);
 
 wave_player waver(&DACout,&PWMout);
 
+PwmOut Rgb(p23);
+PwmOut rGb(p24);
+PwmOut rgB(p25);
+
+int dim = 0;
+
+uLCD_4DGL uLCD(p9, p10, p11); // serial tx, serial rx, reset pin;
+Mutex uLCD_mutex;
+
+Serial blue(p28, p27);
+
+BusOut myled(LED1,LED2,LED3,LED4);
+
+void thread1(void const *args)
+{
+    float x = 0.0;
+    while(1) {
+        //get a new random number for PWM
+        x = rand() / float(RAND_MAX);
+        //add some exponential brightness scaling
+        //for more of a fast flash effect
+        x = x*x*x;
+        Rgb = x;
+        rGb = x * dim;
+        rgB = x * dim;
+        //fast update rate for welding flashes
+        Thread::wait(20);
+        //add a random pause between welds
+        if (rand() / float(RAND_MAX) > 0.97) {
+            Rgb = 0;
+            rGb = 0;
+            rgB = 0;
+            Thread::wait(4000.0 * rand() / float(RAND_MAX));
+        }
+    }
+
+}
+
+void thread2(void const *args)
+{
+    while(1) {
+        uLCD_mutex.lock();
+        uLCD.locate(1,2);
+        uLCD.printf("Lightning!!!");
+        uLCD_mutex.unlock();
+
+        Thread::wait(20);
+
+        uLCD_mutex.lock();
+        uLCD.locate(1,2);
+        uLCD.printf("            ");
+        uLCD_mutex.unlock();
+
+        if (rand() / float(RAND_MAX) > 0.97) {
+            Thread::wait(4000.0 * rand() / float(RAND_MAX));
+        }
+    }
+}
+
+void thread3(void const *args)
+{
+    while (1) {
+        uLCD_mutex.lock();
+        uLCD.locate(1,5);
+        uLCD.printf("Thunder!!!");
+        uLCD_mutex.unlock();
+
+        Thread::wait(20);
+
+        uLCD_mutex.lock();
+        uLCD.locate(1,5);
+        uLCD.printf("          ");
+        uLCD_mutex.unlock();
+
+        if (rand() / float(RAND_MAX) > 0.97) {
+            Thread::wait(4000.0 * rand() / float(RAND_MAX));
+        }
+    }
+}
+
+void thread4(void const *args)
+{
+    char bnum=0;
+    char bhit=0;
+    while(1) {
+        while (!blue.readable()) {
+            Thread::wait(20);
+        }
+        uLCD_mutex.lock();
+        if (blue.getc()=='!') {
+            if (blue.getc()=='B') { //button data packet
+                bnum = blue.getc(); //button number
+                bhit = blue.getc(); //1=hit, 0=release
+                if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
+                    myled = bnum - '0'; //current button number will appear on LEDs
+                    switch (bnum) {
+                        case '1': //number button 1
+                            dim = (bhit == '0');
+                            break;
+                        case '2': //number button 2
+                            if (bhit=='1') {
+                                //add hit code here
+                            } else {
+                                //add release code here
+                            }
+                            break;
+                        case '3': //number button 3
+                            if (bhit=='1') {
+                                //add hit code here
+                            } else {
+                                //add release code here
+                            }
+                            break;
+                        case '4': //number button 4
+                            if (bhit=='1') {
+                                //add hit code here
+                            } else {
+                                //add release code here
+                            }
+                            break;
+                        default:
+                            break;
+                    }
+                }
+            }
+        }
+        uLCD_mutex.unlock();
+    }
+}
+
 int main()
 {
+    Thread t1(thread1);
+    Thread t2(thread2);
+    Thread t3(thread3);
+    Thread t4(thread4);
+
     USBHostMSD msd("usb");
     FILE *wave_file;
     //setup PWM hardware for a Class D style audio output
@@ -25,10 +154,11 @@
     while(!msd.connect()) {
         Thread::wait(500);
     }
-    //open wav file and play it
-    wave_file=fopen("/usb/sample.wav","r");
-    waver.play(wave_file);
-    fclose(wave_file);
-    //end of program
-    while(1) {};
+    while (1) {
+        //open wav file and play it
+        wave_file=fopen("/usb/storm-thunder.wav","r");
+        waver.play(wave_file);
+        fclose(wave_file);
+        Thread::wait(4000.0 * rand() / float(RAND_MAX));
+    }
 }
\ No newline at end of file