VS1053 audio player with lcd and rotary encoder

Dependencies:   LibMenu PinDetect SDFileSystem TextLCD VS1053lib mRotaryEncoder mbed

Revision:
2:1c751f044ecd
Parent:
1:0040f640281c
Child:
3:b6bf1e6d9cde
--- a/main.cpp	Tue Jun 18 17:01:22 2013 +0000
+++ b/main.cpp	Wed Jun 19 10:56:07 2013 +0000
@@ -15,6 +15,10 @@
     PAUSED
 };
 
+void select(MenuNode *node);
+void enterMenu(Menu *menu);
+void enterPausedMenu(Menu *menu);
+
 TextLCD lcd(p24, p25, p26, p27, p28, p29);
 SDFileSystem sd(p5, p6, p7, p8, "sd");
 // PinName mosi, PinName miso, PinName sclk, PinName cs, PinName dreq, PinName rst, PinName xdcs
@@ -26,17 +30,17 @@
 char* currentfile;
 char* lastPlaytime = (char*) malloc(6);
 unsigned char volume = 0x00;
+Menu root(&enterMenu, &select, "ROOT", 5);
+Menu pausedMenu(&enterPausedMenu, &select, "PAUSED", 2);
 
 void select(MenuNode *node) {
     lcd.cls();
     lcd.printf(node->getName());
-    pc.printf("Selected - %s\n\r", node->getName());
 }
 
 void cueNode(MenuNode *node) {
     currentfile = node->getName();
     state = CUED;
-    pc.printf("Cueing menu node - %s\n\r", node->getName());
 }
 
 void setVolume(MenuNode *node) {
@@ -58,11 +62,12 @@
 
 void enterMenu(Menu *menu) {
     current = menu;
-    pc.printf("Entered menu - %s\n\r", menu->getName());
 }
 
-Menu root(&enterMenu, &select, "ROOT", 5);
-Menu pausedMenu(&enterMenu, &select, "PAUSED", 2);
+void enterPausedMenu(Menu *menu) {
+    current = menu;
+    state = PAUSED;
+}
 
 void cancelPlay(MenuNode *node) {
     state = IDLE;
@@ -70,30 +75,20 @@
 }
 
 void buttonPress() {
-    pc.printf("Button press");
     switch (state) {
         case IDLE:
+        case PAUSED:
             current->getSelectedNode().enter();
         break;
         case CUED:
             // do nothing until we start playing;
             break;
         case PLAYING:
-            state = PAUSED;
             pausedMenu.enter();
         break;
-        case PAUSED:
-            current->getSelectedNode().enter();
-        break;
     }
 }
 
-void buttonHeld() {
-    pc.printf("Button held");
-    state = IDLE;
-    root.enter();
-}
-
 void buildLibrary() {
     DIR *d;
     struct dirent *p;
@@ -108,29 +103,21 @@
         root.addMenuNode(*library);
         d = opendir("/sd");
         while ((p = readdir(d)) != NULL) {
-            pc.printf("Makning node\n\r");
             char * name = p->d_name;
             if (sizeof(name) > 0) {
                 MenuNode *node = new MenuNode(&cueNode, &select, name);
-                pc.printf("Makning node done\n\r");
                 library->addMenuNode(*node);
-                pc.printf("Node added\n\r");
-                pc.printf(" - %s\n\r", name);
-            } else {
-                pc.printf("BLANK NAME");            
             }
         }
     } else {
-        pc.printf("Could not open directory!\n");
+        lcd.printf("Could not open root directory!\n");
     }
     closedir(d);
 }
 
 void setupMenu() {
     pc.printf("Building menus...\n\r");
-    pc.printf("Menu size - %d\r\n", root.size());
     buildLibrary();
-    pc.printf("Menu size - %d\r\n", root.size());
     Menu *settings = new Menu(&enterMenu, &select, "Settings", 3);
     root.addMenuNode(*settings);
     Menu *test = new Menu(&enterMenu, &select, "Test", 2);
@@ -141,7 +128,6 @@
     settings->addMenuNode(*bass);
     MenuNode *treble = new MenuNode(&setTreble, &select, "Treble");
     settings->addMenuNode(*treble);
-    pc.printf("Menu size - %d\r\n", root.size());
     MenuNode *contPlay = new MenuNode(&continuePlay, &select, "Continue");
     MenuNode *cancPlay = new MenuNode(&cancelPlay, &select, "Cancel");
     pausedMenu.addMenuNode(*contPlay);
@@ -152,27 +138,22 @@
 
 void control() {
     int val = rot.Get();
-    pc.printf("Enc val - %d", val);
     if (state == PLAYING) {
         pc.printf("\r\n");
         if (val > 1) {
-            pc.printf("Going up...\r\n");
             volume -= 0x05;
+            vs1053.setvolume(volume, volume);        
             rot.Set(0);
         } else if (val < -1) {
-            pc.printf("Going down...\r\n");
             volume += 0x05;
+            vs1053.setvolume(volume, volume);        
             rot.Set(0);
         }
-        pc.printf("Setting volume - %d", volume);
-        vs1053.setvolume(volume, volume);        
     } else if (state == IDLE || state == PAUSED) {
         if (val > 1) {
-            pc.printf("forward\n\r");
             current->up();      
             rot.Set(0);
         } else if (val < -1) {
-            pc.printf("back\n\r");
             current->down();
             rot.Set(0);
         }
@@ -193,21 +174,18 @@
 
 void checkCued() {
     if (state == CUED) {
-        pc.printf("Opening file %s\n\r", currentfile);
         unsigned char buff[BUFFER_SIZE];
         char abs[16];
         strcpy(abs, "/sd/");
         strcat(abs, currentfile);
         FILE *song = fopen(abs, "r");
         if (song == NULL) {
-            pc.printf("Cannot find file\n\r");
             lcd.cls();
             lcd.printf("File not found.");
             wait(1.5);
             root.enter();
         } else {
             char* playtime = (char*) malloc(6);
-            pc.printf("File open\n\r");
             drawNowPlaying("00:00");
             state = PLAYING;
             while(!feof(song)) {
@@ -243,16 +221,15 @@
 }
 
 int main() {
+    pc.printf("Starting...\n\r");
     lcd.printf("Initialising...");
     lcd.locate(0, 1);
-    lcd.printf("O pod v0.1");
+    lcd.printf("O pod v0.2");
     wait(1.0);
-    pc.printf("Starting...\n\r");
     vs1053.init();
     vs1053.loadpatch();
     rot.Set(0);
     rot.attachSW(&buttonPress);
-    //rot.attachSWHeld(&buttonHeld);
     rot.attachROT(&control);
     setupMenu();
     while (1) {