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

📄 jbmcall.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
📖 第 1 页 / 共 4 页
字号:
		ReadBytes(1,1);
		return(bParaByte);
	}
	//以下判断日常折扣情况
    iAddress=0xebd8;                          	// Get Out Usuall Day Discount
    ReadBytes(1,4);
	if(CheckTabSpecial())
		fDayDiscount=1;
    WaitRTC();
	Page(6);
    bTemp=(XBYTE[0xc006]&0x0f)-1;
    Page(5);
    iAddress=0xec00;
    ReadBytes(1,1);								//读周六、周日折扣控制
	if((((bParaByte&0x01)!=0)&&(bTemp==0x06))
	 ||(((bParaByte&0x02)!=0)&&(bTemp==0x00)))
		fDayDiscount=1;
    bParaByte=100;
    if(fDayDiscount){
        switch(bIDL){
            case 0:
            	iAddress=0xebfe;
            	break;

            case 1:
            	iAddress=0xebfc;
            	break;

            case 2:
            	iAddress=0xebfa;
            	break;
        }
        ReadBytes(1,1);
    }
    return bParaByte;
}

/*******************************************************************
*
*
*		功  能:检查当前时间是否到了使用第二费率率表的时间
*		返回1 :使用第二费率表
*		返回0 :使用第一费率表
*
*
********************************************************************/

void NewNo2Tariff(void)
{
	/*
	fNo2Tariff=0;
	iAddress=PARA_21;
	ReadBytes(1,1);					//读年高位
	ReadBytes(1,5);
	aParaBuf[5]=bParaByte;
    if(CheckTable(6)){
		ReadBytes(1,1);				//读年高位
    	ReadBytes(1,6);
		aParaBuf[5]=bParaByte;
       	if(!CheckTable(6))
       		fNo2Tariff=1;
   	}
	*/

	fNo2Tariff=0;
	iAddress=PARA_21+1;
	ReadBytes(1,5);
    if(JudgeCC(5)){									// 起始年月日为CC
    	iAddress++;
		ReadBytes(1,5);
       	if(JudgeCC(5)){								// 终止年月日也为CC
   	    	aParaBuf[0]=ReadByte(PARA_21+4,1);		// 只比较分
   	    	aParaBuf[1]=ReadByte(PARA_21+5,1);
   	    	aParaBuf[2]=ReadByte(PARA_22+4,1);
   	    	aParaBuf[3]=ReadByte(PARA_22+5,1);
       		if(CheckTabSpecial())
       			fNo2Tariff=1;
       		return;
       	}
   	}
	iAddress=PARA_21;
	ReadBytes(1,1);									// 读年高位
	ReadBytes(1,5);
	aParaBuf[5]=bParaByte;
    if(CheckTable(6)){
		ReadBytes(1,1);								// 读年高位
    	ReadBytes(1,6);
		aParaBuf[5]=bParaByte;
       	if(!CheckTable(6))
       		fNo2Tariff=1;
   	}
}

void OldNo2Tariff(void)
{
	fNo2Tariff=0;
	iAddress=PARA_213;
	ReadBytes(1,4);
    if(JudgeCC(4)){									//起始年月日为CC
   		ReadBytes(1,4);
       	if(JudgeCC(4)){								//终止年月日也为CC
   	    	aParaBuf[0]=ReadByte(iAddress-5,1);		//只比较分
   	    	aParaBuf[2]=ReadByte(iAddress-1,1);
   	    	aParaBuf[3]=aParaBuf[1]=0;
       		if(CheckTabSpecial())
       			fNo2Tariff=1;
       		return;
       	}
       	iAddress=PARA_213;
       	ReadBytes(1,4);
   	}
   	aParaBuf[4]=0;
    if(CheckTable(4)){
    	ReadBytes(1,4);
    	aParaBuf[4]=0;
       	if(!CheckTable(4))
       		fNo2Tariff=1;
   	}
}

bool JudgeCC(byte bLength)
{
	byte p2[5];
	memset(p2,0xcc,5);
	if(memcmp(p2,aParaBuf,bLength)==0x00)
		return FALSE;
	if(memcmp(p2,aParaBuf,3)==0x00)
		return TRUE;
	return FALSE;
}

/*************************************************************
*
*       Function Name:  CheckTabSpecial()
*       Function:       比较当前时刻是否在折扣时间之中
*       InPut:          折扣时间(*p)
*						aParaBuf[0]:时(起始)
*						aParaBuf[1]:分(起始)
*						aParaBuf[2]:时(结束)
*						aParaBuf[3]:分(结束)
*       OutPut:         若当前时刻为扣时间(*aParaBuf),则返回 1
*                       若当前时刻不为折扣时间(*aParaBuf),则返回 0
*
**************************************************************/
bool CheckTabSpecial(void)
{
	byte bHour,bMinute;
	WaitRTC();
	Page(6);
	bHour=XBYTE[0xc004];
    bMinute=XBYTE[0xc002];			// p[4]      p[0] p[1]         p[2] p[3]
    Page(5);
	if((aParaBuf[0]==0xcc)&&(aParaBuf[2]==0xcc)){  		// StartTime: cc   **  EndTime: cc   **
		if(aParaBuf[1]<=aParaBuf[3]){
			if((bMinute>=aParaBuf[1])&&(bMinute<aParaBuf[3]))
				return 1;
		}
		else{
			if((bMinute>=aParaBuf[1])||(bMinute<aParaBuf[3]))
				return 1;
		}
		return 0;
	}														// p[4] p[0] p[1]      p[2] p[3]
	if((aParaBuf[0]==0xcc)&&(aParaBuf[3]==0xcc)){			// StartTime: cc   **  EndTime: **  cc
		if((bMinute>=aParaBuf[1])&&(bHour<aParaBuf[2]))
			return 1;
		return 0;
	}
	if((aParaBuf[1]==0xcc)&&(aParaBuf[2]==0xcc)){			// StartTime: **   cc  EndTime: cc  **
		if((bHour>=aParaBuf[0])&&(bMinute<aParaBuf[3]))
			return 1;
		return 0;
	}
	if((aParaBuf[1]==0xcc)&&(aParaBuf[3]==0xcc)){			// StartTime: **   cc  EndTime: **  cc
		if(aParaBuf[0]<=aParaBuf[2]){
			if((bHour>=aParaBuf[0])&&(bHour<aParaBuf[2]))
				return 1;
		}
		else {
			if((bHour>=aParaBuf[0])||(bHour<aParaBuf[2]))
				return 1;
		}
		return 0;
	}
	if((aParaBuf[0]<aParaBuf[2])||
	  ((aParaBuf[0]==aParaBuf[2])&&
	   (aParaBuf[1]<=aParaBuf[3]))){
		if(((bHour>aParaBuf[0])||((bHour==aParaBuf[0])&&(bMinute>=aParaBuf[1])))&&
		   ((bHour<aParaBuf[2])||((bHour==aParaBuf[2])&&(bMinute<aParaBuf[3]))))
			return 1;
	}
	else{
		if((bHour>aParaBuf[0])
		||((bHour==aParaBuf[0])&&(bMinute>=aParaBuf[1]))
		||(bHour<aParaBuf[2])
		||((bHour==aParaBuf[2])&&(bMinute<aParaBuf[3])))
			return 1;
	}
	return 0;
}

/*************************************************************
*
*       Function Name:  CheckTable()
*       Function:       比较当前时刻是否在折扣时间之后
*       InPut:          折扣时间(*p1)、要比较时间的长度(Length)
*
*
*       OutPut:         若当前时刻大于或等于折扣时间(*p1),则返回 1
*                       若当前时刻小于折扣时间(*p1),则返回 0
*
**************************************************************/
bool CheckTable(byte bLength)
{
	byte i;
	byte aRTC[6];
	memset(aRTC,0xcc,6);
	if(memcmp(aRTC,aParaBuf,bLength)==0x00)		//是否全为CC
		return 1;
    WaitRTC();
    Page(6);
    aRTC[0]=XBYTE[0xc009];
    aRTC[1]=XBYTE[0xc008];
    aRTC[2]=XBYTE[0xc007];
    aRTC[3]=XBYTE[0xc004];
    aRTC[4]=XBYTE[0xc002];
    aRTC[5]=aUserRTCBuf[YEARH];					//由于要比较年高位的地方只有一处,
    Page(5);									//故将其单独进行比较
    if((bLength==6)&&(aParaBuf[5]<0x99)){		//bLength等于6时,要比较年高位
    	if(aRTC[5]<aParaBuf[5])
    		return FALSE;
    	else if(aRTC[5]>aParaBuf[5])
    		return TRUE;
    }
    if(aParaBuf[0]!=0xcc){
    	if((aRTC[0]>0x90)&&(aParaBuf[0]<0x80))
        	return FALSE;
    	if((aParaBuf[0]>0x90)&&(aRTC[0]<0x80))
        	return TRUE;
    }
    for(i=0;i<5;i++){
        if(aParaBuf[i]==0xcc)
            continue;
        if(aRTC[i]==aParaBuf[i])
        	continue;
        else if(aRTC[i]<aParaBuf[i])
            return FALSE;
        else
            return TRUE;
    }
    return TRUE;
}

/*****************************************************************
*
*
*       Function Name:  FeeCalc();
*       Function:       计算折扣后的费率
*
*
******************************************************************/

uint FeeCalc(uint bFee,byte bFactor)
{
    uint iTemp;
    ulint lTemp;
    if(bFactor>100)
    	bFactor=100;
    lTemp=((ulint)bFee)*((ulint)bFactor);
    iTemp=(uint)(lTemp/100);
    lTemp=lTemp%100;
    if(lTemp!=0)
        iTemp++;
    return iTemp;
}

/************************************************************
*
*       Function Name:  SaveRecord(void)
*       Function:       存储当前话单记录
*
*
*
************************************************************/

void SaveRecord(void)
{
    byte i,j;
    byte aTemp[4];
    uint xdata iTemp;
    memset(&aNumBuf[pReadNumber],0x0c,(16-pReadNumber));	//
	AutoReadPara(67);
	if(fWorkMode){
		if(!fSaveFreeTalk&&(bClass==1))
		    return;
		if(iParaWord>=500)
			iParaWord=0;
	    iAddress=NEW_BILLS_ADDR+(iParaWord*NEW_BILL_LEN);
	    if((++iParaWord)==500)
	    	iParaWord=0;
	}
	else{
		if(iParaWord>=200)
			iParaWord=0;
		iAddress=OLD_BILLS_ADDR+(iParaWord*15);
	    if((++iParaWord)==200)
	    	iParaWord=0;
	}
	AutoWritePara(67);
	if(fWorkMode){
		i=0;
		for(j=0;j<8;j++){
			aDataBuf[j]=aNumBuf[i++]<<4;
			aDataBuf[j]+=aNumBuf[i++];
		}
    	aDataBuf[8]=(byte)(iTotalTime/3600);
   		iTemp=iTotalTime%3600;
    	i=(byte)(iTemp/60);
    	aDataBuf[9]=((i/10)<<4)+(i%10);
    	i=(byte)(iTemp%60);
    	aDataBuf[10]=((i/10)<<4)+(i%10);
    	SaveFee(11,4);
    	SaveFee(14,0);
    	SaveFee(17,1);
    	SaveFee(20,2);
    	for(i=23,j=1;j<7;i++,j++)
    		aDataBuf[i]=aCallTime[j];
    	aDataBuf[29]=bStartMode;
    	i=NEW_BILL_LEN;
	}
	else{
		i=bIDL;
		switch(bIDL){
			case 0:
				aDataBuf[0]=aNumBuf[i];
				break;

			case 1:
				aDataBuf[0]=aNumBuf[i]|0x10;
				break;

			case 2:
				aDataBuf[0]=aNumBuf[i]|0x20;
				break;
		}
		i++;
		for(j=1;j<7;j++){
			aDataBuf[j]=aNumBuf[i++]<<4;
			aDataBuf[j]+=aNumBuf[i++];
		}
    	aTemp[0]=(byte)(iTotalTime&0xff);
    	aTemp[1]=(byte)((iTotalTime>>8)&0xff);
		aTemp[2]=(byte)((lTotalTariff>>16)&0xff);
    	aDataBuf[7]=(aTemp[0]>>6)&0x03;
    	aDataBuf[7]+=(aTemp[1]<<2)&0xfc;
    	aDataBuf[8]=aTemp[2]&0x03;
    	aDataBuf[8]+=(aTemp[0]<<2)&0xfc;
    	aDataBuf[9]=(byte)((lTotalTariff>>8)&0xff);
    	aDataBuf[10]=(byte)(lTotalTariff&0xff);
    	aDataBuf[11]=aCallTime[MONTH];
    	aDataBuf[12]=aCallTime[DAY];
    	aDataBuf[13]=aCallTime[HOUR];
    	aDataBuf[14]=aCallTime[MINUTE];
    	i=15;
    }
    //
    iPaNeNum=i;
    GeneralWriteData(iAddress);
    //以下判断话单是否正确被写到FLASH中
    Delay5MS(20);
    ReadData(1,iAddress,i,&aDataBuf[30]);
    if(memcmp(&aDataBuf,&aDataBuf[30],i)==0x00){	//话单写入正确
    	if((bReportWord==1)||(bReportWord==3)){
			iAddress=PARA_69;
			WriteTwoBytes(1);						//未汇报话单数加一
			// 判断是否越界
			AutoReadPara(69);
			if(fWorkMode)
				iTemp=500;
			else
				iTemp=200;
			if(iParaWord>iTemp){
				iParaWord=iTemp;
				AutoWritePara(69);
			}	
		}
		else{										//不汇报话单
			iParaWord=0;
			AutoWritePara(69);						//回报话单的数量
			AutoReadPara(67);						//更新回报话单指针
			AutoWritePara(68);
		}
	}
    else{
    	bErrorCode=ERR_22;							//FLASH被写坏报警
    	DispErrorCode();
    }
    lSubTariff+=lTotalTariff; 						//两次锁机之间的话费及通话次数统计
    iSubTimes++;
}

void SaveFee(byte bNo,byte bWhich)
{
   	ulint lTemp;
   	switch(bWhich){
   		case 0:
   			lTemp=lTotalF0;
   			break;

   		case 1:
   			lTemp=lTotalF1;
   			break;

   		case 2:
   			lTemp=lTotalF2;
   			break;

   		case 4:
   			lTemp=lTotalTariff;
   			break;

   		default:
   			return;
   	}
   	aDataBuf[bNo]=(byte)((lTemp>>16)&0xff);
   	aDataBuf[bNo+1]=(byte)((lTemp>>8)&0xff);
   	aDataBuf[bNo+2]=(byte)(lTemp&0xff);
}


/**************************************************************
 *
 *  FuncName:   SaveCurrentTime()
 *  Input:      none
 *  Output:     none
 *
 *************************************************************/

void SaveCurrentTime(void)
{
    WaitRTC();
	Page(6);
    aCallTime[YEARH]=aUserRTCBuf[YEARH];
    aCallTime[YEARL]=aUserRTCBuf[YEARL];
    aCallTime[MONTH]=aUserRTCBuf[MONTH];
    aCallTime[DAY]=aUserRTCBuf[DAY];
    aCallTime[HOUR]=aUserRTCBuf[HOUR];
    aCallTime[MINUTE]=aUserRTCBuf[MINUTE];
    aCallTime[SECOND]=aUserRTCBuf[SECOND];
	Page(5);
}
// End Function: SaveCurrentTime()

void Speaker(byte bTime)
{
    cbDelay5MS=bTime;
    fDelay5MS=0;
	Page(6);
	if(bTime>200)
    	XBYTE[RTC_CONTROLA]=0x25;
    else
    	XBYTE[RTC_CONTROLA]=0x27;
    XBYTE[RTC_CONTROLB]=0x1a;
	Page(5);
    return;
}

/***************************************************************
*
*
*       Function Name:  Falsh()
*       Function:       闪烁通话标记或秒标记
*                       fType=1 闪烁通话标记
*                       fType=0 闪烁秒标记
*
*
*****************************************************************/

void Flash(bool fType)
{
    if(cbDelay5MS==0){
        cbDelay5MS=200;
        fFlashOff=1;
    }
    if(cbDelay5MS==200){
        if(fType)
            DispSymbol(LARGE_FLASH);
        else{
            if((cbRingTimes!=0)||(cbRingPulseNum>=5));
            else{
            	aSmallBuf[2]=0x20;
            	aLargeBuf[8]=0x20;
            }
            DispOut();
        }
	}
    else if(fFlashOff&&(cbDelay5MS<100)){
    	fFlashOff=0;
        if(fType)
            DispSymbol(LARGE_UNFLASH);
        else{
            aLargeBuf[8]=0;
            aSmallBuf[2]=0;
            DispOut();
        }
	}
}

void SaveBaoBiao(void)			//lmt add 2001.3.13
{
	//byte i;
	Page(5);
	if(bIDL==2){
		iAddress=ClassIDDAddress;
		WriteTwoBytes(1);
		iAddress+=2;
		WriteTriBytes(lTotalTariff);
		iAddress=TodayIDDAddress;
		WriteTwoBytes(1);
		iAddress+=2;
		WriteTriBytes(lTotalTariff);
		iAddress=MonthIDDAddress;
		WriteTwoBytes(1);
		iAddress+=2;
		WriteTriBytes(lTotalTariff);
	}
	if(bIDL==1){
		iAddress=ClassDDDAddress;
		WriteTwoBytes(1);
		iAddress+=2;
		WriteTriBytes(lTotalTariff);
		iAddress=TodayDDDAddress;
		WriteTwoBytes(1);
		iAddress+=2;
		WriteTriBytes(lTotalTariff);
		iAddress=MonthDDDAddress;
		WriteTwoBytes(1);
		iAddress+=2;
		WriteTriBytes(lTotalTariff);
	}
	if(bIDL==0){
		iAddress=ClassLOCALAddress;
		WriteTwoBytes(1);
		iAddress+=2;
		WriteTriBytes(lTotalTariff);
		iAddress=TodayLOCALAddress;
		WriteTwoBytes(1);
		iAddress+=2;
		WriteTriBytes(lTotalTariff);
		iAddress=MonthLOCALAddress;
		WriteTwoBytes(1);
		iAddress+=2;
		WriteTriBytes(lTotalTariff);
	}
	Page(5);
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -