inital commit
Dependencies: mbed wave_player mbed-rtos 4DGL-uLCD-SE SDFileSystem2 PinDetect MMA8452
Diff: main.cpp
- Revision:
- 3:8a1fd3450cb5
- Parent:
- 2:c2afd0c426af
- Child:
- 5:afdd7d5b432a
--- a/main.cpp Tue Apr 18 13:00:09 2017 +0000 +++ b/main.cpp Sun Dec 12 00:15:41 2021 +0000 @@ -1,23 +1,265 @@ - #include "mbed.h" #include "rtos.h" #include "SDFileSystem.h" +#include "uLCD_4DGL.h" #include "wave_player.h" +#include "LSM9DS1.h" +#include "PinDetect.h" +#include <string> +#include <vector> +DigitalOut myled(LED1); +Serial blue(p28,p27); SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card +uLCD_4DGL uLCD(p13,p14,p11); + +LSM9DS1 imu(p9, p10, 0xD6, 0x3C); +Serial pc(USBTX, USBRX); + +PinDetect playpause(p23); +PinDetect menu(p26); +PinDetect skip(p25); +PinDetect back(p30); +Mutex LCD; +Mutex Speaker; +Mutex avgs; +Mutex mentex; AnalogOut DACout(p18); wave_player waver(&DACout); +bool play = 0; +bool menu1 = 0; +int currentsong = 0; +int avgIMU; +int avgMic; +int songcount; +vector <string> songList; // vector of songs to index + +class microphone +{ +public : + microphone(PinName pin); + float read(); + operator float (); +private : + AnalogIn _pin; +}; +microphone::microphone (PinName pin): + _pin(pin) +{ +} +float microphone::read() +{ + return _pin.read(); +} +inline microphone::operator float () +{ + return _pin.read(); +} + +microphone mymicrophone(p16); +void TrackSelect() +{ + //Add code here to use the avg to set the next track, or set the next track based on the menu. + } +void LCDThread(void const *argument) +{ + while(1){ + if(!menu1) + { + LCD.lock(); + uLCD.locate(1,1); + uLCD.printf("Put Song Name Here"); + uLCD.printf("%4D", avgIMU); + uLCD.printf("%4D", avgMic); + if(!play) + { + //play + + uLCD.filled_rectangle(0,118,280,40,BLACK); + uLCD.triangle(120, 100, 40, 40, 10, 100, 0x0000FF); + } + else + { + //pause + uLCD.filled_rectangle(0,118,110,40,WHITE); + uLCD.filled_rectangle(50,118,100,40,BLACK); + uLCD.filled_rectangle(180,118,280,40,WHITE); + } + LCD.unlock(); + } + else + { + mentex.lock(); + if(currentsong<songcount+3) + { + for(int i=0; i<3; i++) + { + //add code to display and scroll through menu here + LCD.lock(); + uLCD.printf("\r%d. %s\r\n\r\n", (i+1), songList[currentsong+i].substr(0,songList[currentsong + i].find(".wav"))); + LCD.unlock(); + + } + currentsong= currentsong+3; + } + else + { + for(int i=0; i<songcount-currentsong; i++) + { + //add code to display and scroll through menu here + LCD.lock(); + uLCD.printf("\r%d. %s\r\n\r\n", (i+1), songList[currentsong+i].substr(0,songList[currentsong + i].find(".wav"))); + LCD.unlock(); + } + for(int i=0; i<3-(songcount-currentsong); i++) + { + //add code to display and scroll through menu here + LCD.lock(); + uLCD.printf("\r%d. %s\r\n\r\n", (i+1), songList[currentsong+i].substr(0,songList[currentsong + i].find(".wav"))); + LCD.unlock(); + } + } + mentex.unlock(); + } + + Thread::wait(1000); + } + +} +void buttonThread() +{ + //add playpause and skip features here + Speaker.lock(); + if(play) + { + //playing = false; + } + else + { + //playing = true; + } + play=!play; + myled=play; + Speaker.unlock(); + Thread::wait(100); +} +void skipThread() +{ + //add skip features + mentex.lock(); + if(currentsong<songcount) + { + currentsong++; + } + else + { + currentsong=0; + } + mentex.unlock(); + Thread::wait(100); +} +void backThread() +{ + //add skip features + + mentex.lock(); + if(currentsong!=0) + { + currentsong--; + } + else + { + currentsong=songcount; + } + + mentex.unlock(); + Thread::wait(100); +} +void menuThread() +{ + Speaker.lock(); + menu1=!menu1; + Speaker.unlock(); + Thread::wait(100); +} +void BlueThread(void const *argument) +{ + //add bluetooth control code here + while(1) + { + if(blue.readable()) + { + + } + } +} +void IMUThread(void const *argument) +{ + while(1){ + avgs.lock(); + //put imu averaging and next track selection code here if that is selected + avgMic = int(((abs((mymicrophone - (0.67/3.3)))*500.0)+avgMic)/2); + imu.readAccel(); + avgIMU=int((((imu.ax+imu.az+imu.ay)/3.0)+avgIMU)/2); + avgs.unlock(); + Thread::wait(2500); + } + +} + int main() { + uLCD.cls(); + uLCD.baudrate(3000000); + uLCD.background_color(BLACK); + uLCD.text_width(1); + uLCD.text_height(1); + imu.begin(); + if (!imu.begin()) { + //set fail flag for imu here + } + imu.calibrate(); + blue.baud(9600); + + DIR *dp; + struct dirent *dirp; + dp = opendir("/sd/myMusic"); + songcount = 0; + if(dp !=NULL) + { + while ((dirp = readdir(dp)) != NULL) { + songList.push_back(string(dirp->d_name)); + //uLCD.printf("\r%s\r\n", string(dirp->d_name)); + songcount++; + } + } + playpause.mode(PullUp); + playpause.attach_deasserted(&buttonThread); + playpause.setSampleFrequency(); + + menu.mode(PullUp); + menu.attach_deasserted(&menuThread); + menu.setSampleFrequency(); + skip.mode(PullUp); + skip.attach_deasserted(&skipThread); + skip.setSampleFrequency(); + back.mode(PullUp); + back.attach_deasserted(&backThread); + back.setSampleFrequency(); + //LCD, Player, button Interrupt, bluetooth, imu+mic + Thread thread1(LCDThread); + Thread thread4(BlueThread); + Thread thread5(IMUThread); + while(1){ FILE *wave_file; - printf("\r\n\nHello, wave world!\n\r"); Thread::wait(1000); wave_file=fopen("/sd/sample.wav","r"); if(wave_file==NULL) printf("file open error!\n\n\r"); waver.play(wave_file); fclose(wave_file); + } } \ No newline at end of file