📄 6-2.c
字号:
void main () {
initBiosConst(); // 初始化DSP/BIOS
CST_bssInit(); // 初始化CST 内部数据段
CertainBoardInit (BIOS_APPLICATION, EVM5406_118MHZ_MULT,2); // 初始化PLL 时钟
CSTAction_Init(&Ch0,BIOS_APPLICATION,MyCallback); // 初始化CST 固件
CSL_init(); // 初始化 CSL
CertainPeriphInit(BIOS_APPLICATION,1); // 初始化EVM 片内外设
MyInitialization(); // 初始化用户设定参数
}
void MyInitialization()
{
UartPutString(&Ch0,"Voice echo toy\r\n");
pVoiceLoopBuffer=CSTMemManager.allocate (IALG_EXTERNAL,VOICE_LOOP_BUF_SIZE,0);
// 分配语音缓冲区
VoiceBufIndex=VOICE_LOOP_BUF_SIZE; // 清除缓冲区内存
while ( VoiceBufIndex )
pVoiceLoopBuffer[--VoiceBufIndex]=0;
TurnOff(1); // 禁止所有的标志,并进入待机状态
}
static void TurnOff(void)
{
MainState=ms_BEGIN;
RingCounter=0;
Timer=0;
DefaultSettings();
}
static void DefaultSettings()
{
SetRegister(srd_VAD, 0); // 禁止VAD
SetRegister(srd_AGC, 0); // 禁止AGC
SetRegister(srd_VOICE_GAIN,0); // 设置语音增益为0dB
SetRegister(srd_VOICE_BPS,2); // G.726 16 kbps
SetRegister(srd_ECAN,ecm_NLP); // 使能回音相消器
}
static void SetRegister(int InternalSReg, int Value)
{
tCSTAction Action;
Action.ActionType=cat_SET_REGISTER;
Action.Action.CSTConfigCommand.InternalSReg=InternalSReg;
Action.Action.CSTConfigCommand.Value=Value;
CSTAction(&Ch0, &Action);
}
void MyPeriodicThread() {
CSTAction_Process(&Ch0);
switch ( MainState ) {
case ms_TRIPLE_RING:
if (
DoStandardOperation(sot_OFF_HOOK,0) ) {
TimerLimit=60*ONE_SECOND;
SetMainState(ms_INIT_VOICE);
UartPutString(&Ch0,"Voice Toy Started!\r\n");
}
break;
case ms_INIT_VOICE:
if ( DoStandardOperation(sot_TURNON_VOICE_RXTXDATA,0) ) {
SetMainState(ms_VOICE);
UartPutString(&Ch0,"(Re)Init voice\r\n");
}
break;
case ms_VOICE:
if ( Timer>TimerLimit-ONE_SECOND ) {
SetMainState(ms_JUST_HELP_MUSIC);
UartPutString(&Ch0,"Minute without any DTMF commands\r\n");
}
break;
case ms_JUST_HELP_MUSIC:
if ( DoDTMFMusic() )
{
SetMainState(ms_INIT_VOICE);
UartPutString(&Ch0,"Listen to the help " " (all available DTMF keys)\r\n");
}
break;
}
}
static bool MyCallback (tCSTChannel* pChannel,
tCSTExternalMsgEvent CSTExternalMsgEvent,int Data,int16 *pData)
{
int ITemp;
switch ( CSTExternalMsgEvent ) {
case eme_PERIPH_DATA:
if ( Data==cpe_RING ) {
UartPutString(&Ch0,"Ring detected\r\n");
if ( ++RingCounter>=2 )
SetMainState(ms_TRIPLE_RING);
}
break;
case eme_CPTD_DATA:
if ( Data!=ICPTDDET_BUSY )
break;
case eme_AUTOTURNOFF_ALL:
TurnOff();
UartPutString(&Ch0,"Bye\r\n");
break;
case eme_DTMF_DATA:
switch ( Data ) {
case '*': // 静音器
ITemp=GetRegister(srd_VOICE_GAIN);
if ( ITemp<30 ) ITemp++;
SetRegister(srd_VOICE_GAIN,ITemp);
break;
case '#': // 扬声器
ITemp=GetRegister(srd_VOICE_GAIN);
if ( ITemp>0 ) ITemp--;
SetRegister(srd_VOICE_GAIN,ITemp);
break;
case '1': // 禁止回音相消
SetRegister(srd_ECAN,ecm_DISABLED); break;
case '3': // 使能回音相消
SetRegister(srd_ECAN,ecm_NLP); break;
case '5': // 使能回音相消
TurnOff(); break;
}
break;
case eme_VOICE_DATA:
// 数据以字节存储在 pData
if ( MainState==ms_VOICE ) {
while( Data-- ) {
ITemp=pVoiceLoopBuffer[VoiceBufIndex];
pVoiceLoopBuffer[VoiceBufIndex++]=*pData++;
SendVoiceData(&ITemp,1);
if ( VoiceBufIndex>=VOICE_LOOP_BUF_SIZE )
VoiceBufIndex=0;
}
}
break;
case eme_TICK:
Timer+=Data;
break;
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -