📄 jbwait.c
字号:
}
}
} // End while(TRUE)
}
// End function: Wait()
void CheckDTMF(void)
{
byte i;
if(pReadNumber<3)
return;
if((aNumBuf[0]==0x0a)||(aNumBuf[0]>12)){
for(i=0;i<pReadNumber+1;i++)
aNumBuf[i]=aNumBuf[i+1];
pReadNumber--;
}
i=aNumBuf[pReadNumber];
if((i==0x0a)||(i>12)){
aNumBuf[pReadNumber]=0x0c;
pReadNumber--;
}
}
/*********************************************************
*
*
* 说 明:开锁等待状态
*
*
*
*********************************************************/
void UnLockWait(void)
{
byte bDispStatus;
uint iTalkRecord;
uint iTalkLocation;
uint iTalkPointer;
bool fFirstKey=1;
if((!fUnlockStat)||fEndLockEnable){
bStatusWord=S_NEWLOCKWAIT;
return;
}
AutoReadPara(67); //取话单指针
iTalkPointer=iParaWord;
iTalkLocation=iTalkPointer;
iTalkRecord=iSubTimes;
cbFangDao=200; //关闭防盗联络音
cbRingTimes=0;
cbRingPulseNum=0;
pReadNumber=0;
pWriteNumber=0;
bDialType=0;
Close(POWER_ON);
if(!fDelaySecond){
bDispStatus=5; //显示话单状态
fMustReport=1;
}
else{
DispClr();
DispSymbol(LARGE_PHONE);
bDispStatus=0;
}
while(TRUE){
IDLE;
CheckFDD();
PowerAlarm();
if(JudgeAutoOffHook())
return;
if(JudgeOffHook())
return;
if(fLocked){
fDelaySecond=1;
bStatusWord=S_NEWLOCKWAIT;
return;
}
switch(bDispStatus){
case 0:
DispCharge(iSubTimes,3); //此函数没有送显示,其后须紧显示函数
DispSymbol(LARGE_PHONE);
DispCharge(lSubTariff,2);
DispCharge(lSubTariff,0);
bDispStatus=6;
break;
case 1:
DispSymbol(LARGE_UNPHONE);
GetTalkRecord(iTalkPointer);
DispTalk(iTalkPointer);
bDispStatus=4;
break;
case 4: //话单显示状态
case 5: //话毕,话单显示状态
break;
case 6:
if(fMustReport){
if(ReportBills()) //检查是否要汇报话单
return;
}
break;
default:
break;
}
if(fDateUpdate){
fDateUpdate=0;
WriteDayTotal(); //若更新日分项合计
}
if(fDelaySecond&&((bDispStatus==4)||(bDispStatus==5))){
bDispStatus=0;
DispClr();
}
if(!fFirstKey){
if(bKeyBuf==0xf0)
fFirstKey=1;
continue;
}
if(fKey){
fKey=0;
if(bDispStatus==5){ //话毕显示话单时,按任意键退出
bDispStatus=0;
DispClr();
fFirstKey=0;
continue;
}
switch(bKeyBuf){
case K1:
if(bDispStatus==4){
PrintTalkRecord();
fFirstKey=0;
}
break;
case K2: //向前查话单
if(cbKey>199)
cbKey=150;
if(iSubTimes==0){
Speaker(20);
break;
}
if(iTalkRecord!=0){
iTalkRecord--;
if((iTalkPointer--)==0)
iTalkPointer=iTalkLength; //更新查询指针
}
else
Speaker(15);
cbDelaySecond=6;
fDelaySecond=0;
bDispStatus=1;
break;
case K3: //向后查话单
if(cbKey>199)
cbKey=150;
if(iSubTimes==0){
Speaker(20);
break;
}
if(iTalkRecord<iSubTimes){
iTalkRecord++;
if(iTalkPointer==iTalkLength) //向后查询话单
iTalkPointer=0;
else
iTalkPointer++;
}
if(iTalkRecord==iSubTimes)
iTalkRecord--;
if(iTalkPointer>=iTalkLocation){
iTalkPointer=iTalkLocation;
if(iTalkPointer==0)
iTalkPointer=iTalkLength;
iTalkPointer--;
Speaker(15);
}
cbDelaySecond=6;
fDelaySecond=0;
bDispStatus=1;
break;
case K4: //关锁,进入锁机状态
if(cbKey>30)
break;
if(bDispStatus==6)
fLocked=~fLocked;
else if(bDispStatus==4){
DispClr();
bDispStatus=0;
}
break;
default:
break;
}
}
}
}
void GetDayAddr(byte bDayPointer)
{
if(fWorkMode)
iAddress=NEW_DAYTOTAL_ADDR+((uint)(bDayPointer*21))+2;
else
iAddress=OLD_DAYTOTAL_ADDR+((uint)(bDayPointer*16));
return;
}
bool InComingCall(void)
{
if((cbRingPulseNum>=5)||(cbRingTimes!=0))
return TRUE;
else
return FALSE;
}
/********************************************************
*
* 函数:JudgeAutoOffHook(void)
*
* 说明:判断震铃次数是否为自动摘机震铃次数
* 若是自动摘机震铃次数,则返回TRUE,否则返回FALSE
*
*
*********************************************************/
bool JudgeAutoOffHook(void)
{
while(1){
if(fCallIdValid){ // 来电号码为管理系统的号码
if((cbRingTimes>=1)&&(ciRingHigh>30)){
fCallIdValid=0;
break;
}
return 0;
}
if(bAutoOffHookTimes==0) // 若振铃次数为0,就不进行自动振铃摘机 //
return FALSE;
//if(cbRingTimes>=bAutoOffHookTimes) // 若有振铃,判断是否自动振铃次数到
if(cbRingTimes>=2)
break;
return FALSE;
}
ET2=0;
Open(MD_CS);
if(DetectConnectTone(2))
bStatusWord=S_DOWNCALL;
// Open(POWER_ON);
return TRUE;
}
/********************************************************
*
* 函数:JudgeOffHook(void)
*
* 说明:判断手动摘机后,是否为被叫摘机,或是否进入主叫
* 若进入被叫或通讯程序或进入主叫程序,则返回TRUE,
* 否则返回FALSE
*
*
*********************************************************/
bool JudgeOffHook(void)
{
if(fLockContinue)
pWriteNumber=pReadNumber=0;
if(!OffHook()) //若没有摘机则返回
return FALSE;
if(fStartFangDao) //是否发防盗联络音
cbFangDao=0;
if(InComingCall()){ //是否有震铃
ET2=0;
Open(MD_CS);
if(((bAutoOffHookTimes!=0)||((!fFinishFSK)&&(!fFinishDTMF))||fCallIdValid)
&&(DetectConnectTone(1))){
bStatusWord=S_DOWNCALL;
return TRUE;
}
bStatusWord=S_NEWSLAVECALL;
ciiDelaySecond=1; //不并模拟负载
fiiDelaySecond=0;
Open(POWER_ON);
return TRUE;
}
if(fLocked){ // 若锁机,则不能进入主叫程序
if((InBuf&0x04)||(pReadNumber<pWriteNumber)){
pReadNumber=pWriteNumber=0;
if((!fPluseFD)&&((bDialType&0xf0)!=0)); // 脉冲防盗打无效
else
fLockRequest=1;
bDialType=0;
}
cbFangDao=200;
return FALSE;
}
if(bOffHookDelay!=0){
if(fDetectDialTone)
cbDelay5MS=10;
else
cbDelay5MS=bOffHookDelay; // 延时防盗拨号
fDelay5MS=0;
while(!fDelay5MS){
IDLE;
if(OnHook())
return FALSE;
if((InBuf&0x04)==0x04){ //(pReadNumber<pWriteNumber)||||(cbPulseNum>0)
if(!fLockContinue)
fLockRequest=1;
pReadNumber=0;
pWriteNumber=0;
//cbPulseNum=0;
cbFangDao=200;
return FALSE;
}
}
}
if(fWorkMode)
bStatusWord=S_NEWMASTERCALL;
else
bStatusWord=S_OLDMASTERCALL;
return TRUE;
}
void CheckFDD(void)
{
byte bTimeCount;
////
if(InComingCall())
return;
if(OffHook()){ // 存在摘机有效时长
ciDelaySecond=0;
fiDelaySecond=0;
fDaoDa=0;
}
else if(fFDD) // 要检测并机防盗打
fDaoDa=1;
else
fDaoDa=0;
if(ciDaoDa!=360)
return;
//存在并线盗打
MD_CLK=0;
WriteModem(CR1,0x04);
WriteModem(CR0,0x1a);
WriteModem(TR,0x19);
bTimeCount=90;
if(++bTimes==3)
bTimes=0;
while((bTimeCount--)!=0){ // 持续发DTMF
IDLE;
if((bTimes==0)&&(bTimeCount==40)){
Page(6);
XBYTE[RTC_CONTROLA]=0x27;
XBYTE[RTC_CONTROLB]=0x1a;
Page(5);
}
}
Page(6);
XBYTE[RTC_CONTROLB]=0x12;
XBYTE[RTC_CONTROLA]=0x26;
Page(5);
WriteModem(CR0,0x00);
ResetModem();
if(!fLockContinue)
fLockRequest=1;
}
/**********************************************************
*
*
* 说 明:汇报话单判断
*
*
***********************************************************/
bool ReportBills(void)
{
uint iReportNum;
if((bReportWord==1)||(bReportWord==3));
else
return FALSE;
AutoReadPara(69);
if(fWorkMode){
AutoReadPara(6);
if((bParaByte<1)||(bParaByte>100))
return FALSE;
iReportNum=(uint)(bParaByte*5);
if(iParaWord<iReportNum)
return FALSE;
bCallReason=NEW_REPORT_BILLS;
}
else{
AutoReadPara(209);
if((bParaByte<1)||(bParaByte>200))
return FALSE;
iReportNum=bParaByte;
if(iParaWord<iReportNum)
return FALSE;
bCallReason=OLD_REPORT_BILLS;
}
if((bFailTimes>=3)&&(bFailTimes<30)){ //若未成功呼叫次数大于3次,则不再上呼
AutoReadPara(69);
bParaByte=(byte)(iParaWord%10);
if(bParaByte!=0)
return FALSE;
bFailTimes=0;
}
bStatusWord=S_UPCALL;
return TRUE;
}
/***********************************************************************
*
*
* Function Name: GetTalkRecord(uint)
* Function: Get out the Talk record from talk store area.
*
*
*
***********************************************************************/
void GetTalkRecord(uint iTalkPointer)
{
byte i=0;
byte bTemp;
byte j;
byte aTemp[3];
memset(&aNumBuf,0x0c,16);
j=0;
if(fWorkMode){
iAddress=NEW_BILLS_ADDR+(iTalkPointer*NEW_BILL_LEN);
Page(1);
for(j=0;j<8;j++){
bTemp=XBYTE[iAddress++];
if(i>15)
continue;
aNumBuf[i++]=bTemp>>4; // 从FLASH中取数据
if(i>15)
continue;
aNumBuf[i++]=bTemp&0x0f; // 从FLASH中取数据
}
aTemp[0]=XBYTE[iAddress++];
aTemp[1]=XBYTE[iAddress++];
aTemp[2]=XBYTE[iAddress++];
aTemp[1]=(aTemp[1]>>4)*10+(aTemp[1]&0x0f); //将BCD转换为BIN
aTemp[2]=(aTemp[2]>>4)*10+(aTemp[2]&0x0f);
iTotalTime=(uint)(aTemp[0]*3600)
+(uint)(aTemp[1]*60)
+aTemp[2]; //通话时长
ReadBytes(1,3);
lTotalTariff=lParaLWord; //通话话费
iAddress+=9;
ReadBytes(1,6);
memcpy(&aCallTime[1],&aParaBuf,6); //通话起始时间
aCallTime[0]=0x20;
}
else{
iAddress=OLD_BILLS_ADDR+(iTalkPointer*15);
Page(1);
if((XBYTE[iAddress]&0xf0)==0x10)
aNumBuf[i++]=0;
else if((XBYTE[iAddress]&0xf0)==0x20){
aNumBuf[i++]=0;
aNumBuf[i++]=0;
}
aNumBuf[i++]=XBYTE[iAddress++]&0x0f;
for(j=0;j<6;j++){ //取出电话号码
bTemp=XBYTE[iAddress++];
if(i>15)
continue;
aNumBuf[i++]=bTemp>>4;
if(i>15)
continue;
aNumBuf[i++]=bTemp&0x0f;
}
//Get out the Talk time.
aTemp[1]=XBYTE[iAddress++];
aTemp[2]=XBYTE[iAddress++];
iTotalTime=(aTemp[2]>>2)&0x3f;
iTotalTime+=(aTemp[1]<<6)&0xc0;
iTotalTime+=(uint)((aTemp[1]>>2)*256);
aTemp[1]=XBYTE[iAddress++];
aTemp[0]=XBYTE[iAddress++];
lTotalTariff=((ulint)aTemp[0])+((ulint)(aTemp[1]*256))
+((ulint)((aTemp[2]&0x03)*65536)); //话费
for(i=2;i<6;i++)
aCallTime[i]=XBYTE[iAddress++]; //通话起始时间
WaitRTC();
Page(6);
aCallTime[SECOND]=aUserRTCBuf[SECOND];
if(aCallTime[MONTH]<=aUserRTCBuf[MONTH]){ //添入打印年份
aCallTime[YEARH]=aUserRTCBuf[YEARH];
aCallTime[YEARL]=aUserRTCBuf[YEARL];
}
else{
i=aUserRTCBuf[YEARL]-1;
if(i==0xff)
i=0x99;
else if((i&0x0f)==0x0f)
i-=6;
aCallTime[YEARL]=i;
if(i>0x99)
aCallTime[YEARH]=0x19;
else
aCallTime[YEARH]=0x20;
}
}
Page(5);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -