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