u8
RingCount = 0,
CALLING = 0, //通话中
SetNuming = 0,
verifying = 0,
decideing = 0,
NpCountStart = 0,
NpCountEnd = 0,
NumberAddress,
MainMenu=0,//主菜单播放使能标志
SubMenu=0, //从菜单播放使能标志
MainScanf=0,//主菜单下按键输入使能标志
SubScanf=0,//主菜单7键子菜单下按键输入使能标志
KeyCount=0;
u8 SetNum_buff[15];
//函数功能:接听电话中处理所有的功能
//待解决问题:怎么读取一个正确稳定的DTMF值
void receive_tell(void)
{
if(String_Search(USART1_RxBuffer,250,"CLIP:",5)==1)
Save_DWnumber();
if(String_Search(USART1_RxBuffer,10,"RING:",5)==1 && CALLING==0)
get_tell();//接电话
play_report();
scanf_key();
scanf_calling();
ScanfOutTime();
}
// 超时机制30秒无键值,自动挂机
void ScanfOutTime(void)
{
if(OutTime == 1)
{
send("ATH");
CALLING=0; //通话结束
MainMenu=0;
MainScanf = 0;
SubMenu = 0;
SubScanf = 0;
}
}
//MainMenu==0:主菜单使能
//CALLING==1:接通电话才能播放主菜单。
//AP89_DI_STATUS==0:必须等待子菜单播放完才能开始播放主菜单
//SubMenu == 1:使能主菜单下的 7 键:播报报警电话号码、密码、设置间隔时间、使能报警等。
//verifying == 1: 使能播放需要设置的报警号码
void play_report(void)
{
if(CALLING == 1 && MainMenu == 1 && AP89_DI_STATUS == 0)
{
KeyCount++;
if( KeyCount > 20)
{
KeyCount = 0;
MainMenu=0; //禁止重复播放主菜单
MainScanf = 1;//每次播放主菜单后使能扫描主菜单下的按键
Play_MainMenu();
}
}
if(SubMenu == 1 && CALLING==1 && AP89_DI_STATUS == 0)
{
//
Submen = 0;//禁止子菜单重复播放
KeyCount++;
if( KeyCount > 20)
{
KeyCount = 0;
Play_SubMenu();
}
}
if(NpCountStart < NpCountEnd )
{
if(AP89_DI_STATUS == 0 && verifying == 1)
{
KeyCount++;
if( KeyCount > 100)
{
KeyCount = 0;
switch(SetNum_buff[NpCountStart])
{
case 10: txbyte(COM_PLAY,ZERO) ;//0
break;
case 1: txbyte(COM_PLAY,ONE) ;//1
break;
case 2: txbyte(COM_PLAY,TWO) ;//2
break;
case 3: txbyte(COM_PLAY,THREE) ;//3
break;
case 4: txbyte(COM_PLAY,FOUR) ;//4
break;
case 5: txbyte(COM_PLAY,FIVE) ;//5
break;
case 6: txbyte(COM_PLAY,SIX) ;//6
break;
case 7: txbyte(COM_PLAY,SEVEN) ;//7
break;
case 8: txbyte(COM_PLAY,EIGHT) ;//8
break;
case 9: txbyte(COM_PLAY,NINE) ;//9
break;
default:;
}
NpCountStart++;
}
}
}
else if(verifying == 1)
{
NpCountStart = 0;
NpCountEnd = 0;
verifying = 0; //禁止语音校验输入号码
decideing = 1;
txbyte(COM_PLAY,OK_ENTER) ;//确认输入
}
}
//DTMF_status==0:按键下降沿处理,避免重复执行按键功能
//MainMenu==1:主菜单命令
//DTMF_Value!=0: 没有键值0
//SubMenu==0": 没有播放子菜单
//SetNuming == 1:设置报警号码输入中
void scanf_key(void)
{
if(DTMF_status == 0 && MainScanf == 1) //执行主菜单按键功能
{
switch(DTMF_Value)
{
case 0:
//DTMF_Value==0:没有按键
break;
case 1:
MAIN_key1();
break;
case 2:
MainMenu=1;DTMF_Value=0; //空脚键无效退出
break;
case 3:
MainMenu=0;DTMF_Value=0;
break;
case 4:
MAIN_key4();
break;
case 5:
MainMenu=0;DTMF_Value=0;
break;
case 6:
MainMenu=0;DTMF_Value=0;
break;
case 7:
MAIN_key7();
break;
case 8:
MainMenu=0;DTMF_Value=0;
break;
case 9:
MainMenu=0;DTMF_Value=0;
break;
case 0X0A: MAIN_key0();
break;
default:
MainMenu=0;DTMF_Value=0;
//a-f键值被屏蔽
break;
}
}
if(SubScanf == 1 && DTMF_status == 0) //执行主菜单下 7 键下的子菜单功能
{
switch(DTMF_Value)
{
case 0: //DTMF_ValuE==0没有键值
break;
case 1: SUB_key1();NumberAddress=EEPROM_NUMBER1_Address;
break;
case 2: SUB_key1();NumberAddress=EEPROM_NUMBER2_Address;
break;
case 3: //SUB_key1(EEPROM_NUM3_Address);
break;
case 4: DTMF_Value=0;
break;
case 5:DTMF_Value=0 ;
break;
case 6:DTMF_Value=0 ;
break;
case 7:DTMF_Value=0 ;
break;
case 8:DTMF_Value=0 ;
break;
case 9:DTMF_Value=0 ;
break;
case 0X0A:return_key();
break;
default:DTMF_Value=0 ; //a-f键值被屏蔽
break;
}
}
if(SetNuming == 1 && DTMF_status == 0 && DTMF_Value != 0)//设置报警号码
set_number();
if( decideing == 1 && DTMF_status == 0 && DTMF_Value != 0)//确认是否重新输入报警号码
{
switch(DTMF_Value)
{
case 1:save_number();
break;
case 2:SUB_key1();
break;
case 0X0A:return_key();
break;
}
}
}
//函数功能:主菜单0键。
void MAIN_key0(void)
{
MainMenu = 1 ;//使能主菜单语音播放
DTMF_Value=0;//清空键值
txbit(COM_PAUSE) ;//有确定的按键,不管有无播放主菜单立即发送停止指令
Play_MainMenu();
}
//函数功能:主菜单1键:查询GPS功能。
void MAIN_key1(void)
{
MainMenu=1;
DTMF_Value=0;//清空键值
txbit(COM_PAUSE) ;
//有确定的按键,不管有无播放主菜单立即发送停止指令
if(GPS_JC==0)
{
txbyte(COM_PLAY,GPS) ;
//
Delay_ms(30);
txbyte(COM_PREFETCH,OK_SIGNAL) ;
//
Delay_ms(10);
}
else
{
txbyte(COM_PLAY,GPS) ;
//
Delay_ms(30);
txbyte(COM_PREFETCH,NO_SIGNAL) ;
//
Delay_ms(30);
}
}
/********************************************
函数功能:主菜单4键 GPS定位。
函数参数:
*********************************************/
void MAIN_key4(void)
{
MainMenu=0;
DTMF_Value=0;//清空键值
txbit(COM_PAUSE) ;
//有确定的按键,不管有无播放主菜单立即发送停止指令
DingWei_BZ=1;
txbyte(COM_PLAY,LOCATIONED) ;
//
txbyte(COM_PREFETCH,NO_SPEAKER) ;
//
Delay_ms(10);
}
//函数功能:主菜单7键:播放子菜单
void MAIN_key7(void)
{
MainScanf = 0; //进入主菜单7键子菜单后 禁止主菜单按键输入
MainMenu = 0;//进入子菜单后禁止播放主菜单语音
SubScanf = 1 ;//使能子菜单下子键输入
DTMF_Value=0; //清空键值
txbit(COM_PAUSE);
Play_SubMenu();//播放主菜单7键下的语音提示
}
//函数功能:播放主菜单
void Play_MainMenu(void)
{
txbyte(COM_PLAY,MAIN_MENU) ;
Delay_ms(20);
}
//函数功能:播放子菜单
void Play_SubMenu(void)
{
txbyte(COM_PLAY,SUB_MENU) ;
Delay_ms(20);
}
//函数功能:子菜单1键:设置第一个报警电话
void SUB_key1(void)
{
decideing = 0;
SubScanf = 0 ;//等待输入待设置的电话号码,禁止子菜单输入
DTMF_Value = 0;//清空键值
txbit(COM_PAUSE) ;//有确定的按键,不管有无播放主菜单立即发送停止指令
txbyte(COM_PLAY,PLEASE_PUT_NUM) ;
//请输入号码以#结束
SetNuming=1; //使能设置报警号码
}
//函数功能:主菜单7键->1键: 设置报警号码,紧急呼叫电话
void set_number(void)
{
if(NpCountStart < 12
&&
DTMF_Value != 0X0C)
{
SetNum_buff[NpCountEnd] = DTMF_Value;
DTMF_Value = 0;
NpCountEnd++;
}
else
{
DTMF_Value = 0;
NpCountStart = 0;
txbyte(COM_PLAY,VERIFY_NUM) ;//您输入的电话号码是。
SetNuming = 0; //禁止设置报警号码
verifying = 1;//使能播放输入的报警电话号码
}
}
//保存输输入的报警号码
void save_number(void)
{
DTMF_Value=0; //清空键值
decideing = 0;
I2C_EE_SequentialWrite(SetNum_buff,NumberAddress,11);
SetNuming=0;//禁止设置报警号码
memset(SetNum_buff,0x00,sizeof(SetNum_buff));//清零字符串
return_key();
}
//函数功能:主菜单0键:返回主菜单
void return_key(void)
{
DTMF_Value = 0;//清空键值
decideing = 0;
SubMenu = 0; //进入主菜单禁止子菜单语音播放
SubScanf = 0;//禁止子菜单按键输入
MainScanf = 1; //使能主菜单下按键输入
txbit(COM_PAUSE) ; //有确定的按键,不管有无播放主菜单立即发送停止指令
Play_MainMenu();
}
//函数功能:检测是否挂机
void scanf_calling(void)
{
if(String_Search(USART1_RxBuffer,10,"ZCEND",5)==1) //挂电话
{
CALLING=0; //通话结束
MainMenu=0;
MainScanf = 0;
SubMenu = 0;
SubScanf = 0;
txbit(COM_PDN2);
//挂电话语音下电指令
}
}
//函数功能:保存手机号码
void Save_DWnumber(void)
{
u8
Bufferss[20],
Buffers1[20];
CLR_String(Bufferss,20);
Copy_String_NumStart_End(3,'"','"',Bufferss,USART1_RxBuffer,250); //电话号码保存起来
CLR_String(Buffers1,20);
Copy_String(Bufferss,Buffers1,11);
CLR_String(Bufferss,20);
String_DianDao(Buffers1,DingWei_TEL);
//将电话号码颠倒后放到DingWei_TEL
TIM2_DWCount=59;
//1秒后上传定位信息
}
//函数功能:接电话
void get_tell(void)
{
CALLING=1; //通话中
USART_Send_String(1, "AT+SPEAKER=1\r"); //选择耳机通道
Delay_ms(100);
USART_Send_String(1, "ATA\r"); //接电话
Delay_ms(500);
txbit(COM_PUP2);//语音上电指令
Delay_ms(500);
MainMenu = 1; //接电话后使能主菜单播放
CLR_WDT(); //喂狗
}