ECE 4180 Final Project MP3 player code

Dependencies:   mbed mbed-rtos wave_player_appbd 4DGL-uLCD-SE SDFileSystem PinDetect

Committer:
lfink6
Date:
Fri Dec 10 17:42:59 2021 +0000
Revision:
1:481169ca05e0
Parent:
0:57a32b7102e8
Child:
2:bb408ca8fddb
rev 2;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lfink6 0:57a32b7102e8 1 #include "mbed.h"
lfink6 0:57a32b7102e8 2 #include "rtos.h"
lfink6 0:57a32b7102e8 3 #include "SDFileSystem.h"
lfink6 0:57a32b7102e8 4 #include "uLCD_4DGL.h"
lfink6 0:57a32b7102e8 5 #include "wave_player.h"
lfink6 0:57a32b7102e8 6 #include "LSM9DS1.h"
lfink6 1:481169ca05e0 7 #include "PinDetect.h"
lfink6 0:57a32b7102e8 8
lfink6 0:57a32b7102e8 9 DigitalOut myled(LED1);
lfink6 0:57a32b7102e8 10 Serial blue(p28,p27);
lfink6 1:481169ca05e0 11
lfink6 0:57a32b7102e8 12 uLCD_4DGL uLCD(p13,p14,p11);
lfink6 1:481169ca05e0 13
lfink6 0:57a32b7102e8 14 SDFileSystem sd(p5, p6, p7, p8, "sd");
lfink6 1:481169ca05e0 15
lfink6 0:57a32b7102e8 16 LSM9DS1 imu(p9, p10, 0xD6, 0x3C);
lfink6 1:481169ca05e0 17 Serial pc(USBTX, USBRX);
lfink6 1:481169ca05e0 18
lfink6 1:481169ca05e0 19 PinDetect playpause(p23);
lfink6 1:481169ca05e0 20 Mutex LCD;
lfink6 1:481169ca05e0 21 Mutex Speaker;
lfink6 1:481169ca05e0 22 Mutex avgs;
lfink6 1:481169ca05e0 23 bool play = 0;
lfink6 1:481169ca05e0 24
lfink6 1:481169ca05e0 25
lfink6 1:481169ca05e0 26 AnalogOut DACout(p18);
lfink6 1:481169ca05e0 27 PwmOut PWMout(p26);
lfink6 1:481169ca05e0 28 wave_player waver(&DACout,&PWMout);
lfink6 1:481169ca05e0 29
lfink6 1:481169ca05e0 30 int avgIMU;
lfink6 1:481169ca05e0 31 int avgMic;
lfink6 1:481169ca05e0 32
lfink6 0:57a32b7102e8 33
lfink6 0:57a32b7102e8 34 class microphone
lfink6 0:57a32b7102e8 35 {
lfink6 0:57a32b7102e8 36 public :
lfink6 0:57a32b7102e8 37 microphone(PinName pin);
lfink6 0:57a32b7102e8 38 float read();
lfink6 0:57a32b7102e8 39 operator float ();
lfink6 0:57a32b7102e8 40 private :
lfink6 0:57a32b7102e8 41 AnalogIn _pin;
lfink6 0:57a32b7102e8 42 };
lfink6 0:57a32b7102e8 43 microphone::microphone (PinName pin):
lfink6 0:57a32b7102e8 44 _pin(pin)
lfink6 0:57a32b7102e8 45 {
lfink6 0:57a32b7102e8 46 }
lfink6 0:57a32b7102e8 47 float microphone::read()
lfink6 0:57a32b7102e8 48 {
lfink6 0:57a32b7102e8 49 return _pin.read();
lfink6 0:57a32b7102e8 50 }
lfink6 0:57a32b7102e8 51 inline microphone::operator float ()
lfink6 0:57a32b7102e8 52 {
lfink6 0:57a32b7102e8 53 return _pin.read();
lfink6 0:57a32b7102e8 54 }
lfink6 0:57a32b7102e8 55
lfink6 0:57a32b7102e8 56 microphone mymicrophone(p16);
lfink6 1:481169ca05e0 57
lfink6 1:481169ca05e0 58 void LCDThread(void const *argument)
lfink6 1:481169ca05e0 59 {
lfink6 1:481169ca05e0 60 while(1){
lfink6 1:481169ca05e0 61 LCD.lock();
lfink6 1:481169ca05e0 62 uLCD.locate(1,1);
lfink6 1:481169ca05e0 63 uLCD.printf("Put Song Name Here");
lfink6 1:481169ca05e0 64 uLCD.printf("%4D", avgIMU);
lfink6 1:481169ca05e0 65 uLCD.printf("%4D", avgMic);
lfink6 1:481169ca05e0 66 if(!play)
lfink6 1:481169ca05e0 67 {
lfink6 1:481169ca05e0 68 //play
lfink6 1:481169ca05e0 69
lfink6 1:481169ca05e0 70 uLCD.filled_rectangle(0,118,280,40,BLACK);
lfink6 1:481169ca05e0 71 uLCD.triangle(120, 100, 40, 40, 10, 100, 0x0000FF);
lfink6 1:481169ca05e0 72 }
lfink6 1:481169ca05e0 73 else
lfink6 1:481169ca05e0 74 {
lfink6 1:481169ca05e0 75 //pause
lfink6 1:481169ca05e0 76 uLCD.filled_rectangle(0,118,110,40,WHITE);
lfink6 1:481169ca05e0 77 uLCD.filled_rectangle(50,118,100,40,BLACK);
lfink6 1:481169ca05e0 78 uLCD.filled_rectangle(180,118,280,40,WHITE);
lfink6 1:481169ca05e0 79 }
lfink6 1:481169ca05e0 80 LCD.unlock();
lfink6 1:481169ca05e0 81 Thread::wait(100);
lfink6 1:481169ca05e0 82 }
lfink6 1:481169ca05e0 83
lfink6 1:481169ca05e0 84 }
lfink6 1:481169ca05e0 85 void PlayerThread(void const *argument)
lfink6 1:481169ca05e0 86 {
lfink6 1:481169ca05e0 87 Speaker.lock();
lfink6 1:481169ca05e0 88 FILE *wave_file;
lfink6 1:481169ca05e0 89 wave_file=fopen("/sd/sample.wav","r");
lfink6 1:481169ca05e0 90 waver.play(wave_file);
lfink6 1:481169ca05e0 91 fclose(wave_file);
lfink6 1:481169ca05e0 92 Speaker.unlock();
lfink6 1:481169ca05e0 93 Thread::wait(1000);
lfink6 1:481169ca05e0 94 }
lfink6 1:481169ca05e0 95 void buttonThread()
lfink6 1:481169ca05e0 96 {
lfink6 1:481169ca05e0 97 //add playpause and skip features here
lfink6 1:481169ca05e0 98 Speaker.lock();
lfink6 1:481169ca05e0 99 play=!play;
lfink6 1:481169ca05e0 100 myled=play;
lfink6 1:481169ca05e0 101 Speaker.unlock();
lfink6 1:481169ca05e0 102 Thread::wait(100);
lfink6 1:481169ca05e0 103 }
lfink6 1:481169ca05e0 104 void BlueThread(void const *argument)
lfink6 1:481169ca05e0 105 {
lfink6 1:481169ca05e0 106 //add bluetooth control code here
lfink6 1:481169ca05e0 107 while(1)
lfink6 1:481169ca05e0 108 {
lfink6 1:481169ca05e0 109 if(blue.readable())
lfink6 1:481169ca05e0 110 {
lfink6 1:481169ca05e0 111
lfink6 1:481169ca05e0 112 }
lfink6 1:481169ca05e0 113 }
lfink6 1:481169ca05e0 114 }
lfink6 1:481169ca05e0 115 void IMUThread(void const *argument)
lfink6 1:481169ca05e0 116 {
lfink6 1:481169ca05e0 117 while(1){
lfink6 1:481169ca05e0 118 avgs.lock();
lfink6 1:481169ca05e0 119 //put imu averaging and next track selection code here if that is selected
lfink6 1:481169ca05e0 120 avgMic = int(((abs((mymicrophone - (0.67/3.3)))*500.0)+avgMic)/2);
lfink6 1:481169ca05e0 121 imu.readAccel();
lfink6 1:481169ca05e0 122 avgIMU=int((((imu.ax+imu.az+imu.ay)/3.0)+avgIMU)/2);
lfink6 1:481169ca05e0 123 avgs.unlock();
lfink6 1:481169ca05e0 124 Thread::wait(250);
lfink6 1:481169ca05e0 125 }
lfink6 1:481169ca05e0 126
lfink6 1:481169ca05e0 127 }
lfink6 0:57a32b7102e8 128
lfink6 0:57a32b7102e8 129 int main() {
lfink6 1:481169ca05e0 130 uLCD.cls();
lfink6 1:481169ca05e0 131 uLCD.baudrate(3000000);
lfink6 1:481169ca05e0 132 uLCD.background_color(BLACK);
lfink6 1:481169ca05e0 133 uLCD.text_width(1);
lfink6 1:481169ca05e0 134 uLCD.text_height(1);
lfink6 0:57a32b7102e8 135 imu.begin();
lfink6 0:57a32b7102e8 136 if (!imu.begin()) {
lfink6 0:57a32b7102e8 137 //set fail flag for imu here
lfink6 0:57a32b7102e8 138 }
lfink6 0:57a32b7102e8 139 imu.calibrate();
lfink6 1:481169ca05e0 140 playpause.mode(PullUp);
lfink6 1:481169ca05e0 141 playpause.attach_deasserted(&buttonThread);
lfink6 1:481169ca05e0 142 playpause.setSampleFrequency();
lfink6 1:481169ca05e0 143 //LCD, Player, button Interrupt, bluetooth, imu+mic
lfink6 1:481169ca05e0 144 Thread thread1(LCDThread);
lfink6 1:481169ca05e0 145 Thread thread2(PlayerThread);
lfink6 1:481169ca05e0 146 Thread thread4(BlueThread);
lfink6 1:481169ca05e0 147 Thread thread5(IMUThread);
lfink6 0:57a32b7102e8 148 while(1) {
lfink6 1:481169ca05e0 149 //add some code to show the menu of songs if the mbed pushbutton is pushed here
lfink6 0:57a32b7102e8 150
lfink6 0:57a32b7102e8 151 }
lfink6 0:57a32b7102e8 152 }