Capacitive Touch Sensor Controlling an MP3 Player

Dependencies:   4DGL-uLCD-SE SDFileSystem TextLCD mbed wave_player

Committer:
maxmbrown
Date:
Thu Dec 08 20:20:09 2016 +0000
Revision:
0:1cb83aab3f9a
Capacitive Touch Sensor Controlling an MP3 Player

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maxmbrown 0:1cb83aab3f9a 1 #include "VS1002.h"
maxmbrown 0:1cb83aab3f9a 2 #include "mbed.h"
maxmbrown 0:1cb83aab3f9a 3 #include "uLCD_4DGL.h"
maxmbrown 0:1cb83aab3f9a 4
maxmbrown 0:1cb83aab3f9a 5 //Serial pc(USBTX, USBRX);
maxmbrown 0:1cb83aab3f9a 6 uLCD_4DGL uLCD2(p28, p27, p29);
maxmbrown 0:1cb83aab3f9a 7
maxmbrown 0:1cb83aab3f9a 8 /* ==================================================================
maxmbrown 0:1cb83aab3f9a 9 * Constructor
maxmbrown 0:1cb83aab3f9a 10 * =================================================================*/
maxmbrown 0:1cb83aab3f9a 11
maxmbrown 0:1cb83aab3f9a 12 VS1002::VS1002(PinName mmosi, PinName mmiso, PinName ssck, PinName ccs, const char *name, PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst, PinName dreq, PinName dcs, PinName vol)
maxmbrown 0:1cb83aab3f9a 13 : _sd(mmosi, mmiso, ssck, ccs, name), _spi(mosi, miso, sck), _CS(cs), _RST(rst), _DREQ(dreq), _DCS(dcs), _VOL(vol) {
maxmbrown 0:1cb83aab3f9a 14
maxmbrown 0:1cb83aab3f9a 15 }
maxmbrown 0:1cb83aab3f9a 16
maxmbrown 0:1cb83aab3f9a 17 /*===================================================================
maxmbrown 0:1cb83aab3f9a 18 * Functions
maxmbrown 0:1cb83aab3f9a 19 *==================================================================*/
maxmbrown 0:1cb83aab3f9a 20
maxmbrown 0:1cb83aab3f9a 21 void VS1002::cs_low(void)
maxmbrown 0:1cb83aab3f9a 22 {
maxmbrown 0:1cb83aab3f9a 23 _CS = 0;
maxmbrown 0:1cb83aab3f9a 24 }
maxmbrown 0:1cb83aab3f9a 25 void VS1002::cs_high(void)
maxmbrown 0:1cb83aab3f9a 26 {
maxmbrown 0:1cb83aab3f9a 27 _CS = 1;
maxmbrown 0:1cb83aab3f9a 28 }
maxmbrown 0:1cb83aab3f9a 29 void VS1002::dcs_low(void)
maxmbrown 0:1cb83aab3f9a 30 {
maxmbrown 0:1cb83aab3f9a 31 _DCS = 0;
maxmbrown 0:1cb83aab3f9a 32 }
maxmbrown 0:1cb83aab3f9a 33 void VS1002::dcs_high(void)
maxmbrown 0:1cb83aab3f9a 34 {
maxmbrown 0:1cb83aab3f9a 35 _DCS = 1;
maxmbrown 0:1cb83aab3f9a 36 }
maxmbrown 0:1cb83aab3f9a 37 void VS1002::sci_en(void) //SCI enable
maxmbrown 0:1cb83aab3f9a 38 {
maxmbrown 0:1cb83aab3f9a 39 cs_high();
maxmbrown 0:1cb83aab3f9a 40 dcs_high();
maxmbrown 0:1cb83aab3f9a 41 cs_low();
maxmbrown 0:1cb83aab3f9a 42 }
maxmbrown 0:1cb83aab3f9a 43 void VS1002::sci_dis(void) //SCI disable
maxmbrown 0:1cb83aab3f9a 44 {
maxmbrown 0:1cb83aab3f9a 45 cs_high();
maxmbrown 0:1cb83aab3f9a 46 }
maxmbrown 0:1cb83aab3f9a 47 void VS1002::sdi_en(void) //SDI enable
maxmbrown 0:1cb83aab3f9a 48 {
maxmbrown 0:1cb83aab3f9a 49 dcs_high();
maxmbrown 0:1cb83aab3f9a 50 cs_high();
maxmbrown 0:1cb83aab3f9a 51 dcs_low();
maxmbrown 0:1cb83aab3f9a 52 }
maxmbrown 0:1cb83aab3f9a 53 void VS1002::sdi_dis(void) //SDI disable
maxmbrown 0:1cb83aab3f9a 54 {
maxmbrown 0:1cb83aab3f9a 55 dcs_high();
maxmbrown 0:1cb83aab3f9a 56 }
maxmbrown 0:1cb83aab3f9a 57 void VS1002::reset(void) //hardware reset
maxmbrown 0:1cb83aab3f9a 58 {
maxmbrown 0:1cb83aab3f9a 59 wait(0.01);
maxmbrown 0:1cb83aab3f9a 60 _RST = 0;
maxmbrown 0:1cb83aab3f9a 61 wait(0.01);
maxmbrown 0:1cb83aab3f9a 62 _RST = 1;
maxmbrown 0:1cb83aab3f9a 63 wait(0.10);
maxmbrown 0:1cb83aab3f9a 64 }
maxmbrown 0:1cb83aab3f9a 65 void VS1002::power_down(void) //hardware and software reset
maxmbrown 0:1cb83aab3f9a 66 {
maxmbrown 0:1cb83aab3f9a 67 cs_low();
maxmbrown 0:1cb83aab3f9a 68 reset();
maxmbrown 0:1cb83aab3f9a 69 sci_write(0x00, SM_PDOWN);
maxmbrown 0:1cb83aab3f9a 70 wait(0.01);
maxmbrown 0:1cb83aab3f9a 71 reset();
maxmbrown 0:1cb83aab3f9a 72 }
maxmbrown 0:1cb83aab3f9a 73 void VS1002::sci_initialise(void)
maxmbrown 0:1cb83aab3f9a 74 {
maxmbrown 0:1cb83aab3f9a 75 _RST = 1; //no reset
maxmbrown 0:1cb83aab3f9a 76 _spi.format(8,0); //spi 8bit interface, steady state low
maxmbrown 0:1cb83aab3f9a 77 _spi.frequency(1000000); //rising edge data record, freq. 1Mhz
maxmbrown 0:1cb83aab3f9a 78
maxmbrown 0:1cb83aab3f9a 79 cs_low();
maxmbrown 0:1cb83aab3f9a 80 for(int i=0; i<4; i++)
maxmbrown 0:1cb83aab3f9a 81 {
maxmbrown 0:1cb83aab3f9a 82 _spi.write(0xFF); //clock the chip a bit
maxmbrown 0:1cb83aab3f9a 83 }
maxmbrown 0:1cb83aab3f9a 84 cs_high();
maxmbrown 0:1cb83aab3f9a 85 dcs_high();
maxmbrown 0:1cb83aab3f9a 86 wait_us(5);
maxmbrown 0:1cb83aab3f9a 87 }
maxmbrown 0:1cb83aab3f9a 88 void VS1002::sdi_initialise(void)
maxmbrown 0:1cb83aab3f9a 89 {
maxmbrown 0:1cb83aab3f9a 90 _spi.format(8,0);
maxmbrown 0:1cb83aab3f9a 91 _spi.frequency(7000000); //set to 7MHz
maxmbrown 0:1cb83aab3f9a 92
maxmbrown 0:1cb83aab3f9a 93 cs_high();
maxmbrown 0:1cb83aab3f9a 94 dcs_high();
maxmbrown 0:1cb83aab3f9a 95 }
maxmbrown 0:1cb83aab3f9a 96 void VS1002::sci_write(unsigned char address, unsigned short int data)
maxmbrown 0:1cb83aab3f9a 97 {
maxmbrown 0:1cb83aab3f9a 98 sci_en(); //enables SCI/disables SDI
maxmbrown 0:1cb83aab3f9a 99
maxmbrown 0:1cb83aab3f9a 100 while(!_DREQ); //wait unitl data request is high
maxmbrown 0:1cb83aab3f9a 101 _spi.write(0x02); //SCI write
maxmbrown 0:1cb83aab3f9a 102 _spi.write(address); //register address
maxmbrown 0:1cb83aab3f9a 103 _spi.write((data >> 8) & 0xFF); //write out first half of data word
maxmbrown 0:1cb83aab3f9a 104 _spi.write(data & 0xFF); //write out second half of data word
maxmbrown 0:1cb83aab3f9a 105
maxmbrown 0:1cb83aab3f9a 106 sci_dis(); //enables SDI/disables SCI
maxmbrown 0:1cb83aab3f9a 107 wait_us(5);
maxmbrown 0:1cb83aab3f9a 108 }
maxmbrown 0:1cb83aab3f9a 109 void VS1002::sdi_write(unsigned char datum)
maxmbrown 0:1cb83aab3f9a 110 {
maxmbrown 0:1cb83aab3f9a 111 sdi_en();
maxmbrown 0:1cb83aab3f9a 112
maxmbrown 0:1cb83aab3f9a 113 while(!_DREQ);
maxmbrown 0:1cb83aab3f9a 114 _spi.write(datum);
maxmbrown 0:1cb83aab3f9a 115
maxmbrown 0:1cb83aab3f9a 116 sci_dis();
maxmbrown 0:1cb83aab3f9a 117 }
maxmbrown 0:1cb83aab3f9a 118 unsigned short int VS1002::read(unsigned short int address)
maxmbrown 0:1cb83aab3f9a 119 {
maxmbrown 0:1cb83aab3f9a 120 cs_low(); //enables SCI/disables SDI
maxmbrown 0:1cb83aab3f9a 121
maxmbrown 0:1cb83aab3f9a 122 while(!_DREQ); //wait unitl data request is high
maxmbrown 0:1cb83aab3f9a 123 _spi.write(0x03); //SCI write
maxmbrown 0:1cb83aab3f9a 124 _spi.write(address); //register address
maxmbrown 0:1cb83aab3f9a 125 unsigned short int received = _spi.write(0x00); //write out dummy byte
maxmbrown 0:1cb83aab3f9a 126 received <<= 8;
maxmbrown 0:1cb83aab3f9a 127 received += _spi.write(0x00); //write out dummy byte
maxmbrown 0:1cb83aab3f9a 128
maxmbrown 0:1cb83aab3f9a 129 cs_high(); //enables SDI/disables SCI
maxmbrown 0:1cb83aab3f9a 130
maxmbrown 0:1cb83aab3f9a 131 return received; //return received word
maxmbrown 0:1cb83aab3f9a 132 }
maxmbrown 0:1cb83aab3f9a 133 void VS1002::sine_test_activate(unsigned char wave)
maxmbrown 0:1cb83aab3f9a 134 {
maxmbrown 0:1cb83aab3f9a 135 cs_high(); //enables SDI/disables SCI
maxmbrown 0:1cb83aab3f9a 136
maxmbrown 0:1cb83aab3f9a 137 while(!_DREQ); //wait unitl data request is high
maxmbrown 0:1cb83aab3f9a 138 _spi.write(0x53); //SDI write
maxmbrown 0:1cb83aab3f9a 139 _spi.write(0xEF); //SDI write
maxmbrown 0:1cb83aab3f9a 140 _spi.write(0x6E); //SDI write
maxmbrown 0:1cb83aab3f9a 141 _spi.write(wave); //SDI write
maxmbrown 0:1cb83aab3f9a 142 _spi.write(0x00); //filler byte
maxmbrown 0:1cb83aab3f9a 143 _spi.write(0x00); //filler byte
maxmbrown 0:1cb83aab3f9a 144 _spi.write(0x00); //filler byte
maxmbrown 0:1cb83aab3f9a 145 _spi.write(0x00); //filler byte
maxmbrown 0:1cb83aab3f9a 146
maxmbrown 0:1cb83aab3f9a 147 cs_low(); //enables SCI/disables SDI
maxmbrown 0:1cb83aab3f9a 148 }
maxmbrown 0:1cb83aab3f9a 149 void VS1002::sine_test_deactivate(void)
maxmbrown 0:1cb83aab3f9a 150 {
maxmbrown 0:1cb83aab3f9a 151 cs_high();
maxmbrown 0:1cb83aab3f9a 152
maxmbrown 0:1cb83aab3f9a 153 while(!_DREQ);
maxmbrown 0:1cb83aab3f9a 154 _spi.write(0x45); //SDI write
maxmbrown 0:1cb83aab3f9a 155 _spi.write(0x78); //SDI write
maxmbrown 0:1cb83aab3f9a 156 _spi.write(0x69); //SDI write
maxmbrown 0:1cb83aab3f9a 157 _spi.write(0x74); //SDI write
maxmbrown 0:1cb83aab3f9a 158 _spi.write(0x00); //filler byte
maxmbrown 0:1cb83aab3f9a 159 _spi.write(0x00); //filler byte
maxmbrown 0:1cb83aab3f9a 160 _spi.write(0x00); //filler byte
maxmbrown 0:1cb83aab3f9a 161 _spi.write(0x00); //filler byte
maxmbrown 0:1cb83aab3f9a 162 }
maxmbrown 0:1cb83aab3f9a 163
maxmbrown 0:1cb83aab3f9a 164
maxmbrown 0:1cb83aab3f9a 165 void VS1002::volume(signed int left, signed int right)
maxmbrown 0:1cb83aab3f9a 166 {
maxmbrown 0:1cb83aab3f9a 167 while(_DREQ == 0);
maxmbrown 0:1cb83aab3f9a 168 unsigned short int _left = -left; //convert the decibel values into a format
maxmbrown 0:1cb83aab3f9a 169 unsigned short int _right = -right; //readable by the chip cf. datasheet p.32 subsection 8.6.11
maxmbrown 0:1cb83aab3f9a 170 _left *= 2;
maxmbrown 0:1cb83aab3f9a 171 _right *= 2;
maxmbrown 0:1cb83aab3f9a 172 unsigned short int attenuation = ((256 * _left) + _right);
maxmbrown 0:1cb83aab3f9a 173 cs_low();
maxmbrown 0:1cb83aab3f9a 174 sci_write(0x0B, attenuation); //writeout these values
maxmbrown 0:1cb83aab3f9a 175 cs_high();
maxmbrown 0:1cb83aab3f9a 176 }
maxmbrown 0:1cb83aab3f9a 177
maxmbrown 0:1cb83aab3f9a 178 void VS1002::update_LCD(string print_file)
maxmbrown 0:1cb83aab3f9a 179 {
maxmbrown 0:1cb83aab3f9a 180 uLCD2.cls();
maxmbrown 0:1cb83aab3f9a 181 if(pause){
maxmbrown 0:1cb83aab3f9a 182 uLCD2.printf("Paused ");
maxmbrown 0:1cb83aab3f9a 183 uLCD2.printf(print_file.c_str());}
maxmbrown 0:1cb83aab3f9a 184 if(mute){
maxmbrown 0:1cb83aab3f9a 185 uLCD2.printf("Muted ");
maxmbrown 0:1cb83aab3f9a 186 uLCD2.printf(print_file.c_str());}
maxmbrown 0:1cb83aab3f9a 187 if(!mute && !pause){
maxmbrown 0:1cb83aab3f9a 188 uLCD2.printf("Playing ");
maxmbrown 0:1cb83aab3f9a 189 uLCD2.printf(print_file.c_str()); }
maxmbrown 0:1cb83aab3f9a 190
maxmbrown 0:1cb83aab3f9a 191 uLCD2.locate(0,4);
maxmbrown 0:1cb83aab3f9a 192 if(fade==0)
maxmbrown 0:1cb83aab3f9a 193 uLCD2.printf("Fade: %s ",print_fade);
maxmbrown 0:1cb83aab3f9a 194 else
maxmbrown 0:1cb83aab3f9a 195 uLCD2.printf("Fade: %s %i % ",print_fade,fade_percent);
maxmbrown 0:1cb83aab3f9a 196 if(t!=oldt)
maxmbrown 0:1cb83aab3f9a 197 {
maxmbrown 0:1cb83aab3f9a 198 uLCD2.locate(0,8);
maxmbrown 0:1cb83aab3f9a 199 if(t<10)
maxmbrown 0:1cb83aab3f9a 200 uLCD2.printf("%i:0%i",m,t);
maxmbrown 0:1cb83aab3f9a 201 else
maxmbrown 0:1cb83aab3f9a 202 uLCD2.printf("%i:%i",m,t);
maxmbrown 0:1cb83aab3f9a 203 oldt=t;
maxmbrown 0:1cb83aab3f9a 204 }
maxmbrown 0:1cb83aab3f9a 205 //uLCD2.printf("\n %d %s",new_song_number,song_name[new_song_number-1]);
maxmbrown 0:1cb83aab3f9a 206 }
maxmbrown 0:1cb83aab3f9a 207
maxmbrown 0:1cb83aab3f9a 208 void VS1002::play_song(string song, string print_file, int song_number)
maxmbrown 0:1cb83aab3f9a 209 {
maxmbrown 0:1cb83aab3f9a 210 /*====== Song Select ======*/
maxmbrown 0:1cb83aab3f9a 211
maxmbrown 0:1cb83aab3f9a 212 FILE *song2play;
maxmbrown 0:1cb83aab3f9a 213 unsigned char array[512]; //array for reading data from file
maxmbrown 0:1cb83aab3f9a 214 bool play_new=false; // Variable to see if new_song has be assigned or not
maxmbrown 0:1cb83aab3f9a 215
maxmbrown 0:1cb83aab3f9a 216 song2play = fopen(song.c_str(), "r"); // Open the music file in read mode
maxmbrown 0:1cb83aab3f9a 217
maxmbrown 0:1cb83aab3f9a 218 //Printing to LCD the present status
maxmbrown 0:1cb83aab3f9a 219 update_LCD(print_file);
maxmbrown 0:1cb83aab3f9a 220 t=0;
maxmbrown 0:1cb83aab3f9a 221 m=0;
maxmbrown 0:1cb83aab3f9a 222 if(!song2play)
maxmbrown 0:1cb83aab3f9a 223 {
maxmbrown 0:1cb83aab3f9a 224 uLCD2.printf("\n \n Error!!");
maxmbrown 0:1cb83aab3f9a 225 exit(1);
maxmbrown 0:1cb83aab3f9a 226 }
maxmbrown 0:1cb83aab3f9a 227 while(!feof(song2play))
maxmbrown 0:1cb83aab3f9a 228 {
maxmbrown 0:1cb83aab3f9a 229 if(!pause)
maxmbrown 0:1cb83aab3f9a 230 {
maxmbrown 0:1cb83aab3f9a 231 fread(&array, 1, 512, song2play);
maxmbrown 0:1cb83aab3f9a 232 for(int i=0; i<512; i++)
maxmbrown 0:1cb83aab3f9a 233 {
maxmbrown 0:1cb83aab3f9a 234 sdi_write(array[i]);
maxmbrown 0:1cb83aab3f9a 235 }
maxmbrown 0:1cb83aab3f9a 236 volume(volume_left,volume_right);
maxmbrown 0:1cb83aab3f9a 237 }
maxmbrown 0:1cb83aab3f9a 238 if(t!=oldt)
maxmbrown 0:1cb83aab3f9a 239 {
maxmbrown 0:1cb83aab3f9a 240 uLCD2.locate(0,8);
maxmbrown 0:1cb83aab3f9a 241 if(t<10)
maxmbrown 0:1cb83aab3f9a 242 uLCD2.printf("%i:0%i",m,t);
maxmbrown 0:1cb83aab3f9a 243 else
maxmbrown 0:1cb83aab3f9a 244 uLCD2.printf("%i:%i",m,t);
maxmbrown 0:1cb83aab3f9a 245 oldt=t;
maxmbrown 0:1cb83aab3f9a 246 }
maxmbrown 0:1cb83aab3f9a 247 if(fade!=old_fade)
maxmbrown 0:1cb83aab3f9a 248 {
maxmbrown 0:1cb83aab3f9a 249 uLCD2.locate(0,4);
maxmbrown 0:1cb83aab3f9a 250 if(fade==0)
maxmbrown 0:1cb83aab3f9a 251 uLCD2.printf("Fade: %s ",print_fade);
maxmbrown 0:1cb83aab3f9a 252 else
maxmbrown 0:1cb83aab3f9a 253 uLCD2.printf("Fade: %s %i % ",print_fade,fade_percent);
maxmbrown 0:1cb83aab3f9a 254
maxmbrown 0:1cb83aab3f9a 255 old_fade=fade;
maxmbrown 0:1cb83aab3f9a 256 }
maxmbrown 0:1cb83aab3f9a 257 if(stop)
maxmbrown 0:1cb83aab3f9a 258 {
maxmbrown 0:1cb83aab3f9a 259 play_new=true;
maxmbrown 0:1cb83aab3f9a 260 break;
maxmbrown 0:1cb83aab3f9a 261 }
maxmbrown 0:1cb83aab3f9a 262 if((pause!=old_pause)||(mute!=old_mute)){
maxmbrown 0:1cb83aab3f9a 263 old_pause=pause;
maxmbrown 0:1cb83aab3f9a 264 old_mute=mute;
maxmbrown 0:1cb83aab3f9a 265 update_LCD(print_file);
maxmbrown 0:1cb83aab3f9a 266 uLCD2.locate(0,8);
maxmbrown 0:1cb83aab3f9a 267 if(t<10)
maxmbrown 0:1cb83aab3f9a 268 uLCD2.printf("%i:0%i",m,t);
maxmbrown 0:1cb83aab3f9a 269 else
maxmbrown 0:1cb83aab3f9a 270 uLCD2.printf("%i:%i",m,t);
maxmbrown 0:1cb83aab3f9a 271 }
maxmbrown 0:1cb83aab3f9a 272 if(new_song_number!=song_number)
maxmbrown 0:1cb83aab3f9a 273 {
maxmbrown 0:1cb83aab3f9a 274 play_new=true;
maxmbrown 0:1cb83aab3f9a 275 break;
maxmbrown 0:1cb83aab3f9a 276 }
maxmbrown 0:1cb83aab3f9a 277 }
maxmbrown 0:1cb83aab3f9a 278 fclose(song2play); //close the file
maxmbrown 0:1cb83aab3f9a 279
maxmbrown 0:1cb83aab3f9a 280 if(!play_new)
maxmbrown 0:1cb83aab3f9a 281 {
maxmbrown 0:1cb83aab3f9a 282 new_song_number+=1; // Goto Next song on completion of one song
maxmbrown 0:1cb83aab3f9a 283 if(new_song_number==size)
maxmbrown 0:1cb83aab3f9a 284 new_song_number=0;
maxmbrown 0:1cb83aab3f9a 285 play_new=false;
maxmbrown 0:1cb83aab3f9a 286 }
maxmbrown 0:1cb83aab3f9a 287
maxmbrown 0:1cb83aab3f9a 288 }