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

📄 jbwait.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
📖 第 1 页 / 共 4 页
字号:
	        }
        }
	} // End while(TRUE)
}
// End function: Wait()


void CheckDTMF(void)
{
	byte i;
	if(pReadNumber<3)
		return;
	if((aNumBuf[0]==0x0a)||(aNumBuf[0]>12)){
		for(i=0;i<pReadNumber+1;i++)
			aNumBuf[i]=aNumBuf[i+1];
		pReadNumber--;
	}	
	i=aNumBuf[pReadNumber];
	if((i==0x0a)||(i>12)){
		aNumBuf[pReadNumber]=0x0c;
		pReadNumber--;
	}	
}	
/*********************************************************
*
*
*		说	明:开锁等待状态
*
*
*
*********************************************************/

void UnLockWait(void)
{
    byte bDispStatus;
    uint iTalkRecord;
    uint iTalkLocation;
    uint iTalkPointer;
    bool fFirstKey=1;
    
	if((!fUnlockStat)||fEndLockEnable){
		bStatusWord=S_NEWLOCKWAIT;
		return;
	}	
    AutoReadPara(67);									//取话单指针 
    iTalkPointer=iParaWord;
    iTalkLocation=iTalkPointer;
    iTalkRecord=iSubTimes;
	cbFangDao=200;										//关闭防盗联络音
    cbRingTimes=0;
    cbRingPulseNum=0;
    pReadNumber=0;
    pWriteNumber=0;
	bDialType=0;
	Close(POWER_ON);
    if(!fDelaySecond){
    	bDispStatus=5;									//显示话单状态
    	fMustReport=1;
    }	
    else{
    	DispClr();
    	DispSymbol(LARGE_PHONE);
	    bDispStatus=0;
	}    
    while(TRUE){
        IDLE;
        CheckFDD();
        PowerAlarm();
		if(JudgeAutoOffHook())
			return;
		if(JudgeOffHook())
			return;
        if(fLocked){
        	fDelaySecond=1;
            bStatusWord=S_NEWLOCKWAIT;    
            return;
        }
        switch(bDispStatus){
        	case 0:							
		        DispCharge(iSubTimes,3);		//此函数没有送显示,其后须紧显示函数
        		DispSymbol(LARGE_PHONE);
        		DispCharge(lSubTariff,2);
		        DispCharge(lSubTariff,0);
		        bDispStatus=6;
        		break;
        	
        	case 1:
	            DispSymbol(LARGE_UNPHONE);
                GetTalkRecord(iTalkPointer);	
                DispTalk(iTalkPointer);
                bDispStatus=4;
        		break;
        		
        	case 4:								//话单显示状态
        	case 5:								//话毕,话单显示状态
        		break;
        		
        	case 6:
        		if(fMustReport){
		            if(ReportBills())			//检查是否要汇报话单
   				    	return;
   				}    	
        		break;
        	
        	default:
        		break;	
        }
		if(fDateUpdate){
			fDateUpdate=0;
			WriteDayTotal();					//若更新日分项合计
		}
        if(fDelaySecond&&((bDispStatus==4)||(bDispStatus==5))){
            bDispStatus=0;
            DispClr();
        }
		if(!fFirstKey){
			if(bKeyBuf==0xf0)
				fFirstKey=1;
			continue;	
		}		
		if(fKey){
			fKey=0;
        	if(bDispStatus==5){		   		  	//话毕显示话单时,按任意键退出
                bDispStatus=0;					  
                DispClr();
                fFirstKey=0;
			    continue;
			}        
			switch(bKeyBuf){
				case K1:
				    if(bDispStatus==4){
				        PrintTalkRecord();
                    	fFirstKey=0;
                    }	
				    break;

				case K2:								//向前查话单
       				if(cbKey>199)
       					cbKey=150;	
                  	if(iSubTimes==0){
                   		Speaker(20);
                   		break;
                   	}	
					if(iTalkRecord!=0){
						iTalkRecord--;
		            	if((iTalkPointer--)==0)
		            		iTalkPointer=iTalkLength;	//更新查询指针
    		        }
    		        else
		                Speaker(15);    
                  	cbDelaySecond=6;
   	               	fDelaySecond=0;
       	            bDispStatus=1;
   			        break;    
    
	       		case K3:								//向后查话单
       				if(cbKey>199)
       					cbKey=150;	
                  	if(iSubTimes==0){
                   		Speaker(20);
                   		break;
                   	}	
      	       		if(iTalkRecord<iSubTimes){
	       				iTalkRecord++;
			            if(iTalkPointer==iTalkLength)	//向后查询话单
			                iTalkPointer=0;
		    	        else
		        	    	iTalkPointer++;    
    	            }    	
	   				if(iTalkRecord==iSubTimes)
	   				    iTalkRecord--;
		            if(iTalkPointer>=iTalkLocation){
		                iTalkPointer=iTalkLocation;
		                if(iTalkPointer==0)
		                	iTalkPointer=iTalkLength;
		                iTalkPointer--;
		                Speaker(15);    
    		        }
                    cbDelaySecond=6;
                    fDelaySecond=0;
                    bDispStatus=1;    
				    break;

				case K4:				//关锁,进入锁机状态
					if(cbKey>30)
						break;
					if(bDispStatus==6)
			    		fLocked=~fLocked;
				    else if(bDispStatus==4){
				    	DispClr();
				    	bDispStatus=0;
				    }	
				    break;

				default:
				    break;
			}
	    }		
    }    
}    

void GetDayAddr(byte bDayPointer)
{
	if(fWorkMode)
        iAddress=NEW_DAYTOTAL_ADDR+((uint)(bDayPointer*21))+2;
    else
    	iAddress=OLD_DAYTOTAL_ADDR+((uint)(bDayPointer*16));
    return;
}                    

bool InComingCall(void)
{
    if((cbRingPulseNum>=5)||(cbRingTimes!=0))
    	return TRUE;
    else
    	return FALSE;
}    		

/********************************************************
*
*		函数:JudgeAutoOffHook(void)
*
*		说明:判断震铃次数是否为自动摘机震铃次数
*			  若是自动摘机震铃次数,则返回TRUE,否则返回FALSE
*
*
*********************************************************/

bool JudgeAutoOffHook(void)
{
    while(1){
    	if(fCallIdValid){					// 来电号码为管理系统的号码 
			if((cbRingTimes>=1)&&(ciRingHigh>30)){
				fCallIdValid=0;
				break;
			}	
			return 0;
		}		
		if(bAutoOffHookTimes==0)			// 若振铃次数为0,就不进行自动振铃摘机 //
			return FALSE;
    	//if(cbRingTimes>=bAutoOffHookTimes)	// 若有振铃,判断是否自动振铃次数到
    	if(cbRingTimes>=2)
    		break;
    	return FALSE;
    }	
    ET2=0;
    Open(MD_CS);
    if(DetectConnectTone(2))			
		bStatusWord=S_DOWNCALL;
//	Open(POWER_ON);
	return TRUE;
}

/********************************************************
*
*		函数:JudgeOffHook(void)
*
*		说明:判断手动摘机后,是否为被叫摘机,或是否进入主叫
*			  若进入被叫或通讯程序或进入主叫程序,则返回TRUE,
*												否则返回FALSE
*
*
*********************************************************/

bool JudgeOffHook(void)
{
	if(fLockContinue)
		pWriteNumber=pReadNumber=0;
	if(!OffHook())						//若没有摘机则返回
		return FALSE;
	if(fStartFangDao)					//是否发防盗联络音
		cbFangDao=0;
	
	if(InComingCall()){					//是否有震铃
		ET2=0;			
		Open(MD_CS);	
		if(((bAutoOffHookTimes!=0)||((!fFinishFSK)&&(!fFinishDTMF))||fCallIdValid)
		   &&(DetectConnectTone(1))){
	        bStatusWord=S_DOWNCALL;
	        return TRUE;
	    }   
		bStatusWord=S_NEWSLAVECALL;
		ciiDelaySecond=1;				//不并模拟负载
		fiiDelaySecond=0;		    
	    Open(POWER_ON);    
		return TRUE;
	}
	if(fLocked){						// 若锁机,则不能进入主叫程序
		if((InBuf&0x04)||(pReadNumber<pWriteNumber)){
		    pReadNumber=pWriteNumber=0;    
		    if((!fPluseFD)&&((bDialType&0xf0)!=0));		// 脉冲防盗打无效
		    else
	          	fLockRequest=1;
	    	bDialType=0;
        }   	
        cbFangDao=200;
        return FALSE;
	}	
	if(bOffHookDelay!=0){
		if(fDetectDialTone)
			cbDelay5MS=10;
		else	
	    	cbDelay5MS=bOffHookDelay;					// 延时防盗拨号     
    	fDelay5MS=0;
        while(!fDelay5MS){
            IDLE;
            if(OnHook())
            	return FALSE;
			if((InBuf&0x04)==0x04){	//(pReadNumber<pWriteNumber)||||(cbPulseNum>0)
				if(!fLockContinue)
					fLockRequest=1;	
				pReadNumber=0;
				pWriteNumber=0;
				//cbPulseNum=0;
				cbFangDao=200;
            	return FALSE;
            }   
        }	
    }    
   	if(fWorkMode)
   		bStatusWord=S_NEWMASTERCALL;
   	else
   		bStatusWord=S_OLDMASTERCALL;
    return TRUE;	
}

void CheckFDD(void)
{
	byte bTimeCount;
	////
	if(InComingCall())
		return;
	if(OffHook()){										// 存在摘机有效时长
		ciDelaySecond=0;
		fiDelaySecond=0;
		fDaoDa=0;
	}
	else if(fFDD)										// 要检测并机防盗打
		fDaoDa=1;
	else
		fDaoDa=0;
	if(ciDaoDa!=360)
		return;
	
	//存在并线盗打
	MD_CLK=0;
	WriteModem(CR1,0x04);
	WriteModem(CR0,0x1a);
	WriteModem(TR,0x19); 			
	bTimeCount=90;
	if(++bTimes==3)
		bTimes=0;
	while((bTimeCount--)!=0){							// 持续发DTMF
		IDLE;
		if((bTimes==0)&&(bTimeCount==40)){
			Page(6);
   			XBYTE[RTC_CONTROLA]=0x27;            
   			XBYTE[RTC_CONTROLB]=0x1a;  
   			Page(5);          
		}	
	}
	Page(6);
  	XBYTE[RTC_CONTROLB]=0x12;
	XBYTE[RTC_CONTROLA]=0x26;            
   	Page(5);
	WriteModem(CR0,0x00);
	ResetModem();
	if(!fLockContinue)
		fLockRequest=1;	
}

/**********************************************************
*
*
*		说	明:汇报话单判断
*
*
***********************************************************/

bool ReportBills(void)
{
	uint iReportNum;
	if((bReportWord==1)||(bReportWord==3));
	else
		return FALSE;
	AutoReadPara(69);
	if(fWorkMode){
		AutoReadPara(6);
		if((bParaByte<1)||(bParaByte>100))
			return FALSE;
		iReportNum=(uint)(bParaByte*5);	
		if(iParaWord<iReportNum)
			return FALSE;
		bCallReason=NEW_REPORT_BILLS;
	}	
	else{
		AutoReadPara(209);
		if((bParaByte<1)||(bParaByte>200))
			return FALSE;
		iReportNum=bParaByte;
		if(iParaWord<iReportNum)
			return FALSE;
		bCallReason=OLD_REPORT_BILLS;
	}	
	if((bFailTimes>=3)&&(bFailTimes<30)){		//若未成功呼叫次数大于3次,则不再上呼
		AutoReadPara(69);
		bParaByte=(byte)(iParaWord%10);
		if(bParaByte!=0)
			return FALSE;
		bFailTimes=0;	
	}		
	bStatusWord=S_UPCALL;
	return TRUE;
}    
	
/***********************************************************************
*
*
*       Function Name:  GetTalkRecord(uint)
*       Function:       Get out the Talk record from talk store area.
*						
*
*
***********************************************************************/
void GetTalkRecord(uint iTalkPointer)
{   
    byte i=0;
    byte bTemp;
	byte j;
    byte aTemp[3];
    memset(&aNumBuf,0x0c,16);
	j=0;
    if(fWorkMode){
	    iAddress=NEW_BILLS_ADDR+(iTalkPointer*NEW_BILL_LEN);
    	Page(1);
    	for(j=0;j<8;j++){
    		bTemp=XBYTE[iAddress++];
    		if(i>15)
    			continue;
    		aNumBuf[i++]=bTemp>>4;					// 从FLASH中取数据
    		if(i>15)
    			continue;
    		aNumBuf[i++]=bTemp&0x0f;				// 从FLASH中取数据
    	}
    	aTemp[0]=XBYTE[iAddress++];	
    	aTemp[1]=XBYTE[iAddress++];	
    	aTemp[2]=XBYTE[iAddress++];	
    	aTemp[1]=(aTemp[1]>>4)*10+(aTemp[1]&0x0f);	//将BCD转换为BIN
    	aTemp[2]=(aTemp[2]>>4)*10+(aTemp[2]&0x0f);
    	iTotalTime=(uint)(aTemp[0]*3600)
    			  +(uint)(aTemp[1]*60)
    			  +aTemp[2];						//通话时长
    	ReadBytes(1,3);
    	lTotalTariff=lParaLWord;					//通话话费
    	iAddress+=9;
    	ReadBytes(1,6);
    	memcpy(&aCallTime[1],&aParaBuf,6);			//通话起始时间
    	aCallTime[0]=0x20;
    }		
    else{
    	iAddress=OLD_BILLS_ADDR+(iTalkPointer*15);  
    	Page(1);
    	if((XBYTE[iAddress]&0xf0)==0x10)
        	aNumBuf[i++]=0;
    	else if((XBYTE[iAddress]&0xf0)==0x20){
        	aNumBuf[i++]=0;
        	aNumBuf[i++]=0;        
    	}
    	aNumBuf[i++]=XBYTE[iAddress++]&0x0f;        
    	for(j=0;j<6;j++){							//取出电话号码
    		bTemp=XBYTE[iAddress++];
    		if(i>15)
    			continue;
        	aNumBuf[i++]=bTemp>>4; 
    		if(i>15)
    			continue;
        	aNumBuf[i++]=bTemp&0x0f;    
    	}
	    //Get out the Talk time.
    	aTemp[1]=XBYTE[iAddress++];            
    	aTemp[2]=XBYTE[iAddress++]; 
    	iTotalTime=(aTemp[2]>>2)&0x3f;
    	iTotalTime+=(aTemp[1]<<6)&0xc0;
    	iTotalTime+=(uint)((aTemp[1]>>2)*256);
    	aTemp[1]=XBYTE[iAddress++];            
    	aTemp[0]=XBYTE[iAddress++];            
		lTotalTariff=((ulint)aTemp[0])+((ulint)(aTemp[1]*256))
                +((ulint)((aTemp[2]&0x03)*65536));				//话费
    	for(i=2;i<6;i++)
    		aCallTime[i]=XBYTE[iAddress++];            			//通话起始时间
    	WaitRTC();	
		Page(6);
    	aCallTime[SECOND]=aUserRTCBuf[SECOND];
    	if(aCallTime[MONTH]<=aUserRTCBuf[MONTH]){				//添入打印年份
    		aCallTime[YEARH]=aUserRTCBuf[YEARH];
    		aCallTime[YEARL]=aUserRTCBuf[YEARL];
    	}	
    	else{
    		i=aUserRTCBuf[YEARL]-1;
    		if(i==0xff)
    			i=0x99;
    		else if((i&0x0f)==0x0f)	
    			i-=6;
    		aCallTime[YEARL]=i;
    		if(i>0x99)
    			aCallTime[YEARH]=0x19;
	    	else
    			aCallTime[YEARH]=0x20;	
    	}		
    }	
    Page(5);
}

⌨️ 快捷键说明

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