?? siodvr.c
字號:
//==================================================================================//
// 文件名: SIODVR.C
// 描 述: 該文件主要處理DVR程序,包括錄、放音程序、以及語音數據的上傳、下載程序。
// 日 期: 2003/04/03
// 庫文件: sacmv26e.lib
//==================================================================================//
#include "usbmain.h"
#include "dvr.h"
#include "hardware.h"
extern void SP_ClrWatchDog(void);
extern unsigned int SP_SIOReadAByte(unsigned long int);
extern void SP_SIOMassErase(void);
extern void SP_SIOSendAWord(unsigned long int,unsigned int);
extern unsigned int SP_SIOReadAWord(unsigned long int);
extern void SP_SIOSendAByte(unsigned long int,unsigned int);
extern unsigned int D12_ReadEndpoint(unsigned int endp, unsigned int len, unsigned int * buf);
extern unsigned int D12_WriteEndpoint(unsigned int endp, unsigned int len, unsigned int * buf);
extern unsigned int MainEpBuf[];
extern unsigned int FileLen_Block;
extern unsigned int m_CtrlRecFileData;
extern unsigned int G_UpLoad_Flag;
extern unsigned int Key;
extern unsigned int KeyStatus;
void IsoDvrHandle(void);
void UpLoad(void);
void DownLoad(void);
unsigned long int SpeechFileLength=0;
unsigned long int DownLoadFileLen_Up=0x0000;
unsigned int Block_i=0;
unsigned int Byte_Value=0;
unsigned long int Addr=0;
unsigned int FileLen_Block=0;
unsigned long int Addr_UpLoad=0;
unsigned long int Up_Flash_Addr_Up=0;
unsigned int UpLoad_Counter=0;
unsigned long int Leave_Len=0;
unsigned int FlashAdd_Up=0;
unsigned long int Down_Flash_Addr_Up=0;
//=========================================================================
// 函數: IsoDvrHandle
// 語法: void IsoDvrHandle(void)
// 描述: 進行數碼錄、放音處理
// 參數: 無
// 返回: 無
//=========================================================================
void IsoDvrHandle()
{
unsigned int Ret;
switch(Key)
{
case 0x00:
break;
case 0x01: // Record Key
if (KeyStatus == Record)
SACM_DVR_Stop();
KeyStatus = Record;
Addr = 0;
SACM_DVR_Initial(Manual);
SP_SIOMassErase();
SACM_DVR_InitQueue();
SACM_DVR_InitEncoder(RceMonitorOff);
Key=0;
break;
case 0x02: // Stop Key
switch(KeyStatus)
{
case Record:
SACM_DVR_Stop();
while(SACM_DVR_TestQueue() != Empty )
{ // flush queue
Ret = SACM_DVR_FetchQueue(); // Get data from Queue
SP_SIOSendAWord(Addr,Ret);
Addr += 2;
}
SpeechFileLength=Addr;
break;
case Play:
SACM_DVR_Stop();
break;
default: //
SACM_DVR_Stop();
break;
}
KeyStatus = Stop;
break;
case 0x04: // play key
SACM_DVR_Initial(Manual);
SACM_DVR_Stop();
SP_RampUpDAC1();
SP_RampUpDAC2();
if(KeyStatus == Record)
{
while(SACM_DVR_TestQueue() != Empty)
{
Ret = SACM_DVR_FetchQueue(); // Put remain dat to Queue
SP_SIOSendAWord(Addr,Ret); // save to User Storage
Addr += 2;
}// end of while
SpeechFileLength=Addr;
}
KeyStatus = Play;
Addr = 0x00c0;
SACM_DVR_InitQueue();
while(SACM_DVR_TestQueue() != Full)
{
Ret=SP_SIOReadAWord(Addr); // User Storage SRAM/Flash ..
SACM_DVR_FillQueue(Ret);
Addr += 2;
if(Addr>SpeechFileLength)
{
break;
}
}
SACM_DVR_InitDecoder(DAC1+DAC2);
Key=0;
break;
default:
break;
}
switch(KeyStatus)
{
case Record:
if(Addr < C_SflashSize)
{
SACM_DVR_Encode(); // Get data and Encode
if(SACM_DVR_TestQueue() != Empty)
{ // Save data if queue not empty
Ret = SACM_DVR_FetchQueue(); // Get data from Queue
SP_SIOSendAWord(Addr,Ret); // save to User Storage
Addr += 2;
}
}
else
{
SACM_DVR_Stop();
while(SACM_DVR_TestQueue() != Empty )
{
Ret = SACM_DVR_FetchQueue(); // Get data from Queue
SP_SIOSendAWord(Addr,Ret);
Addr += 2;
}
KeyStatus = Stop;
}
break;
case Play:
if(SACM_DVR_TestQueue() != Full)
{
Ret = SP_SIOReadAWord(Addr); // Read User Storage
SACM_DVR_FillQueue(Ret); // Fill Queue
Addr += 2;
}
if(Addr<SpeechFileLength)
{
SACM_DVR_Decode();
}
else
{
SACM_DVR_Stop();
KeyStatus = Stop; //放完語音,直接退出IsoDvrHandle();
SP_RampDnDAC1();
SP_RampDnDAC2();
}
break;
case Stop:
default:
SACM_DVR_Stop();
break;
} // end of switch(Status)
}
//==================================================================================
// 函數: UpLoad
// 語法: void UpLoad(void)
// 描述: 每中斷一次就調用一次,從FLASH中讀取語音數據,并寫入D12芯片
// 參數: 無
// 返回: 無
//==================================================================================
void UpLoad(void)
{
unsigned int Ret;
unsigned int nRead=0;
unsigned int i=0;
unsigned int Block=0;
Block=64;
UpLoad_Counter++;
if(Addr_UpLoad<SpeechFileLength)
{
Leave_Len=SpeechFileLength-Addr_UpLoad; //Leave_Len值為偶數
if(Leave_Len<=64)
{
Block=(unsigned int)Leave_Len;
}
while(i<Block)
{
nRead=SP_SIOReadAByte(Up_Flash_Addr_Up);
Ret = SP_SIOReadAWord(Up_Flash_Addr_Up); // Read User Storage
MainEpBuf[i]=(Ret&0x00ff);
Ret>>=8;
i+=1;
MainEpBuf[i]=Ret;
i+=1;
Up_Flash_Addr_Up+=2;
}
if(Leave_Len>64)
{
D12_WriteEndpoint(5,64,MainEpBuf);
Addr_UpLoad+=64;
}
else if(Leave_Len<=64)
{
D12_WriteEndpoint(5,Block,MainEpBuf);
Addr_UpLoad=0;
G_UpLoad_Flag=0;//over
}
}//end if
}
//=========================================================================
// 函數: DownLoad
// 語法: void DownLoad(void)
// 描述: 每中斷一次就調用一次,存儲PC機下載的數據。
// 參數: 無
// 返回: 無
//=========================================================================
void DownLoad(void)
{
unsigned int k=0;
Block_i=0;
FileLen_Block= D12_ReadEndpoint(4,64,MainEpBuf);
k=0;//0229
k=0;
k=0;
if(DownLoadFileLen_Up<SpeechFileLength)
{
FlashAdd_Up++;
if(FlashAdd_Up==1)
{
for(k=0;k<0x0fff;k++)
{
SP_ClrWatchDog();
SP_SIOSendAWord(0x00ff0000,0xffff);
}
while(Block_i<FileLen_Block)
{
for(k=0;k<0x00ff;k++)
{
SP_SIOSendAWord(0x00ff0000,0xffff);
}
Byte_Value=256*MainEpBuf[Block_i+1]+MainEpBuf[Block_i];
SP_SIOSendAWord(Down_Flash_Addr_Up,Byte_Value);// save to User Storage
Block_i+=2;
Down_Flash_Addr_Up+=2;
SP_ClrWatchDog();
}
}
else
{
while(Block_i<FileLen_Block)
{
Byte_Value=256*MainEpBuf[Block_i+1]+MainEpBuf[Block_i];
SP_SIOSendAWord(Down_Flash_Addr_Up,Byte_Value);// save to User Storage
Block_i+=2;
Down_Flash_Addr_Up+=2;
SP_ClrWatchDog();
}
}
DownLoadFileLen_Up+=FileLen_Block;
}
if(DownLoadFileLen_Up>=SpeechFileLength)//download end handle
{
m_CtrlRecFileData=0;
D12_ReadEndpoint(4,64,MainEpBuf);//
Block_i=0;
FlashAdd_Up=0;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -