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

📄 jbmcall.c

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