wefwe

Dependencies:   mbed C12832 DogM163 FatFileSystem

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?

UserRevisionLine numberNew 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 }