?? jbmcall.c
字號:
/*************************************************************
*
* Function Name: MasterCall()
* Function: 主叫程序
*
*
*
**************************************************************/
//#pragma SRC
#include <jbMcall.h>
void OldMasterCall(void)
{
byte i;
byte bMasterStatus=0x20;
bool fCountSC; // 四川計費方式
bool fDelayCount;
bool fF0Add,fF1Add,fF3Add;
uint xdata iSCFee,iTemp;
while(1){
switch(bMasterStatus){
case 0x20:
pWriteNumber=0;
pReadNumber=0;
memset(aNumBuf,0x0c,16);
DispClr();
DispSymbol(LARGE_HOOK);
if(!DetectDialTone()){ // 檢測撥號音
bMasterStatus=0x25;
break;
}
fDelayCount=0;
fDelayLock=0;
cbDelaySecond=2;
fDelaySecond=0;
bDialType=0; // 用于混合防盜
bClass=0xff;
fFanjiRequest=1;
fFanJi=0;
while(1){
IDLE;
if(OnHook()){
bMasterStatus=0x25;
break;
}
if(fDelayCount&&fDelaySecond){
bMasterStatus=0x25;
break;
}
if(bClass==1);
else if(RecNumber()){
DispNum(SmallLcd);
pReadNumber++;
if(!fDelayCount){
fDelaySecond=0;
cbDelaySecond=2;
}
if((aNumBuf[0]==2)&&(aNumBuf[1]==0)&&(aNumBuf[2]==0))
bClass=1;
}
if((!fDelayCount)&&fDelaySecond&&(pReadNumber>2)){
cbDelaySecond=100;
fDelayCount=1; // 若60秒鐘內(nèi)沒有按鍵,啟動定時
fDelaySecond=0;
}
if(DisableNumAnaly()){ // 若是禁撥號碼,鎖機退出
bMasterStatus=0x25;
break;
}
if(pReadNumber>2){
JudgeCallKind();
if((fLOCCallLimit&&(bIDL==0))||
(fDDDCallLimit&&(bIDL==1))||
(fIDDCallLimit&&(bIDL==2))){
bMasterStatus=0x25;
break;
}
//反極計費的前提是國內(nèi)電話號碼不小于6位,國際電話號碼不小于8位
if(fFanJi){
if(((bIDL==1)&&(pReadNumber<5))||
((bIDL==2)&&(pReadNumber<7))){
fFanjiRequest=1;
fFanJi=0;
}
else{
bMasterStatus=0x21;
break;
}
}
if(fHanderEnable&&fKey){ //在手動計費狀態(tài)下,啟動計費
fKey=0;
if(bKeyBuf==K4){
bMasterStatus=0x21;
break;
}
}
}
else{
if(fKey){
fKey=0;
if(cbKey>30);
else if(bKeyBuf==K4){
fLockRequest=1;
bMasterStatus=0x26;
break;
}
}
if(fFanJi){
fFanJi=0;
fFanjiRequest=1;
}
}
}
break;
case 0x21: //開始主叫初始計費
Open(POWER_ON);
SaveCurrentTime();
lTotalTariff=0;
iTotalTime=0;
fF0Add=1;
fF1Add=0;
fF3Add=0;
lTotalF0=0;
lTotalF1=0;
lTotalF2=0;
lTotalF3=0;
bMasterStatus=0x22;
break;
case 0x22:
OldCheckHoliday(); //查節(jié)假日表
OldNo2Tariff(); //查第二費率時間表
OldGetTariff();
i=OldGetDiscount(); //查折扣率方案表,計算各項折扣率
if(i<100) //&&(bClass!=0)) //折扣率小于100且設(shè)置折扣項
DispSymbol(LARGE_HALFPRICE);
else
DispSymbol(LARGE_ALLPRICE);
if((bClass&0x01)==0x01)
iF0Tariff=FeeCalc(iF0Tariff,i);
if((bClass&0x02)==0x02)
iF1Tariff=FeeCalc(iF1Tariff,i);
if((bClass&0x08)==0x08)
iF3Tariff=FeeCalc(iF3Tariff,i);
//對服務(wù)費的處理
if((bIDL!=0)&&
(iF2Tariff>0)&&(iF2Tariff<10)){ //判斷四川計費方式
fCountSC=1;
}
else{
fCountSC=0;
if((bClass&0x04)==0x04)
iF2Tariff=FeeCalc(iF2Tariff,i);
}
if(fF0Add){ //初始收費
TotalAdd(iF0Tariff); //收F0費(基本費)
TotalAdd(iF1Tariff); //收F1費(附加費)
lTotalF0=iF0Tariff; //統(tǒng)計F0費(基本費)
lTotalF1=iF1Tariff; //統(tǒng)計F1費(附加費)
if(fCountSC){ //計算四川方式的服務(wù)費
i=(byte)(iF2Tariff);
i*=5;
iF2Tariff=(uint)(lTotalF0+lTotalF1);
iF2Tariff=FeeCalc(iF2Tariff,i);
if(iF2Tariff<100)
iF2Tariff=100;
iSCFee=iF2Tariff;
}
TotalAdd(iF2Tariff); //收F2費(服務(wù)費)
TotalAdd(iF3Tariff); //收F3費
lTotalF3=iF3Tariff; //統(tǒng)計F3費
if(f3Plus1){
TotalAdd(iF3Tariff); //收F3費
TotalAdd(iF3Tariff); //收F3費
F3TotalAdd();
F3TotalAdd();
}
lTotalF2=iF2Tariff; //統(tǒng)計F2費(服務(wù)費)
//取出提前計時時長
iTotalTime=bResetTime;
cbDelaySecond=bFTime;
if(bResetTime!=0)
cbDelaySecond++;
if(bFTime==0);
else if(bResetTime<=bFTime) //提前計時時長與計費時長之關(guān)系
cbDelaySecond-=bResetTime;
else if(bResetTime==(bFTime+1)){
cbDelaySecond--;
TotalAdd(iF1Tariff);
}
else{
cbDelaySecond-=bResetTime%bFTime;
i=bResetTime/bFTime;
do{
TotalAdd(iF0Tariff);
TotalAdd(iF1Tariff);
}while(--i!=0);
}
fDelaySecond=0;
fDelay5MS=1;
fSecond=0;
fF0Add=0;
}
if(fF1Add){
cbDelaySecond=bFTime;
fF1Add=0;
TotalAdd(iF0Tariff); //收F0費(基本費)
TotalAdd(iF1Tariff); //收F1費(附加費)
F0TotalAdd(); //F0費合計
F1TotalAdd(); //F1費合計
if(fCountSC){
i=(byte)(iF2Tariff);
i*=5;
iF2Tariff=(uint)(lTotalF0+lTotalF1);
iF2Tariff=FeeCalc(iF2Tariff,i);
if(iF2Tariff<100)
iF2Tariff=100;
if(iF2Tariff>iSCFee){
iTemp=iF2Tariff;
iF2Tariff-=iSCFee;
TotalAdd(iF2Tariff);
F2TotalAdd();
iSCFee=iTemp;
}
}
}
if(fF3Add){
TotalAdd(iF3Tariff); //收F3費
F3TotalAdd();
fF3Add=0;
}
DispCharge(lTotalTariff,1); //在大、小顯示器上顯示話費
DispCharge(lTotalTariff,2);
DispTime(iTotalTime); //在大顯示器上顯示通話時間
while(1){
IDLE;
if(fSecond){
fSecond=0;
DispTime(++iTotalTime); //在大顯示器上顯示通話時間
//提前計時時長存入變量, 以判斷通話時長是否要減一
if(bResetTime!=0x00)
iTotalTime--;
//計算收3+1或3+3費(F3費)的時間是否到
if(iTotalTime>179){
if(f3Plus1){
if(((iTotalTime-180)%60)==0x00)
fF3Add=1;
}
else{
if((iTotalTime%180)==0x00)
fF3Add=1;
}
}
if(bResetTime!=0x00)
iTotalTime++;
//計算收F1費的時間是否到
if(fDelaySecond){
fDelaySecond=0;
fF1Add=1;
}
//判斷是否要進行收費了
if(fF1Add||fF3Add)
break;
}
if(KeyPro()||OnHook()){
bMasterStatus=0x24;
break;
}
Flash(1);
}
break;
case 0x24:
if(iTotalTime==0) //解決通話時長為零的情況
DispTime(++iTotalTime); //在大顯示器上顯示通話時間
if(fEndLockEnable){
DispSymbol(LARGE_LOCK);
fLocked=1;
}
DispSymbol(LARGE_UNFLASH);
DispSymbol(LARGE_PHONE);
SaveTotal(); //通話次數(shù)、話費累計
SaveRecord(); //存儲話單
SaveBaoBiao(); //lmt add 2001.3.13
fLockRequest=1;
cbFangDao=200; //關(guān)閉防盜聯(lián)絡(luò)音
Speaker(255);
if((fIDDPrintLimit&&(bIDL==2))||
(fLOCPrintLimit&&(bIDL==0))||
(fDDDPrintLimit&&(bIDL==1)));
else PrintTalkRecord(); //打印話單
cbDelaySecond=30;
fDelaySecond=0;
pReadNumber=0;
pWriteNumber=0;
bStatusWord=S_OLDLOCKWAIT;
return;
case 0x25:
fLockRequest=1;
fDelaySecond=1;
bStatusWord=S_OLDLOCKWAIT;
return;
case 0x26:
fLocked=1;
fDelaySecond=1;
DispSymbol(LARGE_LOCK);
bStatusWord=S_OLDLOCKWAIT;
return;
}
}
}
void NewMasterCall(void)
{
byte bMasterStatus=0x20;
bool fDelayCount;
bool fF0Add,fF1Add,fF2Add,fF3Add;
byte xdata bCallStart;
while(1){
switch(bMasterStatus){
case 0x20:
pWriteNumber=0;
pReadNumber=0;
memset(aNumBuf,0x0c,16);
DispClr();
DispSymbol(LARGE_HOOK);
if(!DetectDialTone()){ //檢測撥號音
bMasterStatus=0x25;
break;
}
/*
AutoReadPara(34);
if(bParaByte!=0)
Open(MLD);
*/
fFanjiRequest=1;
fFanJi=0;
fDelayCount=0;
fDelayLock=0;
cbDelaySecond=2;
fDelaySecond=0;
bDialType=0;
bClass=0xff;
fiDelaySecond=0;
ciDelaySecond=0xffff;
bQueryFee=0;
bCallStart=0;
bIs201=0; // 2001-04-05 19:25 add
while(1){
IDLE;
if(OnHook()){ //HooKoff
if(bCallStart)
CallStation(); //尋呼臺號碼分析
bMasterStatus=0x25;
break;
}
/*去掉定時鎖機功能 2001-03-12 13:54
if(fDelayCount&&fDelaySecond){ //自動掛機定時到
bMasterStatus=0x25;
break;
}
*/
if((bClass==1)||(bClass==2)||(bIs201==1)){ // 免費或特服號碼時 add 2001-04-05 19:25
if(pReadNumber<pWriteNumber){ // 2001-04-05 20:00
pWriteNumber--;
aNumBuf[pReadNumber]=0x0c;
}
}
else if(RecNumber()){
DispNum(SmallLcd);
pReadNumber++;
if(!fDelayCount){
fDelaySecond=0;
cbDelaySecond=2;
}
JudgeCallKind();
NewCheckHoliday();
NewNo2Tariff();
//if(bQueryFee!=1)
NewGetTariff(1);
if(bClass==0){ //若是禁撥號碼,鎖機退出
bMasterStatus=0x25;
break;
}
// 在撥號到達(dá)一定位數(shù)時,打開模擬負(fù)載,進行CALL臺防盜 00-12-8 13:47
if((bCallStart==0)&&(bStationFDLength>=3)&&(pReadNumber>=bStationFDLength)){
bCallStart=1;
if(JudgeCallStation()) //判斷所撥的號碼是否是CALL臺的號碼
Open(MLD);
}
}
if((!fDelayCount)&&fDelaySecond&&
(pReadNumber>2)){
cbDelaySecond=100;
fDelayCount=1; //若2秒鐘內(nèi)沒有按鍵,啟動60秒自動掛機定時
fDelaySecond=0;
ciDelaySecond=iAutoDelayTime;
fiDelaySecond=0;
}
if(pReadNumber>2){
if((fLOCCallLimit&&(bIDL==0))||
(fDDDCallLimit&&(bIDL==1))||
(fIDDCallLimit&&(bIDL==2))){
bMasterStatus=0x25;
break;
}
//反極計費和延時計費的前提是;
//國內(nèi)電話號碼不小于6位,國際電話號碼不小于8位,本地號碼不小于3位
if(fFanJi||fiDelaySecond){
if(((bIDL==1)&&(pReadNumber<5))||
((bIDL==2)&&(pReadNumber<7))){
if(fFanJi){
fFanjiRequest=1;
fFanJi=0; //重新等反極
}
}
else{
if(fFanJi)
bStartMode=0;
else
bStartMode=3;
bMasterStatus=0x21;
break;
}
}
if(fHanderEnable&&fKey){ //在手動計費狀態(tài)下,啟動計費
fKey=0;
if(bKeyBuf==K4){
bStartMode=1;
bMasterStatus=0x21;
break;
}
}
}
else{
if(fKey){
fKey=0;
if(cbKey>30);
else if(bKeyBuf==K4){
fLockRequest=1;
bMasterStatus=0x26;
break;
}
}
if(fFanJi){
fFanJi=0;
fFanjiRequest=1;
}
}
}
break;
case 0x21: //開始主叫初始計費
Close(MLD);
Open(POWER_ON);
SaveCurrentTime();
lTotalTariff=0;
iTotalTime=0;
fF0Add=1;
fF1Add=0;
fF2Add=0;
fF3Add=0;
lTotalF0=0;
lTotalF1=0;
lTotalF2=0;
lTotalF3=0;
bQueryFee=0;
bMasterStatus=0x22;
break;
case 0x22:
NewCheckHoliday(); //查節(jié)假日表
NewNo2Tariff(); //查第二費率時間表
NewGetTariff(0);
if(bClass==0){
bMasterStatus=0x24;
break;
}
if(bClass==1){
bMasterStatus=0x23;
break;
}
NewGetDiscount(); //查折扣率方案表,計算折扣率存儲在aParaBuf[]中
iF0Tariff=FeeCalc(iF0Tariff,aParaBuf[0]);
iF1Tariff=FeeCalc(iF1Tariff,aParaBuf[1]);
iF2Tariff=FeeCalc(iF2Tariff,aParaBuf[2]);
iF3Tariff=FeeCalc(iF3Tariff,aParaBuf[3]);
if((aParaBuf[0]<100)||(aParaBuf[1]<100)||
(aParaBuf[2]<100)||(aParaBuf[3]<100))
DispSymbol(LARGE_HALFPRICE);
else
DispSymbol(LARGE_ALLPRICE);
if(fF0Add){ //初始收費
TotalAdd(iF0Tariff); //收F0費
TotalAdd(iF2Tariff); //收F2費
TotalAdd(iF3Tariff); //收F3費
lTotalF3=iF3Tariff;
if(f3Plus1){
TotalAdd(iF3Tariff); //收F3費
TotalAdd(iF3Tariff); //收F3費
F3TotalAdd();
F3TotalAdd();
}
lTotalF0=iF0Tariff;
lTotalF1=0;
lTotalF2=iF2Tariff;
//取出提前計時時長
iTotalTime=iResetTime;
if(iT0Time==0){ //T0時長為0時,將立即收F1費
TotalAdd(iF1Tariff);
F1TotalAdd();
iT0Time=iT1Time;
}
ciDelaySecond=iT0Time;
ciiDelaySecond=iT2Time;
if(iTotalTime!=0)
ciDelaySecond++;
if(iT0Time==0);
else if(iTotalTime<=iT0Time) //提前計時時長與計費時長之關(guān)系
ciDelaySecond-=iTotalTime;
else if(iTotalTime==(iT0Time+1)){
ciDelaySecond--;
TotalAdd(iF1Tariff);
}
fiDelaySecond=0;
fiiDelaySecond=0;
fDelay5MS=1;
fSecond=0;
fF0Add=0;
}
if(fF1Add){
TotalAdd(iF1Tariff); //收F1費
F1TotalAdd();
ciDelaySecond=iT1Time;
fF1Add=0;
}
if(fF2Add){
TotalAdd(iF2Tariff); //收F2費
F2TotalAdd();
ciiDelaySecond=iT2Time;
fF2Add=0;
}
if(fF3Add){
TotalAdd(iF3Tariff); //收F3費
F3TotalAdd();
fF3Add=0;
}
bMasterStatus=0x23;
break;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -