Capacitive Touch Sensor Controlling an MP3 Player

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

Revision:
0:1cb83aab3f9a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/VS1002.cpp	Thu Dec 08 20:20:09 2016 +0000
@@ -0,0 +1,288 @@
+#include "VS1002.h"
+#include "mbed.h"
+#include "uLCD_4DGL.h"
+
+//Serial pc(USBTX, USBRX);
+uLCD_4DGL uLCD2(p28, p27, p29);
+
+/* ==================================================================
+ * Constructor
+ * =================================================================*/
+
+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)
+    : _sd(mmosi, mmiso, ssck, ccs, name), _spi(mosi, miso, sck), _CS(cs), _RST(rst), _DREQ(dreq), _DCS(dcs), _VOL(vol) {
+    
+    }    
+
+/*===================================================================
+ * Functions
+ *==================================================================*/
+ 
+void VS1002::cs_low(void)
+{
+    _CS = 0;                                
+}
+void VS1002::cs_high(void)
+{
+    _CS = 1;                                
+}
+void VS1002::dcs_low(void)
+{
+    _DCS = 0;
+}
+void VS1002::dcs_high(void)
+{
+    _DCS = 1;
+}
+void VS1002::sci_en(void)                    //SCI enable
+{
+    cs_high();
+    dcs_high();
+    cs_low();
+}
+void VS1002::sci_dis(void)                    //SCI disable
+{
+    cs_high();
+}
+void VS1002::sdi_en(void)                    //SDI enable
+{
+    dcs_high();
+    cs_high();
+    dcs_low();
+}
+void VS1002::sdi_dis(void)                    //SDI disable
+{
+    dcs_high();
+}
+void VS1002::reset(void)                    //hardware reset
+{
+    wait(0.01);
+    _RST = 0;
+    wait(0.01);
+    _RST = 1;
+    wait(0.10);
+}
+void VS1002::power_down(void)                //hardware and software reset
+{
+    cs_low();
+    reset();
+    sci_write(0x00, SM_PDOWN);
+    wait(0.01);
+    reset();
+}
+void VS1002::sci_initialise(void)
+{
+    _RST = 1;                                //no reset
+    _spi.format(8,0);                        //spi 8bit interface, steady state low
+    _spi.frequency(1000000);                //rising edge data record, freq. 1Mhz
+    
+    cs_low();
+    for(int i=0; i<4; i++)
+    {
+    _spi.write(0xFF);                        //clock the chip a bit
+    }
+    cs_high();
+    dcs_high();
+    wait_us(5);
+}
+void VS1002::sdi_initialise(void)
+{
+    _spi.format(8,0);
+    _spi.frequency(7000000);                //set to 7MHz
+    
+    cs_high();
+    dcs_high();
+}
+void VS1002::sci_write(unsigned char address, unsigned short int data)
+{
+    sci_en();                                //enables SCI/disables SDI
+    
+    while(!_DREQ);                            //wait unitl data request is high
+    _spi.write(0x02);                        //SCI write
+    _spi.write(address);                    //register address
+    _spi.write((data >> 8) & 0xFF);            //write out first half of data word
+    _spi.write(data & 0xFF);                //write out second half of data word
+    
+    sci_dis();                                //enables SDI/disables SCI
+    wait_us(5);
+}
+void VS1002::sdi_write(unsigned char datum)
+{
+    sdi_en();
+    
+    while(!_DREQ);
+    _spi.write(datum);
+    
+    sci_dis();
+}
+unsigned short int VS1002::read(unsigned short int address)
+{
+    cs_low();                                //enables SCI/disables SDI
+    
+    while(!_DREQ);                            //wait unitl data request is high
+    _spi.write(0x03);                        //SCI write
+    _spi.write(address);                    //register address
+    unsigned short int received = _spi.write(0x00);    //write out dummy byte
+    received <<= 8;
+    received += _spi.write(0x00);            //write out dummy byte
+    
+    cs_high();                                //enables SDI/disables SCI
+    
+    return received;                        //return received word
+}
+void VS1002::sine_test_activate(unsigned char wave)
+{
+    cs_high();                                //enables SDI/disables SCI
+    
+    while(!_DREQ);                            //wait unitl data request is high
+    _spi.write(0x53);                        //SDI write
+    _spi.write(0xEF);                        //SDI write
+    _spi.write(0x6E);                        //SDI write
+    _spi.write(wave);                        //SDI write
+    _spi.write(0x00);                        //filler byte
+    _spi.write(0x00);                        //filler byte
+    _spi.write(0x00);                        //filler byte
+    _spi.write(0x00);                        //filler byte
+
+    cs_low();                                //enables SCI/disables SDI
+}
+void VS1002::sine_test_deactivate(void)
+{
+    cs_high();
+    
+    while(!_DREQ);
+    _spi.write(0x45);                        //SDI write
+    _spi.write(0x78);                        //SDI write
+    _spi.write(0x69);                        //SDI write
+    _spi.write(0x74);                        //SDI write
+    _spi.write(0x00);                        //filler byte
+    _spi.write(0x00);                        //filler byte
+    _spi.write(0x00);                        //filler byte
+    _spi.write(0x00);                        //filler byte
+}
+
+
+void VS1002::volume(signed int left, signed int right)
+{
+    while(_DREQ == 0);
+    unsigned short int _left = -left;       //convert the decibel values into a format
+    unsigned short int _right = -right;     //readable by the chip cf. datasheet p.32 subsection 8.6.11
+    _left *= 2;
+    _right *= 2;
+    unsigned short int attenuation = ((256 * _left) + _right);
+    cs_low();
+    sci_write(0x0B, attenuation);               //writeout these values
+    cs_high();
+}
+
+void VS1002::update_LCD(string print_file)
+{
+ uLCD2.cls();
+  if(pause){
+    uLCD2.printf("Paused ");
+    uLCD2.printf(print_file.c_str());}
+  if(mute){
+   uLCD2.printf("Muted ");
+   uLCD2.printf(print_file.c_str());}
+  if(!mute && !pause){
+   uLCD2.printf("Playing ");
+   uLCD2.printf(print_file.c_str()); } 
+   
+   uLCD2.locate(0,4);
+    if(fade==0)
+        uLCD2.printf("Fade: %s    ",print_fade);
+    else
+        uLCD2.printf("Fade: %s %i %  ",print_fade,fade_percent);
+    if(t!=oldt)
+    {
+        uLCD2.locate(0,8);
+        if(t<10)
+            uLCD2.printf("%i:0%i",m,t);
+        else
+            uLCD2.printf("%i:%i",m,t);
+        oldt=t;
+    }
+  //uLCD2.printf("\n %d %s",new_song_number,song_name[new_song_number-1]); 
+}
+
+void VS1002::play_song(string song, string print_file, int song_number)
+{
+    /*====== Song Select ======*/
+    
+    FILE *song2play;
+    unsigned char array[512];           //array for reading data from file
+    bool play_new=false;                // Variable to see if new_song has be assigned or not
+
+    song2play = fopen(song.c_str(), "r");    // Open the music file in read mode
+    
+     //Printing to LCD the present status
+   update_LCD(print_file);
+   t=0;
+   m=0;
+    if(!song2play) 
+    {
+        uLCD2.printf("\n \n Error!!");
+        exit(1);
+    }
+      while(!feof(song2play))
+    {
+            if(!pause)
+           {
+           fread(&array, 1, 512, song2play);           
+           for(int i=0; i<512; i++)
+           {
+                sdi_write(array[i]);
+           }
+           volume(volume_left,volume_right);
+           }
+           if(t!=oldt)
+           {
+                uLCD2.locate(0,8);
+                if(t<10)
+                    uLCD2.printf("%i:0%i",m,t);
+                else
+                    uLCD2.printf("%i:%i",m,t);
+                oldt=t;
+           }
+           if(fade!=old_fade)
+           {
+                uLCD2.locate(0,4);
+                if(fade==0)
+                    uLCD2.printf("Fade: %s    ",print_fade);
+                else
+                    uLCD2.printf("Fade: %s %i %  ",print_fade,fade_percent);
+                
+                old_fade=fade; 
+            }
+          if(stop)
+          {
+             play_new=true;
+             break;
+          }
+            if((pause!=old_pause)||(mute!=old_mute)){
+                old_pause=pause;
+                old_mute=mute;
+                update_LCD(print_file);
+                uLCD2.locate(0,8);
+                if(t<10)
+                    uLCD2.printf("%i:0%i",m,t);
+                else
+                    uLCD2.printf("%i:%i",m,t);
+                }
+            if(new_song_number!=song_number)
+            {
+              play_new=true;
+              break;
+            }
+          }
+           fclose(song2play);                              //close the file
+
+      if(!play_new)
+      {
+     new_song_number+=1;               // Goto Next song on completion of one song
+     if(new_song_number==size)
+        new_song_number=0;     
+     play_new=false;                  
+     }
+      
+}
\ No newline at end of file