inital commit

Dependencies:   mbed wave_player mbed-rtos 4DGL-uLCD-SE SDFileSystem2 PinDetect MMA8452

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