IMU-controlled mp3 player

Dependencies:   4DGL-uLCD-SE MMA8452 PinDetect SDFileSystem mbed wave_player

main.cpp

Committer:
kthlee
Date:
2016-05-02
Revision:
0:b051af62369a

File content as of revision 0:b051af62369a:

#include "mbed.h"
#include "MMA8452.h"
#include "uLCD_4DGL.h"
#include "SDFileSystem.h"
#include "wave_player.h"
#include "PinDetect.h"
#include <vector>
#include <string>
#include <algorithm>

Serial pc(USBTX, USBRX);
SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card DI, DO, SCK, CS
uLCD_4DGL uLCD(p9, p10, p11); // create a global uLCD object rx, tx, reset
MMA8452 acc(p28, p27, 100000); // SDA, SCL, rate
AnalogOut DACout(p18);
PwmOut PWMout(p21);
wave_player waver(&DACout,&PWMout);
PinDetect pb1(p30);


enum modes_t {MainMenu, ListArtists, ListSongs, ListSongsByArtist, PlaySong, PauseSong};
modes_t Mode;
volatile unsigned short currentPointer = 0;
char filePath[] = "/sd/myMusic/";
char location;
vector<string> filenames;
vector<string> artistNames;
vector<string> songNames;
vector<string> playList;
FILE *wave_file;
string artistChosen = "";
string songChosen = "";
int x_value, y_value, z_value;
bool playing = true;
float volume = 0.5f;
float volume_change = 1;

void VolumeUp() {
    volume_change += 0.05;
    if (volume_change >= 1.5) {
        volume_change = 2;
    }
}
void VolumeDown() {
    volume_change -= 0.05;
    if (volume_change <= 0.0) {
        volume_change = 0.0;
    }
}

void pb1_hit_callback()
{
    
    if (Mode == PauseSong) {
        Mode = MainMenu;
    } else {
        playing = !playing;
    }
}

void playSong(string filename) //play a song of given filename
{
    wave_file = fopen(filename.c_str(),"r");
    waver.play(wave_file);
    fclose(wave_file);
}


int aa = 0;

void read_file_names(char *dir) {
    DIR *dp;
    struct dirent *dirp;
    dp = opendir(dir);
    filenames.clear();
    while((dirp = readdir(dp)) != NULL) {
        filenames.push_back(string(dirp->d_name));
    }
}

void printArtists(vector<string> inputList) {
    uLCD.cls();
    uLCD.locate(0,0);
    uLCD.printf("LIST OF ARTISTS:");
    for (int x = 0; x < inputList.size();x++)
    {
        size_t index = inputList[x].find("-");
        uLCD.locate(2,x+3);
        uLCD.printf(inputList[x].substr(0,index).c_str());
    }    
    uLCD.locate(0,currentPointer+3);
    uLCD.printf("->");
}

void printSongs(vector<string> inputList) {
    uLCD.cls();
    uLCD.locate(0,0);
    uLCD.printf("LIST OF SONGS:");
    for (int x = 0; x < inputList.size();x++)
    {
        size_t index = inputList[x].find("-");
        uLCD.locate(2,x+3);
        uLCD.printf(inputList[x].substr(index+2,inputList[x].length()).c_str());
    }    
    uLCD.locate(0,currentPointer+3);
    uLCD.printf("->");
}

vector<string> getArtistList(vector<string> filenames) {
    vector<string> returnList;
    bool mark = false;
    
    for (int i = 0; i < filenames.size(); i++) {
        size_t index = filenames[i].find("-");
        for (int j = i + 1; j < filenames.size(); j++) {
            if (filenames[i].substr(0,index).compare(filenames[j].substr(0,index)) == 0) {
                mark = true;
            }
        }
        
        if (mark == false) {
            returnList.push_back(filenames[i]);
        }
        
        mark = false;
    }
    
    return returnList;
}

vector<string> getSongList(vector<string> filenames) {
    vector<string> returnList;
    for (int i = 0; i < filenames.size(); i++) {
        size_t index = filenames[i].find("-");
        returnList.push_back(filenames[i]);
    }
    return returnList;
}

vector<string> getSongsByArtistList(vector<string> filenames, string artistName) {
    vector<string> returnList;
    for (int i = 0; i < filenames.size(); i++) {
        size_t index = filenames[i].find("-");
        if (filenames[i].find(artistName) != string::npos) {
            returnList.push_back(filenames[i]);
        }
    }
    return returnList;
}


int main() {
    
    pb1.mode(PullUp);
    pb1.attach_deasserted(&pb1_hit_callback);
    pb1.setSampleFrequency();
    Mode = MainMenu;    
    acc.activate();
    
    PWMout.period(1.0/400000.0);
    
    while (1) {
        if (Mode == MainMenu) {
            uLCD.cls();
            uLCD.locate(0,0);
            uLCD.printf("Please Choose:");
            uLCD.locate(0,7);
            uLCD.printf("Artists");
            uLCD.locate(12,7);
            uLCD.printf("Songs");
            while (x_value < 700 && x_value > -700) {
                acc.readXCount(&x_value);
                if (x_value > 700) {
                    Mode = ListArtists; //+X for artists
                }
                if (x_value < -700) {
                    Mode = ListSongs; //-X for Songs
                }
            }
            
        }
        
        if (Mode == ListArtists) {
            read_file_names("/sd/myMusic");
            uLCD.cls();
            artistNames = getArtistList(filenames);
            printArtists(artistNames); //same thing as printSongs(); but for artists
            
            while ( x_value < 700 ||  x_value > -700 || y_value < 700 || y_value > -700)
            {
                
                acc.readYCount(&y_value);
                acc.readXCount(&x_value);
                
                if (y_value > 700) {
                    Mode = MainMenu; //+Y for main menu.
                    break;
                }
                if (y_value < -700) {
                    Mode = ListSongsByArtist; //-Y to list songs by artists
                    size_t index2 = artistNames[currentPointer].find("-");
                    artistChosen = artistNames[currentPointer].substr(0,index2);
                    break;
                }
                if (x_value > 700) {
                    if (currentPointer <= 0) {
                        currentPointer--;
                        break;
                    }
                }
                if (x_value <-700) {
                    if (currentPointer != artistNames.size()) {
                        currentPointer++;
                        break;
                    }
                }
            }
        }
        
        if (Mode == ListSongs) {
            uLCD.cls();
            read_file_names("/sd/myMusic");
            songNames = getSongList(filenames);
            printSongs(songNames);
            uLCD.locate(0,0);
            
            while ( x_value < 700 ||  x_value > -700 || y_value < 700 || y_value > -700)
            {
                
                acc.readXCount(&x_value);
                acc.readYCount(&y_value);
                
                if (y_value > 700) {
                    Mode = MainMenu; //+Y to go back to the main menu.
                    break;
                }
                if (y_value < -700) {
                    playList = songNames;
                    Mode = PlaySong; //-Y to play the song.
                    break;
                }
                if (x_value > 700) {
                    if (currentPointer != 0) {
                        currentPointer--;
                        break;
                    }
                }
                if (x_value <-700) {
                    if (currentPointer != songNames.size()) {
                        currentPointer++; 
                        break;
                    }
                }
                //
//                //Debug Status
//                uLCD.locate(9,9);
//                uLCD.printf("X: %d", x_value);
//                uLCD.locate(9,10);
//                uLCD.printf("Y: %d", y_value);
            }
        }
        
        if (Mode == ListSongsByArtist) {
            uLCD.cls();
            read_file_names("/sd/myMusic");
            songNames = getSongsByArtistList(filenames, artistChosen);
            printSongs(songNames);
            uLCD.locate(0,0);
            uLCD.printf("ListSongsByArtist:");
            
            while ( x_value < 700 ||  x_value > -700 || y_value < 700 || y_value > -700)
            {
                
                acc.readXCount(&x_value);
                acc.readYCount(&y_value);
                
                if (y_value > 700) {
                    Mode = ListArtists; //+Y to go back to list artists
                    break;
                }
                if (y_value < -700) {
                    playList = songNames;
                    Mode = PlaySong; //-Y to play the song.
                    break;
                }
                if (x_value > 700) {
                    if (currentPointer >= 0) {
                        currentPointer--; ////this decreases the song counter (used for selection)
                        break;
                    }
                }
                if (x_value <-700) {
                    if (currentPointer <= songNames.size()) {
                        currentPointer++; ////this increases the song counter
                        break;
                    }
                }
            }
        }
        
        if (Mode == PlaySong) {
            uLCD.cls();
            size_t index3 = playList[currentPointer].find("-");
            uLCD.locate(0,2);
            uLCD.printf("Now Playing:");
            uLCD.locate(2,4);
            uLCD.printf(playList[currentPointer].substr(0,index3).c_str());
            uLCD.locate(2,6);
            uLCD.printf(playList[currentPointer].substr(index3+2, playList[currentPointer].length()-4).c_str());
            playing = true;
            if (playing) {
                playSong("/sd/myMusic/" + playList[currentPointer]);
            }
            Mode = PauseSong;
        }
        
        if (Mode == PauseSong) {
            uLCD.cls();
            uLCD.locate(2,2);
            uLCD.printf("Song Stopped.");
            uLCD.locate(2,4);
            uLCD.printf("Volume: %d", (int)(volume_change * 100/150*100) );
            
            while ( x_value < 700 ||  x_value > -700 || y_value < 700 || y_value > -700)
            {
                
                acc.readXCount(&x_value);
                acc.readYCount(&y_value);
                
                if (x_value > 700) {
                    VolumeUp();
                    break;
                }
                if (x_value < -700) {
                    VolumeDown();
                    break;
                }
                if (y_value > 700) {
                    //Change
                    currentPointer++;
                    songChosen = playList[currentPointer];
                    Mode = PlaySong;
                    break;
                }
                if (y_value <-700) {
                    
                    currentPointer--;
                    songChosen = playList[currentPointer];
                    //Change to previous song
                    Mode = PlaySong;
                    break;
                }
                
                if (Mode == MainMenu) {
                    break;
                }
            }
            
        }
                
    }
}