?? jbmcall.c
字號:
case 1:
iAddress=NEW_DDD_TARIFF_ADDR;
break;
case 2:
iAddress=NEW_IDD_TARIFF_ADDR;
break;
}
ReadBytes(1,2);
iParaWord+=iAddress; // 區號表的長度
if(iParaWord>0xa000)
iParaWord=0;
Page(1);
while(1){
if(XBYTE[iAddress]!=0xc0){ // 若費率表首標志不為0xc0,返回
fDefaultTari=1;
break;
}
iAddress++;
aClass[0]=XBYTE[iAddress++];
aClass[1]=XBYTE[iAddress++]; // 取出費率的級數表
bNum=0; // 取出的區號位數計數
for(i=0;i<8;i++,iAddress++){ // Get Out the Rest Number
bTemp=XBYTE[iAddress]>>4;
if(bTemp>=0x0c) // 若查到區號則跳出 00-12-8 13:46
break;
/*
if(bTemp>0x0c){
fDefaultTari=1;
break;
}
*/
aTemp[2*i]=bTemp;
bNum++;
bTemp=XBYTE[iAddress]&0x0f;
if(bTemp==0x0c){
iAddress++;
break;
}
if(bTemp>0x0c){
fDefaultTari=1;
break;
}
aTemp[2*i+1]=bTemp;
bNum++;
}
if(fDefaultTari)
break;
if(fDial){
if(pReadNumber>=bIDL){
if(memcmp(&aTemp,&aNumBuf[bIDL],(pReadNumber-bIDL))==0){
fDial=0;
fCheckCall=0;
}
}
}
if(memcmp(&aTemp,&aNumBuf[bIDL],bNum)==0x00){
//
if(!fNo2Tariff)
bClass=aClass[0];
else
bClass=aClass[1];
if(bClass!=0xff) // 忽略級數
break;
}
if(iAddress>iParaWord){
fDefaultTari=1;
break;
}
}
if(fDefaultTari){
aClass[0]=3; // 缺省費率自動查詢
aClass[1]=3;
}
Page(5);
//bMClass=aClass[0]; // 存儲級數表到緩沖區
//bSClass=aClass[1];
//}
//else{
//aClass[0]=bMClass;
//aClass[1]=bSClass;
//}
switch(bIDL){
case 0:
iAddress=NEW_LOCAL_CLASS_ADDR;
break;
case 1:
iAddress=NEW_DDD_CLASS_ADDR;
break;
case 2:
iAddress=NEW_IDD_CLASS_ADDR;
break;
}
Page(1);
if(!fNo2Tariff)
bClass=aClass[0];
else{
bClass=aClass[1];
bParaByte=XBYTE[iAddress];
iAddress+=(uint)(bParaByte*16)+1;
}
Page(5);
if(bClass<2)
return;
iAddress+=(uint)((bClass-2)*16)+1;
ReadBytes(1,2);
iF0Tariff=iParaWord;
ReadBytes(1,2);
iT0Time=iParaWord;
// 2001-08-30 09:51 davy
if(fCheckCall&&(bClass==3)){ // 缺省費率設置為禁撥電話
if((iF0Tariff==0xffff)&&(iT0Time==0xffff)){
bClass=0;
return;
} // dw 2001-08-30 10:51
}
//
ReadBytes(1,2);
iF1Tariff=iParaWord;
ReadBytes(1,2);
iT1Time=iParaWord;
ReadBytes(1,2);
iF2Tariff=iParaWord;
ReadBytes(1,2);
iT2Time=iParaWord;
ReadBytes(1,2);
if((iParaWord&0x8000)!=0)
f3Plus1=0;
else
f3Plus1=1;
iF3Tariff=iParaWord&0x7fff;
ReadBytes(1,1);
aTemp[0]=bParaByte;
ReadBytes(1,1);
aTemp[1]=bParaByte;
if((aTemp[0]!=0)&&fHoliday)
bDayPartCode=aTemp[0]; // 是節假日,按節假日日分時段方案表
else
bDayPartCode=aTemp[1]; // 不用管是否為節假日
}
bool DetectDialTone(void)
{
byte cbToneCount=0;
byte bTemp;
if(!fDetectDialTone)
return TRUE;
Open(MLD);
Delay5MS(3);
Close(RLY);
MD_CLK=0; // 打開運放電源
WriteModem(CR1,0x04);
WriteModem(CR0,0x19);
cbDelay5MS=160;
fDelay5MS=0;
while(!fDelay5MS){
IDLE;
IDLE;
if(pReadNumber<pWriteNumber)
break;
bTemp=ReadModem(DR);
if((bTemp&0x02)!=0)
cbToneCount++;
else
cbToneCount=0;
if(cbToneCount==40){
ResetModem();
Open(RLY); // 釋放繼電器
Delay5MS(3);
Close(MLD); // 釋放模擬負載
return TRUE;
}
}
ResetModem();
Close(MLD);
fLockRequest=1;
IDLE;
IDLE;
pReadNumber=0;
pWriteNumber=0;
while(fLockContinue)
IDLE;
Delay5MS(5);
return TRUE;
}
void NewGetDiscount(void)
{
byte i;
byte bNum;
byte aTemp[2];
byte bHour,bMinute;
byte bDiscountPart,bWeek;
memset(aParaBuf,100,4);
WaitRTC();
Page(6);
bWeek=(XBYTE[0xc006]&0x0f)-1;
if(bWeek==0)
bWeek=7; //范圍為1-7
bHour=XBYTE[0xc004];
bMinute=XBYTE[0xc002];
Page(5);
if(bDayPartCode>32)
return;
iAddress=NEW_DISCOUNT_ADDR;
ReadBytes(1,2);
iParaWord+=NEW_DISCOUNT_ADDR;
if(iParaWord>NEW_IDD_CLASS_ADDR)
return;
Page(1);
//查找日分時段方案代碼
while(TRUE){
i=XBYTE[iAddress]; //日分時段代碼
if(i==bDayPartCode)
break;
if(i>32){ //找不到折扣方案,則不打折
Page(5);
return;
}
iAddress+=XBYTE[iAddress+1]; //找下一個日分時段代碼
if(iAddress>iParaWord){
Page(5);
return;
}
}
iAddress+=2; //指向起始星期
//查找當前時間使用何種分時段方案
while(TRUE){
if(iAddress>iParaWord){
Page(5);
return;
}
aTemp[0]=XBYTE[iAddress];
aTemp[1]=XBYTE[iAddress+1];
if((aTemp[0]>0)&&(aTemp[1]<8)){
if((bWeek<aTemp[0])||(bWeek>aTemp[1])){
iAddress+=(XBYTE[iAddress+2]*3)+3;
continue;
}
break;
}
if(aTemp[0]==0x0f) //此方案為節假日使用,不用檢查星期
break;
Page(5);
return;
}
iAddress+=2;
//查找日分時段方案的折扣率方案
bNum=XBYTE[iAddress++];
iAddress+=(uint)(bNum*3); //倒著判斷
bDiscountPart=0xff;
for(i=0;i<bNum;i++){
iAddress-=3;
aTemp[0]=XBYTE[iAddress];
aTemp[1]=XBYTE[iAddress+1];
if((bHour>aTemp[0])||
((bHour==aTemp[0])&&(bMinute>=aTemp[1]))){
bDiscountPart=XBYTE[iAddress+2];
break;
}
}
if(bDiscountPart==0xff){ // add 0301
Page(5);
return;
}
//節假日表首址
iAddress=iParaWord;
ReadBytes(1,1);
bNum=bParaByte;
if(bNum>32)
return;
iAddress+=(uint)(bParaByte*8);
//折扣率方案表首地址
ReadBytes(1,1);
bNum=bParaByte;
if((bNum>32)||(bDiscountPart>bNum)) //折扣率代碼超過了折扣率數量
return;
for(i=0;i<bNum;i++){
Page(1);
if(XBYTE[iAddress]==bDiscountPart)
break;
iAddress+=5;
}
Page(5);
if(i==bNum)
return; //查完了整個折扣率表,仍沒有找到相應的折扣率代碼
iAddress++;
ReadBytes(1,4); //取出折扣率save in aParaBuf[]中
}
bool JudgeCallStation(void)
{
byte i,j;
byte aTemp[16];
iAddress=NEW_CALLSTATION_ADDR; //尋呼臺參數表首址
ReadBytes(1,1);
if(bParaByte>32)
return 0;
for(i=0;i<bParaByte;i++){
//取出call臺號碼
ReadBytes(1,8);
for(j=0;j<8;j++){
aTemp[2*j]=aParaBuf[j]>>4;
aTemp[2*j+1]=aParaBuf[j]&0x0f;
}
if(aTemp[0]==0x0f)
return 0;
//判斷所撥號碼是否為Call臺號碼
for(j=0;j<16;j++){
if(aTemp[j]==0x0f)
return 1;
if(aTemp[j]!=aNumBuf[j])
break;
}
//比較下一個Call臺號碼
iAddress+=8;
}
return 0;
}
/*************************************************************
*
* Function Name: CallStation
* Function: call臺號碼分析
* OutPut: 若所撥號碼為call號碼,返回 1,
* 若所撥號碼不為call號碼,返回 0
*
*
*
**************************************************************/
void CallStation(void)
{
byte i,j;
byte aTemp[16];
bool fCallCode=0;
if((!fWorkMode)||(bStationFDLength==0)
||(pWriteNumber<bStationFDLength))
return;
iAddress=NEW_CALLSTATION_ADDR; //尋呼臺參數表首址
ReadBytes(1,1);
if(bParaByte>32)
return;
for(i=0;i<bParaByte;i++){
//取出call臺號碼
ReadBytes(1,8);
for(j=0;j<8;j++){
aTemp[2*j]=aParaBuf[j]>>4;
aTemp[2*j+1]=aParaBuf[j]&0x0f;
}
if(aTemp[0]==0x0f)
return;
//判斷所撥號碼是否為call臺號碼
for(j=0;j<16;j++){
if(aTemp[j]==0x0f){
fCallCode=1;
break;
}
if(aTemp[j]!=aNumBuf[j])
break;
}
if(fCallCode)
break;
//比較下一個call臺號碼
iAddress+=8;
}
//為call臺號碼,則發取消碼
if(fCallCode){
ReadBytes(1,8);
for(j=0;j<8;j++){
aTemp[2*j]=aParaBuf[j]>>4;
aTemp[2*j+1]=aParaBuf[j]&0x0f;
}
Close(RLY);
Open(POWER_ON);
//發送取消碼
MD_CLK=0;
Open(POWER_ON);
WriteModem(CR1,0x00);
WriteModem(CR0,0x1a);
//延時后發取消碼
if(iCancelCodeDelay>4000)
iCancelCodeDelay=4000;
if(iCancelCodeDelay==0)
cbDelaySecond=1;
else
cbDelaySecond=(byte)(iCancelCodeDelay/200);
j=(byte)(iCancelCodeDelay%200);
if(j!=0)
cbDelaySecond++;
cbDelaySecond++;
fDelaySecond=0;
while(!fDelaySecond){
for(j=0;j<16;j++){
if(aTemp[j]==0x0f)
break;
if(aTemp[j]==0)
aTemp[j]=0x0a;
WriteModem(TR,aTemp[j]);
WriteModem(CR0,0x1a);
i=ReadModem(TR);
WriteModem(TR,(i|0x10));
Delay5MS(21);
i=ReadModem(TR);
WriteModem(TR,(i&0xef));
WriteModem(CR0,0x00);
Delay5MS(20);
}
Delay5MS(40);
}
ResetModem();
Close(POWER_ON);
}
}
/*************************************************************
*
* Function Name: DisableNumAnaly(void)
* Function: 禁撥號碼分析
* OutPut: 若所撥號碼為禁撥號碼,返回 1
* 若所撥號碼為可撥號碼,返回 0
*
*
*
**************************************************************/
bool DisableNumAnaly(void)
{
byte i,j;
byte aTemp[8];
iAddress=0xee00;
for(i=0;i<8;i++){
ReadBytes(1,4);
for(j=0;j<4;j++){
aTemp[2*j]=aParaBuf[j]>>4;
aTemp[2*j+1]=aParaBuf[j]&0x0f;
}
if(aTemp[0]==0x0c)
break;
if(memcmp(aTemp,aNumBuf,8)==0x00)
return TRUE;
}
return FALSE;
}
/****************************************************************
*
* Function Name: GetDiscount()
* Function: 查找當前時刻折扣率,返回之
*
*
*****************************************************************/
byte code aHMTcode[]={0,0,8,5,2, // HongKong Zone Code
0,0,8,5,3, // Macau Zone Code
0,0,8,8,6}; // TaiWan Zone Code
byte OldGetDiscount(void)
{
byte i;
byte bTemp;
uint iTemp;
bool fFirst=0,fDayDiscount;
//判斷三時段設置
AutoReadPara(51);
if((bParaByte&0x04)!=0){ //三時段設置打開
WaitRTC();
Page(6);
bTemp=XBYTE[0xc004];
Page(5);
if((bParaByte&0x10)!=0) //新疆專用
i=2;
else
i=0;
if((bTemp>=i)&&(bTemp<(i+7))){
switch(bIDL){
case 1: //國內電話三時段折扣率都為30%
if((bParaByte&0x80)!=0){ //浙江專用,附加費固定為10
iF1Tariff=10;
bClass&=0xfd; //不打折,&11111101
}
return(30);
case 2: //國際電話除港澳臺以外,三時段折扣率為60%
fDayDiscount=1;
for(i=0;i<3;i++){
if(memcmp(&aNumBuf,&aHMTcode[5*i],5)==0x00)
fDayDiscount=0;
}
if(fDayDiscount)
return(60);
break;
default: //本地電話無三時段
break;
}
}
}
//判斷特定折扣率
switch(bIDL){ //Get Out Special Discount
case 0:
iTemp=0xebf0;
break;
case 1:
iTemp=0xebe6;
break;
case 2:
iTemp=0xebdc;
break;
}
fDayDiscount=0;
fFirst=1;
while(1){
iAddress=iTemp;
ReadBytes(1,5);
if(fFirst&&(JudgeCC(5))){
ReadBytes(1,5); //起始 年月日均為CC的情況
if(JudgeCC(5)){ //起始、終止 年月日均為CC的情況
aParaBuf[0]=ReadByte(iTemp+3,1);
aParaBuf[1]=ReadByte(iTemp+4,1);
aParaBuf[2]=ReadByte(iTemp+8,1);
aParaBuf[3]=ReadByte(iTemp+9,1);
if(CheckTabSpecial())
fDayDiscount=1;
break;
}
fFirst=0;
continue;
}
if(CheckTable(5)){
ReadBytes(1,5);
if(!CheckTable(5))
fDayDiscount=1;
}
break;
}
if(fDayDiscount||fHoliday){ //節假日或特定折扣的情況下
switch(bIDL){ //Get Out Special Discount
case 0:
iAddress=0xebff;
break;
case 1:
iAddress=0xebfd;
break;
case 2:
iAddress=0xebfb;
break;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -