#include <string.h>
#include "VS1053.h"


unsigned char volume=0;


unsigned char vs_getvolume(void)
{
	return volume;
}


void vs_setvolume(unsigned char vol) //0-100
{
	volume = vol;

	if(vol == 0)
	{
		vs_write(VS_VOL, 0xFFFF);	
	}
	else
	{
		vol = 100-vol;
		vs_write(VS_VOL, (vol<<8) | vol);
	}

	while(!vs_request());
}


unsigned char vs_request(void)
{
	return PINF.3;//DREQ_CHECK //1=ready, 0=buf full\
   
}


void vs_data32(char *data)
{
	unsigned char c;

	PORTF.2=0;   //DCS 

	c = *data++;
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); // 1
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); // 2
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); // 3
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); // 4
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); // 5
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); // 6
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); // 7
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); // 8
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); // 9
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //10
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //11
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //12
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //13
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //14
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //15
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //16
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //17
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //18
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //19
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //20
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //21
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //22
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //23
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //24
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //25
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //26
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //27
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //28
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //29
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //30
	SPDR = c; c = *data++; while (!(SPSR & (1<<SPIF))); //31
	SPDR = c;              while (!(SPSR & (1<<SPIF))); //32

	PORTF.2=1;  //DCS 
}


void vs_data(unsigned char data)
{
	PORTF.2=0;   //DCS 

	vs_spi_write(data);

	PORTF.2=1;   //DCS 
}


void vs_write(unsigned char addr, unsigned int data)
{
	//CS_ENABLE
    PORTF.0=0;

	vs_spi_write(VS_WRITE);
	vs_spi_write(addr);
	vs_spi_write(data>>8); 	//MSB
	vs_spi_write(data); 	//LSB 
    PORTF.0=1;

	//CS_DISABLE
}



unsigned int vs_read(unsigned char addr)
{
	unsigned int i;
    
//CS_ENABLE
PORTF.0=0;

	SPSR &= ~(1<<SPI2X);

	vs_spi_write(VS_READ);
	vs_spi_write(addr);

	i   = vs_spi_read();
	i <<= 8;
	i  |= vs_spi_read();

	SPSR |= (1<<SPI2X);

	//CS_DISABLE 
    PORTF.0=1;

	return i;
}


void vs_spi_write(unsigned char c)
{
	
    SPDR = c;
	while (!(SPSR & (1<<SPIF)));
     
    
}


unsigned char vs_spi_read(void)
{
	SPDR = 0;
	while (!(SPSR & (1<<SPIF)));

	return SPDR;
}


void vs_reset(void)
{
	unsigned int i;

	for(i = 2052; i != 0; i--)
	{
		vs_data(0x00);
	}

	vs_write(VS_MODE, SM_SDINEW | SM_CANCEL);
	delay_ms(2);

	for(i = 32; i != 0; i--)
	{
		vs_data(0x00);
	}
}


void vs_init(void)
{
	SPSR &= ~(1 << SPI2X);

	delay_ms(2); 
    
	//RESET
    PORTF.4=0;
	delay_ms(2);
	
	//RESET 
    PORTF.4=1;
	delay_ms(2);
  
	vs_write(VS_MODE, SM_SDINEW);  


	vs_write(VS_CLOCKF, 0x01800 + SC_MUL_2X);
	delay_ms(2);
	
	vs_setvolume(50);
  
	
	SPSR |=  (1 << SPI2X);
    
    
}



void vs_play (void)
{


while (PINF.3)  //While DREQ=1
{

   if (audiodata_pntr == (mp3_buffer + 512))   // buffer empty
        {
        
            audiodata_pntr = mp3_buffer;
            result=f_read(&fil_obj,mp3_buffer,512,&ByteRead);
            i=0; 
             a++;
            }
      
       vs_data32 (audiodata_pntr);   // send data on SPI bus 
       audiodata_pntr += 32;   // advance data pointer  
       
           j++;   
         
    }
    

}










