mp3 player hw gatech
Dependencies: PinDetect SDFileSystem TextLCD mbed wave_player
main.cpp@0:00b023aa8f45, 2013-07-14 (annotated)
- Committer:
- zchen311
- Date:
- Sun Jul 14 20:31:43 2013 +0000
- Revision:
- 0:00b023aa8f45
mp3 player done
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
zchen311 | 0:00b023aa8f45 | 1 | |
zchen311 | 0:00b023aa8f45 | 2 | #include "mbed.h" |
zchen311 | 0:00b023aa8f45 | 3 | #include "SDFileSystem.h" |
zchen311 | 0:00b023aa8f45 | 4 | #include "wave_player.h" |
zchen311 | 0:00b023aa8f45 | 5 | #include "TextLCD.h" |
zchen311 | 0:00b023aa8f45 | 6 | #include "PinDetect.h" |
zchen311 | 0:00b023aa8f45 | 7 | #include <string> |
zchen311 | 0:00b023aa8f45 | 8 | |
zchen311 | 0:00b023aa8f45 | 9 | #include <vector> |
zchen311 | 0:00b023aa8f45 | 10 | |
zchen311 | 0:00b023aa8f45 | 11 | SDFileSystem sd(p5, p6, p7, p8,p9, "sd"); //SD card |
zchen311 | 0:00b023aa8f45 | 12 | TextLCD myLCD(p22, p23, p24, p25, p26, p27); //TextLCD |
zchen311 | 0:00b023aa8f45 | 13 | AnalogOut DACout(p18); |
zchen311 | 0:00b023aa8f45 | 14 | //AnalogOut DACout(p20); |
zchen311 | 0:00b023aa8f45 | 15 | |
zchen311 | 0:00b023aa8f45 | 16 | void read_file_names(char *); |
zchen311 | 0:00b023aa8f45 | 17 | void volumePressed(); |
zchen311 | 0:00b023aa8f45 | 18 | wave_player waver(&DACout); |
zchen311 | 0:00b023aa8f45 | 19 | vector<string> filenames; //filenames are stored in a vector string |
zchen311 | 0:00b023aa8f45 | 20 | PinDetect pb1(p28); // Up button - scrolls up the list |
zchen311 | 0:00b023aa8f45 | 21 | PinDetect pb2(p29); // Down button - scrolls down the list |
zchen311 | 0:00b023aa8f45 | 22 | PinDetect pb3(p30); // Play/Pause- selects and plays or pauses the filename |
zchen311 | 0:00b023aa8f45 | 23 | PinDetect pb4(p15); |
zchen311 | 0:00b023aa8f45 | 24 | int volatile Scrollup=0; // heat to temp |
zchen311 | 0:00b023aa8f45 | 25 | int volatile Scrolldown=0;// cool to temp |
zchen311 | 0:00b023aa8f45 | 26 | int volatile total=0; // heat or cool mpde |
zchen311 | 0:00b023aa8f45 | 27 | bool select=false; |
zchen311 | 0:00b023aa8f45 | 28 | bool *selectptr=&select; |
zchen311 | 0:00b023aa8f45 | 29 | |
zchen311 | 0:00b023aa8f45 | 30 | |
zchen311 | 0:00b023aa8f45 | 31 | void pb1_hit_callback (void) |
zchen311 | 0:00b023aa8f45 | 32 | { |
zchen311 | 0:00b023aa8f45 | 33 | Scrollup++; |
zchen311 | 0:00b023aa8f45 | 34 | |
zchen311 | 0:00b023aa8f45 | 35 | |
zchen311 | 0:00b023aa8f45 | 36 | if(Scrollup >= total) |
zchen311 | 0:00b023aa8f45 | 37 | Scrollup=0; |
zchen311 | 0:00b023aa8f45 | 38 | |
zchen311 | 0:00b023aa8f45 | 39 | } |
zchen311 | 0:00b023aa8f45 | 40 | // Callback routine is interrupt activated by a debounced pb2 hit |
zchen311 | 0:00b023aa8f45 | 41 | void pb2_hit_callback (void) |
zchen311 | 0:00b023aa8f45 | 42 | { |
zchen311 | 0:00b023aa8f45 | 43 | |
zchen311 | 0:00b023aa8f45 | 44 | Scrollup--; |
zchen311 | 0:00b023aa8f45 | 45 | if(Scrollup < 0) |
zchen311 | 0:00b023aa8f45 | 46 | Scrollup = total-1; |
zchen311 | 0:00b023aa8f45 | 47 | } |
zchen311 | 0:00b023aa8f45 | 48 | |
zchen311 | 0:00b023aa8f45 | 49 | // Callback routine is interrupt activated by a debounced pb3 hit |
zchen311 | 0:00b023aa8f45 | 50 | |
zchen311 | 0:00b023aa8f45 | 51 | void pb3_hit_callback (void) |
zchen311 | 0:00b023aa8f45 | 52 | { |
zchen311 | 0:00b023aa8f45 | 53 | select=!select; |
zchen311 | 0:00b023aa8f45 | 54 | } |
zchen311 | 0:00b023aa8f45 | 55 | // Callback routine is interrupt activated by a debounced pb3 hit |
zchen311 | 0:00b023aa8f45 | 56 | void pb4_hit_callback (void) |
zchen311 | 0:00b023aa8f45 | 57 | { |
zchen311 | 0:00b023aa8f45 | 58 | |
zchen311 | 0:00b023aa8f45 | 59 | volumePressed(); |
zchen311 | 0:00b023aa8f45 | 60 | |
zchen311 | 0:00b023aa8f45 | 61 | |
zchen311 | 0:00b023aa8f45 | 62 | |
zchen311 | 0:00b023aa8f45 | 63 | } |
zchen311 | 0:00b023aa8f45 | 64 | int main() |
zchen311 | 0:00b023aa8f45 | 65 | { |
zchen311 | 0:00b023aa8f45 | 66 | // Use internal pullups for the three pushbuttons |
zchen311 | 0:00b023aa8f45 | 67 | pb1.mode(PullUp); |
zchen311 | 0:00b023aa8f45 | 68 | pb2.mode(PullUp); |
zchen311 | 0:00b023aa8f45 | 69 | pb3.mode(PullUp); |
zchen311 | 0:00b023aa8f45 | 70 | pb4.mode(PullUp); |
zchen311 | 0:00b023aa8f45 | 71 | // Delay for initial pullup to take effect |
zchen311 | 0:00b023aa8f45 | 72 | wait(.01); |
zchen311 | 0:00b023aa8f45 | 73 | //Setup Interrupt callback functions for a pb hit |
zchen311 | 0:00b023aa8f45 | 74 | pb1.attach_deasserted(&pb1_hit_callback); |
zchen311 | 0:00b023aa8f45 | 75 | pb2.attach_deasserted(&pb2_hit_callback); |
zchen311 | 0:00b023aa8f45 | 76 | pb3.attach_deasserted(&pb3_hit_callback); |
zchen311 | 0:00b023aa8f45 | 77 | pb4.attach_deasserted(&pb4_hit_callback); |
zchen311 | 0:00b023aa8f45 | 78 | // Start sampling pb inputs using interrupts |
zchen311 | 0:00b023aa8f45 | 79 | pb1.setSampleFrequency(); |
zchen311 | 0:00b023aa8f45 | 80 | pb2.setSampleFrequency(); |
zchen311 | 0:00b023aa8f45 | 81 | pb3.setSampleFrequency(); |
zchen311 | 0:00b023aa8f45 | 82 | pb4.setSampleFrequency(); |
zchen311 | 0:00b023aa8f45 | 83 | |
zchen311 | 0:00b023aa8f45 | 84 | |
zchen311 | 0:00b023aa8f45 | 85 | // myLCD.printf("\n\n\nHello, wave world!\n"); |
zchen311 | 0:00b023aa8f45 | 86 | // wave_file = fopen("/sd/myMusic", "r"); |
zchen311 | 0:00b023aa8f45 | 87 | bool SDcard=0; |
zchen311 | 0:00b023aa8f45 | 88 | while(!SDcard) |
zchen311 | 0:00b023aa8f45 | 89 | { SDcard=sd.sd_inserted(); |
zchen311 | 0:00b023aa8f45 | 90 | if( SDcard==false){ |
zchen311 | 0:00b023aa8f45 | 91 | myLCD.locate(0,0); |
zchen311 | 0:00b023aa8f45 | 92 | myLCD.printf("Insert SDCARD"); |
zchen311 | 0:00b023aa8f45 | 93 | } |
zchen311 | 0:00b023aa8f45 | 94 | else |
zchen311 | 0:00b023aa8f45 | 95 | myLCD.cls(); |
zchen311 | 0:00b023aa8f45 | 96 | } |
zchen311 | 0:00b023aa8f45 | 97 | FILE *wave_file; |
zchen311 | 0:00b023aa8f45 | 98 | read_file_names("/sd/myMusic"); |
zchen311 | 0:00b023aa8f45 | 99 | string directory; |
zchen311 | 0:00b023aa8f45 | 100 | directory="/sd/myMusic"; |
zchen311 | 0:00b023aa8f45 | 101 | string song; |
zchen311 | 0:00b023aa8f45 | 102 | |
zchen311 | 0:00b023aa8f45 | 103 | |
zchen311 | 0:00b023aa8f45 | 104 | while(1) { |
zchen311 | 0:00b023aa8f45 | 105 | //int pos=size((*it).c_str())-4; |
zchen311 | 0:00b023aa8f45 | 106 | int index=0; |
zchen311 | 0:00b023aa8f45 | 107 | index=Scrollup; |
zchen311 | 0:00b023aa8f45 | 108 | int len=filenames[index].size(); |
zchen311 | 0:00b023aa8f45 | 109 | |
zchen311 | 0:00b023aa8f45 | 110 | myLCD.cls(); |
zchen311 | 0:00b023aa8f45 | 111 | myLCD.locate(0,0); |
zchen311 | 0:00b023aa8f45 | 112 | myLCD.printf("%s",filenames[index].substr(0,len-4)); |
zchen311 | 0:00b023aa8f45 | 113 | |
zchen311 | 0:00b023aa8f45 | 114 | if(select==true) { |
zchen311 | 0:00b023aa8f45 | 115 | song = directory + "/" + filenames[index]; |
zchen311 | 0:00b023aa8f45 | 116 | wave_file = fopen(song.c_str(), "r"); |
zchen311 | 0:00b023aa8f45 | 117 | myLCD.locate(0,1); |
zchen311 | 0:00b023aa8f45 | 118 | myLCD.printf("%s","Now Playing"); |
zchen311 | 0:00b023aa8f45 | 119 | waver.play(wave_file,selectptr); |
zchen311 | 0:00b023aa8f45 | 120 | select=false; |
zchen311 | 0:00b023aa8f45 | 121 | fclose(wave_file); |
zchen311 | 0:00b023aa8f45 | 122 | |
zchen311 | 0:00b023aa8f45 | 123 | } |
zchen311 | 0:00b023aa8f45 | 124 | else |
zchen311 | 0:00b023aa8f45 | 125 | //myLCD.cls(); |
zchen311 | 0:00b023aa8f45 | 126 | //myLCD.printf("%d",Scrollup); |
zchen311 | 0:00b023aa8f45 | 127 | //myLCD.printf("%s","now playing"); |
zchen311 | 0:00b023aa8f45 | 128 | //waver.play(wave_file); |
zchen311 | 0:00b023aa8f45 | 129 | wait(0.3); |
zchen311 | 0:00b023aa8f45 | 130 | } |
zchen311 | 0:00b023aa8f45 | 131 | |
zchen311 | 0:00b023aa8f45 | 132 | |
zchen311 | 0:00b023aa8f45 | 133 | |
zchen311 | 0:00b023aa8f45 | 134 | |
zchen311 | 0:00b023aa8f45 | 135 | |
zchen311 | 0:00b023aa8f45 | 136 | } |
zchen311 | 0:00b023aa8f45 | 137 | |
zchen311 | 0:00b023aa8f45 | 138 | |
zchen311 | 0:00b023aa8f45 | 139 | void read_file_names(char *dir) |
zchen311 | 0:00b023aa8f45 | 140 | |
zchen311 | 0:00b023aa8f45 | 141 | { |
zchen311 | 0:00b023aa8f45 | 142 | |
zchen311 | 0:00b023aa8f45 | 143 | DIR *dp; |
zchen311 | 0:00b023aa8f45 | 144 | |
zchen311 | 0:00b023aa8f45 | 145 | struct dirent *dirp; |
zchen311 | 0:00b023aa8f45 | 146 | |
zchen311 | 0:00b023aa8f45 | 147 | dp = opendir(dir); |
zchen311 | 0:00b023aa8f45 | 148 | |
zchen311 | 0:00b023aa8f45 | 149 | //read all directory and file names in current directory into filename vector |
zchen311 | 0:00b023aa8f45 | 150 | while((dirp = readdir(dp)) != NULL) { |
zchen311 | 0:00b023aa8f45 | 151 | filenames.push_back(string(dirp->d_name)); |
zchen311 | 0:00b023aa8f45 | 152 | total++; |
zchen311 | 0:00b023aa8f45 | 153 | } |
zchen311 | 0:00b023aa8f45 | 154 | } |
zchen311 | 0:00b023aa8f45 | 155 | void volumePressed(){ |
zchen311 | 0:00b023aa8f45 | 156 | |
zchen311 | 0:00b023aa8f45 | 157 | |
zchen311 | 0:00b023aa8f45 | 158 | |
zchen311 | 0:00b023aa8f45 | 159 | int *volumeMod=waver.getVolumeMod(); |
zchen311 | 0:00b023aa8f45 | 160 | |
zchen311 | 0:00b023aa8f45 | 161 | *volumeMod = *volumeMod + 1; |
zchen311 | 0:00b023aa8f45 | 162 | |
zchen311 | 0:00b023aa8f45 | 163 | if (*volumeMod >= 16) |
zchen311 | 0:00b023aa8f45 | 164 | |
zchen311 | 0:00b023aa8f45 | 165 | *volumeMod = 0; |
zchen311 | 0:00b023aa8f45 | 166 | } |
zchen311 | 0:00b023aa8f45 | 167 | |
zchen311 | 0:00b023aa8f45 | 168 | |
zchen311 | 0:00b023aa8f45 | 169 | |
zchen311 | 0:00b023aa8f45 | 170 | |
zchen311 | 0:00b023aa8f45 | 171 | |
zchen311 | 0:00b023aa8f45 | 172 | |
zchen311 | 0:00b023aa8f45 | 173 | |
zchen311 | 0:00b023aa8f45 | 174 | |
zchen311 | 0:00b023aa8f45 | 175 | |
zchen311 | 0:00b023aa8f45 | 176 |