ECE 4180 Final

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

Committer:
jcrane32
Date:
Thu Dec 05 03:21:55 2019 +0000
Revision:
7:15fdc55dbf66
Parent:
6:cd24147b5e50
Child:
11:362e25f659a5
Child:
18:c760ba93b881
Further tidied up code base. Set up templates for c arrays for songs and ticker to play music from arrays.

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;
yqin70 0:4f77ae831ee7 41
yqin70 0:4f77ae831ee7 42 // mutex to make the lcd lib thread safe
yqin70 0:4f77ae831ee7 43 Mutex lcd_mutex;
yqin70 0:4f77ae831ee7 44 int songnum = 1;
yqin70 0:4f77ae831ee7 45 AnalogIn joy_pot(p16);
jcrane32 6:cd24147b5e50 46
yqin70 0:4f77ae831ee7 47 // Thread 1
yqin70 1:a1aa9a79070a 48 // print homescreen to LCD
ShelbyC22 5:b2cf15651d4e 49 //new homescreen that doesn't have the flashing
jcrane32 6:cd24147b5e50 50 void homescreen_thread()
yqin70 0:4f77ae831ee7 51 {
yqin70 0:4f77ae831ee7 52 while(true) { // thread loop
ShelbyC22 5:b2cf15651d4e 53 lcd_mutex.lock();
yqin70 0:4f77ae831ee7 54 if (homescreen){
yqin70 0:4f77ae831ee7 55 uLCD.cls();
ShelbyC22 5:b2cf15651d4e 56 uLCD.text_height(1.3);
yqin70 2:765774781bb1 57 uLCD.text_width(1.9);
yqin70 0:4f77ae831ee7 58 uLCD.color(WHITE);
ShelbyC22 5:b2cf15651d4e 59 uLCD.locate(5,0);
ShelbyC22 5:b2cf15651d4e 60 uLCD.printf("Tap Tap");
ShelbyC22 5:b2cf15651d4e 61 uLCD.locate(4,1);
ShelbyC22 5:b2cf15651d4e 62 uLCD.printf("Revolution");
ShelbyC22 5:b2cf15651d4e 63 uLCD.locate(0,3);
jcrane32 7:15fdc55dbf66 64 uLCD.printf("Pick a song!");
ShelbyC22 5:b2cf15651d4e 65 uLCD.text_height(1.3);
yqin70 2:765774781bb1 66 uLCD.text_width(1.9);
ShelbyC22 5:b2cf15651d4e 67 uLCD.locate(3,5);
ShelbyC22 4:59b73f321c0e 68 uLCD.printf("Fireflies");
ShelbyC22 5:b2cf15651d4e 69 uLCD.locate(3,7);
ShelbyC22 4:59b73f321c0e 70 uLCD.printf("The Middle");
ShelbyC22 5:b2cf15651d4e 71 uLCD.locate(3,9);
ShelbyC22 4:59b73f321c0e 72 uLCD.printf("Stacy's Mom");
ShelbyC22 5:b2cf15651d4e 73 uLCD.locate(3,11);
jcrane32 7:15fdc55dbf66 74 uLCD.printf("I Write Sins \n \t Not Tragedies");
ShelbyC22 5:b2cf15651d4e 75 uLCD.filled_circle(6, 43, 4, GREEN); //new selection with circle instead of rectangle
ShelbyC22 5:b2cf15651d4e 76 homescreen = false;}
ShelbyC22 5:b2cf15651d4e 77 if (songchange){
ShelbyC22 5:b2cf15651d4e 78 for (int i = 0; i < 4; i++){
ShelbyC22 5:b2cf15651d4e 79 uLCD.filled_circle(6, i*15+43, 4,BLACK);
ShelbyC22 5:b2cf15651d4e 80 }
ShelbyC22 5:b2cf15651d4e 81 uLCD.filled_circle(6, (songnum-1)*15+43, 4,GREEN);
ShelbyC22 5:b2cf15651d4e 82 songchange = false;
ShelbyC22 5:b2cf15651d4e 83 }
yqin70 0:4f77ae831ee7 84 lcd_mutex.unlock();
ShelbyC22 5:b2cf15651d4e 85 Thread::wait(200);
yqin70 0:4f77ae831ee7 86 }
yqin70 0:4f77ae831ee7 87 }
yqin70 0:4f77ae831ee7 88
jcrane32 6:cd24147b5e50 89 // Thread 2
jcrane32 7:15fdc55dbf66 90 // joystick control for song selection during homescreen
jcrane32 6:cd24147b5e50 91 void joystick_thread()
yqin70 0:4f77ae831ee7 92 {
yqin70 0:4f77ae831ee7 93 while(1){
yqin70 0:4f77ae831ee7 94 if ((joy_pot <= (1.4/3.3)) && songnum>1) {
yqin70 0:4f77ae831ee7 95 songnum--;
ShelbyC22 5:b2cf15651d4e 96 songchange = true;
ShelbyC22 5:b2cf15651d4e 97 }
yqin70 2:765774781bb1 98 else if ((joy_pot >= (1.8/3.3)) && songnum<4){
yqin70 0:4f77ae831ee7 99 songnum++;
ShelbyC22 5:b2cf15651d4e 100 songchange = true;
yqin70 0:4f77ae831ee7 101 }
yqin70 0:4f77ae831ee7 102 Thread::wait(250);
yqin70 0:4f77ae831ee7 103 }
yqin70 0:4f77ae831ee7 104 }
yqin70 0:4f77ae831ee7 105
yqin70 0:4f77ae831ee7 106 // Thread 3
yqin70 1:a1aa9a79070a 107 //pb1 is to select song
yqin70 1:a1aa9a79070a 108 //pb2 is to return to homescreen
jcrane32 6:cd24147b5e50 109 void pbcontrol_thread()
yqin70 0:4f77ae831ee7 110 {
yqin70 0:4f77ae831ee7 111 pb1.mode(PullUp);
yqin70 0:4f77ae831ee7 112 pb2.mode(PullUp);
yqin70 0:4f77ae831ee7 113 while(true) { // thread loop
yqin70 0:4f77ae831ee7 114 if (!pb2)
yqin70 0:4f77ae831ee7 115 {
yqin70 0:4f77ae831ee7 116 homescreen = true;
yqin70 0:4f77ae831ee7 117 songselect = false;
yqin70 0:4f77ae831ee7 118 }
yqin70 0:4f77ae831ee7 119 if (!pb1)
yqin70 0:4f77ae831ee7 120 {
yqin70 0:4f77ae831ee7 121 songselect = true;
yqin70 0:4f77ae831ee7 122 }
yqin70 0:4f77ae831ee7 123 Thread::wait(100); // value of pot1 / 100
yqin70 0:4f77ae831ee7 124 }
yqin70 0:4f77ae831ee7 125 }
yqin70 0:4f77ae831ee7 126
jcrane32 7:15fdc55dbf66 127 // Thread 4
jcrane32 7:15fdc55dbf66 128 // this thread plays music using the ticker class
jcrane32 7:15fdc55dbf66 129 void playsound() {
jcrane32 7:15fdc55dbf66 130 if (playing) {
jcrane32 7:15fdc55dbf66 131 //DACout = song[songNdx++];
jcrane32 7:15fdc55dbf66 132 //if (i>**songlength**) i
jcrane32 7:15fdc55dbf66 133 } else {
jcrane32 7:15fdc55dbf66 134 DACout = 0;
jcrane32 7:15fdc55dbf66 135 songNdx = 0;
jcrane32 7:15fdc55dbf66 136 }
jcrane32 7:15fdc55dbf66 137 }
jcrane32 7:15fdc55dbf66 138
jcrane32 7:15fdc55dbf66 139 int main() {
yqin70 3:431877852f14 140
jcrane32 7:15fdc55dbf66 141 uLCD.baudrate(3000000);
jcrane32 6:cd24147b5e50 142 thread1.start(homescreen_thread);
jcrane32 7:15fdc55dbf66 143 thread2.start(joystick_thread);
jcrane32 6:cd24147b5e50 144 thread3.start(pbcontrol_thread);
jcrane32 7:15fdc55dbf66 145 // nextsample.attach(&playsound, 1.0/8000.0);
ShelbyC22 5:b2cf15651d4e 146 //startup sound
ShelbyC22 5:b2cf15651d4e 147 myRGBled = blue; //tested to make sure led works, we can use whatever color(s) here
ShelbyC22 5:b2cf15651d4e 148 FILE *wave_file;
ShelbyC22 5:b2cf15651d4e 149 wave_file=fopen("/sd/cheer.wav","r");
ShelbyC22 5:b2cf15651d4e 150 waver.play(wave_file);
ShelbyC22 5:b2cf15651d4e 151 fclose(wave_file);
yqin70 0:4f77ae831ee7 152 while(1)
yqin70 0:4f77ae831ee7 153 {
yqin70 0:4f77ae831ee7 154
yqin70 1:a1aa9a79070a 155 if (songselect){
yqin70 1:a1aa9a79070a 156 myled = 0;
yqin70 1:a1aa9a79070a 157 homescreen = false;
yqin70 1:a1aa9a79070a 158 lcd_mutex.lock();
yqin70 1:a1aa9a79070a 159 uLCD.cls();
yqin70 1:a1aa9a79070a 160 uLCD.printf("You selected song %2d",songnum);
yqin70 1:a1aa9a79070a 161 lcd_mutex.unlock();
yqin70 1:a1aa9a79070a 162 //add case statement based on songnum or something
yqin70 1:a1aa9a79070a 163 //code for playing song from sd
ShelbyC22 4:59b73f321c0e 164 switch (songnum)
ShelbyC22 4:59b73f321c0e 165 {
ShelbyC22 4:59b73f321c0e 166 case 1:
ShelbyC22 4:59b73f321c0e 167 {
ShelbyC22 4:59b73f321c0e 168 FILE *wave_file;
ShelbyC22 4:59b73f321c0e 169 wave_file =fopen("/sd/4180 final project/Fireflies.wav", "r");
ShelbyC22 4:59b73f321c0e 170 waver.play(wave_file);
ShelbyC22 4:59b73f321c0e 171 fclose(wave_file);
ShelbyC22 4:59b73f321c0e 172 break;
ShelbyC22 4:59b73f321c0e 173 }
ShelbyC22 4:59b73f321c0e 174 case 2:
ShelbyC22 4:59b73f321c0e 175 {
ShelbyC22 4:59b73f321c0e 176 FILE *wave_file;
ShelbyC22 4:59b73f321c0e 177 wave_file =fopen("/sd/4180 final project/The_Middle.wav", "r");
ShelbyC22 4:59b73f321c0e 178 waver.play(wave_file);
ShelbyC22 4:59b73f321c0e 179 fclose(wave_file);
ShelbyC22 4:59b73f321c0e 180 break;
ShelbyC22 4:59b73f321c0e 181 }
ShelbyC22 4:59b73f321c0e 182 case 3:
ShelbyC22 4:59b73f321c0e 183 {
ShelbyC22 4:59b73f321c0e 184 FILE *wave_file;
ShelbyC22 4:59b73f321c0e 185 wave_file =fopen("/sd/4180 final project/Stacy's_Mom.wav", "r");
ShelbyC22 4:59b73f321c0e 186 waver.play(wave_file);
ShelbyC22 4:59b73f321c0e 187 fclose(wave_file);
ShelbyC22 4:59b73f321c0e 188 break;
ShelbyC22 4:59b73f321c0e 189 }
ShelbyC22 4:59b73f321c0e 190 case 4:
ShelbyC22 4:59b73f321c0e 191 {
ShelbyC22 4:59b73f321c0e 192 FILE *wave_file;
ShelbyC22 4:59b73f321c0e 193 wave_file =fopen("/sd/4180 final project/Sins_!_Tragedies.wav", "r");
ShelbyC22 4:59b73f321c0e 194 waver.play(wave_file);
ShelbyC22 4:59b73f321c0e 195 fclose(wave_file);
ShelbyC22 4:59b73f321c0e 196 break;
ShelbyC22 4:59b73f321c0e 197 }
ShelbyC22 4:59b73f321c0e 198 default:
ShelbyC22 4:59b73f321c0e 199 break;
ShelbyC22 4:59b73f321c0e 200 }
ShelbyC22 4:59b73f321c0e 201
yqin70 1:a1aa9a79070a 202 }
yqin70 0:4f77ae831ee7 203 Thread::wait(100);
yqin70 0:4f77ae831ee7 204 }
yqin70 0:4f77ae831ee7 205 }
yqin70 0:4f77ae831ee7 206
yqin70 0:4f77ae831ee7 207