#include <mega128.h>
#include <stdio.h>
#include <ctype.h>
#include <spi.h>  
#include <delay.h>  
#include <string.h>
#include "main.h"
#include "mmc.h"
#include "diskio.h"  
#include "delay.h"
#include "tff.h"
#include "dataflash.h"
#include "vs1001.h"

extern FIL file1;
 
unsigned char SPI(unsigned char data)
{            
SPDR = data;
while(!(SPSR & 0x80)); // Wait Queue off
return SPDR;
}

void Voiceout(unsigned int Startpage, unsigned int Endpage)
{
 unsigned int Page_mem;
 unsigned int temp;
 unsigned char N;
 
 vs_write(VS_MODE,0x0804);
 
 for (Page_mem = Startpage; Page_mem<Endpage;Page_mem++)
 {
    DF_CHIP_SELECT=0;
    delay_us(1);

    SPI(MAIN_MEMORY_PAGE_READ2);                 //command Current_page_read
        
    SPI(Page_mem>>7);
    SPI(Page_mem<<1);
    SPI(0x00);

    SPI(0x00);                          // write don't care byte
    SPI(0x00);                          // write don't care byte
    SPI(0x00);                          // start at buffer address 0
    SPI(0x00);                          // write don't care byte

    for (temp=0;temp<264;temp++)
    {
     N = SPI(0xFF);
     vs_stream(&N,1);
     while(!(DREQ));
    }
       
 DF_CHIP_SELECT=1;
 delay_us(1);

 }
 //VS1001_Stream(0x00,2048);
 delay_ms(250);
}


//**************************************************************************************
//*  Says a number (current range is 0 to 299)
//**************************************************************************************

unsigned char Corresp(unsigned int T)
{

if ((T>=100) && (T<200)) {Say(v_100); T-=100;}
if ((T>=200) && (T<300)) {Say(v_200); T-=200;}
if ((T>=300) && (T<400)) {Say(v_300); T-=300;}
if ((T>=400) && (T<500)) {Say(v_400); T-=400;}
if ((T>=500) && (T<600)) {Say(v_500); T-=500;}
if ((T>=600) && (T<700)) {Say(v_600); T-=600;}
if ((T>=700) && (T<800)) {Say(v_200); T-=700;}
if ((T>=800) && (T<900)) {Say(v_200); T-=800;}
if ((T>=900) && (T<1000)){Say(v_200); T-=900;}

if ((T>=20) && (T<30)) {Say(v_20); T-=20;}
if ((T>=30) && (T<40)) {Say(v_30); T-=30;}
if ((T>=40) && (T<50)) {Say(v_40); T-=40;}
if ((T>=50) && (T<60)) {Say(v_50); T-=50;}
if ((T>=60) && (T<70)) {Say(v_60); T-=60;}
if ((T>=70) && (T<80)) {Say(v_70); T-=70;}
if ((T>=80) && (T<90)) {Say(v_80); T-=80;}
if ((T>=90) && (T<100)){Say(v_90); T-=90;}

if ((T<=20) && (T>0)) Say(T);
return 1;
}

void Say(unsigned char ptr)
{
switch (ptr)
{
case 0: Voiceout(341 , 355);break;       //0
case 1: Voiceout(355 , 373);break;       //1
case 2: Voiceout(373 , 388);break;       //2
case 3: Voiceout(388 , 404);break;       //3
case 4: Voiceout(404 , 424);break;       //4
case 5: Voiceout(424 , 443);break;       //5
case 6: Voiceout(443 , 464);break;       //6
case 7: Voiceout(464 , 487);break;       //7
case 8: Voiceout(487 , 505);break;       //8
case 9: Voiceout(505 , 524);break;       //9
case 10: Voiceout(524 , 544);break;      //10
case 11: Voiceout(544 , 571);break;      //11
case 12: Voiceout(571 , 602);break;      //12
case 13: Voiceout(602 , 634);break;      //13
case 14: Voiceout(634 , 667);break;      //14
case 15: Voiceout(667 , 696);break;      //15
case 16: Voiceout(696 , 729);break;      //16
case 17: Voiceout(729 , 761);break;      //17
case 18: Voiceout(761 , 792);break;      //18
case 19: Voiceout(792 , 824);break;      //19
case 20: Voiceout(824 , 851);break;      //20
case 21: Voiceout(851 , 876);break;      //30
case 22: Voiceout(876 , 899);break;      //40
case 23: Voiceout(899 , 925);break;      //50
case 24: Voiceout(925 , 952);break;      //60
case 25: Voiceout(952 , 978);break;      //70
case 26: Voiceout(978 , 1008);break;     //80
case 27: Voiceout(1008 , 1037);break;    //90
case 28: Voiceout(1037 , 1059);break;    //100
case 29: Voiceout(1059 , 1080);break;    //200
case 30: Voiceout(1080 , 1104);break;    //300
case 31: Voiceout(1104 , 1132);break;    //400
case 32: Voiceout(1132 , 1157);break;    //500
case 33: Voiceout(1157 , 1178);break;    //600
case 34: Voiceout(1178 , 1204);break;    //700
case 35: Voiceout(1204 , 1232);break;    //800
case 36: Voiceout(1231 , 1256);break;    //900
case 37: Voiceout(1256 , 1282);break;    //1000
case 38: Voiceout(0 , 75);break;        //"startup"
case 39: Voiceout(81 , 106);break;       //"card capacity" 
case 40: Voiceout(106 , 141);break;      //"nocard"
case 41: Voiceout(141 , 183);break;     //"wrongcard" 
case 42: Voiceout(183 , 214);break;     //"play"
case 43: Voiceout(214 , 231);break;     //"stop"
case 44:Voiceout(225 , 259);break;      //"overbook" 
case 45:Voiceout(259 , 298);break;     //"overtrack"
case 46:Voiceout(298 , 316);break;     //"book"
case 47:Voiceout(316 , 339);break;     //"track"
case 48: Voiceout(1282 , 1307);break;   //gb
case 49: Voiceout(1049 , 1067);break;   //mb
case 50: Voiceout(1067 , 1093);break;   //cancel
case 51: Voiceout(1093 , 1118);break;   //repeat
case 52: Voiceout(1118 , 1160);break;   //autostop1
case 53: Voiceout(1160 , 1199);break;   //autostop2
case 54: Voiceout(1199 , 1228);break;   //fwupdate
case 55: Voiceout(1228 , 1254);break;   //version
case 56: Voiceout(1254 , 1281);break;   //hwversion
case 57: Voiceout(1280 , 1310);break;   //lobatt
case 58: Voiceout(1310 , 1340);break;   //endread
case 59: Voiceout(1340 , 1367);break;   //lastbook
case 60: Voiceout(1367 , 1418);break;   //lasttrack
case 61: Voiceout(1418 , 1472);break;   //endcard
case 62: Voiceout(1472 , 1520);break;   //blockoff
case 63: Voiceout(1520 , 1560);break;   //blockon
case 64: Voiceout(1560 , 1595);break;   //flagon
case 65: Voiceout(1595 , 1640);break;   //gotoflag
}
}

/*****************************************************************************
Чтение регистра статуса
AT45_STATUS_READ
******************************************************************************/
unsigned char GetStatus(void)
{ 
    unsigned char status;
    
    DF_CHIP_SELECT=0; /* выбираем чип */
    SPI(STATUS_REGISTER); /* посылаем команду */
    status = SPI(0xFF); /* читаем статус */
    DF_CHIP_SELECT=1; /* освобождаем чип */
    return status;
}

//---------------------------------------------------

void AT45WaitReady()
{
unsigned int errtime=0;
unsigned char stat;

while (!(stat & 0x80))
{
stat = GetStatus();
if(errtime++>=9345) break;
}
}

void BufferToFlash(char Buffer, unsigned int page)
{
if (page > 2048) page = 2048;
    
DF_CHIP_SELECT=0;
if (Buffer == 0) SPI(0x83); else SPI(0x86);
SPI(page>>7);
SPI(page<<1);
SPI(0x00);
DF_CHIP_SELECT=1;

}

void Buffer_write(unsigned char Buffer)
{

if (Buffer==0) SPI(BUFFER_1_WRITE); else SPI(BUFFER_2_WRITE);

SPI(0x00);
SPI(0x00);
SPI(0x00);
}


void Dfprog(void)
 {
 unsigned char DF_buf[264];
 unsigned int Page_mem;
 unsigned char buffer=0;
 CHAR filename[11];
 BYTE res;
 unsigned int temp;
 USHORT  br;
 
 printf("Entering Dataflash programming mode ... \r\n");
 
 Sine_Sweep();
 delay_ms(10);
 Sine_Sweep();
 delay_ms(10);
 Page_mem = 0;
  
 strcpyf(filename,"voice.bin");
 
 if (f_open(&file1,filename, FA_OPEN_EXISTING | FA_READ) == FR_OK)
 {
    printf("File %s is opened!\r\n", filename);
    printf("Starting Dataflash programming...\r\n");

    for (;;)
     {          
        res=f_read(&file1,DF_buf,sizeof(DF_buf),&br);
        if (Page_mem > 2047) break;
        //if (res || br == 0) break;                                 // error or eof
        DF_CHIP_SELECT=0;
        buffer=!buffer;
        Buffer_write(buffer);                                      //запишем буфер  
           for (temp=0;temp<sizeof(DF_buf);temp++)
           {
           SPI(DF_buf[temp]);
           }
        DF_CHIP_SELECT=1;
        BufferToFlash(buffer, Page_mem);
        delay_ms(15);                                              //от этой задержки зависит качество программирования ДФ
        Page_mem++;   
     }
 }
 
 printf("Dataflash programming finished !\r\n");
 
 Sine_Sweep();
 delay_ms(10);
 Sine_Sweep();
 delay_ms(10);
 Sine_Sweep();
 delay_ms(10);
 Sine_Sweep();
}


