📄 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 + -