sd
Dependencies: 4DGL-uLCD-SE PinDetect SDFileSystem mbed wave_player
Fork of WavePlayer_HelloWorld by
main.cpp@2:6e4f4a49eebe, 2014-03-26 (annotated)
- Committer:
- jmar7
- Date:
- Wed Mar 26 18:21:02 2014 +0000
- Revision:
- 2:6e4f4a49eebe
- Parent:
- 1:5b8e223e983d
f
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jmar7 | 2:6e4f4a49eebe | 1 | //Jason Mar |
4180_1 | 1:5b8e223e983d | 2 | #include "mbed.h" |
4180_1 | 1:5b8e223e983d | 3 | #include "SDFileSystem.h" |
4180_1 | 1:5b8e223e983d | 4 | #include "wave_player.h" |
jmar7 | 2:6e4f4a49eebe | 5 | #include "uLCD_4DGL.h" |
jmar7 | 2:6e4f4a49eebe | 6 | #include "PinDetect.h" |
jmar7 | 2:6e4f4a49eebe | 7 | #include <string> |
jmar7 | 2:6e4f4a49eebe | 8 | #include <vector> |
4180_1 | 1:5b8e223e983d | 9 | |
jmar7 | 2:6e4f4a49eebe | 10 | //initialize all pins |
jmar7 | 2:6e4f4a49eebe | 11 | SDFileSystem sd(p5, p6, p7, p8, p9, "sd"); //SD card |
jmar7 | 2:6e4f4a49eebe | 12 | uLCD_4DGL uLCD(p28, p27, p29); |
jmar7 | 2:6e4f4a49eebe | 13 | PinDetect pb1(p24); |
jmar7 | 2:6e4f4a49eebe | 14 | PinDetect pb2(p23); |
jmar7 | 2:6e4f4a49eebe | 15 | PinDetect pb3(p22); |
jmar7 | 2:6e4f4a49eebe | 16 | PinDetect pb4(p21); |
4180_1 | 1:5b8e223e983d | 17 | |
4180_1 | 1:5b8e223e983d | 18 | AnalogOut DACout(p18); |
4180_1 | 1:5b8e223e983d | 19 | |
4180_1 | 1:5b8e223e983d | 20 | wave_player waver(&DACout); |
jmar7 | 2:6e4f4a49eebe | 21 | //unused pins |
jmar7 | 2:6e4f4a49eebe | 22 | DigitalOut P10(p10); |
jmar7 | 2:6e4f4a49eebe | 23 | DigitalOut P11(p11); |
jmar7 | 2:6e4f4a49eebe | 24 | DigitalOut P12(p12); |
jmar7 | 2:6e4f4a49eebe | 25 | DigitalOut P13(p13); |
jmar7 | 2:6e4f4a49eebe | 26 | DigitalOut P14(p14); |
jmar7 | 2:6e4f4a49eebe | 27 | DigitalOut P15(p15); |
jmar7 | 2:6e4f4a49eebe | 28 | DigitalOut P16(p16); |
jmar7 | 2:6e4f4a49eebe | 29 | DigitalOut P17(p17); |
jmar7 | 2:6e4f4a49eebe | 30 | DigitalOut P19(p19); |
jmar7 | 2:6e4f4a49eebe | 31 | DigitalOut P20(p20); |
jmar7 | 2:6e4f4a49eebe | 32 | |
jmar7 | 2:6e4f4a49eebe | 33 | vector<string> filenames; //filenames are stored in a vector string |
jmar7 | 2:6e4f4a49eebe | 34 | int volatile selection = 0; |
jmar7 | 2:6e4f4a49eebe | 35 | int volatile totalSongs = 0; |
jmar7 | 2:6e4f4a49eebe | 36 | bool play = false; |
jmar7 | 2:6e4f4a49eebe | 37 | bool *playptr = &play; |
jmar7 | 2:6e4f4a49eebe | 38 | |
jmar7 | 2:6e4f4a49eebe | 39 | //implement pushbuttons |
jmar7 | 2:6e4f4a49eebe | 40 | void pb1_hit_callback (void) |
jmar7 | 2:6e4f4a49eebe | 41 | { |
jmar7 | 2:6e4f4a49eebe | 42 | play = !play; |
jmar7 | 2:6e4f4a49eebe | 43 | } |
jmar7 | 2:6e4f4a49eebe | 44 | void pb2_hit_callback (void) |
jmar7 | 2:6e4f4a49eebe | 45 | { |
jmar7 | 2:6e4f4a49eebe | 46 | selection++; |
jmar7 | 2:6e4f4a49eebe | 47 | if(selection >= totalSongs) |
jmar7 | 2:6e4f4a49eebe | 48 | selection = 0; |
jmar7 | 2:6e4f4a49eebe | 49 | } |
jmar7 | 2:6e4f4a49eebe | 50 | void pb3_hit_callback (void) |
jmar7 | 2:6e4f4a49eebe | 51 | { |
jmar7 | 2:6e4f4a49eebe | 52 | selection--; |
jmar7 | 2:6e4f4a49eebe | 53 | if(selection < 0) |
jmar7 | 2:6e4f4a49eebe | 54 | selection = totalSongs - 1; |
jmar7 | 2:6e4f4a49eebe | 55 | } |
jmar7 | 2:6e4f4a49eebe | 56 | void pb4_hit_callback (void) |
jmar7 | 2:6e4f4a49eebe | 57 | { |
jmar7 | 2:6e4f4a49eebe | 58 | int *vol = waver.getVolume(); |
jmar7 | 2:6e4f4a49eebe | 59 | *vol = *vol + 1; |
jmar7 | 2:6e4f4a49eebe | 60 | if (*vol >= 16){ |
jmar7 | 2:6e4f4a49eebe | 61 | *vol = 0; |
jmar7 | 2:6e4f4a49eebe | 62 | } |
jmar7 | 2:6e4f4a49eebe | 63 | } |
jmar7 | 2:6e4f4a49eebe | 64 | //reads the file names |
jmar7 | 2:6e4f4a49eebe | 65 | void read_file_names(char *dir) |
jmar7 | 2:6e4f4a49eebe | 66 | { |
jmar7 | 2:6e4f4a49eebe | 67 | DIR *dp; |
jmar7 | 2:6e4f4a49eebe | 68 | struct dirent *dirp; |
jmar7 | 2:6e4f4a49eebe | 69 | dp = opendir(dir); |
jmar7 | 2:6e4f4a49eebe | 70 | //read all directory and file names in current directory into filename vector |
jmar7 | 2:6e4f4a49eebe | 71 | while((dirp = readdir(dp)) != NULL) { |
jmar7 | 2:6e4f4a49eebe | 72 | filenames.push_back(string(dirp->d_name)); |
jmar7 | 2:6e4f4a49eebe | 73 | totalSongs++; |
jmar7 | 2:6e4f4a49eebe | 74 | } |
jmar7 | 2:6e4f4a49eebe | 75 | closedir(dp); |
jmar7 | 2:6e4f4a49eebe | 76 | } |
jmar7 | 2:6e4f4a49eebe | 77 | |
4180_1 | 1:5b8e223e983d | 78 | |
4180_1 | 1:5b8e223e983d | 79 | int main() |
4180_1 | 1:5b8e223e983d | 80 | { |
jmar7 | 2:6e4f4a49eebe | 81 | //initialize the buttons |
jmar7 | 2:6e4f4a49eebe | 82 | pb1.mode(PullUp); |
jmar7 | 2:6e4f4a49eebe | 83 | pb2.mode(PullUp); |
jmar7 | 2:6e4f4a49eebe | 84 | pb3.mode(PullUp); |
jmar7 | 2:6e4f4a49eebe | 85 | pb4.mode(PullUp); |
jmar7 | 2:6e4f4a49eebe | 86 | |
jmar7 | 2:6e4f4a49eebe | 87 | // Delay for initial pullup to take effect |
jmar7 | 2:6e4f4a49eebe | 88 | wait(.01); |
jmar7 | 2:6e4f4a49eebe | 89 | |
jmar7 | 2:6e4f4a49eebe | 90 | // Setup Interrupt callback functions for a pb hit |
jmar7 | 2:6e4f4a49eebe | 91 | pb1.attach_deasserted(&pb1_hit_callback); |
jmar7 | 2:6e4f4a49eebe | 92 | pb2.attach_deasserted(&pb2_hit_callback); |
jmar7 | 2:6e4f4a49eebe | 93 | pb3.attach_deasserted(&pb3_hit_callback); |
jmar7 | 2:6e4f4a49eebe | 94 | pb4.attach_deasserted(&pb4_hit_callback); |
jmar7 | 2:6e4f4a49eebe | 95 | |
jmar7 | 2:6e4f4a49eebe | 96 | // Start sampling pb inputs using interrupts |
jmar7 | 2:6e4f4a49eebe | 97 | pb1.setSampleFrequency(); |
jmar7 | 2:6e4f4a49eebe | 98 | pb2.setSampleFrequency(); |
jmar7 | 2:6e4f4a49eebe | 99 | pb3.setSampleFrequency(); |
jmar7 | 2:6e4f4a49eebe | 100 | pb4.setSampleFrequency(); |
jmar7 | 2:6e4f4a49eebe | 101 | |
jmar7 | 2:6e4f4a49eebe | 102 | //check for SD card insertion, if no sd card print Insert SD Card |
jmar7 | 2:6e4f4a49eebe | 103 | bool SDinsert = false; |
jmar7 | 2:6e4f4a49eebe | 104 | while(SDinsert == false){ |
jmar7 | 2:6e4f4a49eebe | 105 | SDinsert = sd.sd_inserted(); |
jmar7 | 2:6e4f4a49eebe | 106 | if(SDinsert == false){ |
jmar7 | 2:6e4f4a49eebe | 107 | uLCD.locate(0,1); |
jmar7 | 2:6e4f4a49eebe | 108 | uLCD.printf("Insert SD Card"); |
jmar7 | 2:6e4f4a49eebe | 109 | } |
jmar7 | 2:6e4f4a49eebe | 110 | else { |
jmar7 | 2:6e4f4a49eebe | 111 | sd.disk_initialize(); |
jmar7 | 2:6e4f4a49eebe | 112 | uLCD.cls(); |
jmar7 | 2:6e4f4a49eebe | 113 | } |
jmar7 | 2:6e4f4a49eebe | 114 | } |
jmar7 | 2:6e4f4a49eebe | 115 | FILE *file; |
jmar7 | 2:6e4f4a49eebe | 116 | read_file_names("/sd/myMusic"); |
jmar7 | 2:6e4f4a49eebe | 117 | |
jmar7 | 2:6e4f4a49eebe | 118 | |
jmar7 | 2:6e4f4a49eebe | 119 | string song; |
jmar7 | 2:6e4f4a49eebe | 120 | string dir; |
jmar7 | 2:6e4f4a49eebe | 121 | int c = 0; |
jmar7 | 2:6e4f4a49eebe | 122 | int prevfile = -1; |
jmar7 | 2:6e4f4a49eebe | 123 | while(1) { |
jmar7 | 2:6e4f4a49eebe | 124 | //prints the directory of songs and does not refresh until a pushbutton changes the selection |
jmar7 | 2:6e4f4a49eebe | 125 | if(c == 0 || selection != prevfile){ |
jmar7 | 2:6e4f4a49eebe | 126 | prevfile = selection; |
jmar7 | 2:6e4f4a49eebe | 127 | uLCD.cls(); |
jmar7 | 2:6e4f4a49eebe | 128 | uLCD.locate(0,0); |
jmar7 | 2:6e4f4a49eebe | 129 | //lists the directory songs in white and the selected song in red |
jmar7 | 2:6e4f4a49eebe | 130 | for(int i=0;i<totalSongs;i++){ |
jmar7 | 2:6e4f4a49eebe | 131 | if(i != selection){ |
jmar7 | 2:6e4f4a49eebe | 132 | int l=filenames[i].size(); |
jmar7 | 2:6e4f4a49eebe | 133 | uLCD.locate(0,i); |
jmar7 | 2:6e4f4a49eebe | 134 | uLCD.color(WHITE); |
jmar7 | 2:6e4f4a49eebe | 135 | //substrings the .wav out of the print |
jmar7 | 2:6e4f4a49eebe | 136 | uLCD.printf("%s",filenames[i].substr(0,l-4)); |
jmar7 | 2:6e4f4a49eebe | 137 | } |
jmar7 | 2:6e4f4a49eebe | 138 | else { |
jmar7 | 2:6e4f4a49eebe | 139 | int l=filenames[selection].size(); |
jmar7 | 2:6e4f4a49eebe | 140 | uLCD.locate(0,selection); |
jmar7 | 2:6e4f4a49eebe | 141 | uLCD.color(RED); |
jmar7 | 2:6e4f4a49eebe | 142 | uLCD.printf("%s",filenames[selection].substr(0,l-4)); |
jmar7 | 2:6e4f4a49eebe | 143 | } |
jmar7 | 2:6e4f4a49eebe | 144 | } |
jmar7 | 2:6e4f4a49eebe | 145 | } |
jmar7 | 2:6e4f4a49eebe | 146 | c++; |
jmar7 | 2:6e4f4a49eebe | 147 | |
jmar7 | 2:6e4f4a49eebe | 148 | if(play==true) { |
jmar7 | 2:6e4f4a49eebe | 149 | //concatenates directory with songname |
jmar7 | 2:6e4f4a49eebe | 150 | dir="/sd/myMusic"; |
jmar7 | 2:6e4f4a49eebe | 151 | song = dir + "/" + filenames[selection]; |
jmar7 | 2:6e4f4a49eebe | 152 | //reads the wav file |
jmar7 | 2:6e4f4a49eebe | 153 | file = fopen(song.c_str(), "r"); |
jmar7 | 2:6e4f4a49eebe | 154 | //clears the screen to print song playiing |
jmar7 | 2:6e4f4a49eebe | 155 | uLCD.cls(); |
jmar7 | 2:6e4f4a49eebe | 156 | int l=filenames[selection].size(); |
jmar7 | 2:6e4f4a49eebe | 157 | uLCD.locate(0,0); |
jmar7 | 2:6e4f4a49eebe | 158 | uLCD.printf("%s",filenames[selection].substr(0,l-4)); |
jmar7 | 2:6e4f4a49eebe | 159 | uLCD.locate(0,1); |
jmar7 | 2:6e4f4a49eebe | 160 | uLCD.printf("%s","Now Playing"); |
jmar7 | 2:6e4f4a49eebe | 161 | waver.play(file,playptr); |
jmar7 | 2:6e4f4a49eebe | 162 | play=false; |
jmar7 | 2:6e4f4a49eebe | 163 | fclose(file); |
jmar7 | 2:6e4f4a49eebe | 164 | uLCD.cls(); |
jmar7 | 2:6e4f4a49eebe | 165 | //reprint the menu as it was before the song started |
jmar7 | 2:6e4f4a49eebe | 166 | for(int i=0;i<totalSongs;i++){ |
jmar7 | 2:6e4f4a49eebe | 167 | if(i != selection){ |
jmar7 | 2:6e4f4a49eebe | 168 | int l=filenames[i].size(); |
jmar7 | 2:6e4f4a49eebe | 169 | uLCD.locate(0,i); |
jmar7 | 2:6e4f4a49eebe | 170 | uLCD.color(WHITE); |
jmar7 | 2:6e4f4a49eebe | 171 | uLCD.printf("%s",filenames[i].substr(0,l-4)); |
jmar7 | 2:6e4f4a49eebe | 172 | } |
jmar7 | 2:6e4f4a49eebe | 173 | else { |
jmar7 | 2:6e4f4a49eebe | 174 | int l=filenames[selection].size(); |
jmar7 | 2:6e4f4a49eebe | 175 | uLCD.locate(0,selection); |
jmar7 | 2:6e4f4a49eebe | 176 | uLCD.color(RED); |
jmar7 | 2:6e4f4a49eebe | 177 | uLCD.printf("%s",filenames[selection].substr(0,l-4)); |
jmar7 | 2:6e4f4a49eebe | 178 | } |
jmar7 | 2:6e4f4a49eebe | 179 | } |
jmar7 | 2:6e4f4a49eebe | 180 | } |
jmar7 | 2:6e4f4a49eebe | 181 | else |
jmar7 | 2:6e4f4a49eebe | 182 | wait(0.3); |
jmar7 | 2:6e4f4a49eebe | 183 | } |
4180_1 | 1:5b8e223e983d | 184 | } |