⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jbmcall.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
📖 第 1 页 / 共 4 页
字号:
	        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 + -