adfdafa
Dependencies: 4DGL-uLCD-SE PinDetect SDFileSystem mbed wave_player
main.cpp@0:5369e93c00ed, 2016-04-11 (annotated)
- Committer:
- agamemaker
- Date:
- Mon Apr 11 16:50:37 2016 +0000
- Revision:
- 0:5369e93c00ed
afdsad
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
agamemaker | 0:5369e93c00ed | 1 | #include "mbed.h" |
agamemaker | 0:5369e93c00ed | 2 | #include "Speaker.h" |
agamemaker | 0:5369e93c00ed | 3 | #include "SDFileSystem.h" |
agamemaker | 0:5369e93c00ed | 4 | #include "TextLCD.h" |
agamemaker | 0:5369e93c00ed | 5 | #include "PinDetect.h" |
agamemaker | 0:5369e93c00ed | 6 | #include "wave_player.h" |
agamemaker | 0:5369e93c00ed | 7 | #include "uLCD_4DGL.h" |
agamemaker | 0:5369e93c00ed | 8 | #include <vector> |
agamemaker | 0:5369e93c00ed | 9 | #include <string> |
agamemaker | 0:5369e93c00ed | 10 | |
agamemaker | 0:5369e93c00ed | 11 | //Pin setup |
agamemaker | 0:5369e93c00ed | 12 | DigitalOut myled(LED1); |
agamemaker | 0:5369e93c00ed | 13 | PinDetect pb1(p26); |
agamemaker | 0:5369e93c00ed | 14 | PinDetect pb2(p25); |
agamemaker | 0:5369e93c00ed | 15 | PinDetect pb3(p24); |
agamemaker | 0:5369e93c00ed | 16 | PinDetect pb4(p23); |
agamemaker | 0:5369e93c00ed | 17 | DigitalIn sdd(p12); |
agamemaker | 0:5369e93c00ed | 18 | DigitalOut myLED1(LED1); |
agamemaker | 0:5369e93c00ed | 19 | DigitalOut myLED2(LED2); |
agamemaker | 0:5369e93c00ed | 20 | DigitalOut myLED3(LED3); |
agamemaker | 0:5369e93c00ed | 21 | DigitalOut myLED4(LED4); |
agamemaker | 0:5369e93c00ed | 22 | TextLCD panel(p14, p15, p16, p17, p19, p20); |
agamemaker | 0:5369e93c00ed | 23 | uLCD_4DGL lcd(p28,p27,p29); |
agamemaker | 0:5369e93c00ed | 24 | AnalogOut DACout(p18); |
agamemaker | 0:5369e93c00ed | 25 | wave_player waver(&DACout); |
agamemaker | 0:5369e93c00ed | 26 | SDFileSystem sd(p5, p6, p7, p8, "sd"); |
agamemaker | 0:5369e93c00ed | 27 | |
agamemaker | 0:5369e93c00ed | 28 | //Globals |
agamemaker | 0:5369e93c00ed | 29 | vector <string> filenames; |
agamemaker | 0:5369e93c00ed | 30 | int current = 0; |
agamemaker | 0:5369e93c00ed | 31 | bool play = false, sd_insert = false; |
agamemaker | 0:5369e93c00ed | 32 | static int veclen = 5; |
agamemaker | 0:5369e93c00ed | 33 | FILE *wave_file; |
agamemaker | 0:5369e93c00ed | 34 | |
agamemaker | 0:5369e93c00ed | 35 | void sd_check(){ |
agamemaker | 0:5369e93c00ed | 36 | int sdPre = sdd.read(); |
agamemaker | 0:5369e93c00ed | 37 | while (sdPre == 0){ |
agamemaker | 0:5369e93c00ed | 38 | lcd.locate(0,0); |
agamemaker | 0:5369e93c00ed | 39 | lcd.printf("Insert SD card"); |
agamemaker | 0:5369e93c00ed | 40 | sdPre = sdd.read(); |
agamemaker | 0:5369e93c00ed | 41 | wait (.5); |
agamemaker | 0:5369e93c00ed | 42 | } |
agamemaker | 0:5369e93c00ed | 43 | lcd.cls(); |
agamemaker | 0:5369e93c00ed | 44 | } |
agamemaker | 0:5369e93c00ed | 45 | |
agamemaker | 0:5369e93c00ed | 46 | void write_screen() |
agamemaker | 0:5369e93c00ed | 47 | { |
agamemaker | 0:5369e93c00ed | 48 | lcd.locate(0,0); |
agamemaker | 0:5369e93c00ed | 49 | string name; |
agamemaker | 0:5369e93c00ed | 50 | int j = 0; |
agamemaker | 0:5369e93c00ed | 51 | vector<string>::iterator it; |
agamemaker | 0:5369e93c00ed | 52 | //lcd.cls(); |
agamemaker | 0:5369e93c00ed | 53 | for(it = filenames.begin(); it < filenames.end(); it++) { |
agamemaker | 0:5369e93c00ed | 54 | name = (*it).c_str(); |
agamemaker | 0:5369e93c00ed | 55 | name.erase((name.length()-4),4); |
agamemaker | 0:5369e93c00ed | 56 | if(j++ == current){ |
agamemaker | 0:5369e93c00ed | 57 | lcd.printf("~"); |
agamemaker | 0:5369e93c00ed | 58 | } |
agamemaker | 0:5369e93c00ed | 59 | else{ |
agamemaker | 0:5369e93c00ed | 60 | lcd.printf(" "); |
agamemaker | 0:5369e93c00ed | 61 | } |
agamemaker | 0:5369e93c00ed | 62 | if(name.length() > 17){ |
agamemaker | 0:5369e93c00ed | 63 | name.erase(17,(17-name.length())); |
agamemaker | 0:5369e93c00ed | 64 | lcd.printf("%s",name); |
agamemaker | 0:5369e93c00ed | 65 | } |
agamemaker | 0:5369e93c00ed | 66 | else{ |
agamemaker | 0:5369e93c00ed | 67 | lcd.printf("%s\n",name); |
agamemaker | 0:5369e93c00ed | 68 | } |
agamemaker | 0:5369e93c00ed | 69 | } |
agamemaker | 0:5369e93c00ed | 70 | /*for(int j = 0; j > veclen; j++){ |
agamemaker | 0:5369e93c00ed | 71 | lcd.locate(0,j); |
agamemaker | 0:5369e93c00ed | 72 | if(j == current){ |
agamemaker | 0:5369e93c00ed | 73 | lcd.printf("~"); |
agamemaker | 0:5369e93c00ed | 74 | } |
agamemaker | 0:5369e93c00ed | 75 | else{ |
agamemaker | 0:5369e93c00ed | 76 | lcd.printf("~"); |
agamemaker | 0:5369e93c00ed | 77 | } |
agamemaker | 0:5369e93c00ed | 78 | }*/ |
agamemaker | 0:5369e93c00ed | 79 | } |
agamemaker | 0:5369e93c00ed | 80 | |
agamemaker | 0:5369e93c00ed | 81 | void write_panel() |
agamemaker | 0:5369e93c00ed | 82 | { |
agamemaker | 0:5369e93c00ed | 83 | panel.cls(); |
agamemaker | 0:5369e93c00ed | 84 | if(play == true){ |
agamemaker | 0:5369e93c00ed | 85 | string name; |
agamemaker | 0:5369e93c00ed | 86 | vector<string>::iterator it; |
agamemaker | 0:5369e93c00ed | 87 | it = filenames.begin() + current; |
agamemaker | 0:5369e93c00ed | 88 | name = (*it).c_str(); |
agamemaker | 0:5369e93c00ed | 89 | name.erase((name.length()-4),4); |
agamemaker | 0:5369e93c00ed | 90 | if(name.length() > 16){ |
agamemaker | 0:5369e93c00ed | 91 | name.erase(16,(16-name.length())); |
agamemaker | 0:5369e93c00ed | 92 | panel.printf("%s",name); |
agamemaker | 0:5369e93c00ed | 93 | } |
agamemaker | 0:5369e93c00ed | 94 | else{ |
agamemaker | 0:5369e93c00ed | 95 | panel.printf("%s\n",name); |
agamemaker | 0:5369e93c00ed | 96 | } |
agamemaker | 0:5369e93c00ed | 97 | } |
agamemaker | 0:5369e93c00ed | 98 | else{ |
agamemaker | 0:5369e93c00ed | 99 | panel.printf("Stopped\n"); |
agamemaker | 0:5369e93c00ed | 100 | } |
agamemaker | 0:5369e93c00ed | 101 | for(int i = 0; i < 16; i++){ |
agamemaker | 0:5369e93c00ed | 102 | if(i < waver.volume){ |
agamemaker | 0:5369e93c00ed | 103 | panel.printf("*"); |
agamemaker | 0:5369e93c00ed | 104 | } |
agamemaker | 0:5369e93c00ed | 105 | else |
agamemaker | 0:5369e93c00ed | 106 | { |
agamemaker | 0:5369e93c00ed | 107 | panel.printf(" "); |
agamemaker | 0:5369e93c00ed | 108 | } |
agamemaker | 0:5369e93c00ed | 109 | } |
agamemaker | 0:5369e93c00ed | 110 | } |
agamemaker | 0:5369e93c00ed | 111 | void play_file() |
agamemaker | 0:5369e93c00ed | 112 | { |
agamemaker | 0:5369e93c00ed | 113 | bool* play_point = &play; |
agamemaker | 0:5369e93c00ed | 114 | string file_name("/sd/"); |
agamemaker | 0:5369e93c00ed | 115 | file_name += filenames[current]; |
agamemaker | 0:5369e93c00ed | 116 | wave_file = fopen(file_name.c_str(),"r"); |
agamemaker | 0:5369e93c00ed | 117 | waver.play(wave_file, play_point); |
agamemaker | 0:5369e93c00ed | 118 | fclose(wave_file); |
agamemaker | 0:5369e93c00ed | 119 | play = false; |
agamemaker | 0:5369e93c00ed | 120 | write_panel(); |
agamemaker | 0:5369e93c00ed | 121 | } |
agamemaker | 0:5369e93c00ed | 122 | |
agamemaker | 0:5369e93c00ed | 123 | //Push buttons |
agamemaker | 0:5369e93c00ed | 124 | void pb1_hit_callback (void) |
agamemaker | 0:5369e93c00ed | 125 | { |
agamemaker | 0:5369e93c00ed | 126 | if(play == false){ |
agamemaker | 0:5369e93c00ed | 127 | current = (current-1) % veclen; |
agamemaker | 0:5369e93c00ed | 128 | if(current < 0){ |
agamemaker | 0:5369e93c00ed | 129 | current += veclen; |
agamemaker | 0:5369e93c00ed | 130 | } |
agamemaker | 0:5369e93c00ed | 131 | write_screen(); |
agamemaker | 0:5369e93c00ed | 132 | } |
agamemaker | 0:5369e93c00ed | 133 | } |
agamemaker | 0:5369e93c00ed | 134 | |
agamemaker | 0:5369e93c00ed | 135 | void pb2_hit_callback (void) |
agamemaker | 0:5369e93c00ed | 136 | { |
agamemaker | 0:5369e93c00ed | 137 | if(play == false){ |
agamemaker | 0:5369e93c00ed | 138 | current = (1+current) % veclen; |
agamemaker | 0:5369e93c00ed | 139 | write_screen(); |
agamemaker | 0:5369e93c00ed | 140 | } |
agamemaker | 0:5369e93c00ed | 141 | } |
agamemaker | 0:5369e93c00ed | 142 | |
agamemaker | 0:5369e93c00ed | 143 | void pb3_hit_callback (void) |
agamemaker | 0:5369e93c00ed | 144 | { |
agamemaker | 0:5369e93c00ed | 145 | play = !play; |
agamemaker | 0:5369e93c00ed | 146 | write_panel(); |
agamemaker | 0:5369e93c00ed | 147 | } |
agamemaker | 0:5369e93c00ed | 148 | |
agamemaker | 0:5369e93c00ed | 149 | void pb4_hit_callback (void) |
agamemaker | 0:5369e93c00ed | 150 | { |
agamemaker | 0:5369e93c00ed | 151 | waver.volume--; |
agamemaker | 0:5369e93c00ed | 152 | if(waver.volume < 0){ |
agamemaker | 0:5369e93c00ed | 153 | waver.volume = 16; |
agamemaker | 0:5369e93c00ed | 154 | } |
agamemaker | 0:5369e93c00ed | 155 | write_panel(); |
agamemaker | 0:5369e93c00ed | 156 | |
agamemaker | 0:5369e93c00ed | 157 | } |
agamemaker | 0:5369e93c00ed | 158 | |
agamemaker | 0:5369e93c00ed | 159 | //Set up |
agamemaker | 0:5369e93c00ed | 160 | void push_set() |
agamemaker | 0:5369e93c00ed | 161 | { |
agamemaker | 0:5369e93c00ed | 162 | // Use internal pullups for the three pushbuttons |
agamemaker | 0:5369e93c00ed | 163 | pb1.mode(PullUp); |
agamemaker | 0:5369e93c00ed | 164 | pb2.mode(PullUp); |
agamemaker | 0:5369e93c00ed | 165 | pb3.mode(PullUp); |
agamemaker | 0:5369e93c00ed | 166 | pb4.mode(PullUp); |
agamemaker | 0:5369e93c00ed | 167 | // Delay for initial pullup to take effect |
agamemaker | 0:5369e93c00ed | 168 | wait(.01); |
agamemaker | 0:5369e93c00ed | 169 | // Setup Interrupt callback functions for a pb hit |
agamemaker | 0:5369e93c00ed | 170 | pb1.attach_deasserted(&pb1_hit_callback); |
agamemaker | 0:5369e93c00ed | 171 | pb2.attach_deasserted(&pb2_hit_callback); |
agamemaker | 0:5369e93c00ed | 172 | pb3.attach_deasserted(&pb3_hit_callback); |
agamemaker | 0:5369e93c00ed | 173 | pb4.attach_deasserted(&pb4_hit_callback); |
agamemaker | 0:5369e93c00ed | 174 | // Start sampling pb inputs using interrupts |
agamemaker | 0:5369e93c00ed | 175 | pb1.setSampleFrequency(); |
agamemaker | 0:5369e93c00ed | 176 | pb2.setSampleFrequency(); |
agamemaker | 0:5369e93c00ed | 177 | pb3.setSampleFrequency(); |
agamemaker | 0:5369e93c00ed | 178 | pb4.setSampleFrequency(); |
agamemaker | 0:5369e93c00ed | 179 | } |
agamemaker | 0:5369e93c00ed | 180 | |
agamemaker | 0:5369e93c00ed | 181 | //File reads |
agamemaker | 0:5369e93c00ed | 182 | void read_file_names(char *dir) |
agamemaker | 0:5369e93c00ed | 183 | { |
agamemaker | 0:5369e93c00ed | 184 | DIR *dp; |
agamemaker | 0:5369e93c00ed | 185 | struct dirent *dirp; |
agamemaker | 0:5369e93c00ed | 186 | dp = opendir(dir); |
agamemaker | 0:5369e93c00ed | 187 | //read all directory and file names in current directory into filename vector |
agamemaker | 0:5369e93c00ed | 188 | while((dirp = readdir(dp)) != NULL) { |
agamemaker | 0:5369e93c00ed | 189 | filenames.push_back(string(dirp->d_name)); |
agamemaker | 0:5369e93c00ed | 190 | } |
agamemaker | 0:5369e93c00ed | 191 | } |
agamemaker | 0:5369e93c00ed | 192 | |
agamemaker | 0:5369e93c00ed | 193 | int main() |
agamemaker | 0:5369e93c00ed | 194 | { |
agamemaker | 0:5369e93c00ed | 195 | lcd.cls(); |
agamemaker | 0:5369e93c00ed | 196 | panel.cls(); |
agamemaker | 0:5369e93c00ed | 197 | sd_check(); |
agamemaker | 0:5369e93c00ed | 198 | push_set(); |
agamemaker | 0:5369e93c00ed | 199 | read_file_names("/sd/"); |
agamemaker | 0:5369e93c00ed | 200 | write_screen(); |
agamemaker | 0:5369e93c00ed | 201 | write_panel(); |
agamemaker | 0:5369e93c00ed | 202 | while(true) |
agamemaker | 0:5369e93c00ed | 203 | { |
agamemaker | 0:5369e93c00ed | 204 | wait(.01); |
agamemaker | 0:5369e93c00ed | 205 | if(play == true) |
agamemaker | 0:5369e93c00ed | 206 | { |
agamemaker | 0:5369e93c00ed | 207 | play_file(); |
agamemaker | 0:5369e93c00ed | 208 | } |
agamemaker | 0:5369e93c00ed | 209 | } |
agamemaker | 0:5369e93c00ed | 210 | } |