4180 lab 5

Dependencies:   mbed 4DGL-uLCD-SE RPCInterface

Revision:
3:94d9434576af
Parent:
2:4845e2dae429
Child:
4:1ef667567942
--- a/main.cpp	Wed Feb 19 18:48:09 2020 +0000
+++ b/main.cpp	Mon Feb 24 17:01:46 2020 +0000
@@ -1,35 +1,51 @@
 #include "mbed.h"
 #include "rtos.h"
+#include "uLCD_4DGL.h"
+#include "SDFileSystem.h"
+#include "wave_player.h"
+
 //#include "part2.h"
 //#include "part3.h"
 #include "part4_led.h"
 //#include "lidar_theremin.h"
 
 Serial pc(USBTX, USBRX);
-RawSerial  dev(p13,p14);
+RawSerial dev(p9,p10);
 
 DigitalOut myled1(LED1);
+DigitalOut myled2(LED2);
+DigitalOut myled3(LED3);
+DigitalOut myled4(LED4);
 RGBLed led = RGBLed(p21, p22, p23);
 Color colors[] = { _red, _pink, _orange, _yellow };
 
+uLCD_4DGL lcd(p28,p27,p30);
+
 Thread led_thread;
+Thread lcd_thread1;
+Thread lcd_thread2;
+Thread audio_thread;
 
-void changeColor(char c) {
-    if (c == 'r') {
-        colors[0] = _red;
-        colors[1] = _pink;
-        colors[2] = _orange;
-        colors[3] = _yellow;
-    } else if (c == 'b') {
-        colors[0] = _teal;
-        colors[1] = _light_blue;
-        colors[2] = _blue;
-        colors[3] = _purple;
-    } else if (c == 'g') {
-        colors[0] = _yellow;
-        colors[1] = _light_green;
-        colors[2] = _green;
-        colors[3] = _teal;
+void changeColor() {
+    while (dev.readable()) {
+        char c = dev.getc();
+        
+        if (c == 'r') {
+            colors[0] = _red;
+            colors[1] = _pink;
+            colors[2] = _orange;
+            colors[3] = _yellow;
+        } else if (c == 'b') {
+            colors[0] = _teal;
+            colors[1] = _light_blue;
+            colors[2] = _blue;
+            colors[3] = _purple;
+        } else if (c == 'g') {
+            colors[0] = _yellow;
+            colors[1] = _light_green;
+            colors[2] = _green;
+            colors[3] = _teal;
+        }
     }
 }
 
@@ -45,22 +61,93 @@
     }
 }
 
+Mutex lcd_mutex;
+//Semaphore sem(1);
+
+
+void lcd1_handler() {
+    int i = 0;
+    while (1) {
+        lcd_mutex.lock();
+//        sem.wait();
+        lcd.locate(0, 0);
+        lcd.printf("Counter: %d", i);
+        lcd_mutex.unlock();
+//        sem.release();
+        
+        i++;
+        Thread::wait(1000);
+    }
+}
+
+void lcd2_handler() {
+    int i,k, offset;
+    double s,a;
+    k = 1;
+    offset = 50;
+    lcd_mutex.lock();
+//    sem.wait();
+    lcd.rectangle(89,0,127,17,1);
+    lcd_mutex.unlock();
+//    sem.release();
+    
+    while(1) {       // thread loop
+//        v = 1; 
+        lcd_mutex.lock();
+//        sem.wait();
+        for (i=0; i<127; i++) {
+            s = 8 * sin((long double)(i+k) /5);   // pixel to print
+            a = 8 * sin((long double)(i+k-1) /5); // old pixel to erase
+            lcd.pixel(i,offset + (int)a, BLACK);           // erase pixel
+            lcd.pixel(i,offset + (int)s, WHITE);           // print pixel
+        }
+        lcd_mutex.unlock();
+//        sem.release();
+        k++;
+        Thread::wait(100);   // value of pot1 / 100   
+    }
+}
+
+SDFileSystem sd(p5, p6, p7, p8, "sd");
+AnalogOut DACout(p18);
+wave_player waver(&DACout);
+
+void audio_handler() {
+    FILE *wave_file;
+    myled2 = !myled2;
+//    printf("\n\n\nHello, wave world!\n");
+//    myled4 = !myled4;
+    while (1) {
+        myled4 = !myled4;
+        wave_file=fopen("/sd/sample.wav","r");
+        waver.play(wave_file);
+        fclose(wave_file);
+        Thread::wait(1000);
+    }
+}
+
 int main() {
 //    run_part2();
 //    run_part2_EC();
 //    run_lidar_theremin();
     
 //    run_part3();
+
+    pc.baud(9600);
+    dev.baud(9600);
     
     led_thread.start(led_handler);
+    lcd.cls();
+    lcd_thread1.start(lcd1_handler);
+    lcd_thread2.start(lcd2_handler);
+    myled2 = !myled2;
+    audio_thread.start(audio_handler);
+    myled3 = !myled3;
+    
+    dev.attach(&changeColor, Serial::RxIrq);
 
     while (1) {
         myled1 = !myled1;
-        
-        if (dev.readable()) {
-//            changeColor(dev.getc());
-            pc.putc(dev.getc());
-        }
 
         Thread::wait(500);
     }