📄 jbwait.c
字号:
/*************************************************************
*
* 文 件 名: jbWait.c
* 说 明: 等待状态
* 处理: 1。监视振铃;
* 2。监视摘机;
* 3。更新日分项合计记录;
* 4。查询功能。
* 起始日期: 99/11/16
*
*
************************************************************/
//#pragma SRC
//#pragma DEBUG
#include <jbWait.h>
extern void DispCmd(byte);
void LockWait(void)
{
byte bTemp;
byte bDispStatus;
byte bDayTotalPointer;
uint iTalkPointer;
uint xdata iTalkRecord;
bool fFirstKey=1,fToday=0;
bool fDispD=0;
bool fDispLock=0,fDispUnLock=0; // 增加变量的目的是:减少CPU在待机时的运行时间、功耗
bool fEnCallId;
bool fDispDate=0;
bool fCheckFSK=0;
bool fCheckDTMF=0;
bool fFlagDisapear=0;
AutoReadPara(80); // 是否启用来电显示功能
if(bParaByte==1)
fEnCallId=1;
else
fEnCallId=0;
fFinishFSK=0; // 用于控制
fFinishDTMF=0;
cbRingTimes=0;
cbRingPulseNum=0;
cbFangDao=200;
bDialType=0;
ciDelaySecond=0; // 用于防并机定时
fiDelaySecond=0;
pReadNumber=0;
pWriteNumber=0;
fDaoDa=0;
ciDaoDa=0;
bFSKWord=0;
Close(POWER_ON);
AutoReadPara(67);
iTalkRecord=iTalkPointer=iParaWord; //取话单指针
AutoReadPara(71);
bDayTotalPointer=bParaByte; //日分项合计指针
if(!fDelaySecond){
bDispStatus=4; // 显示话单状态
fMustReport=1;
}
else{
DispClr();
DispSymbol(LARGE_PHONE);
bDispStatus=0;
fSecond=1;
fDispD=1;
}
fCallIdValid=0;
ET2=0;
TR2=0;
Open(MD_CS);
while(TRUE){
IDLE;
if(OffHook()||(ciDaoDa==360)||fLockContinue){ // 防止并线盗打的行为
pWriteNumber=pReadNumber=0;
fCheckDTMF=0;
}
else if((!fEnCallId)&&(bAutoOffHookTimes!=0));
else if(!fCheckDTMF){ // 测到DTMF
if(pReadNumber<pWriteNumber){ // 开始检测DTMF //
if(aNumBuf[0]<10){
pReadNumber=0;
fCheckDTMF=1;
cbDelay5MS=100; // 超时控制
fDelay5MS=0;
fCallIdValid=0;
fFinishDTMF=0;
}
else
pWriteNumber=0;
}
}
if(fCheckDTMF){
if(pReadNumber<pWriteNumber){ // 检测到有效拨号
if(aNumBuf[pReadNumber]<10){
pReadNumber++;
cbDelay5MS=100;
fDelay5MS=0;
}
else{ // 结束符号
fDelay5MS=1;
fCheckDTMF=0;
}
}
if(fDelay5MS){ // 超时出错
fDelay5MS=0;
aNumBuf[pReadNumber]=0x0c;
if(pReadNumber)
pReadNumber--;
CheckDTMF();
memcpy(aDataBuf,aNumBuf,16); // 判断来电显示号码
if(fEnCallId&&(pReadNumber>1)){ // 显示来电号码
memset(aLargeBuf,0,20);
memset(aSmallBuf,0,5);
aLargeBuf[1]|=0x08;
ET2=0;
DispNum(LargeLcd);
DispNum(SmallLcd);
AutoReadPara(81); // 来电号码延时显示时间
cbDelaySecond=bParaByte;
fDelaySecond=0;
bDispStatus=8; // 延时显示
if(CheckManagement())
fCallIdValid=1;
pReadNumber++;
SaveCallId();
pReadNumber--;
DispDiscount();
AutoReadPara(67);
iTalkRecord=iTalkPointer=iParaWord;
fFinishDTMF=1;
bFSKWord=0;
}
fCheckDTMF=0;
pReadNumber=pWriteNumber=0;
}
}
if(InComingCall()){
if((bDispStatus!=0)&&(bDispStatus!=8)){
bDispStatus=0;
memset(aLargeBuf,0,20);
DispCurrentTime();
fDispD=1;
fDispLock=0;
fDispUnLock=0;
}
// DTMF 检测来电显示
if((cbRingTimes>=1)&&(ciRingHigh>=20)){ // 若检测到振铃,就启动检测FSK信号 //
if((!fEnCallId)&&(bAutoOffHookTimes!=0));
else if(!fCheckFSK){
for(bTemp=0;bTemp<55;bTemp++) // 清缓冲区
aCallID[bTemp]=0;
TR2=1;
ET2=1;
fCheckFSK=1;
fDataOver=0;
fFinishFSK=0;
// 打开使能
Close(MD_CS);
// 开定时器 2,检测来电号码
}
else if(fDataOver){ // 数据接收完毕 //
fFinishFSK=1;
fDataOver=0;
TR2=0;
ET2=0;
bFSKWord=0; // 变量初始化 //
Open(MD_CS);
//
// 调试用,向串口发送来电显示数据
// SCON=0x40; // 串口工作模式1,8位UART
// TH1=L9600;TL1=L9600; // 串口9600BPS定时常数
// TR1=1;ES=1;REN=1;TI=0;RI=0;
// for(bTemp=0;bTemp<30;bTemp++)
// TxByte(aCallID[bTemp]);
// REN=0;TR1=0;ES=0;
//
//
bTemp=CheckCallID(); // 判断来电显示号码
if(fEnCallId&&(bTemp==2)){ // 显示来电号码
memset(aLargeBuf,0,20);
memset(aSmallBuf,0,5);
aLargeBuf[1]|=0x08;
DispNum(LargeLcd);
DispNum(SmallLcd);
pReadNumber++;
SaveCallId();
pReadNumber--;
AutoReadPara(67);
iTalkRecord=iTalkPointer=iParaWord;
DispDiscount();
AutoReadPara(81); // 延时显示时间
bDispStatus=8;
cbDelaySecond=bParaByte;
fDelaySecond=0;
}
else if(bTemp==1){
while(ciRingHigh<20)
IDLE;
if(DetectConnectTone(2))
bStatusWord=S_DOWNCALL;
// Open(POWER_ON);
return;
}
}
}
if(!fDispUnLock){
DispSymbol(LARGE_UNLOCK); // 若有被叫,则不显示锁机标记
fDispUnLock=1;
}
fDispLock=0;
if(!fFlagDisapear){
fFlagDisapear=1;
if(aLargeBuf[8]==0x20){
aLargeBuf[8]=0;
aSmallBuf[2]=0;
DispOut();
}
}
}
else{ // 振铃结束
fFlagDisapear=0;
if(fLocked){
if(!fDispLock){
fDispLock=1;
DispSymbol(LARGE_LOCK);
}
fDispUnLock=0;
}
if(fCheckFSK){
TR2=0;
ET2=0;
bFSKWord=0;
fCheckFSK=0;
Open(MD_CS);
}
if(fFinishFSK)
fFinishFSK=0;
}
if(JudgeAutoOffHook())
return;
if(JudgeOffHook())
return;
if(!fLocked){
if(!fDispUnLock){
DispSymbol(LARGE_UNLOCK); // 若有被叫,则不显示锁机标记
fDispUnLock=1;
}
fDispLock=0;
}
//
switch(bDispStatus){
case 0:
if(InComingCall()||(!fLocked));
else{
if(!fDispLock){
DispSymbol(LARGE_LOCK);
fDispLock=1;
}
fDispUnLock=0;
}
if((cbRingTimes==0)||(bFSKWord<3)){ // 振铃时,不更新显示
if(fSecond){
fSecond=0;
DispCurrentTime();
Page(6);
if(fDispD||(XBYTE[0xc000]==0)){ // 只有在秒为0时才检查是否是折扣时间
fDispD=0;
Page(5);
DispDiscount();
}
Page(5);
if(fMustReport){
if(ReportBills())
return;
}
DispSymbol(LARGE_PHONE);
}
Flash(0);
}
break;
case 1:
memset(aSmallBuf,'\0',5);
fDispDate=0;
GetTalkRecord(iTalkPointer);
DispTalk(iTalkPointer); //显示话单
DispSymbol(LARGE_UNLOCK);
DispSymbol(LARGE_UNPHONE);
bDispStatus=5;
break;
case 2: //用户累计通话次数及总话费
memset(aLargeBuf,'\0',20);
memset(aSmallBuf,'\0',5);
iAddress=PARA_60;
DispTotal(6,0);
bDispStatus=6;
break;
case 3: //日分项合计
memset(aLargeBuf,'\0',20);
memset(aSmallBuf,'\0',5);
//DispClr();
if(fToday){ //当日日分项合计
fToday=0;
iAddress=0xc02c;
DispMD(6);
iAddress+=2;
DispTotal(6,1);
}
else{
GetDayAddr(bDayTotalPointer);
DispMD(1);
iAddress+=2;
DispTotal(1,1);
}
bDispStatus=7;
break;
case 4: // 话毕,显示话单状态
case 5: // 显示话单状态
case 6: // 显示用户累计值
case 7: // 显示日分项和用户合计
case 8: // 来电延时显示
break;
default:
fDispD=1;
fDispLock=0;
fDispUnLock=0;
bDispStatus=0;
break;
}
//
CheckFDD();
PowerAlarm();
if((!fLocked)&&fUnLockStat&&fWorkMode // 若开锁,延时后进入开锁状态
&&(!fEndLockEnable)){ // 只有在新模式下,且开锁统计参数设为有效
cbDelay5MS=190;
fDelay5MS=0;
while(!fDelay5MS) {IDLE;}
bStatusWord=S_NEWUNLOCKWAIT;
fDelaySecond=1;
lSubTariff=0;
iSubTimes=0;
return;
}
if(fDateUpdate){
fDateUpdate=0;
WriteDayTotal();
AutoReadPara(71);
bDayTotalPointer=bParaByte; //更新日分项合计指针
}
if(fDelaySecond&&(bDispStatus>3)){
if(bDispStatus==8){
fCheckDTMF=0;
pReadNumber=0;
pWriteNumber=0;
}
fDelaySecond=0;
bDispStatus=0;
memset(aLargeBuf,0,20);
DispCurrentTime();
fDispD=1;
fDispLock=0;
fSecond=1;
fDispUnLock=0;
}
if(!fFirstKey){
if(bKeyBuf==0xf0)
fFirstKey=1;
continue;
}
if(bFSKWord>2)
continue;
if(fKey){
fKey=0;
if((bDispStatus==4)||(bDispStatus==8)){ // 话毕显示话单时,按任意键退出
if(cbKey>199)
continue;
bDispStatus=0;
DispClr();
fSecond=1;
fFirstKey=0;
fDispD=1;
fDispLock=0;
fDispUnLock=0;
continue;
}
switch(bKeyBuf){
case K1: // 显示累计总通话次数、话费
if(bDispStatus==5){
if(!fDispDate){
DispBillTime();
PrintTalkRecord();
fFirstKey=0;
fDispDate=1;
}
else{
cbDelaySecond=6;
fDelaySecond=0;
bDispStatus=1;
}
break;
}
if((bDispStatus==6)&&(cbKey<30))
fDelaySecond=1;
if((bDispStatus!=0)||(cbKey<220)) //只能从锁机显示时间状态进入
break; //,查询累计值状态
bDispStatus=2; //长按键
cbDelaySecond=7;
fDelaySecond=0;
break;
case K2:
if(bDispStatus>5)
break;
if(cbKey>199)
cbKey=150;
if((iTalkPointer--)==00) //向前查询话单
iTalkPointer=iTalkLength;
cbDelaySecond=6;
fDelaySecond=0;
bDispStatus=1;
break;
case K3:
if(bDispStatus>5)
break;
if(cbKey>199)
cbKey=150;
if(iTalkPointer==iTalkRecord){ //向后查询到尽头
if((iTalkPointer--)==0)
iTalkPointer=iTalkLength;
Speaker(15);
}
if(iTalkPointer==iTalkLength) //向后查询话单
iTalkPointer=0;
else
iTalkPointer++;
if(iTalkPointer==iTalkRecord){
if((iTalkPointer--)==0)
iTalkPointer=iTalkLength;
Speaker(15);
}
cbDelaySecond=6;
fDelaySecond=0;
bDispStatus=1;
break;
case K4: //开锁
if(cbKey>30)
break;
if(bDispStatus==0){
if(!fLockContinue){
if(fLocked)
fLockRequest=1;
fLocked=~fLocked;
}
}
else
fDelaySecond=1;
break;
case K12: //向前查询日分项累计和
if(bDispStatus==5) //need
break;
if(cbKey>199)
cbKey=100;
if((bDayTotalPointer--)==0)
bDayTotalPointer=bDayTotalLength;
cbDelaySecond=6;
fDelaySecond=0;
bDispStatus=3;
break;
case K13: //向后查询日分项累计和
if(bDispStatus==5) //need
break;
if(cbKey>199)
cbKey=100;
AutoReadPara(71);
if(bDayTotalPointer==bParaByte){
Speaker(15);
fToday=1;
}
else if(bDayTotalPointer==bDayTotalLength)
bDayTotalPointer=0;
else{
bDayTotalPointer++;
if(bDayTotalPointer==bParaByte)
fToday=1;
}
cbDelaySecond=6;
fDelaySecond=0;
bDispStatus=3;
break;
default:
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -