ECE 4180 Final
Dependencies: mbed wave_player mbed-rtos C12832_lcd 4DGL-uLCD-SE LCD_fonts SDFileSystem
Diff: main.cpp
- 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); + } +} + +