ECE 4180 Final

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

Revision:
0:4f77ae831ee7
Child:
1:a1aa9a79070a
diff -r 000000000000 -r 4f77ae831ee7 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Dec 03 21:24:00 2019 +0000
@@ -0,0 +1,207 @@
+// example to test the mbed Lab Board lcd lib with the mbed rtos
+// Pot1 changes the contrast
+// Pot2 changes the speed of the sin wave
+#include "mbed.h"
+#include "SDFileSystem.h"
+#include "wave_player.h"
+#include "uLCD_4DGL.h"
+//setup some color objects in flash using const's
+
+#include "rtos.h"
+#include "Small_6.h"
+#include "Small_7.h"
+#include "Arial_9.h"
+#include "stdio.h"
+#include "C12832_lcd.h"
+
+//class for 3 PWM color values for RGBLED
+class LEDColor
+{
+public:
+    LEDColor(float r, float g, float b);
+    float red;
+    float green;
+    float blue;
+};
+LEDColor:: LEDColor(float r, float g, float b)
+    : red(r), green(g), blue(b)
+{
+}
+//Operator overload to adjust brightness with no color change
+LEDColor operator * (const LEDColor& x, const float& b)
+{
+    return LEDColor(x.red*b,x.green*b,x.blue*b);
+}
+//Operator overload to add colors
+LEDColor operator + (const LEDColor& x, const LEDColor& y)
+{
+    return LEDColor(x.red+y.red,x.green+y.green,x.blue+y.blue);
+}
+ 
+//Class to control an RGB LED using three PWM pins
+class RGBLed
+{
+public:
+    RGBLed(PinName redpin, PinName greenpin, PinName bluepin);
+    void write(float red,float green, float blue);
+    void write(LEDColor c);
+    RGBLed operator = (LEDColor c) {
+        write(c);
+        return *this;
+    };
+private:
+    PwmOut _redpin;
+    PwmOut _greenpin;
+    PwmOut _bluepin;
+};
+ 
+RGBLed::RGBLed (PinName redpin, PinName greenpin, PinName bluepin)
+    : _redpin(redpin), _greenpin(greenpin), _bluepin(bluepin)
+{
+    //50Hz PWM clock default a bit too low, go to 2000Hz (less flicker)
+    _redpin.period(0.0005);
+}
+ 
+void RGBLed::write(float red,float green, float blue)
+{
+    _redpin = red;
+    _greenpin = green;
+    _bluepin = blue;
+}
+void RGBLed::write(LEDColor c)
+{
+    _redpin = c.red;
+    _greenpin = c.green;
+    _bluepin = c.blue;
+}
+ 
+//classes could be moved to include file
+ 
+//Setup RGB led using PWM pins and class
+RGBLed myRGBled(p23,p22,p21); //RGB PWM pins
+const LEDColor red(1.0,0.0,0.0);
+const LEDColor green(0.0,0.2,0.0);
+//brighter green LED is scaled down to same as red and
+//blue LED outputs on Sparkfun RGBLED
+const LEDColor blue(0.0,0.0,1.0);
+const LEDColor yellow(1.0,0.2,0.0);
+const LEDColor white(1.0,0.2,1.0);
+const LEDColor black(0.0,0.0,0.0);
+char bred=0;
+char bgreen=0;
+char bblue=0; 
+
+volatile bool songselect = false;
+volatile bool homescreen = true;
+uLCD_4DGL uLCD(p28,p27,p30); 
+SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
+DigitalOut myled(LED1);
+DigitalIn pb1(p20);
+DigitalIn pb2(p19);
+
+// mutex to make the lcd lib thread safe
+Mutex lcd_mutex;
+int songnum = 1;
+AnalogIn joy_pot(p16);
+// Thread 1
+// print counter into first line and wait for 1 s
+void thread1(void const *args)
+{
+    
+    while(true) {       // thread loop
+        
+        if (homescreen){
+            lcd_mutex.lock();
+            uLCD.cls();
+            uLCD.text_height(1.8);
+            uLCD.text_width(1.8);
+            uLCD.color(WHITE);
+            uLCD.locate(0,0);
+            uLCD.printf("Pick a song");
+            uLCD.text_height(2);
+            uLCD.text_width(2);
+            uLCD.locate(1,2);
+            uLCD.printf("Song1");
+            uLCD.locate(1,4);
+            uLCD.printf("Song2");
+            uLCD.locate(1,6);
+            uLCD.printf("Song3");
+            uLCD.rectangle(5, songnum*30, 100, songnum*30+25 ,GREEN);
+            lcd_mutex.unlock();
+            if (songselect){
+                myled = 0;
+                homescreen = false;
+                lcd_mutex.lock();
+                uLCD.cls();
+                uLCD.printf("You selected song %2d",songnum);
+                lcd_mutex.unlock();
+                
+                }
+            //FILE *fp = fopen("/sd/sdtest.txt", "r");
+            //char c = fgetc(fp);
+            //while(c){
+            //    c = fgetc(fp);
+            //    }
+            }
+            Thread::wait(200);    
+    }
+}
+
+void thread2(void const *args)
+{
+
+   while(1){
+        //if (homescreen){
+            if ((joy_pot <= (1.4/3.3)) && songnum>1) {
+                songnum--;
+                } 
+            else if ((joy_pot >= (1.8/3.3)) && songnum<3){
+                songnum++;
+                }
+        //    }
+        Thread::wait(250);
+        
+    }
+}
+
+// Thread 3
+// print a sin function in a small window
+// the value of pot 1 changes the speed of the sine wave
+void thread3(void const *args)
+{
+    pb1.mode(PullUp);
+    pb2.mode(PullUp);
+    while(true) {       // thread loop
+        if (!pb2)
+            {
+            homescreen = true;
+            songselect = false;
+            }
+        if (!pb1)
+            {
+            songselect = true;
+            }
+        Thread::wait(100);   // value of pot1 / 100
+    }
+}
+
+int main()
+{
+    uLCD.media_init();
+    uLCD.set_sector_address(0x001D, 0x4C01);
+    uLCD.display_image(0,0);
+//    t1.start(thread1);
+//   t2.start(thread2);
+//    t3.start(thread3);
+    Thread t1(thread1);
+    Thread t2(thread2);
+    myled = 1;
+    Thread t3(thread3);
+    while(1) 
+    {
+        
+        Thread::wait(100);    
+        }
+}
+        
+