📄 jbscall.c
字号:
/**********************************************************
*
* FileName: jScall.c
* Function: 被叫程序
*
**********************************************************/
//#pragma DEBUG
#include <jbScall.h>
void OldSlaveCall(void)
{
byte bSlaveStatus=0x30; // 被叫状态控制字
byte bUnitTariff; // 被叫计费费率
byte bUnitTime; // 被叫计费时长
byte bDelayTime;
bool fMustSaveRecord=0;
pReadNumber=0;
pWriteNumber=0;
memset(&aNumBuf,0x0c,16);
fFanjiRequest=1;
fFanJi=0;
DispClr();
DispSymbol(LARGE_HOOK);
AutoReadPara(206);
bUnitTime=bParaByte; // 被叫计费时长
AutoReadPara(207);
bUnitTariff=bParaByte; // 被叫计费费率
AutoReadPara(208);
bDelayTime=bParaByte; // 被叫计费延时时间
iTotalTime=1; // 计费时间提前1秒
lTotalTariff=0;
bDialType=0;
if(fSlaveCallEnable&&(bUnitTariff!=0)){ // 被叫是否允许计费
bSlaveStatus=0x31;
if(!fSlaveCalcForm)
bSlaveStatus=0x32; // 手动计费状态
}
SaveCurrentTime();
ciDelaySecond=0;
fiDelaySecond=0;
iAddress=0;
while(TRUE){
switch(bSlaveStatus){
case 0x30: // 免费通话过程
fDelay5MS=1;
fDelayLock=0;
while(1){
IDLE;
Flash(1);
if(OnHookDelay()||(pReadNumber==4)||(fFanJi&&(pReadNumber>2))){
fLockRequest=1; // 若挂机,则锁机退出
bSlaveStatus=0x34;
break;
}
JudgeNum();
if(fSecond){
fSecond=0;
iAddress++;
}
if(KeyPro()){
fLockRequest=1;
bSlaveStatus=0x34;
break;
}
} // End while(1)
break;
case 0x31:
if(bDelayTime==0){
bSlaveStatus=0x33;
break;
}
ciDelaySecond=bDelayTime; //自动计费延时过程
fiDelaySecond=0;
while(1){
IDLE;
Flash(1);
if(OnHookDelay()||(pReadNumber==4)||(fFanJi&&(pReadNumber>2))){
fLockRequest=1;
bSlaveStatus=0x34;
break;
}
JudgeNum();
if(fiDelaySecond){
bSlaveStatus=0x33; // 自动计费延时时间到
break;
}
if(fSecond){
fSecond=0;
iAddress++;
}
if(KeyPro()){
fLockRequest=1;
bSlaveStatus=0x34;
break;
}
} // End while(1)
break;
case 0x32: // 等待手动启动计费
while(1){
IDLE;
Flash(1);
if(OnHookDelay()||(pReadNumber==4)||(fFanJi&&(pReadNumber>2))){
fLockRequest=1;
bSlaveStatus=0x34;
break;
}
JudgeNum();
if(fSecond){
fSecond=0;
iAddress++;
}
if(fKey&&(bKeyBuf==K4)){ // 手动计费状态下,启动计费
fKey=0;
bSlaveStatus=0x33; // 手动计费开始
break;
}
} // End while(1)
break;
case 0x33: //被叫计费状态
lTotalTariff+=(ulint)bUnitTariff;
fMustSaveRecord=1;
DispCharge(lTotalTariff,1);
DispCharge(lTotalTariff,2);
DispTime(iTotalTime);
fSecond=0;
if(bUnitTime==0){
bSlaveStatus=0x30;
break;
}
ciDelaySecond=bUnitTime;
fiDelaySecond=0;
while(1){
IDLE;
Flash(1);
if(fSecond){
fSecond=0;
DispTime(++iTotalTime);
iAddress++;
if(fiDelaySecond)
break;
}
if(OnHookDelay()||(fFanJi&&(pReadNumber>2))||(pReadNumber==4)){
fLockRequest=1;
bSlaveStatus=0x34;
break;
}
JudgeNum();
if(KeyPro()){
fLockRequest=1;
bSlaveStatus=0x34;
break;
}
} // End while(1)
break;
case 0x34: // 被叫通话结束,统计、存储过程
cbFangDao=200;
Close(MLD);
DispSymbol(LARGE_UNHOOK);
DispSymbol(LARGE_UNFLASH);
DispSymbol(LARGE_PHONE);
if(fLocked)
DispSymbol(LARGE_LOCK);
fDelaySecond=1;
Speaker(255);
if(fMustSaveRecord){
fMustSaveRecord=0;
memset(aNumBuf,0x0c,15); // 被叫存储零号码话单
bIDL=0;
SaveRecord();
if(!fLOCPrintLimit)
PrintTalkRecord();
cbDelaySecond=5;
fDelaySecond=0;
}
SaveTotal(); // 被叫通话次数、收费累计
pReadNumber=pWriteNumber=0;
bStatusWord=S_OLDLOCKWAIT;
return;
}
// End switch(bSlaveStatus)
}
// End while(1)
}
// End function: SlaveCall()
void NewSlaveCall(void)
{
byte bSlaveStatus=0x30;
uint iMTTime;
uint iRT0Time;
uint iRT1Time;
uint iRF0Tariff;
uint iRF1Tariff;
bool fMustDelay=0;
//初始化被叫被叫参数
AutoReadPara(24);
iMTTime=iParaWord; // 被叫限时时长
AutoReadPara(25);
iRF0Tariff=iParaWord; // 被叫初始收费
AutoReadPara(26);
iRT0Time=iParaWord; // 被叫初始时长
AutoReadPara(27);
iRF1Tariff=iParaWord; // 被叫单位收费
AutoReadPara(28);
iRT1Time=iParaWord; // 被叫单位时长
pReadNumber=0;
pWriteNumber=0;
memset(aNumBuf,0x0c,16);
fFanjiRequest=1;
fFanJi=0;
DispClr();
DispSymbol(LARGE_HOOK);
if((iMTTime==0)||((iRT1Time==0)&&(iRT0Time==0)))
bSlaveStatus=0x33;
else if((iRF0Tariff==0)&&(iRF1Tariff==0))
bSlaveStatus=0x30;
else if(fSlaveCalcForm) // 呼入计费方式
bSlaveStatus=0x31; // 自动计费
lTotalTariff=0;
iTotalTime=1; // 预设1秒钟
fDelayLock=0;
bDialType=0;
fSecond=0;
fDelay5MS=1;
iAddress=0;
bClass=0;
SaveCurrentTime();
while(1){
switch(bSlaveStatus){
case 0x30: // 手动计时状态下,或被叫不计费,未启动计费
while(1){
IDLE;
Flash(1);
if(OnHookDelay()||(pReadNumber==4)){
bSlaveStatus=0x33;
break;
}
if(fFanJiFangDao&&fFanJi){
//if(bClass>2){
bSlaveStatus=0x33;
break;
//}
//fFanjiRequest=1;
//fFanJi=0;
}
JudgeNum();
if(fSecond){
fSecond=0;
iAddress++;
iTotalTime++;
if(iMTTime!=9999){ // 是否要被叫限时
if((iTotalTime-1)>=iMTTime){
bSlaveStatus=0x33;
break;
}
}
}
if((!fSlaveCalcForm)&&fKey){ // 允许手动计费时,手动启动计费
fKey=0;
if(bKeyBuf==K4){
bSlaveStatus=0x31;
break;
}
}
}
break;
case 0x31: // 自动或手动计费准备
TotalAdd(iRF0Tariff);
ciDelaySecond=iRT0Time;
fiDelaySecond=0;
fSecond=0;
fMustDelay=1;
iTotalTime=1;
bSlaveStatus=0x32;
break;
case 0x32:
DispCharge(lTotalTariff,1);
DispCharge(lTotalTariff,2);
DispTime(iTotalTime);
while(1){
IDLE;
Flash(1);
if(fSecond){
fSecond=0;
iAddress++;
DispTime(++iTotalTime);
if(iMTTime!=9999){ //是否要被叫限时
if((iTotalTime-1)>=iMTTime){
bSlaveStatus=0x33;
break;
}
}
if(fiDelaySecond){
fiDelaySecond=0;
ciDelaySecond=iRT1Time;
TotalAdd(iRF1Tariff);
break;
}
}
if(OnHookDelay()||(pReadNumber==4)||KeyPro()){
bSlaveStatus=0x33;
break;
}
if(fFanJiFangDao&&fFanJi){
//if(bClass>2){
bSlaveStatus=0x33;
break;
//}
//fFanjiRequest=1;
//fFanJi=0;
}
JudgeNum();
}
break;
case 0x33:
Close(MLD);
fLockRequest=1;
Speaker(255);
SaveTotal(); //被叫通话次数、收费累计
cbFangDao=200; //关闭防盗联络音
if(fMustDelay){
DispSymbol(LARGE_UNFLASH);
DispSymbol(LARGE_PHONE);
if(fLocked)
DispSymbol(LARGE_LOCK);
bIDL=0;
memset(aNumBuf,0x0c,16); //被叫存储零号码话单
if(fSaveInTalk)
SaveRecord();
if(!fLOCPrintLimit)
PrintTalkRecord();
cbDelaySecond=5;
fDelaySecond=0;
}
else
fDelaySecond=1;
if(fLocked)
bStatusWord=S_NEWLOCKWAIT;
else
bStatusWord=S_NEWUNLOCKWAIT;
return;
}
}
}
void JudgeNum(void)
{
if(iAddress>90)
return;
if(pReadNumber<pWriteNumber){
bClass++;
pReadNumber++;
cbDelaySecond=10;
}
if(cbDelaySecond==0){
pReadNumber=0;
pWriteNumber=0;
}
}
/*
if(pReadNumber<pWriteNumber){
if(iAddress>60){
pReadNumber=0;
pWriteNumber=0;
}
else{
pReadNumber++;
cbDelaySecond=8;
fDelaySecond=0;
}
}
if(fDelaySecond){
fDelaySecond=0;
pReadNumber=0;
pWriteNumber=0;
}
}
*/
bool OnHookDelay(void)
{
if(fiiDelaySecond){
Close(MLD);
if(OnHook())
return TRUE;
else
return FALSE;
}
AutoReadPara(55);
if((bParaByte==1)&&(ciiDelaySecond==1)) //不并模拟负载
Close(MLD);
return FALSE;
}
bool KeyPro(void)
{
if(!fKey)
return FALSE;
fKey=0;
if((bKeyBuf==K4)&&(cbKey>=225)){
if(!fDelayLock){
fDelayLock=1;
cbKey=30;
}
else
return TRUE;
}
return FALSE;
}
// End function: KeyPro()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -