?? jbmcall.c
字號:
case 0x23:
DispCharge(lTotalTariff,1); //在大、小顯示器上顯示話費
DispCharge(lTotalTariff,2);
DispTime(iTotalTime); //在大顯示器上顯示通話時間
while(1){
IDLE;
if(fSecond){
fSecond=0;
iTotalTime++;
DispTime(iTotalTime);
if(bClass==1)
continue; //add 2001-04-05 21:04
//計算收F1費的時間是否到
if(fiDelaySecond){
fiDelaySecond=0;
fF1Add=1;
}
//計算收F2費的時間是否到
if(fiiDelaySecond){
fiiDelaySecond=0;
fF2Add=1;
}
//計算收F3費的時間是否到
if(iResetTime!=0x00)
iTotalTime--;
if(iTotalTime>179){
if(f3Plus1){
if(((iTotalTime-180)%60)==0x00)
fF3Add=1;
}
else{
if((iTotalTime%180)==0x00)
fF3Add=1;
}
}
if(iResetTime!=0x00)
iTotalTime++;
//判斷是否要進行收費了
if(fF1Add||fF2Add||fF3Add){
bMasterStatus=0x22;
break;
}
}
if(KeyPro()||OnHook()){
bMasterStatus=0x24;
break;
}
Flash(1);
}
break;
case 0x24:
if(iTotalTime==0) //解決通話時長為零的情況
DispTime(++iTotalTime); //在大顯示器上顯示通話時間
if(fEndLockEnable)
DispSymbol(LARGE_LOCK);
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=bTalkDispTime;
fDelaySecond=0;
pReadNumber=0;
pWriteNumber=0;
if(fEndLockEnable){
fLocked=1;
bStatusWord=S_NEWLOCKWAIT;
}
else
bStatusWord=S_NEWUNLOCKWAIT;
return;
case 0x25:
Close(MLD);
fLockRequest=1;
fDelaySecond=1;
bStatusWord=S_NEWUNLOCKWAIT;
return;
case 0x26:
Close(MLD);
fLocked=1;
fDelaySecond=1;
DispSymbol(LARGE_LOCK);
bStatusWord=S_NEWLOCKWAIT;
return;
}
}
}
void JudgeCallKind(void)
{
if(aNumBuf[0]!=0)
bIDL=0; // Local Phone
else if(aNumBuf[1]!=0)
bIDL=1; // Domestic Phone
else
bIDL=2; // Internation Phone
}
/**************************************************************
*
* 掛機判斷
*
* 如掛機,則返回1,否則返回0
*
***************************************************************/
bool OnHook(void)
{
if(cbLineState>(128+L0))
return TRUE;
else
return FALSE;
}
/**************************************************************
*
* 摘機判斷
* 如摘機,則返回1,否則返回0
*
***************************************************************/
bool OffHook(void)
{
if(cbLineState<(128-L4))
return 1;
else
return 0;
}
/*******************************************************
*
* 說 明:判斷脈沖、音頻混合撥號
* 若出現混合撥號,則取消輸入的號碼,并鎖機
* 否則就顯示所撥的號碼。
*
********************************************************/
bool RecNumber(void)
{
if(pReadNumber>=pWriteNumber)
return FALSE;
if(bDialType==0xff){ //存在混合撥號
fLockRequest=1;
return FALSE;
}
else{
if((pReadNumber==0)&&(aNumBuf[0]==0x0b)){
aNumBuf[0]=0x0a;
if(!fWorkMode)
fLockRequest=1;
}
else if((pReadNumber==0)&&(aNumBuf[0]==0x0c)){
aNumBuf[0]=0x0b;
if(!fWorkMode)
fLockRequest=1;
}
else if(aNumBuf[pReadNumber]>0x09){
// add 2001-04-05 19:21, 不顯示 201# 后面的撥號
if((pReadNumber==3)&&(aNumBuf[0]==2)&&(aNumBuf[1]==0)&&(aNumBuf[2]==1)&&(aNumBuf[3]==12))
bIs201=1;
//
aNumBuf[pReadNumber]=0x0c;
pWriteNumber--;
return FALSE;
}
DispNum(LargeLcd);
return TRUE;
}
}
void TotalAdd(uint iCost)
{
lTotalTariff+=iCost;
}
void F0TotalAdd(void)
{
lTotalF0+=iF0Tariff;
}
void F1TotalAdd(void)
{
lTotalF1+=iF1Tariff;
}
void F2TotalAdd(void)
{
lTotalF2+=iF2Tariff;
}
void F3TotalAdd(void)
{
lTotalF3+=iF3Tariff;
}
/**********************************************************
*
* 節假日表,包含春節和重要節日
*
**********************************************************/
byte code aOldHoliday[]={ 0x0c,0x01,0x01,0x0c,0x0c,
0x0c,0x05,0x01,0x02,0x03,
0x0c,0x10,0x01,0x02,0x03,
0x00,0x02,0x05,0x06,0x07,
0x01,0x01,0x24,0x25,0x26,
0x02,0x02,0x12,0x13,0x14,
0x03,0x02,0x01,0x02,0x03,
0x04,0x01,0x22,0x23,0x24,
0x05,0x02,0x09,0x10,0x11,
0x06,0x01,0x29,0x30,0x31,
0x07,0x02,0x18,0x19,0x20,
0x08,0x02,0x07,0x08,0x09,
0x09,0x01,0x26,0x27,0x28,
0x10,0x02,0x14,0x15,0x16,
0x11,0x02,0x03,0x04,0x05,
0x12,0x01,0x23,0x24,0x25,
0x13,0x02,0x10,0x11,0x12,
0x14,0x01,0x31,0x0c,0x0c,
0x14,0x02,0x01,0x02,0x0c,
0x15,0x02,0x19,0x20,0x21,
0x15,0x02,0x19,0x20,0x21,
0x16,0x02,0x08,0x09,0x10,
0x17,0x01,0x28,0x29,0x30,
0x18,0x02,0x16,0x17,0x18,
0x19,0x02,0x05,0x06,0x07,
0x20,0x01,0x25,0x26,0x27,
0x21,0x02,0x12,0x13,0x14,
0x22,0x02,0x01,0x02,0x03,
0x23,0x01,0x22,0x23,0x24,
0x24,0x02,0x10,0x11,0x12,
0x25,0x01,0x29,0x30,0x31,
0x26,0x02,0x17,0x18,0x19,
0x27,0x02,0x06,0x07,0x08,
0x28,0x01,0x26,0x27,0x28,
0x29,0x02,0x13,0x14,0x15,
0x30,0x02,0x03,0x04,0x05};
void NewCheckHoliday(void)
{
byte i;
byte bNum;
fHoliday=0;
iAddress=NEW_DISCOUNT_ADDR;
ReadBytes(1,2);
iAddress=NEW_DISCOUNT_ADDR+iParaWord;
ReadBytes(1,1);
bNum=bParaByte; //取出節假日的數量
if(bNum>32)
return;
for(i=0;i<bNum;i++){
iAddress--;
ReadBytes(1,5);
aParaBuf[0]=0xcc; //年無關
if(CheckTable(5)){
iAddress--;
ReadBytes(1,5);
aParaBuf[0]=0xcc; //年無關
if(!CheckTable(5)){
fHoliday=1;
return;
}
} //end if(...)
else
iAddress+=4;
} //end for(...)
}
void OldCheckHoliday(void)
{
byte i,j;
byte bNum;
byte aHoliday[6];
fHoliday=0;
WaitRTC();
Page(6);
aHoliday[0]=XBYTE[0xc009]; //YEAR
aHoliday[1]=XBYTE[0xc008]; //MONTH
aHoliday[2]=XBYTE[0xc007]; //DAY
Page(5);
for(i=0;i<34;i++){
bNum=5*i;
if(aOldHoliday[bNum]==0x0c);
else if(aOldHoliday[bNum]!=aHoliday[0])
continue;
aHoliday[4]=aOldHoliday[bNum+1]; //取月
for(j=2;j<5;j++){ //比較日
aHoliday[5]=aOldHoliday[bNum+j];
if((aHoliday[1]==aHoliday[4])&&
(aHoliday[2]==aHoliday[5])){
fHoliday=1;
return;
}
}
} //end for(...)
}
/**************************************************************
*
* Function Name: SaveTotal()
* Function:更新主叫、被叫通話次數、話費累計
*
*
*
***************************************************************/
void SaveTotal(void)
{
switch(bStatusWord){
case S_OLDMASTERCALL:
case S_NEWMASTERCALL:
iAddress=PARA_60;
if(fWorkMode){
switch(bClass){
case 0: //禁撥電話
iAddress=PARA_62;
break;
case 1: //免費電話
iAddress=PARA_63;
break;
case 2: //特服電話
iAddress=PARA_64;
break;
default: //普通計費電話
iAddress=PARA_60;
break;
}
}
//
WriteTwoBytes(1); //統計通話次數
iAddress=PARA_61;
WriteTriBytes(lTotalTariff); //統計總話費
//
iAddress=0xc02e;
WriteTwoBytes(1); //日分項通話次數
iAddress+=2;
if(fWorkMode){
WriteTriBytes(lTotalTariff); //日分項話費總計
iAddress+=3;
}
WriteTriBytes(lTotalF0); //日分項F0合計
iAddress+=3;
WriteTriBytes(lTotalF1); //日分項F1合計
iAddress+=3;
WriteTriBytes(lTotalF2); //日分項F2合計
iAddress+=3;
WriteTriBytes(lTotalF3); //日分項F3合計
break;
case S_OLDSLAVECALL:
case S_NEWSLAVECALL:
iAddress=PARA_65;
WriteTwoBytes(1); //被叫通話次數
iAddress=PARA_66;
WriteTriBytes(lTotalTariff); //被叫通話總計
break;
}
}
void WriteTwoBytes(uint iCost)
{
ReadBytes(6,2);
iParaWord+=iCost;
Page(6);
iAddress-=2;
XBYTE[iAddress]=(byte)((iParaWord>>8)&0xff);
XBYTE[iAddress+1]=(byte)(iParaWord&0xff);
Page(5);
}
void WriteTriBytes(ulint lCost)
{
ReadBytes(6,3);
lParaLWord+=lCost;
Page(6);
iAddress-=3;
XBYTE[iAddress]=(byte)((lParaLWord>>16)&0xff);
XBYTE[iAddress+1]=(byte)((lParaLWord>>8)&0xff);
XBYTE[iAddress+2]=(byte)(lParaLWord&0xff);
Page(5);
}
/****************************************************************
*
* Function Name: GetOldTariff()
* Function: 查找當前時刻費率,存人iF0Tariff,iF1Tariff,
* iF2Tariff
* 若所撥號碼為特服或免費電話,返回 1
* 若所撥號碼為普通電話,返回 0
*
*
****************************************************************/
void OldGetTariff(void)
{
byte i;
byte bTemp;
byte bNum;
byte aTemp[10];
byte aClass[2];
bool fDefaultTari=0;
switch(bIDL){
case 0:
iAddress=0xec0d;
ReadBytes(1,2);
break;
case 1:
iAddress=0xec0a;
ReadBytes(1,2);
break;
case 2:
iParaWord=0x3310;
break;
}
iAddress=iParaWord|0xf000; // Get Out Tariff Table Head Address in iAddress
Page(1);
while(TRUE){
aClass[0]=XBYTE[iAddress];
iAddress++;
aClass[1]=XBYTE[iAddress]; //Get Out Class Addr
if((aClass[0]==0xff)||(aClass[1]==0xff)){
fDefaultTari=1;
break;
}
aTemp[0]=aClass[1]&0x0f; //Get Out the First Number
iAddress++;
if(aTemp[0]>=10){
fDefaultTari=1;
break;
}
bNum=1; //記錄取出的號碼個數
for(i=0;i<5;i++,iAddress++){ //Get Out the Rest Number
bTemp=XBYTE[iAddress]>>4;
if(bTemp>=0x0c)
break;
if(bTemp>=10){
fDefaultTari=1;
break;
}
aTemp[2*i+1]=bTemp;
bNum++;
bTemp=XBYTE[iAddress]&0x0f;
if(bTemp==0x0c){
iAddress++;
break;
}
if(bTemp>=10||i==4){
fDefaultTari=1;
break;
}
aTemp[2*i+2]=bTemp;
bNum++;
}
if(fDefaultTari)
break;
if(memcmp(&aTemp,&aNumBuf[bIDL],bNum)==0x00)
break;
if(iAddress<0xf000){
fDefaultTari=1;
break;
}
}
if(fDefaultTari){
aClass[0]=0; //缺省費率自動查詢
aClass[1]=0;
}
switch(bIDL){
case 0:
if(!fNo2Tariff)
iAddress=0xf1a4;
else
iAddress=0xf258;
break;
case 1:
if(!fNo2Tariff)
iAddress=0xef88;
else
iAddress=0xf096;
break;
case 2:
if(!fNo2Tariff)
iAddress=0xee20;
else
iAddress=0xeed4;
break;
}
if(!fNo2Tariff)
i=(aClass[0]>>1)&0x1f;
else
i=((aClass[0]<<4)&0x10)+((aClass[1]>>4)&0x0f);
iAddress+=(uint)(i*9);
//
Page(5);
ReadBytes(1,1);
bFTime=bParaByte;
bClass=0;
ReadBytes(1,2);
iF0Tariff=iParaWord&0x7fff;
if((iParaWord&0x8000)!=0)
bClass|=0x01;
ReadBytes(1,2);
iF1Tariff=iParaWord&0x7fff;
if((iParaWord&0x8000)!=0)
bClass|=0x02;
ReadBytes(1,2);
iF2Tariff=iParaWord&0x7fff;
if((iParaWord&0x8000)!=0)
bClass|=0x04;
ReadBytes(1,2);
iF3Tariff=iParaWord&0x3fff;
if((iParaWord&0x8000)!=0)
bClass|=0x08;
if((iParaWord&0x4000)!=0)
f3Plus1=0;
else
f3Plus1=1;
}
/**************************************************************
*
* 功能:查新費率表
*
*
*
***************************************************************/
void NewGetTariff(bool fDial)
{
byte i;
byte bTemp;
byte bNum;
byte aTemp[16],aClass[2];
bool fDefaultTari=0;
bool fCheckCall=1;
Page(5);
//if(bQueryFee!=1){
switch(bIDL){
case 0:
iAddress=NEW_LOCAL_TARIFF_ADDR;
break;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -