Worked at 10am 2/28
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player
main.cpp
- Committer:
- Josahty
- Date:
- 2018-02-28
- Revision:
- 1:d988c10dcf0b
- Parent:
- 0:0871fbbffcad
File content as of revision 1:d988c10dcf0b:
#include "mbed.h" #include "rtos.h" #include "wave_player.h" #include "SDFileSystem.h" #include "uLCD_4DGL.h" RawSerial Blue(p28,p27); Serial pc(USBTX, USBRX); DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); PwmOut led_red(p21); PwmOut led_green(p22); PwmOut led_blue(p23); SDFileSystem sd(p5, p6, p7, p8, "sd"); uLCD_4DGL uLCD(p9,p10,p11); float x = 0.0; bool gfxstatus = false; bool textstatus = false; int soundmode = 0; int gfxmode = 0; int rgbmode = 0; Mutex stdio_mutex; Mutex sound_mutex; Mutex sound_mutex_2; Mutex blue_mutex; AnalogOut DACout(p18); wave_player waver(&DACout); Thread t1; Thread t2; Thread t3; Thread t4; FILE *wave_file; #include "cylonbyc.h" Ticker sampletick; #define sample_freq 11025.0 //get and set the frequency from wav conversion tool GUI int i=0; //interrupt routine to play next audio sample from array in flash void audio_sample () { sound_mutex_2.lock(); DACout.write_u16(sound_data[i]); i++; if (i>= NUM_ELEMENTS) { i = 0; sampletick.detach(); } sound_mutex_2.unlock(); } //global variables for main and interrupt routine volatile bool button_ready = 0; volatile int bnum = 0; volatile int bhit ; //state used to remember previous characters read in a button message enum statetype {start = 0, got_exclm, got_B, got_num, got_hit}; statetype state = start; //Interrupt routine to parse message with one new character per serial RX interrupt void parse_message() { led2 = !led2; while(Blue.readable()) { blue_mutex.lock(); switch (state) { case start: if (Blue.getc()=='!') { state = got_exclm; } else state = start; break; case got_exclm: if (Blue.getc() == 'B') { state = got_B; } else state = start; break; case got_B: bnum = Blue.getc(); state = got_num; break; case got_num: bhit = Blue.getc(); state = got_hit; break; case got_hit: if (Blue.getc() == char(~('!' + ' B' + bnum + bhit))) button_ready = 1; state = start; break; default: Blue.getc(); state = start; } blue_mutex.unlock(); } //pc.printf("Left interrupt\n"); } inline float random_number() { return (rand()/(float(RAND_MAX))); } // mode = 0 shows alternating orbs and SONIC SCREWDRIVER // mode = 1 shows a rectangle and TARDIS APPROACHING void LCD_write(int user, int LCD_mode) { stdio_mutex.lock(); if(user == 0) { if(LCD_mode == 0) { uLCD.filled_rectangle(60,12,68,40, WHITE); uLCD.filled_rectangle(56,12,72,16, WHITE); uLCD.filled_rectangle(48,16,80,64, WHITE); uLCD.filled_rectangle(56,24,60,32, WHITE); uLCD.filled_rectangle(68,24,72,32, WHITE); if(gfxstatus) { uLCD.filled_circle(96, 32, 10, WHITE); uLCD.filled_circle(32, 32, 10, BLUE); } else { uLCD.filled_circle(32, 32, 10, WHITE); uLCD.filled_circle(96, 32, 10, BLUE); } } else if (LCD_mode == 1) { uLCD.filled_circle(96, 32, 10, WHITE); uLCD.filled_circle(32, 32, 10, WHITE); if(gfxstatus) { uLCD.filled_circle(64,58,10,WHITE); uLCD.filled_rectangle(60,12,68,40, WHITE); uLCD.filled_rectangle(56,12,72,16, BLUE); uLCD.filled_rectangle(48,16,80,64, BLUE); uLCD.filled_rectangle(56,24,60,32, WHITE); uLCD.filled_rectangle(68,24,72,32, WHITE); } else { uLCD.filled_rectangle(56,12,72,16, WHITE); uLCD.filled_rectangle(48,16,80,64, WHITE); uLCD.filled_rectangle(60,12,68,40, BLUE); uLCD.filled_circle(64,58,10,BLUE); } } } else if (user == 1) { if(LCD_mode == 0) { if(textstatus) { uLCD.locate(6, 9); // Move cursor uLCD.color(BLUE); uLCD.printf("SONIC"); uLCD.locate(4,13); // Move cursor uLCD.color(WHITE); uLCD.printf("SCREWDRIVER"); } else { uLCD.locate(6, 9); // Move cursor uLCD.color(WHITE); uLCD.printf("SONIC"); uLCD.locate(4,13); // Move cursor uLCD.color(BLUE); uLCD.printf("SCREWDRIVER"); } } else if(LCD_mode == 1) { if(textstatus) { uLCD.locate(6, 9); // Move cursor uLCD.color(BLUE); uLCD.printf("TARDIS"); uLCD.locate(4,13); // Move cursor uLCD.color(WHITE); uLCD.printf("APPROACHING"); } else { uLCD.locate(6, 9); // Move cursor uLCD.color(WHITE); uLCD.printf("TARDIS"); uLCD.locate(4,13); // Move cursor uLCD.color(BLUE); uLCD.printf("APPROACHING"); } } } stdio_mutex.unlock(); } void LCD_thread_1() // Displays two alternating circles on the LCD { while (true) { //led1 = !led1; gfxstatus = !gfxstatus; LCD_write(0,gfxmode); Thread::wait(1000); } } void LCD_thread_2() // Displays "Please seek shelter" on the LCD { while (true) { //led2 = !led2; textstatus = !textstatus; LCD_write(1,gfxmode); Thread::wait(1000); } } // mode = 0 gives Sonic Screwdriver (welding) lighting // mode = 1 gives Tardis (warmup/cooldown) lighting void RGB_write(int RGB_mode) { if(RGB_mode == 0) { for(int j = 0; j < 80; j++) { //get a new random number for PWM x = random_number(); //add some exponential brightness scaling //for more of a fast flash effect led_red = x*x*x; led_green = x*x*x; led_blue = x*x*x; Thread::wait(20); } led_red = 0; led_green = 0; led_blue = 0; } else if(RGB_mode == 1) { //LED warm up effect using PWM for(int j=0; j<25; j++) { //led_red = i/25.0; led_green = j/25.0; led_blue = j/25.0; Thread::wait(20); } //LED at full brightness level //led_red = 1.0; led_blue = 1.0; led_green = 1.0; Thread::wait(700); //LED cool down effect using PWM for(int j=25; j>0; j--) { //led_red = i/25.0; led_green = j/25.0; led_blue = j/25.0; Thread::wait(20); } //LED off led_red = 0.0; led_green = 0.0; led_blue = 0.0; } } void RGB_thread() { while (true) { //led3 = !led3; RGB_write(rgbmode); Thread::wait(1000); } } void Sound_write(int snd_mode) { stdio_mutex.lock(); if(soundmode == 0) { //sampletick.attach(&audio_sample, 1.0 / sample_freq); wave_file=fopen("/sd/sonic.wav","r"); waver.play(wave_file); fclose(wave_file); } else if(soundmode == 1) { wave_file=fopen("/sd/tardis.wav","r"); waver.play(wave_file); fclose(wave_file); } stdio_mutex.unlock(); } void Sound_thread() { while(true) { led1 = !led1; Sound_write(soundmode); Thread::wait(1310); } } int main() { uLCD.background_color(WHITE); uLCD.cls(); uLCD.textbackground_color(WHITE); t1.start(LCD_thread_1); t2.start(LCD_thread_2); t3.start(RGB_thread); t4.start(Sound_thread); //pc.printf("hi\n"); Blue.attach(&parse_message,Serial::RxIrq); //pc.printf("bye\n"); while (true) { if(button_ready && (bnum=='5')) { // button 4 changed pc.printf("Sound Mode Mode = 0\n"); soundmode = 0; button_ready = 0; //reset flag after reading button message } else if(button_ready && (bnum=='6')) { // button 4 changed pc.printf("Sound Mode = 1\n"); soundmode = 1; button_ready = 0; //reset flag after reading button message } else if(button_ready && (bnum=='1')) { // button 4 changed pc.printf("Graphics Mode = 0\n"); gfxmode = 0; button_ready = 0; //reset flag after reading button message } else if(button_ready && (bnum=='2')) { // button 4 changed pc.printf("Graphics Mode = 1\n"); gfxmode = 1; button_ready = 0; //reset flag after reading button message } else if(button_ready && (bnum=='3')) { // button 4 changed pc.printf("Light Mode = 0\n"); rgbmode = 0; button_ready = 0; //reset flag after reading button message } else if(button_ready && (bnum=='4')) { // button 4 changed pc.printf("Light Mode = 1\n"); rgbmode = 1; button_ready = 0; //reset flag after reading button message } Thread::wait(50); } }