wefwe
Dependencies: mbed C12832 DogM163 FatFileSystem
main.cpp@28:19aac2daf669, 2019-05-08 (annotated)
- Committer:
- JostBaus
- Date:
- Wed May 08 13:48:54 2019 +0000
- Revision:
- 28:19aac2daf669
- Parent:
- 27:6e5cc34fb952
Wavspiller using RiceGulumb
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
neilt6 | 0:8f2b6eed2a9d | 1 | #include "mbed.h" |
JostBaus | 26:304ecc4066a8 | 2 | #include "string.h" |
JostBaus | 26:304ecc4066a8 | 3 | #include "stdio.h" |
JostBaus | 26:304ecc4066a8 | 4 | #include "math.h" |
JostBaus | 26:304ecc4066a8 | 5 | #include "C12832.h" |
JostBaus | 28:19aac2daf669 | 6 | #include "SDHCFileSystem.h" |
JostBaus | 28:19aac2daf669 | 7 | #include "_bitio.h" |
JostBaus | 26:304ecc4066a8 | 8 | #include <string> |
JostBaus | 26:304ecc4066a8 | 9 | using namespace std; |
neilt6 | 0:8f2b6eed2a9d | 10 | |
JostBaus | 26:304ecc4066a8 | 11 | //Communication\interfaces |
JostBaus | 26:304ecc4066a8 | 12 | Serial pc(USBTX,USBRX); //USB serial |
JostBaus | 28:19aac2daf669 | 13 | C12832 lcd(p5, p7, p6, p8, p9); //LCD |
JostBaus | 28:19aac2daf669 | 14 | DigitalIn RW(p10); |
JostBaus | 26:304ecc4066a8 | 15 | SDFileSystem sd(p11, p12, p13, p15, "sd"); //SDCard |
JostBaus | 26:304ecc4066a8 | 16 | DigitalIn sdDetect(p14); //CardDetect |
JostBaus | 26:304ecc4066a8 | 17 | |
JostBaus | 26:304ecc4066a8 | 18 | //in- and outputs |
JostBaus | 28:19aac2daf669 | 19 | DigitalIn PauseBtn(p19); |
JostBaus | 28:19aac2daf669 | 20 | DigitalIn StopBtn(p20); |
JostBaus | 28:19aac2daf669 | 21 | DigitalIn UpBtn(p18); |
JostBaus | 28:19aac2daf669 | 22 | DigitalIn DownBtn(p17); |
neilt6 | 10:ae649a596123 | 23 | |
JostBaus | 28:19aac2daf669 | 24 | DigitalOut led1(LED1); |
JostBaus | 28:19aac2daf669 | 25 | DigitalOut led2(LED2); |
JostBaus | 28:19aac2daf669 | 26 | |
JostBaus | 26:304ecc4066a8 | 27 | |
JostBaus | 26:304ecc4066a8 | 28 | //DAC output |
JostBaus | 28:19aac2daf669 | 29 | // BU9480F define |
JostBaus | 28:19aac2daf669 | 30 | //SPI bu9480f(p23,p24,p21); |
JostBaus | 28:19aac2daf669 | 31 | //DigitalOut LRCLK(p22); |
JostBaus | 28:19aac2daf669 | 32 | // BU9480F define.end |
JostBaus | 26:304ecc4066a8 | 33 | |
JostBaus | 28:19aac2daf669 | 34 | //ticker- sampling |
JostBaus | 28:19aac2daf669 | 35 | Ticker tick; |
JostBaus | 26:304ecc4066a8 | 36 | |
JostBaus | 26:304ecc4066a8 | 37 | //timer |
JostBaus | 26:304ecc4066a8 | 38 | Timer dur; |
neilt6 | 10:ae649a596123 | 39 | |
JostBaus | 26:304ecc4066a8 | 40 | //func |
JostBaus | 26:304ecc4066a8 | 41 | void read_file_names(char *dir); //SDCard read file names |
JostBaus | 26:304ecc4066a8 | 42 | void menu(); |
JostBaus | 26:304ecc4066a8 | 43 | void PlaySong(int m); |
JostBaus | 26:304ecc4066a8 | 44 | void StopSong(); |
JostBaus | 28:19aac2daf669 | 45 | void dac_out(); |
JostBaus | 28:19aac2daf669 | 46 | void encode(long int n); |
JostBaus | 28:19aac2daf669 | 47 | void decode(void); |
JostBaus | 26:304ecc4066a8 | 48 | |
JostBaus | 26:304ecc4066a8 | 49 | //variables |
JostBaus | 26:304ecc4066a8 | 50 | int m = 1; //index of choosen songs |
JostBaus | 26:304ecc4066a8 | 51 | int i = 0; //index of files from folder |
JostBaus | 28:19aac2daf669 | 52 | int Paused = 0;//Is the song paused? |
JostBaus | 26:304ecc4066a8 | 53 | int Stopped = 0; //Is the song stopped? |
JostBaus | 26:304ecc4066a8 | 54 | char* songs[5]; |
neilt6 | 0:8f2b6eed2a9d | 55 | |
JostBaus | 28:19aac2daf669 | 56 | // a FIFO for the DAC |
JostBaus | 28:19aac2daf669 | 57 | #define TXFIFO_FULL 1 |
JostBaus | 28:19aac2daf669 | 58 | #define RAM_LENGTH 8192//8192 |
JostBaus | 28:19aac2daf669 | 59 | #define RAM_LIMIT (RAM_LENGTH - 1) |
JostBaus | 28:19aac2daf669 | 60 | volatile short DAC_fifo[RAM_LENGTH]; |
JostBaus | 28:19aac2daf669 | 61 | volatile short DAC_wptr=0; |
JostBaus | 28:19aac2daf669 | 62 | volatile short DAC_rptr=0; |
JostBaus | 28:19aac2daf669 | 63 | volatile short DAC_on; |
JostBaus | 28:19aac2daf669 | 64 | volatile short DAC_diff=0; |
JostBaus | 28:19aac2daf669 | 65 | |
neilt6 | 0:8f2b6eed2a9d | 66 | int main() |
neilt6 | 0:8f2b6eed2a9d | 67 | { |
JostBaus | 26:304ecc4066a8 | 68 | while(sdDetect == 0) { |
JostBaus | 26:304ecc4066a8 | 69 | lcd.printf("Insert SD Card!"); |
neilt6 | 17:e5b7469082c8 | 70 | wait(0.5); |
JostBaus | 26:304ecc4066a8 | 71 | } |
JostBaus | 28:19aac2daf669 | 72 | pc.printf("going out of main"); |
JostBaus | 26:304ecc4066a8 | 73 | menu(); |
JostBaus | 26:304ecc4066a8 | 74 | } |
neilt6 | 17:e5b7469082c8 | 75 | |
JostBaus | 26:304ecc4066a8 | 76 | void menu() |
JostBaus | 26:304ecc4066a8 | 77 | { |
JostBaus | 26:304ecc4066a8 | 78 | lcd.cls(); |
JostBaus | 26:304ecc4066a8 | 79 | sd.disk_initialize(); |
JostBaus | 26:304ecc4066a8 | 80 | read_file_names("/sd/Music"); |
JostBaus | 26:304ecc4066a8 | 81 | while(1) { |
JostBaus | 28:19aac2daf669 | 82 | lcd.cls(); |
JostBaus | 26:304ecc4066a8 | 83 | lcd.printf("Please select a song"); |
JostBaus | 28:19aac2daf669 | 84 | if(UpBtn == 1) { |
JostBaus | 26:304ecc4066a8 | 85 | m++; |
JostBaus | 26:304ecc4066a8 | 86 | if(m == 5) { |
JostBaus | 26:304ecc4066a8 | 87 | m = 0; |
JostBaus | 26:304ecc4066a8 | 88 | } |
JostBaus | 28:19aac2daf669 | 89 | } else if(DownBtn == 1) { |
JostBaus | 26:304ecc4066a8 | 90 | m--; |
JostBaus | 26:304ecc4066a8 | 91 | if(m == -1) { |
JostBaus | 26:304ecc4066a8 | 92 | m = 4; |
JostBaus | 26:304ecc4066a8 | 93 | } |
neilt6 | 19:ae979143c796 | 94 | } |
JostBaus | 26:304ecc4066a8 | 95 | lcd.locate(0,15); |
JostBaus | 26:304ecc4066a8 | 96 | lcd.printf("%s", (songs[m])); |
JostBaus | 28:19aac2daf669 | 97 | if(PauseBtn == 1) { |
JostBaus | 28:19aac2daf669 | 98 | pc.printf("going to play song"); |
JostBaus | 26:304ecc4066a8 | 99 | PlaySong(m); |
JostBaus | 26:304ecc4066a8 | 100 | } |
JostBaus | 26:304ecc4066a8 | 101 | wait(0.1); |
JostBaus | 26:304ecc4066a8 | 102 | } |
JostBaus | 26:304ecc4066a8 | 103 | } |
neilt6 | 17:e5b7469082c8 | 104 | |
JostBaus | 26:304ecc4066a8 | 105 | void read_file_names(char *dir) // function that reads in file names from sd cards |
JostBaus | 26:304ecc4066a8 | 106 | { |
JostBaus | 28:19aac2daf669 | 107 | pc.printf("found files"); |
JostBaus | 26:304ecc4066a8 | 108 | DIR *dp; |
JostBaus | 26:304ecc4066a8 | 109 | struct dirent *dirp; |
JostBaus | 26:304ecc4066a8 | 110 | dp = opendir(dir); |
JostBaus | 26:304ecc4066a8 | 111 | //read all directory and file names in current directory into filename vector |
JostBaus | 26:304ecc4066a8 | 112 | while((dirp = readdir(dp)) != NULL) { |
JostBaus | 26:304ecc4066a8 | 113 | songs[i] = dirp->d_name; |
JostBaus | 26:304ecc4066a8 | 114 | i++; |
neilt6 | 0:8f2b6eed2a9d | 115 | } |
neilt6 | 0:8f2b6eed2a9d | 116 | } |
JostBaus | 26:304ecc4066a8 | 117 | |
JostBaus | 26:304ecc4066a8 | 118 | void PlaySong(int m) |
JostBaus | 26:304ecc4066a8 | 119 | { |
JostBaus | 26:304ecc4066a8 | 120 | string songname = songs[m]; |
JostBaus | 26:304ecc4066a8 | 121 | string a = "/sd/Music/"; |
JostBaus | 26:304ecc4066a8 | 122 | string fname = a + songname; //retrieves the file name |
JostBaus | 28:19aac2daf669 | 123 | FILE *infp; |
JostBaus | 26:304ecc4066a8 | 124 | dur.start(); |
JostBaus | 26:304ecc4066a8 | 125 | lcd.cls(); |
JostBaus | 26:304ecc4066a8 | 126 | lcd.locate(0,0); |
JostBaus | 26:304ecc4066a8 | 127 | lcd.printf("Now playing"); |
JostBaus | 28:19aac2daf669 | 128 | infp = fopen(fname.c_str(),"rb"); //opens the music file |
JostBaus | 28:19aac2daf669 | 129 | // bu9480f init |
JostBaus | 28:19aac2daf669 | 130 | //bu9480f.format(16,0); |
JostBaus | 28:19aac2daf669 | 131 | //bu9480f.frequency(16000000); //16MHz |
JostBaus | 28:19aac2daf669 | 132 | // bu9480f init.end |
JostBaus | 28:19aac2daf669 | 133 | tick.attach_us(&dac_out, 41); //set 24.4kHz sampling data |
JostBaus | 28:19aac2daf669 | 134 | decode(); |
JostBaus | 28:19aac2daf669 | 135 | //plays the music file |
JostBaus | 28:19aac2daf669 | 136 | |
JostBaus | 28:19aac2daf669 | 137 | tick.detach(); |
JostBaus | 28:19aac2daf669 | 138 | fclose( infp ); |
JostBaus | 26:304ecc4066a8 | 139 | menu(); |
JostBaus | 26:304ecc4066a8 | 140 | } |
JostBaus | 26:304ecc4066a8 | 141 | |
JostBaus | 26:304ecc4066a8 | 142 | void StopSong() |
JostBaus | 26:304ecc4066a8 | 143 | { |
JostBaus | 28:19aac2daf669 | 144 | pc.printf("stopped"); |
JostBaus | 26:304ecc4066a8 | 145 | lcd.cls(); |
JostBaus | 26:304ecc4066a8 | 146 | dur.reset(); |
JostBaus | 28:19aac2daf669 | 147 | tick.detach(); |
JostBaus | 28:19aac2daf669 | 148 | menu(); |
JostBaus | 28:19aac2daf669 | 149 | } |
JostBaus | 28:19aac2daf669 | 150 | |
JostBaus | 28:19aac2daf669 | 151 | void dac_out() |
JostBaus | 28:19aac2daf669 | 152 | { |
JostBaus | 28:19aac2daf669 | 153 | pc.printf("playing"); |
JostBaus | 28:19aac2daf669 | 154 | if(StopBtn == 1) { |
JostBaus | 28:19aac2daf669 | 155 | StopSong(); |
JostBaus | 28:19aac2daf669 | 156 | } |
JostBaus | 28:19aac2daf669 | 157 | if(PauseBtn == 1) { |
JostBaus | 28:19aac2daf669 | 158 | dur.stop(); |
JostBaus | 28:19aac2daf669 | 159 | if(Paused == 1) { |
JostBaus | 28:19aac2daf669 | 160 | Paused = 0; |
JostBaus | 28:19aac2daf669 | 161 | dur.start(); |
JostBaus | 28:19aac2daf669 | 162 | } else { |
JostBaus | 28:19aac2daf669 | 163 | Paused = 1; |
JostBaus | 28:19aac2daf669 | 164 | } |
JostBaus | 28:19aac2daf669 | 165 | } |
JostBaus | 28:19aac2daf669 | 166 | if(Paused == 0) { |
JostBaus | 28:19aac2daf669 | 167 | lcd.locate(0,10); |
JostBaus | 28:19aac2daf669 | 168 | lcd.printf("%s", (songs[m])); |
JostBaus | 28:19aac2daf669 | 169 | // printf("\t%d\r\n",DAC_diff); |
JostBaus | 28:19aac2daf669 | 170 | if (DAC_diff > 1) { |
JostBaus | 28:19aac2daf669 | 171 | led2 = 0; |
JostBaus | 28:19aac2daf669 | 172 | |
JostBaus | 28:19aac2daf669 | 173 | //LRCLK = 0; |
JostBaus | 28:19aac2daf669 | 174 | //bu9480f.write(DAC_fifo[DAC_rptr++]); |
JostBaus | 28:19aac2daf669 | 175 | DAC_rptr &= RAM_LIMIT; |
JostBaus | 28:19aac2daf669 | 176 | |
JostBaus | 28:19aac2daf669 | 177 | //LRCLK = 1; |
JostBaus | 28:19aac2daf669 | 178 | //bu9480f.write(DAC_fifo[DAC_rptr++]); |
JostBaus | 28:19aac2daf669 | 179 | DAC_rptr &= RAM_LIMIT; |
JostBaus | 28:19aac2daf669 | 180 | |
JostBaus | 28:19aac2daf669 | 181 | DAC_diff-=2; |
JostBaus | 28:19aac2daf669 | 182 | |
JostBaus | 28:19aac2daf669 | 183 | } else led2 = 1; |
JostBaus | 28:19aac2daf669 | 184 | lcd.locate(0,20); |
JostBaus | 28:19aac2daf669 | 185 | lcd.printf("%2.f s", dur.read()); |
JostBaus | 28:19aac2daf669 | 186 | } else { |
JostBaus | 28:19aac2daf669 | 187 | lcd.printf("PAUSED"); |
JostBaus | 28:19aac2daf669 | 188 | } |
JostBaus | 26:304ecc4066a8 | 189 | } |
JostBaus | 28:19aac2daf669 | 190 | |
JostBaus | 28:19aac2daf669 | 191 | void encode(long int n) |
JostBaus | 28:19aac2daf669 | 192 | { |
JostBaus | 28:19aac2daf669 | 193 | pc.printf("encoding"); |
JostBaus | 28:19aac2daf669 | 194 | int zero_shift = 0; |
JostBaus | 28:19aac2daf669 | 195 | |
JostBaus | 28:19aac2daf669 | 196 | if(n < 0) { |
JostBaus | 28:19aac2daf669 | 197 | putbit(0); // sign (put 0:if n as negative) |
JostBaus | 28:19aac2daf669 | 198 | n = -n; // n = abs(n) |
JostBaus | 28:19aac2daf669 | 199 | //printf("\t 0"); |
JostBaus | 28:19aac2daf669 | 200 | } else { |
JostBaus | 28:19aac2daf669 | 201 | putbit(1); // sign (put 1:if n as positive) |
JostBaus | 28:19aac2daf669 | 202 | //printf("\t 1"); |
JostBaus | 28:19aac2daf669 | 203 | } |
JostBaus | 28:19aac2daf669 | 204 | zero_shift = (n >> (k)); |
JostBaus | 28:19aac2daf669 | 205 | //printf("\t shift= %d",zero_shift); |
JostBaus | 28:19aac2daf669 | 206 | while(zero_shift > 0) { |
JostBaus | 28:19aac2daf669 | 207 | |
JostBaus | 28:19aac2daf669 | 208 | zero_shift--; |
JostBaus | 28:19aac2daf669 | 209 | putbit(0); |
JostBaus | 28:19aac2daf669 | 210 | } // put n/(2^k) 0's |
JostBaus | 28:19aac2daf669 | 211 | |
JostBaus | 28:19aac2daf669 | 212 | putbit(1); // terminating "1" |
JostBaus | 28:19aac2daf669 | 213 | putbits(k,rightbits(k,n)); |
JostBaus | 28:19aac2daf669 | 214 | //printf("\t finish= %d \r\n",(n & ((1U<<k)-1))); |
JostBaus | 28:19aac2daf669 | 215 | } |
JostBaus | 28:19aac2daf669 | 216 | |
JostBaus | 28:19aac2daf669 | 217 | |
JostBaus | 28:19aac2daf669 | 218 | |
JostBaus | 28:19aac2daf669 | 219 | void decode(void) |
JostBaus | 28:19aac2daf669 | 220 | { |
JostBaus | 28:19aac2daf669 | 221 | pc.printf("decoding"); |
JostBaus | 28:19aac2daf669 | 222 | //short dac_data; |
JostBaus | 28:19aac2daf669 | 223 | long int decode_buff; |
JostBaus | 28:19aac2daf669 | 224 | short diff,diff2; |
JostBaus | 28:19aac2daf669 | 225 | unsigned int buff_sign,zero_shift; |
JostBaus | 28:19aac2daf669 | 226 | //char flag; |
JostBaus | 28:19aac2daf669 | 227 | |
JostBaus | 28:19aac2daf669 | 228 | diff = 0; |
JostBaus | 28:19aac2daf669 | 229 | diff2 = 0; |
JostBaus | 28:19aac2daf669 | 230 | // get sign(1 for positive, 0 for negative) |
JostBaus | 28:19aac2daf669 | 231 | while(1) { |
JostBaus | 28:19aac2daf669 | 232 | |
JostBaus | 28:19aac2daf669 | 233 | if((buff_sign = getbit())==OVERRUN)break; |
JostBaus | 28:19aac2daf669 | 234 | zero_shift = 0; |
JostBaus | 28:19aac2daf669 | 235 | while(getbit()==0)zero_shift++; |
JostBaus | 28:19aac2daf669 | 236 | |
JostBaus | 28:19aac2daf669 | 237 | decode_buff = (signed int)((1U << k)*zero_shift); |
JostBaus | 28:19aac2daf669 | 238 | decode_buff += (getbits(k)); |
JostBaus | 28:19aac2daf669 | 239 | |
JostBaus | 28:19aac2daf669 | 240 | if(!buff_sign)decode_buff =- decode_buff; |
JostBaus | 28:19aac2daf669 | 241 | /* return decode_buff; */ |
JostBaus | 28:19aac2daf669 | 242 | diff =(diff + decode_buff); |
JostBaus | 28:19aac2daf669 | 243 | DAC_fifo[DAC_wptr++]=(short)diff; |
JostBaus | 28:19aac2daf669 | 244 | DAC_wptr &= RAM_LIMIT; |
JostBaus | 28:19aac2daf669 | 245 | //DAC_diff++; |
JostBaus | 28:19aac2daf669 | 246 | while (DAC_diff > RAM_LIMIT) { |
JostBaus | 28:19aac2daf669 | 247 | led1 = 1; |
JostBaus | 28:19aac2daf669 | 248 | } //wait |
JostBaus | 28:19aac2daf669 | 249 | led1=0; |
JostBaus | 28:19aac2daf669 | 250 | |
JostBaus | 28:19aac2daf669 | 251 | if((buff_sign = getbit())==OVERRUN)break; |
JostBaus | 28:19aac2daf669 | 252 | zero_shift = 0; |
JostBaus | 28:19aac2daf669 | 253 | while(getbit()==0)zero_shift++; |
JostBaus | 28:19aac2daf669 | 254 | |
JostBaus | 28:19aac2daf669 | 255 | decode_buff = (signed int)((1U << k)*zero_shift); |
JostBaus | 28:19aac2daf669 | 256 | decode_buff += (getbits(k)); |
JostBaus | 28:19aac2daf669 | 257 | |
JostBaus | 28:19aac2daf669 | 258 | if(!buff_sign)decode_buff =- decode_buff; |
JostBaus | 28:19aac2daf669 | 259 | /* return decode_buff; */ |
JostBaus | 28:19aac2daf669 | 260 | diff2 =(diff2 + decode_buff); |
JostBaus | 28:19aac2daf669 | 261 | |
JostBaus | 28:19aac2daf669 | 262 | DAC_fifo[DAC_wptr++]=(short)diff2; |
JostBaus | 28:19aac2daf669 | 263 | DAC_wptr &= RAM_LIMIT; |
JostBaus | 28:19aac2daf669 | 264 | DAC_diff+=2; |
JostBaus | 28:19aac2daf669 | 265 | |
JostBaus | 28:19aac2daf669 | 266 | while (DAC_diff > RAM_LIMIT) { |
JostBaus | 28:19aac2daf669 | 267 | led1 = 1; |
JostBaus | 28:19aac2daf669 | 268 | } //wait |
JostBaus | 28:19aac2daf669 | 269 | led1=0; |
JostBaus | 28:19aac2daf669 | 270 | |
JostBaus | 28:19aac2daf669 | 271 | |
JostBaus | 28:19aac2daf669 | 272 | |
JostBaus | 28:19aac2daf669 | 273 | } |
JostBaus | 28:19aac2daf669 | 274 | } |