sd
Dependencies: 4DGL-uLCD-SE PinDetect SDFileSystem mbed wave_player
Fork of WavePlayer_HelloWorld by
Diff: main.cpp
- 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
