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

📄 jbmcall.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
📖 第 1 页 / 共 4 页
字号:
/*************************************************************
*
*       Function Name:  MasterCall()
*       Function:       主叫程序
*
*
*
**************************************************************/

//#pragma SRC

#include <jbMcall.h>

void OldMasterCall(void)
{
    byte i;
    byte bMasterStatus=0x20;
	bool fCountSC;										// 四川计费方式
    bool fDelayCount;
	bool fF0Add,fF1Add,fF3Add;
	uint xdata iSCFee,iTemp;
	
    while(1){
        switch(bMasterStatus){
        case 0x20:
            pWriteNumber=0;
            pReadNumber=0;
            memset(aNumBuf,0x0c,16);
            DispClr();
            DispSymbol(LARGE_HOOK);
            if(!DetectDialTone()){						// 检测拨号音
                bMasterStatus=0x25;
                break;
            }
            fDelayCount=0;
            fDelayLock=0;
            cbDelaySecond=2;
            fDelaySecond=0;
            bDialType=0;								// 用于混合防盗
            bClass=0xff;
            fFanjiRequest=1;
            fFanJi=0;
            while(1){
                IDLE;
                if(OnHook()){
                    bMasterStatus=0x25;
                    break;
                }
                if(fDelayCount&&fDelaySecond){
                    bMasterStatus=0x25;
                    break;
                }
                if(bClass==1);
                else if(RecNumber()){
					DispNum(SmallLcd);
					pReadNumber++;
                    if(!fDelayCount){
                    	fDelaySecond=0;
                        cbDelaySecond=2;
                    }
                    if((aNumBuf[0]==2)&&(aNumBuf[1]==0)&&(aNumBuf[2]==0))
                    	bClass=1;
                }
                if((!fDelayCount)&&fDelaySecond&&(pReadNumber>2)){
                    cbDelaySecond=100;
                    fDelayCount=1;              		// 若60秒钟内没有按键,启动定时
                    fDelaySecond=0;
                }
                if(DisableNumAnaly()){					// 若是禁拨号码,锁机退出
   	                bMasterStatus=0x25;
       	            break;
                }
                if(pReadNumber>2){
                	JudgeCallKind();
                    if((fLOCCallLimit&&(bIDL==0))||
                       (fDDDCallLimit&&(bIDL==1))||
                       (fIDDCallLimit&&(bIDL==2))){
    	                bMasterStatus=0x25;
	                    break;

                    }
                    //反极计费的前提是国内电话号码不小于6位,国际电话号码不小于8位
                    if(fFanJi){
                    	if(((bIDL==1)&&(pReadNumber<5))||
                    	   ((bIDL==2)&&(pReadNumber<7))){
                    	   	fFanjiRequest=1;
                    	   	fFanJi=0;
                    	}
                    	else{
                        	bMasterStatus=0x21;
                        	break;
                        }
                    }
                    if(fHanderEnable&&fKey){           //在手动计费状态下,启动计费
                        fKey=0;
                        if(bKeyBuf==K4){
                            bMasterStatus=0x21;
                            break;
                        }
                    }
                }
                else{
                 	if(fKey){
	                	fKey=0;
    	            	if(cbKey>30);
        	        	else if(bKeyBuf==K4){
            	    		fLockRequest=1;
                			bMasterStatus=0x26;
                			break;
                		}
                	}
                	if(fFanJi){
                		fFanJi=0;
                		fFanjiRequest=1;
                	}
                }
            }
            break;

        case 0x21:                              	//开始主叫初始计费
        	Open(POWER_ON);
            SaveCurrentTime();
            lTotalTariff=0;
            iTotalTime=0;
            fF0Add=1;
           	fF1Add=0;
            fF3Add=0;
            lTotalF0=0;
            lTotalF1=0;
            lTotalF2=0;
            lTotalF3=0;
            bMasterStatus=0x22;
            break;

        case 0x22:
        	OldCheckHoliday();						//查节假日表
			OldNo2Tariff();        					//查第二费率时间表
           	OldGetTariff();
            i=OldGetDiscount();						//查折扣率方案表,计算各项折扣率
            if(i<100)			//&&(bClass!=0))	//折扣率小于100且设置折扣项
            	DispSymbol(LARGE_HALFPRICE);
            else
            	DispSymbol(LARGE_ALLPRICE);
    		if((bClass&0x01)==0x01)
   	    		iF0Tariff=FeeCalc(iF0Tariff,i);
   			if((bClass&0x02)==0x02)
       			iF1Tariff=FeeCalc(iF1Tariff,i);
       		if((bClass&0x08)==0x08)
       			iF3Tariff=FeeCalc(iF3Tariff,i);

       		//对服务费的处理
			if((bIDL!=0)&&
				(iF2Tariff>0)&&(iF2Tariff<10)){		//判断四川计费方式
       			fCountSC=1;
       		}
       		else{
       			fCountSC=0;
	   			if((bClass&0x04)==0x04)
    	   			iF2Tariff=FeeCalc(iF2Tariff,i);
    	   	}
            if(fF0Add){								//初始收费
           		TotalAdd(iF0Tariff);				//收F0费(基本费)
            	TotalAdd(iF1Tariff);				//收F1费(附加费)
           		lTotalF0=iF0Tariff;					//统计F0费(基本费)
            	lTotalF1=iF1Tariff;					//统计F1费(附加费)
            	if(fCountSC){						//计算四川方式的服务费
            		i=(byte)(iF2Tariff);
            		i*=5;
            		iF2Tariff=(uint)(lTotalF0+lTotalF1);
            		iF2Tariff=FeeCalc(iF2Tariff,i);
            		if(iF2Tariff<100)
            			iF2Tariff=100;
            		iSCFee=iF2Tariff;
            	}
            	TotalAdd(iF2Tariff);				//收F2费(服务费)
           		TotalAdd(iF3Tariff);				//收F3费
				lTotalF3=iF3Tariff;					//统计F3费
            	if(f3Plus1){
	           		TotalAdd(iF3Tariff);			//收F3费
    	       		TotalAdd(iF3Tariff);			//收F3费
	            	F3TotalAdd();
    	        	F3TotalAdd();
            	}
            	lTotalF2=iF2Tariff;					//统计F2费(服务费)
				//取出提前计时时长
	            iTotalTime=bResetTime;
           		cbDelaySecond=bFTime;
        	    if(bResetTime!=0)
            		cbDelaySecond++;
            	if(bFTime==0);
            	else if(bResetTime<=bFTime)	   		//提前计时时长与计费时长之关系
            		cbDelaySecond-=bResetTime;
            	else if(bResetTime==(bFTime+1)){
	            	cbDelaySecond--;
    	        	TotalAdd(iF1Tariff);
        	    }
	            else{
    	        	cbDelaySecond-=bResetTime%bFTime;
        	    	i=bResetTime/bFTime;
            		do{
            			TotalAdd(iF0Tariff);
            			TotalAdd(iF1Tariff);
            		}while(--i!=0);
            	}
        	    fDelaySecond=0;
        	    fDelay5MS=1;
        	    fSecond=0;
            	fF0Add=0;
            }
            if(fF1Add){
            	cbDelaySecond=bFTime;
            	fF1Add=0;
            	TotalAdd(iF0Tariff);				//收F0费(基本费)
            	TotalAdd(iF1Tariff);				//收F1费(附加费)
            	F0TotalAdd();						//F0费合计
            	F1TotalAdd();						//F1费合计
            	if(fCountSC){
            		i=(byte)(iF2Tariff);
            		i*=5;
            		iF2Tariff=(uint)(lTotalF0+lTotalF1);
            		iF2Tariff=FeeCalc(iF2Tariff,i);
            		if(iF2Tariff<100)
            			iF2Tariff=100;
            		if(iF2Tariff>iSCFee){
            			iTemp=iF2Tariff;
            			iF2Tariff-=iSCFee;
            			TotalAdd(iF2Tariff);
            			F2TotalAdd();
	            		iSCFee=iTemp;
            		}
            	}
            }
            if(fF3Add){
            	TotalAdd(iF3Tariff);				//收F3费
            	F3TotalAdd();
            	fF3Add=0;
            }
           	DispCharge(lTotalTariff,1);               //在大、小显示器上显示话费
           	DispCharge(lTotalTariff,2);
            DispTime(iTotalTime);                     //在大显示器上显示通话时间
            while(1){
				IDLE;
                if(fSecond){
                    fSecond=0;
	                DispTime(++iTotalTime);           //在大显示器上显示通话时间
	                //提前计时时长存入变量, 以判断通话时长是否要减一
	                if(bResetTime!=0x00)
	                	iTotalTime--;
	                //计算收3+1或3+3费(F3费)的时间是否到
	                if(iTotalTime>179){
		                if(f3Plus1){
	               		 	if(((iTotalTime-180)%60)==0x00)
	                			fF3Add=1;
	                	}
	                	else{
	                		if((iTotalTime%180)==0x00)
	                			fF3Add=1;
	                	}
	                }
	                if(bResetTime!=0x00)
	                	iTotalTime++;
	                //计算收F1费的时间是否到
                    if(fDelaySecond){
                    	fDelaySecond=0;
                    	fF1Add=1;
        		    }
        		    //判断是否要进行收费了
        		    if(fF1Add||fF3Add)
        		    	break;
                }
                if(KeyPro()||OnHook()){
                   	bMasterStatus=0x24;
                   	break;
                }
                Flash(1);
            }
            break;

        case 0x24:
        	if(iTotalTime==0)					//解决通话时长为零的情况
                DispTime(++iTotalTime);         //在大显示器上显示通话时间
            if(fEndLockEnable){
            	DispSymbol(LARGE_LOCK);
            	fLocked=1;
            }
            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=30;
            fDelaySecond=0;
            pReadNumber=0;
            pWriteNumber=0;
			bStatusWord=S_OLDLOCKWAIT;
			return;

		case 0x25:
			fLockRequest=1;
            fDelaySecond=1;
			bStatusWord=S_OLDLOCKWAIT;
			return;

		case 0x26:
			fLocked=1;
			fDelaySecond=1;
			DispSymbol(LARGE_LOCK);
			bStatusWord=S_OLDLOCKWAIT;
			return;
		}
    }
}

void NewMasterCall(void)
{
    byte bMasterStatus=0x20;
    bool fDelayCount;
	bool fF0Add,fF1Add,fF2Add,fF3Add;
	byte xdata bCallStart;
    while(1){
        switch(bMasterStatus){
	    case 0x20:
            pWriteNumber=0;
            pReadNumber=0;
    	    memset(aNumBuf,0x0c,16);
            DispClr();
            DispSymbol(LARGE_HOOK);
            if(!DetectDialTone()){						//检测拨号音
                bMasterStatus=0x25;
                break;
            }
            /*
            AutoReadPara(34);
            if(bParaByte!=0)
            	Open(MLD);
            */
            fFanjiRequest=1;
            fFanJi=0;
            fDelayCount=0;
            fDelayLock=0;
            cbDelaySecond=2;
            fDelaySecond=0;
            bDialType=0;
            bClass=0xff;
            fiDelaySecond=0;
            ciDelaySecond=0xffff;
            bQueryFee=0;
            bCallStart=0;
            bIs201=0;									// 2001-04-05 19:25 add
            while(1){
                IDLE;
                if(OnHook()){						//HooKoff
                	if(bCallStart)
                		CallStation();				//寻呼台号码分析
                    bMasterStatus=0x25;
                    break;
                }
                /*去掉定时锁机功能 2001-03-12 13:54
                if(fDelayCount&&fDelaySecond){		//自动挂机定时到
                    bMasterStatus=0x25;
                    break;
                }
                */
   	        	if((bClass==1)||(bClass==2)||(bIs201==1)){				// 免费或特服号码时 add 2001-04-05 19:25
   	        		if(pReadNumber<pWriteNumber){						// 2001-04-05 20:00
   	        			pWriteNumber--;
   	        			aNumBuf[pReadNumber]=0x0c;
   	        		}
   	        	}		
                else if(RecNumber()){
					DispNum(SmallLcd);
					pReadNumber++;
                    if(!fDelayCount){
                    	fDelaySecond=0;
                        cbDelaySecond=2;
                    }
                	JudgeCallKind();
	                NewCheckHoliday();
    	        	NewNo2Tariff();
    	        	//if(bQueryFee!=1)
   	    	    		NewGetTariff(1);
	               	if(bClass==0){  				//若是禁拨号码,锁机退出
   		               	bMasterStatus=0x25;
       		           	break;
           		    }
           		    // 在拨号到达一定位数时,打开模拟负载,进行CALL台防盗 00-12-8 13:47
           		    if((bCallStart==0)&&(bStationFDLength>=3)&&(pReadNumber>=bStationFDLength)){
           		    	bCallStart=1;
           		    	if(JudgeCallStation())			//判断所拨的号码是否是CALL台的号码
           		    		Open(MLD);
           		    }
                }
                if((!fDelayCount)&&fDelaySecond&&
                  (pReadNumber>2)){
                    cbDelaySecond=100;
                    fDelayCount=1;      				//若2秒钟内没有按键,启动60秒自动挂机定时
                    fDelaySecond=0;
   	        		ciDelaySecond=iAutoDelayTime;
       	    		fiDelaySecond=0;
                }
                if(pReadNumber>2){
                    if((fLOCCallLimit&&(bIDL==0))||
                       (fDDDCallLimit&&(bIDL==1))||
                       (fIDDCallLimit&&(bIDL==2))){
    	                bMasterStatus=0x25;
	                    break;
                    }
                    //反极计费和延时计费的前提是;
                    //国内电话号码不小于6位,国际电话号码不小于8位,本地号码不小于3位
                    if(fFanJi||fiDelaySecond){
                    	if(((bIDL==1)&&(pReadNumber<5))||
                    	   ((bIDL==2)&&(pReadNumber<7))){
                    	   	if(fFanJi){
                    	   		fFanjiRequest=1;
                    	   		fFanJi=0;				//重新等反极
                    	   	}
                    	}
                    	else{
	                    	if(fFanJi)
	                    		bStartMode=0;
	                    	else
	                    		bStartMode=3;
                        	bMasterStatus=0x21;
                        	break;
                        }
                    }
                    if(fHanderEnable&&fKey){            //在手动计费状态下,启动计费
                        fKey=0;
                        if(bKeyBuf==K4){
                        	bStartMode=1;
                            bMasterStatus=0x21;
                            break;
                        }
                    }
                }
                else{
                 	if(fKey){
                		fKey=0;
                		if(cbKey>30);
                		else if(bKeyBuf==K4){
                			fLockRequest=1;
	                		bMasterStatus=0x26;
        	        		break;
    	            	}
    	            }
                	if(fFanJi){
                		fFanJi=0;
                		fFanjiRequest=1;
                	}
                }
            }
            break;

        case 0x21:                             		//开始主叫初始计费
        	Close(MLD);
        	Open(POWER_ON);
            SaveCurrentTime();
            lTotalTariff=0;
            iTotalTime=0;
            fF0Add=1;
           	fF1Add=0;
            fF2Add=0;
            fF3Add=0;
            lTotalF0=0;
            lTotalF1=0;
            lTotalF2=0;
            lTotalF3=0;
			bQueryFee=0;
            bMasterStatus=0x22;
            break;

        case 0x22:
        	NewCheckHoliday();						//查节假日表
			NewNo2Tariff();        					//查第二费率时间表
           	NewGetTariff(0);
           	if(bClass==0){
           		bMasterStatus=0x24;
           		break;
           	}
   	        if(bClass==1){
   	        	bMasterStatus=0x23;
   	        	break;
   	        }
   	        NewGetDiscount();		    			//查折扣率方案表,计算折扣率存储在aParaBuf[]中
			iF0Tariff=FeeCalc(iF0Tariff,aParaBuf[0]);
			iF1Tariff=FeeCalc(iF1Tariff,aParaBuf[1]);
			iF2Tariff=FeeCalc(iF2Tariff,aParaBuf[2]);
			iF3Tariff=FeeCalc(iF3Tariff,aParaBuf[3]);
			if((aParaBuf[0]<100)||(aParaBuf[1]<100)||
			   (aParaBuf[2]<100)||(aParaBuf[3]<100))
			    DispSymbol(LARGE_HALFPRICE);
			else
				DispSymbol(LARGE_ALLPRICE);
            if(fF0Add){								//初始收费
            	TotalAdd(iF0Tariff);				//收F0费
            	TotalAdd(iF2Tariff);				//收F2费
           		TotalAdd(iF3Tariff);				//收F3费
            	lTotalF3=iF3Tariff;
            	if(f3Plus1){
            		TotalAdd(iF3Tariff);			//收F3费
            		TotalAdd(iF3Tariff);			//收F3费
	            	F3TotalAdd();
	            	F3TotalAdd();
            	}
            	lTotalF0=iF0Tariff;
           		lTotalF1=0;
            	lTotalF2=iF2Tariff;
				//取出提前计时时长
	            iTotalTime=iResetTime;
           		if(iT0Time==0){						//T0时长为0时,将立即收F1费
           			TotalAdd(iF1Tariff);
           			F1TotalAdd();
           			iT0Time=iT1Time;
           		}
           		ciDelaySecond=iT0Time;
            	ciiDelaySecond=iT2Time;
        	    if(iTotalTime!=0)
            		ciDelaySecond++;
            	if(iT0Time==0);
            	else if(iTotalTime<=iT0Time)	   	//提前计时时长与计费时长之关系
            		ciDelaySecond-=iTotalTime;
            	else if(iTotalTime==(iT0Time+1)){
	            	ciDelaySecond--;
    	        	TotalAdd(iF1Tariff);
        	    }
        	    fiDelaySecond=0;
            	fiiDelaySecond=0;
        	    fDelay5MS=1;
        	    fSecond=0;
            	fF0Add=0;
            }
            if(fF1Add){
            	TotalAdd(iF1Tariff);				//收F1费
            	F1TotalAdd();
            	ciDelaySecond=iT1Time;
            	fF1Add=0;
            }
            if(fF2Add){
            	TotalAdd(iF2Tariff);				//收F2费
            	F2TotalAdd();
            	ciiDelaySecond=iT2Time;
            	fF2Add=0;
            }
            if(fF3Add){
            	TotalAdd(iF3Tariff);				//收F3费
            	F3TotalAdd();
            	fF3Add=0;
            }
           	bMasterStatus=0x23;
           	break;

⌨️ 快捷键说明

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