adfdafa

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

Revision:
0:5369e93c00ed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Apr 11 16:50:37 2016 +0000
@@ -0,0 +1,210 @@
+#include "mbed.h"
+#include "Speaker.h"
+#include "SDFileSystem.h"
+#include "TextLCD.h"
+#include "PinDetect.h"
+#include "wave_player.h"
+#include "uLCD_4DGL.h"
+#include <vector>
+#include <string>
+
+//Pin setup
+DigitalOut myled(LED1);
+PinDetect pb1(p26);
+PinDetect pb2(p25);
+PinDetect pb3(p24);
+PinDetect pb4(p23);
+DigitalIn sdd(p12);
+DigitalOut myLED1(LED1);
+DigitalOut myLED2(LED2);
+DigitalOut myLED3(LED3);
+DigitalOut myLED4(LED4);
+TextLCD panel(p14, p15, p16, p17, p19, p20);
+uLCD_4DGL lcd(p28,p27,p29);
+AnalogOut DACout(p18);
+wave_player waver(&DACout);
+SDFileSystem sd(p5, p6, p7, p8, "sd");
+
+//Globals
+vector <string> filenames;
+int current = 0;
+bool play = false, sd_insert = false;
+static int veclen = 5;
+FILE *wave_file;
+
+void sd_check(){
+    int sdPre = sdd.read();
+    while (sdPre == 0){
+        lcd.locate(0,0);
+        lcd.printf("Insert SD card");
+        sdPre = sdd.read();
+        wait (.5);
+    }
+    lcd.cls();
+}
+
+void write_screen()
+{
+    lcd.locate(0,0);
+    string name;
+    int j = 0;
+    vector<string>::iterator it;
+    //lcd.cls();
+    for(it = filenames.begin(); it < filenames.end(); it++) {
+        name = (*it).c_str();
+        name.erase((name.length()-4),4);
+        if(j++ == current){
+            lcd.printf("~");
+        }
+        else{
+            lcd.printf(" ");
+        }
+        if(name.length() > 17){
+            name.erase(17,(17-name.length()));
+            lcd.printf("%s",name);
+        }
+        else{
+            lcd.printf("%s\n",name);
+        }
+    }
+    /*for(int j = 0; j > veclen; j++){
+        lcd.locate(0,j);
+        if(j == current){
+            lcd.printf("~");
+        }
+        else{
+            lcd.printf("~");   
+        }
+    }*/
+}
+
+void write_panel()
+{
+    panel.cls();
+    if(play == true){
+    string name;
+    vector<string>::iterator it;
+    it = filenames.begin() + current;
+    name = (*it).c_str();
+    name.erase((name.length()-4),4);
+    if(name.length() > 16){
+        name.erase(16,(16-name.length()));
+        panel.printf("%s",name);
+    }
+    else{
+        panel.printf("%s\n",name);
+    }
+    }
+    else{
+        panel.printf("Stopped\n");
+    }
+    for(int i = 0; i < 16; i++){
+        if(i < waver.volume){
+            panel.printf("*");
+        }
+        else
+        {    
+        panel.printf(" ");
+        }
+    }
+}
+void play_file()
+{
+    bool* play_point = &play;
+    string file_name("/sd/");
+    file_name += filenames[current];
+    wave_file = fopen(file_name.c_str(),"r");
+    waver.play(wave_file, play_point);
+    fclose(wave_file);
+    play = false;
+    write_panel();
+}
+
+//Push buttons
+void pb1_hit_callback (void)
+{
+    if(play == false){
+        current = (current-1) % veclen;
+        if(current < 0){
+            current += veclen;
+        }
+        write_screen();
+    }
+}
+
+void pb2_hit_callback (void)
+{
+    if(play == false){
+        current = (1+current) % veclen;
+        write_screen();
+    }    
+}
+
+void pb3_hit_callback (void)
+{
+    play = !play;
+    write_panel();
+}
+
+void pb4_hit_callback (void)
+{
+    waver.volume--;
+    if(waver.volume < 0){
+        waver.volume = 16;
+    }
+    write_panel();
+
+}
+
+//Set up
+void push_set()
+{
+    // Use internal pullups for the three pushbuttons
+    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();
+}
+
+//File reads
+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));
+    }
+}
+
+int main()
+{
+    lcd.cls();
+    panel.cls();
+    sd_check();
+    push_set();
+    read_file_names("/sd/");
+    write_screen();
+    write_panel();
+    while(true)
+    {     
+        wait(.01);
+        if(play == true)
+        {
+            play_file();
+        }
+    }
+}
\ No newline at end of file