sd

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

Fork of WavePlayer_HelloWorld by jim hamblen

Revision:
2:6e4f4a49eebe
Parent:
1:5b8e223e983d
--- a/main.cpp	Thu Jan 24 02:59:05 2013 +0000
+++ b/main.cpp	Wed Mar 26 18:21:02 2014 +0000
@@ -1,20 +1,184 @@
-
+//Jason Mar
 #include "mbed.h"
 #include "SDFileSystem.h"
 #include "wave_player.h"
-
+#include "uLCD_4DGL.h"
+#include "PinDetect.h"
+#include <string>
+#include <vector>
 
-SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
+//initialize all pins
+SDFileSystem sd(p5, p6, p7, p8, p9, "sd"); //SD card
+uLCD_4DGL uLCD(p28, p27, p29);
+PinDetect pb1(p24);
+PinDetect pb2(p23);
+PinDetect pb3(p22);
+PinDetect pb4(p21);
 
 AnalogOut DACout(p18);
 
 wave_player waver(&DACout);
+//unused pins
+DigitalOut P10(p10);
+DigitalOut P11(p11);
+DigitalOut P12(p12);
+DigitalOut P13(p13);
+DigitalOut P14(p14);
+DigitalOut P15(p15);
+DigitalOut P16(p16);
+DigitalOut P17(p17);
+DigitalOut P19(p19);
+DigitalOut P20(p20);
+
+vector<string> filenames; //filenames are stored in a vector string
+int volatile selection = 0;
+int volatile totalSongs = 0;
+bool play = false;
+bool *playptr = &play;
+
+//implement pushbuttons
+void pb1_hit_callback (void)
+{
+   play = !play;
+}
+void pb2_hit_callback (void)
+{
+    selection++;
+    if(selection >= totalSongs)
+        selection = 0;
+}
+void pb3_hit_callback (void)
+{
+    selection--;
+    if(selection < 0)
+        selection = totalSongs - 1;
+}
+void pb4_hit_callback (void)
+{
+    int *vol = waver.getVolume();
+    *vol = *vol + 1;
+    if (*vol >= 16){
+        *vol = 0;
+    }
+}
+//reads the file names
+void read_file_names(char *dir)
+{
+    DIR *dp;
+    struct dirent *dirp;
+    dp = opendir(dir);
+  //read all directory and file names in current directory into filename vector
+    while((dirp = readdir(dp)) != NULL) {
+        filenames.push_back(string(dirp->d_name));
+        totalSongs++;
+    }
+    closedir(dp);
+}
+
 
 int main()
 {
-    FILE *wave_file;
-    printf("\n\n\nHello, wave world!\n");
-    wave_file=fopen("/sd/sample.wav","r");
-    waver.play(wave_file);
-    fclose(wave_file);
+    //initialize the buttons
+    pb1.mode(PullUp);
+    pb2.mode(PullUp);
+    pb3.mode(PullUp);
+    pb4.mode(PullUp);
+    
+    // Delay for initial pullup to take effect
+    wait(.01);
+    
+    // Setup Interrupt callback functions for a pb hit
+    pb1.attach_deasserted(&pb1_hit_callback);
+    pb2.attach_deasserted(&pb2_hit_callback);
+    pb3.attach_deasserted(&pb3_hit_callback);
+    pb4.attach_deasserted(&pb4_hit_callback);
+    
+    // Start sampling pb inputs using interrupts
+    pb1.setSampleFrequency();
+    pb2.setSampleFrequency();
+    pb3.setSampleFrequency();
+    pb4.setSampleFrequency();
+    
+    //check for SD card insertion, if no sd card print Insert SD Card
+    bool SDinsert = false;
+    while(SDinsert == false){
+        SDinsert = sd.sd_inserted();
+        if(SDinsert == false){
+            uLCD.locate(0,1);
+            uLCD.printf("Insert SD Card");
+        }
+        else {
+            sd.disk_initialize();
+            uLCD.cls();
+        }
+    }
+    FILE *file;
+    read_file_names("/sd/myMusic");
+    
+         
+    string song; 
+    string dir;
+    int c = 0;
+    int prevfile = -1;
+    while(1) {
+        //prints the directory of songs and does not refresh until a pushbutton changes the selection
+        if(c == 0 || selection != prevfile){
+            prevfile = selection;
+            uLCD.cls();
+            uLCD.locate(0,0);
+            //lists the directory songs in white and the selected song in red
+            for(int i=0;i<totalSongs;i++){    
+                if(i != selection){
+                    int l=filenames[i].size();
+                    uLCD.locate(0,i);
+                    uLCD.color(WHITE);
+                    //substrings the .wav out of the print
+                    uLCD.printf("%s",filenames[i].substr(0,l-4));
+                }
+                else {
+                    int l=filenames[selection].size();
+                    uLCD.locate(0,selection);
+                    uLCD.color(RED);
+                    uLCD.printf("%s",filenames[selection].substr(0,l-4));
+                }
+            }   
+        }
+        c++;
+        
+        if(play==true) {
+            //concatenates directory with songname
+            dir="/sd/myMusic";    
+            song = dir + "/" + filenames[selection];
+            //reads the wav file
+            file = fopen(song.c_str(), "r");
+            //clears the screen to print song playiing
+            uLCD.cls();
+            int l=filenames[selection].size();
+            uLCD.locate(0,0);
+            uLCD.printf("%s",filenames[selection].substr(0,l-4));
+            uLCD.locate(0,1);
+            uLCD.printf("%s","Now Playing");
+            waver.play(file,playptr);
+            play=false;
+            fclose(file);
+            uLCD.cls();
+            //reprint the menu as it was before the song started
+            for(int i=0;i<totalSongs;i++){    
+                if(i != selection){
+                    int l=filenames[i].size();
+                    uLCD.locate(0,i);
+                    uLCD.color(WHITE);
+                    uLCD.printf("%s",filenames[i].substr(0,l-4));
+                }
+                else {
+                    int l=filenames[selection].size();
+                    uLCD.locate(0,selection);
+                    uLCD.color(RED);
+                    uLCD.printf("%s",filenames[selection].substr(0,l-4));
+                }
+            }
+        }
+        else
+            wait(0.3);
+    }
 }
\ No newline at end of file