ECE 4180 Final

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

Committer:
jcrane32
Date:
Thu Dec 05 04:43:25 2019 +0000
Revision:
18:c760ba93b881
Parent:
7:15fdc55dbf66
Added support to play songs from .h files and added necessary variables.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yqin70 0:4f77ae831ee7 1 #include "mbed.h"
jcrane32 7:15fdc55dbf66 2 #include "rtos.h"
yqin70 0:4f77ae831ee7 3 #include "SDFileSystem.h"
yqin70 0:4f77ae831ee7 4 #include "wave_player.h"
yqin70 0:4f77ae831ee7 5 #include "uLCD_4DGL.h"
jcrane32 6:cd24147b5e50 6
yqin70 0:4f77ae831ee7 7 //setup some color objects in flash using const's
yqin70 0:4f77ae831ee7 8
yqin70 0:4f77ae831ee7 9 #include "Small_6.h"
yqin70 0:4f77ae831ee7 10 #include "Small_7.h"
yqin70 0:4f77ae831ee7 11 #include "Arial_9.h"
yqin70 0:4f77ae831ee7 12 #include "stdio.h"
yqin70 0:4f77ae831ee7 13 #include "C12832_lcd.h"
yqin70 0:4f77ae831ee7 14
jcrane32 6:cd24147b5e50 15 #include "bubbles.h"
jcrane32 6:cd24147b5e50 16 #include "songs.h"
jcrane32 7:15fdc55dbf66 17 #include "LED.hpp"
jcrane32 6:cd24147b5e50 18
yqin70 0:4f77ae831ee7 19
yqin70 0:4f77ae831ee7 20 //Setup RGB led using PWM pins and class
ShelbyC22 4:59b73f321c0e 21 RGBLed myRGBled(p24,p23,p22); //RGB PWM pins
jcrane32 7:15fdc55dbf66 22
yqin70 0:4f77ae831ee7 23 char bred=0;
yqin70 0:4f77ae831ee7 24 char bgreen=0;
yqin70 0:4f77ae831ee7 25 char bblue=0;
yqin70 0:4f77ae831ee7 26
yqin70 0:4f77ae831ee7 27 volatile bool songselect = false;
yqin70 0:4f77ae831ee7 28 volatile bool homescreen = true;
ShelbyC22 5:b2cf15651d4e 29 volatile bool songchange = false;
jcrane32 7:15fdc55dbf66 30 volatile bool playing = false;
jcrane32 7:15fdc55dbf66 31 uLCD_4DGL uLCD(p28,p27,p30);
yqin70 0:4f77ae831ee7 32 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
yqin70 0:4f77ae831ee7 33 DigitalOut myled(LED1);
yqin70 0:4f77ae831ee7 34 DigitalIn pb1(p20);
yqin70 0:4f77ae831ee7 35 DigitalIn pb2(p19);
yqin70 1:a1aa9a79070a 36 AnalogOut DACout(p18);
yqin70 1:a1aa9a79070a 37 wave_player waver(&DACout);
jcrane32 6:cd24147b5e50 38 Thread thread1, thread2, thread3;
jcrane32 7:15fdc55dbf66 39 Ticker nextsample;
jcrane32 7:15fdc55dbf66 40 int songNdx = 0;
jcrane32 18:c760ba93b881 41 int songnum = 1;
jcrane32 18:c760ba93b881 42 const unsigned short *playingSong = NULL;
yqin70 0:4f77ae831ee7 43
yqin70 0:4f77ae831ee7 44 // mutex to make the lcd lib thread safe
yqin70 0:4f77ae831ee7 45 Mutex lcd_mutex;
jcrane32 18:c760ba93b881 46
yqin70 0:4f77ae831ee7 47 AnalogIn joy_pot(p16);
jcrane32 6:cd24147b5e50 48
yqin70 0:4f77ae831ee7 49 // Thread 1
yqin70 1:a1aa9a79070a 50 // print homescreen to LCD
ShelbyC22 5:b2cf15651d4e 51 //new homescreen that doesn't have the flashing
jcrane32 6:cd24147b5e50 52 void homescreen_thread()
yqin70 0:4f77ae831ee7 53 {
yqin70 0:4f77ae831ee7 54 while(true) { // thread loop
ShelbyC22 5:b2cf15651d4e 55 lcd_mutex.lock();
yqin70 0:4f77ae831ee7 56 if (homescreen){
yqin70 0:4f77ae831ee7 57 uLCD.cls();
ShelbyC22 5:b2cf15651d4e 58 uLCD.text_height(1.3);
yqin70 2:765774781bb1 59 uLCD.text_width(1.9);
yqin70 0:4f77ae831ee7 60 uLCD.color(WHITE);
ShelbyC22 5:b2cf15651d4e 61 uLCD.locate(5,0);
ShelbyC22 5:b2cf15651d4e 62 uLCD.printf("Tap Tap");
ShelbyC22 5:b2cf15651d4e 63 uLCD.locate(4,1);
ShelbyC22 5:b2cf15651d4e 64 uLCD.printf("Revolution");
ShelbyC22 5:b2cf15651d4e 65 uLCD.locate(0,3);
jcrane32 7:15fdc55dbf66 66 uLCD.printf("Pick a song!");
ShelbyC22 5:b2cf15651d4e 67 uLCD.text_height(1.3);
yqin70 2:765774781bb1 68 uLCD.text_width(1.9);
ShelbyC22 5:b2cf15651d4e 69 uLCD.locate(3,5);
ShelbyC22 4:59b73f321c0e 70 uLCD.printf("Fireflies");
ShelbyC22 5:b2cf15651d4e 71 uLCD.locate(3,7);
ShelbyC22 4:59b73f321c0e 72 uLCD.printf("The Middle");
ShelbyC22 5:b2cf15651d4e 73 uLCD.locate(3,9);
ShelbyC22 4:59b73f321c0e 74 uLCD.printf("Stacy's Mom");
ShelbyC22 5:b2cf15651d4e 75 uLCD.locate(3,11);
jcrane32 7:15fdc55dbf66 76 uLCD.printf("I Write Sins \n \t Not Tragedies");
ShelbyC22 5:b2cf15651d4e 77 uLCD.filled_circle(6, 43, 4, GREEN); //new selection with circle instead of rectangle
ShelbyC22 5:b2cf15651d4e 78 homescreen = false;}
ShelbyC22 5:b2cf15651d4e 79 if (songchange){
ShelbyC22 5:b2cf15651d4e 80 for (int i = 0; i < 4; i++){
ShelbyC22 5:b2cf15651d4e 81 uLCD.filled_circle(6, i*15+43, 4,BLACK);
ShelbyC22 5:b2cf15651d4e 82 }
ShelbyC22 5:b2cf15651d4e 83 uLCD.filled_circle(6, (songnum-1)*15+43, 4,GREEN);
ShelbyC22 5:b2cf15651d4e 84 songchange = false;
ShelbyC22 5:b2cf15651d4e 85 }
yqin70 0:4f77ae831ee7 86 lcd_mutex.unlock();
ShelbyC22 5:b2cf15651d4e 87 Thread::wait(200);
yqin70 0:4f77ae831ee7 88 }
yqin70 0:4f77ae831ee7 89 }
yqin70 0:4f77ae831ee7 90
jcrane32 6:cd24147b5e50 91 // Thread 2
jcrane32 7:15fdc55dbf66 92 // joystick control for song selection during homescreen
jcrane32 6:cd24147b5e50 93 void joystick_thread()
yqin70 0:4f77ae831ee7 94 {
yqin70 0:4f77ae831ee7 95 while(1){
yqin70 0:4f77ae831ee7 96 if ((joy_pot <= (1.4/3.3)) && songnum>1) {
yqin70 0:4f77ae831ee7 97 songnum--;
ShelbyC22 5:b2cf15651d4e 98 songchange = true;
ShelbyC22 5:b2cf15651d4e 99 }
yqin70 2:765774781bb1 100 else if ((joy_pot >= (1.8/3.3)) && songnum<4){
yqin70 0:4f77ae831ee7 101 songnum++;
ShelbyC22 5:b2cf15651d4e 102 songchange = true;
yqin70 0:4f77ae831ee7 103 }
yqin70 0:4f77ae831ee7 104 Thread::wait(250);
yqin70 0:4f77ae831ee7 105 }
yqin70 0:4f77ae831ee7 106 }
yqin70 0:4f77ae831ee7 107
yqin70 0:4f77ae831ee7 108 // Thread 3
yqin70 1:a1aa9a79070a 109 //pb1 is to select song
yqin70 1:a1aa9a79070a 110 //pb2 is to return to homescreen
jcrane32 6:cd24147b5e50 111 void pbcontrol_thread()
yqin70 0:4f77ae831ee7 112 {
yqin70 0:4f77ae831ee7 113 pb1.mode(PullUp);
yqin70 0:4f77ae831ee7 114 pb2.mode(PullUp);
yqin70 0:4f77ae831ee7 115 while(true) { // thread loop
yqin70 0:4f77ae831ee7 116 if (!pb2)
yqin70 0:4f77ae831ee7 117 {
yqin70 0:4f77ae831ee7 118 homescreen = true;
yqin70 0:4f77ae831ee7 119 songselect = false;
yqin70 0:4f77ae831ee7 120 }
yqin70 0:4f77ae831ee7 121 if (!pb1)
yqin70 0:4f77ae831ee7 122 {
yqin70 0:4f77ae831ee7 123 songselect = true;
yqin70 0:4f77ae831ee7 124 }
yqin70 0:4f77ae831ee7 125 Thread::wait(100); // value of pot1 / 100
yqin70 0:4f77ae831ee7 126 }
yqin70 0:4f77ae831ee7 127 }
yqin70 0:4f77ae831ee7 128
jcrane32 7:15fdc55dbf66 129 // Thread 4
jcrane32 7:15fdc55dbf66 130 // this thread plays music using the ticker class
jcrane32 7:15fdc55dbf66 131 void playsound() {
jcrane32 7:15fdc55dbf66 132 if (playing) {
jcrane32 18:c760ba93b881 133 DACout = playingSong[songNdx++];
jcrane32 18:c760ba93b881 134 // if (i>**songlength**) i
jcrane32 7:15fdc55dbf66 135 } else {
jcrane32 7:15fdc55dbf66 136 DACout = 0;
jcrane32 7:15fdc55dbf66 137 songNdx = 0;
jcrane32 7:15fdc55dbf66 138 }
jcrane32 7:15fdc55dbf66 139 }
jcrane32 7:15fdc55dbf66 140
jcrane32 7:15fdc55dbf66 141 int main() {
yqin70 3:431877852f14 142
jcrane32 7:15fdc55dbf66 143 uLCD.baudrate(3000000);
jcrane32 6:cd24147b5e50 144 thread1.start(homescreen_thread);
jcrane32 7:15fdc55dbf66 145 thread2.start(joystick_thread);
jcrane32 6:cd24147b5e50 146 thread3.start(pbcontrol_thread);
jcrane32 7:15fdc55dbf66 147 // nextsample.attach(&playsound, 1.0/8000.0);
ShelbyC22 5:b2cf15651d4e 148 //startup sound
ShelbyC22 5:b2cf15651d4e 149 myRGBled = blue; //tested to make sure led works, we can use whatever color(s) here
jcrane32 18:c760ba93b881 150 // FILE *wave_file;
jcrane32 18:c760ba93b881 151 // wave_file=fopen("/sd/cheer.wav","r");
jcrane32 18:c760ba93b881 152 // waver.play(wave_file);
jcrane32 18:c760ba93b881 153 // fclose(wave_file);
yqin70 0:4f77ae831ee7 154 while(1)
yqin70 0:4f77ae831ee7 155 {
yqin70 0:4f77ae831ee7 156
yqin70 1:a1aa9a79070a 157 if (songselect){
jcrane32 18:c760ba93b881 158 myRGBled = yellow;
yqin70 1:a1aa9a79070a 159 myled = 0;
jcrane32 18:c760ba93b881 160 playing = true;
yqin70 1:a1aa9a79070a 161 homescreen = false;
yqin70 1:a1aa9a79070a 162 lcd_mutex.lock();
yqin70 1:a1aa9a79070a 163 uLCD.cls();
jcrane32 18:c760ba93b881 164 uLCD.printf("You selected song %2d", songnum);
yqin70 1:a1aa9a79070a 165 lcd_mutex.unlock();
yqin70 1:a1aa9a79070a 166 //add case statement based on songnum or something
yqin70 1:a1aa9a79070a 167 //code for playing song from sd
ShelbyC22 4:59b73f321c0e 168 switch (songnum)
ShelbyC22 4:59b73f321c0e 169 {
ShelbyC22 4:59b73f321c0e 170 case 1:
ShelbyC22 4:59b73f321c0e 171 {
jcrane32 18:c760ba93b881 172 playingSong = fireflies;
jcrane32 18:c760ba93b881 173 // FILE *wave_file;
jcrane32 18:c760ba93b881 174 // wave_file =fopen("/sd/4180 final project/Fireflies.wav", "r");
jcrane32 18:c760ba93b881 175 // waver.play(wave_file);
jcrane32 18:c760ba93b881 176 // fclose(wave_file);
jcrane32 18:c760ba93b881 177 break;
ShelbyC22 4:59b73f321c0e 178 }
ShelbyC22 4:59b73f321c0e 179 case 2:
ShelbyC22 4:59b73f321c0e 180 {
jcrane32 18:c760ba93b881 181 playingSong = the_middle;
jcrane32 18:c760ba93b881 182 // FILE *wave_file;
jcrane32 18:c760ba93b881 183 // wave_file =fopen("/sd/4180 final project/The_Middle.wav", "r");
jcrane32 18:c760ba93b881 184 // waver.play(wave_file);
jcrane32 18:c760ba93b881 185 // fclose(wave_file);
jcrane32 18:c760ba93b881 186 break;
ShelbyC22 4:59b73f321c0e 187 }
ShelbyC22 4:59b73f321c0e 188 case 3:
ShelbyC22 4:59b73f321c0e 189 {
jcrane32 18:c760ba93b881 190 playingSong = stacys_mom;
jcrane32 18:c760ba93b881 191 // FILE *wave_file;
jcrane32 18:c760ba93b881 192 // wave_file =fopen("/sd/4180 final project/Stacy's_Mom.wav", "r");
jcrane32 18:c760ba93b881 193 // waver.play(wave_file);
jcrane32 18:c760ba93b881 194 // fclose(wave_file);
jcrane32 18:c760ba93b881 195 break;
ShelbyC22 4:59b73f321c0e 196 }
ShelbyC22 4:59b73f321c0e 197 case 4:
ShelbyC22 4:59b73f321c0e 198 {
jcrane32 18:c760ba93b881 199 playingSong = sins;
jcrane32 18:c760ba93b881 200 // FILE *wave_file;
jcrane32 18:c760ba93b881 201 // wave_file =fopen("/sd/4180 final project/Sins_!_Tragedies.wav", "r");
jcrane32 18:c760ba93b881 202 // waver.play(wave_file);
jcrane32 18:c760ba93b881 203 // fclose(wave_file);
jcrane32 18:c760ba93b881 204 break;
ShelbyC22 4:59b73f321c0e 205 }
ShelbyC22 4:59b73f321c0e 206 default:
jcrane32 18:c760ba93b881 207 break;
ShelbyC22 4:59b73f321c0e 208 }
ShelbyC22 4:59b73f321c0e 209
yqin70 1:a1aa9a79070a 210 }
yqin70 0:4f77ae831ee7 211 Thread::wait(100);
yqin70 0:4f77ae831ee7 212 }
yqin70 0:4f77ae831ee7 213 }
yqin70 0:4f77ae831ee7 214
yqin70 0:4f77ae831ee7 215