?? 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--;
}
}
/*********************************************************
*
*
* 說 明:開鎖等待狀態(tài)
*
*
*
*********************************************************/
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; //關(guān)閉防盜聯(lián)絡(luò)音
cbRingTimes=0;
cbRingPulseNum=0;
pReadNumber=0;
pWriteNumber=0;
bDialType=0;
Close(POWER_ON);
if(!fDelaySecond){
bDispStatus=5; //顯示話單狀態(tài)
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); //此函數(shù)沒有送顯示,其后須緊顯示函數(shù)
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: //話單顯示狀態(tài)
case 5: //話畢,話單顯示狀態(tài)
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: //關(guān)鎖,進入鎖機狀態(tài)
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;
}
/********************************************************
*
* 函數(shù):JudgeAutoOffHook(void)
*
* 說明:判斷震鈴次數(shù)是否為自動摘機震鈴次數(shù)
* 若是自動摘機震鈴次數(shù),則返回TRUE,否則返回FALSE
*
*
*********************************************************/
bool JudgeAutoOffHook(void)
{
while(1){
if(fCallIdValid){ // 來電號碼為管理系統(tǒng)的號碼
if((cbRingTimes>=1)&&(ciRingHigh>30)){
fCallIdValid=0;
break;
}
return 0;
}
if(bAutoOffHookTimes==0) // 若振鈴次數(shù)為0,就不進行自動振鈴摘機 //
return FALSE;
//if(cbRingTimes>=bAutoOffHookTimes) // 若有振鈴,判斷是否自動振鈴次數(shù)到
if(cbRingTimes>=2)
break;
return FALSE;
}
ET2=0;
Open(MD_CS);
if(DetectConnectTone(2))
bStatusWord=S_DOWNCALL;
// Open(POWER_ON);
return TRUE;
}
/********************************************************
*
* 函數(shù):JudgeOffHook(void)
*
* 說明:判斷手動摘機后,是否為被叫摘機,或是否進入主叫
* 若進入被叫或通訊程序或進入主叫程序,則返回TRUE,
* 否則返回FALSE
*
*
*********************************************************/
bool JudgeOffHook(void)
{
if(fLockContinue)
pWriteNumber=pReadNumber=0;
if(!OffHook()) //若沒有摘機則返回
return FALSE;
if(fStartFangDao) //是否發(fā)防盜聯(lián)絡(luò)音
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){ // 持續(xù)發(fā)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)){ //若未成功呼叫次數(shù)大于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中取數(shù)據(jù)
if(i>15)
continue;
aNumBuf[i++]=bTemp&0x0f; // 從FLASH中取數(shù)據(jù)
}
aTemp[0]=XBYTE[iAddress++];
aTemp[1]=XBYTE[iAddress++];
aTemp[2]=XBYTE[iAddress++];
aTemp[1]=(aTemp[1]>>4)*10+(aTemp[1]&0x0f); //將BCD轉(zhuǎn)換為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);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -