📄 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秒钟内没有按键,启动定时
fDelaySecond=0;
}
if(DisableNumAnaly()){ // 若是禁拨号码,锁机退出
bMasterStatus=0x25;
break;
}
if(pReadNumber>2){
JudgeCallKind();
if((fLOCCallLimit&&(bIDL==0))||
(fDDDCallLimit&&(bIDL==1))||
(fIDDCallLimit&&(bIDL==2))){
bMasterStatus=0x25;
break;
}
//反极计费的前提是国内电话号码不小于6位,国际电话号码不小于8位
if(fFanJi){
if(((bIDL==1)&&(pReadNumber<5))||
((bIDL==2)&&(pReadNumber<7))){
fFanjiRequest=1;
fFanJi=0;
}
else{
bMasterStatus=0x21;
break;
}
}
if(fHanderEnable&&fKey){ //在手动计费状态下,启动计费
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(); //查节假日表
OldNo2Tariff(); //查第二费率时间表
OldGetTariff();
i=OldGetDiscount(); //查折扣率方案表,计算各项折扣率
if(i<100) //&&(bClass!=0)) //折扣率小于100且设置折扣项
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);
//对服务费的处理
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; //统计F0费(基本费)
lTotalF1=iF1Tariff; //统计F1费(附加费)
if(fCountSC){ //计算四川方式的服务费
i=(byte)(iF2Tariff);
i*=5;
iF2Tariff=(uint)(lTotalF0+lTotalF1);
iF2Tariff=FeeCalc(iF2Tariff,i);
if(iF2Tariff<100)
iF2Tariff=100;
iSCFee=iF2Tariff;
}
TotalAdd(iF2Tariff); //收F2费(服务费)
TotalAdd(iF3Tariff); //收F3费
lTotalF3=iF3Tariff; //统计F3费
if(f3Plus1){
TotalAdd(iF3Tariff); //收F3费
TotalAdd(iF3Tariff); //收F3费
F3TotalAdd();
F3TotalAdd();
}
lTotalF2=iF2Tariff; //统计F2费(服务费)
//取出提前计时时长
iTotalTime=bResetTime;
cbDelaySecond=bFTime;
if(bResetTime!=0)
cbDelaySecond++;
if(bFTime==0);
else if(bResetTime<=bFTime) //提前计时时长与计费时长之关系
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(); //通话次数、话费累计
SaveRecord(); //存储话单
SaveBaoBiao(); //lmt add 2001.3.13
fLockRequest=1;
cbFangDao=200; //关闭防盗联络音
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;
}
// 在拨号到达一定位数时,打开模拟负载,进行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秒钟内没有按键,启动60秒自动挂机定时
fDelaySecond=0;
ciDelaySecond=iAutoDelayTime;
fiDelaySecond=0;
}
if(pReadNumber>2){
if((fLOCCallLimit&&(bIDL==0))||
(fDDDCallLimit&&(bIDL==1))||
(fIDDCallLimit&&(bIDL==2))){
bMasterStatus=0x25;
break;
}
//反极计费和延时计费的前提是;
//国内电话号码不小于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){ //在手动计费状态下,启动计费
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(); //查节假日表
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) //提前计时时长与计费时长之关系
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -