IMU-controlled mp3 player

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

Committer:
kthlee
Date:
Mon May 02 08:00:51 2016 +0000
Revision:
0:b051af62369a
s

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kthlee 0:b051af62369a 1 #include "mbed.h"
kthlee 0:b051af62369a 2 #include "MMA8452.h"
kthlee 0:b051af62369a 3 #include "uLCD_4DGL.h"
kthlee 0:b051af62369a 4 #include "SDFileSystem.h"
kthlee 0:b051af62369a 5 #include "wave_player.h"
kthlee 0:b051af62369a 6 #include "PinDetect.h"
kthlee 0:b051af62369a 7 #include <vector>
kthlee 0:b051af62369a 8 #include <string>
kthlee 0:b051af62369a 9 #include <algorithm>
kthlee 0:b051af62369a 10
kthlee 0:b051af62369a 11 Serial pc(USBTX, USBRX);
kthlee 0:b051af62369a 12 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card DI, DO, SCK, CS
kthlee 0:b051af62369a 13 uLCD_4DGL uLCD(p9, p10, p11); // create a global uLCD object rx, tx, reset
kthlee 0:b051af62369a 14 MMA8452 acc(p28, p27, 100000); // SDA, SCL, rate
kthlee 0:b051af62369a 15 AnalogOut DACout(p18);
kthlee 0:b051af62369a 16 PwmOut PWMout(p21);
kthlee 0:b051af62369a 17 wave_player waver(&DACout,&PWMout);
kthlee 0:b051af62369a 18 PinDetect pb1(p30);
kthlee 0:b051af62369a 19
kthlee 0:b051af62369a 20
kthlee 0:b051af62369a 21 enum modes_t {MainMenu, ListArtists, ListSongs, ListSongsByArtist, PlaySong, PauseSong};
kthlee 0:b051af62369a 22 modes_t Mode;
kthlee 0:b051af62369a 23 volatile unsigned short currentPointer = 0;
kthlee 0:b051af62369a 24 char filePath[] = "/sd/myMusic/";
kthlee 0:b051af62369a 25 char location;
kthlee 0:b051af62369a 26 vector<string> filenames;
kthlee 0:b051af62369a 27 vector<string> artistNames;
kthlee 0:b051af62369a 28 vector<string> songNames;
kthlee 0:b051af62369a 29 vector<string> playList;
kthlee 0:b051af62369a 30 FILE *wave_file;
kthlee 0:b051af62369a 31 string artistChosen = "";
kthlee 0:b051af62369a 32 string songChosen = "";
kthlee 0:b051af62369a 33 int x_value, y_value, z_value;
kthlee 0:b051af62369a 34 bool playing = true;
kthlee 0:b051af62369a 35 float volume = 0.5f;
kthlee 0:b051af62369a 36 float volume_change = 1;
kthlee 0:b051af62369a 37
kthlee 0:b051af62369a 38 void VolumeUp() {
kthlee 0:b051af62369a 39 volume_change += 0.05;
kthlee 0:b051af62369a 40 if (volume_change >= 1.5) {
kthlee 0:b051af62369a 41 volume_change = 2;
kthlee 0:b051af62369a 42 }
kthlee 0:b051af62369a 43 }
kthlee 0:b051af62369a 44 void VolumeDown() {
kthlee 0:b051af62369a 45 volume_change -= 0.05;
kthlee 0:b051af62369a 46 if (volume_change <= 0.0) {
kthlee 0:b051af62369a 47 volume_change = 0.0;
kthlee 0:b051af62369a 48 }
kthlee 0:b051af62369a 49 }
kthlee 0:b051af62369a 50
kthlee 0:b051af62369a 51 void pb1_hit_callback()
kthlee 0:b051af62369a 52 {
kthlee 0:b051af62369a 53
kthlee 0:b051af62369a 54 if (Mode == PauseSong) {
kthlee 0:b051af62369a 55 Mode = MainMenu;
kthlee 0:b051af62369a 56 } else {
kthlee 0:b051af62369a 57 playing = !playing;
kthlee 0:b051af62369a 58 }
kthlee 0:b051af62369a 59 }
kthlee 0:b051af62369a 60
kthlee 0:b051af62369a 61 void playSong(string filename) //play a song of given filename
kthlee 0:b051af62369a 62 {
kthlee 0:b051af62369a 63 wave_file = fopen(filename.c_str(),"r");
kthlee 0:b051af62369a 64 waver.play(wave_file);
kthlee 0:b051af62369a 65 fclose(wave_file);
kthlee 0:b051af62369a 66 }
kthlee 0:b051af62369a 67
kthlee 0:b051af62369a 68
kthlee 0:b051af62369a 69 int aa = 0;
kthlee 0:b051af62369a 70
kthlee 0:b051af62369a 71 void read_file_names(char *dir) {
kthlee 0:b051af62369a 72 DIR *dp;
kthlee 0:b051af62369a 73 struct dirent *dirp;
kthlee 0:b051af62369a 74 dp = opendir(dir);
kthlee 0:b051af62369a 75 filenames.clear();
kthlee 0:b051af62369a 76 while((dirp = readdir(dp)) != NULL) {
kthlee 0:b051af62369a 77 filenames.push_back(string(dirp->d_name));
kthlee 0:b051af62369a 78 }
kthlee 0:b051af62369a 79 }
kthlee 0:b051af62369a 80
kthlee 0:b051af62369a 81 void printArtists(vector<string> inputList) {
kthlee 0:b051af62369a 82 uLCD.cls();
kthlee 0:b051af62369a 83 uLCD.locate(0,0);
kthlee 0:b051af62369a 84 uLCD.printf("LIST OF ARTISTS:");
kthlee 0:b051af62369a 85 for (int x = 0; x < inputList.size();x++)
kthlee 0:b051af62369a 86 {
kthlee 0:b051af62369a 87 size_t index = inputList[x].find("-");
kthlee 0:b051af62369a 88 uLCD.locate(2,x+3);
kthlee 0:b051af62369a 89 uLCD.printf(inputList[x].substr(0,index).c_str());
kthlee 0:b051af62369a 90 }
kthlee 0:b051af62369a 91 uLCD.locate(0,currentPointer+3);
kthlee 0:b051af62369a 92 uLCD.printf("->");
kthlee 0:b051af62369a 93 }
kthlee 0:b051af62369a 94
kthlee 0:b051af62369a 95 void printSongs(vector<string> inputList) {
kthlee 0:b051af62369a 96 uLCD.cls();
kthlee 0:b051af62369a 97 uLCD.locate(0,0);
kthlee 0:b051af62369a 98 uLCD.printf("LIST OF SONGS:");
kthlee 0:b051af62369a 99 for (int x = 0; x < inputList.size();x++)
kthlee 0:b051af62369a 100 {
kthlee 0:b051af62369a 101 size_t index = inputList[x].find("-");
kthlee 0:b051af62369a 102 uLCD.locate(2,x+3);
kthlee 0:b051af62369a 103 uLCD.printf(inputList[x].substr(index+2,inputList[x].length()).c_str());
kthlee 0:b051af62369a 104 }
kthlee 0:b051af62369a 105 uLCD.locate(0,currentPointer+3);
kthlee 0:b051af62369a 106 uLCD.printf("->");
kthlee 0:b051af62369a 107 }
kthlee 0:b051af62369a 108
kthlee 0:b051af62369a 109 vector<string> getArtistList(vector<string> filenames) {
kthlee 0:b051af62369a 110 vector<string> returnList;
kthlee 0:b051af62369a 111 bool mark = false;
kthlee 0:b051af62369a 112
kthlee 0:b051af62369a 113 for (int i = 0; i < filenames.size(); i++) {
kthlee 0:b051af62369a 114 size_t index = filenames[i].find("-");
kthlee 0:b051af62369a 115 for (int j = i + 1; j < filenames.size(); j++) {
kthlee 0:b051af62369a 116 if (filenames[i].substr(0,index).compare(filenames[j].substr(0,index)) == 0) {
kthlee 0:b051af62369a 117 mark = true;
kthlee 0:b051af62369a 118 }
kthlee 0:b051af62369a 119 }
kthlee 0:b051af62369a 120
kthlee 0:b051af62369a 121 if (mark == false) {
kthlee 0:b051af62369a 122 returnList.push_back(filenames[i]);
kthlee 0:b051af62369a 123 }
kthlee 0:b051af62369a 124
kthlee 0:b051af62369a 125 mark = false;
kthlee 0:b051af62369a 126 }
kthlee 0:b051af62369a 127
kthlee 0:b051af62369a 128 return returnList;
kthlee 0:b051af62369a 129 }
kthlee 0:b051af62369a 130
kthlee 0:b051af62369a 131 vector<string> getSongList(vector<string> filenames) {
kthlee 0:b051af62369a 132 vector<string> returnList;
kthlee 0:b051af62369a 133 for (int i = 0; i < filenames.size(); i++) {
kthlee 0:b051af62369a 134 size_t index = filenames[i].find("-");
kthlee 0:b051af62369a 135 returnList.push_back(filenames[i]);
kthlee 0:b051af62369a 136 }
kthlee 0:b051af62369a 137 return returnList;
kthlee 0:b051af62369a 138 }
kthlee 0:b051af62369a 139
kthlee 0:b051af62369a 140 vector<string> getSongsByArtistList(vector<string> filenames, string artistName) {
kthlee 0:b051af62369a 141 vector<string> returnList;
kthlee 0:b051af62369a 142 for (int i = 0; i < filenames.size(); i++) {
kthlee 0:b051af62369a 143 size_t index = filenames[i].find("-");
kthlee 0:b051af62369a 144 if (filenames[i].find(artistName) != string::npos) {
kthlee 0:b051af62369a 145 returnList.push_back(filenames[i]);
kthlee 0:b051af62369a 146 }
kthlee 0:b051af62369a 147 }
kthlee 0:b051af62369a 148 return returnList;
kthlee 0:b051af62369a 149 }
kthlee 0:b051af62369a 150
kthlee 0:b051af62369a 151
kthlee 0:b051af62369a 152 int main() {
kthlee 0:b051af62369a 153
kthlee 0:b051af62369a 154 pb1.mode(PullUp);
kthlee 0:b051af62369a 155 pb1.attach_deasserted(&pb1_hit_callback);
kthlee 0:b051af62369a 156 pb1.setSampleFrequency();
kthlee 0:b051af62369a 157 Mode = MainMenu;
kthlee 0:b051af62369a 158 acc.activate();
kthlee 0:b051af62369a 159
kthlee 0:b051af62369a 160 PWMout.period(1.0/400000.0);
kthlee 0:b051af62369a 161
kthlee 0:b051af62369a 162 while (1) {
kthlee 0:b051af62369a 163 if (Mode == MainMenu) {
kthlee 0:b051af62369a 164 uLCD.cls();
kthlee 0:b051af62369a 165 uLCD.locate(0,0);
kthlee 0:b051af62369a 166 uLCD.printf("Please Choose:");
kthlee 0:b051af62369a 167 uLCD.locate(0,7);
kthlee 0:b051af62369a 168 uLCD.printf("Artists");
kthlee 0:b051af62369a 169 uLCD.locate(12,7);
kthlee 0:b051af62369a 170 uLCD.printf("Songs");
kthlee 0:b051af62369a 171 while (x_value < 700 && x_value > -700) {
kthlee 0:b051af62369a 172 acc.readXCount(&x_value);
kthlee 0:b051af62369a 173 if (x_value > 700) {
kthlee 0:b051af62369a 174 Mode = ListArtists; //+X for artists
kthlee 0:b051af62369a 175 }
kthlee 0:b051af62369a 176 if (x_value < -700) {
kthlee 0:b051af62369a 177 Mode = ListSongs; //-X for Songs
kthlee 0:b051af62369a 178 }
kthlee 0:b051af62369a 179 }
kthlee 0:b051af62369a 180
kthlee 0:b051af62369a 181 }
kthlee 0:b051af62369a 182
kthlee 0:b051af62369a 183 if (Mode == ListArtists) {
kthlee 0:b051af62369a 184 read_file_names("/sd/myMusic");
kthlee 0:b051af62369a 185 uLCD.cls();
kthlee 0:b051af62369a 186 artistNames = getArtistList(filenames);
kthlee 0:b051af62369a 187 printArtists(artistNames); //same thing as printSongs(); but for artists
kthlee 0:b051af62369a 188
kthlee 0:b051af62369a 189 while ( x_value < 700 || x_value > -700 || y_value < 700 || y_value > -700)
kthlee 0:b051af62369a 190 {
kthlee 0:b051af62369a 191
kthlee 0:b051af62369a 192 acc.readYCount(&y_value);
kthlee 0:b051af62369a 193 acc.readXCount(&x_value);
kthlee 0:b051af62369a 194
kthlee 0:b051af62369a 195 if (y_value > 700) {
kthlee 0:b051af62369a 196 Mode = MainMenu; //+Y for main menu.
kthlee 0:b051af62369a 197 break;
kthlee 0:b051af62369a 198 }
kthlee 0:b051af62369a 199 if (y_value < -700) {
kthlee 0:b051af62369a 200 Mode = ListSongsByArtist; //-Y to list songs by artists
kthlee 0:b051af62369a 201 size_t index2 = artistNames[currentPointer].find("-");
kthlee 0:b051af62369a 202 artistChosen = artistNames[currentPointer].substr(0,index2);
kthlee 0:b051af62369a 203 break;
kthlee 0:b051af62369a 204 }
kthlee 0:b051af62369a 205 if (x_value > 700) {
kthlee 0:b051af62369a 206 if (currentPointer <= 0) {
kthlee 0:b051af62369a 207 currentPointer--;
kthlee 0:b051af62369a 208 break;
kthlee 0:b051af62369a 209 }
kthlee 0:b051af62369a 210 }
kthlee 0:b051af62369a 211 if (x_value <-700) {
kthlee 0:b051af62369a 212 if (currentPointer != artistNames.size()) {
kthlee 0:b051af62369a 213 currentPointer++;
kthlee 0:b051af62369a 214 break;
kthlee 0:b051af62369a 215 }
kthlee 0:b051af62369a 216 }
kthlee 0:b051af62369a 217 }
kthlee 0:b051af62369a 218 }
kthlee 0:b051af62369a 219
kthlee 0:b051af62369a 220 if (Mode == ListSongs) {
kthlee 0:b051af62369a 221 uLCD.cls();
kthlee 0:b051af62369a 222 read_file_names("/sd/myMusic");
kthlee 0:b051af62369a 223 songNames = getSongList(filenames);
kthlee 0:b051af62369a 224 printSongs(songNames);
kthlee 0:b051af62369a 225 uLCD.locate(0,0);
kthlee 0:b051af62369a 226
kthlee 0:b051af62369a 227 while ( x_value < 700 || x_value > -700 || y_value < 700 || y_value > -700)
kthlee 0:b051af62369a 228 {
kthlee 0:b051af62369a 229
kthlee 0:b051af62369a 230 acc.readXCount(&x_value);
kthlee 0:b051af62369a 231 acc.readYCount(&y_value);
kthlee 0:b051af62369a 232
kthlee 0:b051af62369a 233 if (y_value > 700) {
kthlee 0:b051af62369a 234 Mode = MainMenu; //+Y to go back to the main menu.
kthlee 0:b051af62369a 235 break;
kthlee 0:b051af62369a 236 }
kthlee 0:b051af62369a 237 if (y_value < -700) {
kthlee 0:b051af62369a 238 playList = songNames;
kthlee 0:b051af62369a 239 Mode = PlaySong; //-Y to play the song.
kthlee 0:b051af62369a 240 break;
kthlee 0:b051af62369a 241 }
kthlee 0:b051af62369a 242 if (x_value > 700) {
kthlee 0:b051af62369a 243 if (currentPointer != 0) {
kthlee 0:b051af62369a 244 currentPointer--;
kthlee 0:b051af62369a 245 break;
kthlee 0:b051af62369a 246 }
kthlee 0:b051af62369a 247 }
kthlee 0:b051af62369a 248 if (x_value <-700) {
kthlee 0:b051af62369a 249 if (currentPointer != songNames.size()) {
kthlee 0:b051af62369a 250 currentPointer++;
kthlee 0:b051af62369a 251 break;
kthlee 0:b051af62369a 252 }
kthlee 0:b051af62369a 253 }
kthlee 0:b051af62369a 254 //
kthlee 0:b051af62369a 255 // //Debug Status
kthlee 0:b051af62369a 256 // uLCD.locate(9,9);
kthlee 0:b051af62369a 257 // uLCD.printf("X: %d", x_value);
kthlee 0:b051af62369a 258 // uLCD.locate(9,10);
kthlee 0:b051af62369a 259 // uLCD.printf("Y: %d", y_value);
kthlee 0:b051af62369a 260 }
kthlee 0:b051af62369a 261 }
kthlee 0:b051af62369a 262
kthlee 0:b051af62369a 263 if (Mode == ListSongsByArtist) {
kthlee 0:b051af62369a 264 uLCD.cls();
kthlee 0:b051af62369a 265 read_file_names("/sd/myMusic");
kthlee 0:b051af62369a 266 songNames = getSongsByArtistList(filenames, artistChosen);
kthlee 0:b051af62369a 267 printSongs(songNames);
kthlee 0:b051af62369a 268 uLCD.locate(0,0);
kthlee 0:b051af62369a 269 uLCD.printf("ListSongsByArtist:");
kthlee 0:b051af62369a 270
kthlee 0:b051af62369a 271 while ( x_value < 700 || x_value > -700 || y_value < 700 || y_value > -700)
kthlee 0:b051af62369a 272 {
kthlee 0:b051af62369a 273
kthlee 0:b051af62369a 274 acc.readXCount(&x_value);
kthlee 0:b051af62369a 275 acc.readYCount(&y_value);
kthlee 0:b051af62369a 276
kthlee 0:b051af62369a 277 if (y_value > 700) {
kthlee 0:b051af62369a 278 Mode = ListArtists; //+Y to go back to list artists
kthlee 0:b051af62369a 279 break;
kthlee 0:b051af62369a 280 }
kthlee 0:b051af62369a 281 if (y_value < -700) {
kthlee 0:b051af62369a 282 playList = songNames;
kthlee 0:b051af62369a 283 Mode = PlaySong; //-Y to play the song.
kthlee 0:b051af62369a 284 break;
kthlee 0:b051af62369a 285 }
kthlee 0:b051af62369a 286 if (x_value > 700) {
kthlee 0:b051af62369a 287 if (currentPointer >= 0) {
kthlee 0:b051af62369a 288 currentPointer--; ////this decreases the song counter (used for selection)
kthlee 0:b051af62369a 289 break;
kthlee 0:b051af62369a 290 }
kthlee 0:b051af62369a 291 }
kthlee 0:b051af62369a 292 if (x_value <-700) {
kthlee 0:b051af62369a 293 if (currentPointer <= songNames.size()) {
kthlee 0:b051af62369a 294 currentPointer++; ////this increases the song counter
kthlee 0:b051af62369a 295 break;
kthlee 0:b051af62369a 296 }
kthlee 0:b051af62369a 297 }
kthlee 0:b051af62369a 298 }
kthlee 0:b051af62369a 299 }
kthlee 0:b051af62369a 300
kthlee 0:b051af62369a 301 if (Mode == PlaySong) {
kthlee 0:b051af62369a 302 uLCD.cls();
kthlee 0:b051af62369a 303 size_t index3 = playList[currentPointer].find("-");
kthlee 0:b051af62369a 304 uLCD.locate(0,2);
kthlee 0:b051af62369a 305 uLCD.printf("Now Playing:");
kthlee 0:b051af62369a 306 uLCD.locate(2,4);
kthlee 0:b051af62369a 307 uLCD.printf(playList[currentPointer].substr(0,index3).c_str());
kthlee 0:b051af62369a 308 uLCD.locate(2,6);
kthlee 0:b051af62369a 309 uLCD.printf(playList[currentPointer].substr(index3+2, playList[currentPointer].length()-4).c_str());
kthlee 0:b051af62369a 310 playing = true;
kthlee 0:b051af62369a 311 if (playing) {
kthlee 0:b051af62369a 312 playSong("/sd/myMusic/" + playList[currentPointer]);
kthlee 0:b051af62369a 313 }
kthlee 0:b051af62369a 314 Mode = PauseSong;
kthlee 0:b051af62369a 315 }
kthlee 0:b051af62369a 316
kthlee 0:b051af62369a 317 if (Mode == PauseSong) {
kthlee 0:b051af62369a 318 uLCD.cls();
kthlee 0:b051af62369a 319 uLCD.locate(2,2);
kthlee 0:b051af62369a 320 uLCD.printf("Song Stopped.");
kthlee 0:b051af62369a 321 uLCD.locate(2,4);
kthlee 0:b051af62369a 322 uLCD.printf("Volume: %d", (int)(volume_change * 100/150*100) );
kthlee 0:b051af62369a 323
kthlee 0:b051af62369a 324 while ( x_value < 700 || x_value > -700 || y_value < 700 || y_value > -700)
kthlee 0:b051af62369a 325 {
kthlee 0:b051af62369a 326
kthlee 0:b051af62369a 327 acc.readXCount(&x_value);
kthlee 0:b051af62369a 328 acc.readYCount(&y_value);
kthlee 0:b051af62369a 329
kthlee 0:b051af62369a 330 if (x_value > 700) {
kthlee 0:b051af62369a 331 VolumeUp();
kthlee 0:b051af62369a 332 break;
kthlee 0:b051af62369a 333 }
kthlee 0:b051af62369a 334 if (x_value < -700) {
kthlee 0:b051af62369a 335 VolumeDown();
kthlee 0:b051af62369a 336 break;
kthlee 0:b051af62369a 337 }
kthlee 0:b051af62369a 338 if (y_value > 700) {
kthlee 0:b051af62369a 339 //Change
kthlee 0:b051af62369a 340 currentPointer++;
kthlee 0:b051af62369a 341 songChosen = playList[currentPointer];
kthlee 0:b051af62369a 342 Mode = PlaySong;
kthlee 0:b051af62369a 343 break;
kthlee 0:b051af62369a 344 }
kthlee 0:b051af62369a 345 if (y_value <-700) {
kthlee 0:b051af62369a 346
kthlee 0:b051af62369a 347 currentPointer--;
kthlee 0:b051af62369a 348 songChosen = playList[currentPointer];
kthlee 0:b051af62369a 349 //Change to previous song
kthlee 0:b051af62369a 350 Mode = PlaySong;
kthlee 0:b051af62369a 351 break;
kthlee 0:b051af62369a 352 }
kthlee 0:b051af62369a 353
kthlee 0:b051af62369a 354 if (Mode == MainMenu) {
kthlee 0:b051af62369a 355 break;
kthlee 0:b051af62369a 356 }
kthlee 0:b051af62369a 357 }
kthlee 0:b051af62369a 358
kthlee 0:b051af62369a 359 }
kthlee 0:b051af62369a 360
kthlee 0:b051af62369a 361 }
kthlee 0:b051af62369a 362 }