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

📄 jbwait.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
📖 第 1 页 / 共 4 页
字号:
 
/*************************************************************
 *
 *	文 件 名:	jbWait.c
 *	说    明:	等待状态
 *				处理:	1。监视振铃;
 *						2。监视摘机;
 *						3。更新日分项合计记录;
 *						4。查询功能。
 *	起始日期: 	99/11/16
 *
 *
 ************************************************************/

//#pragma SRC
//#pragma DEBUG

#include <jbWait.h>

extern void DispCmd(byte);

void LockWait(void)
{
	byte bTemp;
 	byte bDispStatus;
 	byte bDayTotalPointer;
 	uint iTalkPointer;
 	uint xdata iTalkRecord;
 	bool fFirstKey=1,fToday=0;
 	bool fDispD=0;
 	bool fDispLock=0,fDispUnLock=0;		// 增加变量的目的是:减少CPU在待机时的运行时间、功耗
 	bool fEnCallId;
 	bool fDispDate=0;
 	bool fCheckFSK=0;
 	bool fCheckDTMF=0;
 	bool fFlagDisapear=0;
 	
 	AutoReadPara(80);					// 是否启用来电显示功能
 	if(bParaByte==1)
 		fEnCallId=1;
 	else
 		fEnCallId=0;
 	fFinishFSK=0;						// 用于控制
 	fFinishDTMF=0;
 	cbRingTimes=0;
    cbRingPulseNum=0;
	cbFangDao=200;
	bDialType=0;
	ciDelaySecond=0;					// 用于防并机定时
	fiDelaySecond=0;
	pReadNumber=0;
	pWriteNumber=0;
    fDaoDa=0;
    ciDaoDa=0;
    bFSKWord=0;
    
    Close(POWER_ON);
    AutoReadPara(67);
    iTalkRecord=iTalkPointer=iParaWord;				    //取话单指针
    AutoReadPara(71);
    bDayTotalPointer=bParaByte;							//日分项合计指针
    if(!fDelaySecond){
    	bDispStatus=4;					// 显示话单状态
    	fMustReport=1;
    }
    else{
    	DispClr();	
	    DispSymbol(LARGE_PHONE);
		bDispStatus=0;
		fSecond=1;
 		fDispD=1;
	}   
	fCallIdValid=0;
	ET2=0;
	TR2=0;
	Open(MD_CS);
	while(TRUE){
 	    IDLE;
 	    
 		if(OffHook()||(ciDaoDa==360)||fLockContinue){		// 防止并线盗打的行为
			pWriteNumber=pReadNumber=0;
			fCheckDTMF=0;
		}
		else if((!fEnCallId)&&(bAutoOffHookTimes!=0));
		else if(!fCheckDTMF){			// 测到DTMF 
			if(pReadNumber<pWriteNumber){	 				// 开始检测DTMF //
				if(aNumBuf[0]<10){
					pReadNumber=0;
					fCheckDTMF=1;
					cbDelay5MS=100;			// 超时控制 
					fDelay5MS=0;
					fCallIdValid=0;
					fFinishDTMF=0;
				}
				else
					pWriteNumber=0;
			}
		}
		if(fCheckDTMF){
			if(pReadNumber<pWriteNumber){					// 检测到有效拨号 
				if(aNumBuf[pReadNumber]<10){
					pReadNumber++;
					cbDelay5MS=100;
					fDelay5MS=0;
				}	
				else{					// 结束符号
					fDelay5MS=1;
					fCheckDTMF=0;
				}	
			}	
			if(fDelay5MS){				// 超时出错	
				fDelay5MS=0;
				aNumBuf[pReadNumber]=0x0c;
				if(pReadNumber)
					pReadNumber--;
				CheckDTMF();
				memcpy(aDataBuf,aNumBuf,16);				// 判断来电显示号码 	
				if(fEnCallId&&(pReadNumber>1)){				// 显示来电号码 		
					memset(aLargeBuf,0,20);
					memset(aSmallBuf,0,5);
					aLargeBuf[1]|=0x08;
					ET2=0;
					DispNum(LargeLcd);
					DispNum(SmallLcd);
					AutoReadPara(81);						// 来电号码延时显示时间 
					cbDelaySecond=bParaByte;
					fDelaySecond=0;
					bDispStatus=8;							// 延时显示 
					if(CheckManagement())
						fCallIdValid=1;
					pReadNumber++;
					SaveCallId();
					pReadNumber--;
					DispDiscount();
					AutoReadPara(67);
    				iTalkRecord=iTalkPointer=iParaWord;	
					fFinishDTMF=1;
					bFSKWord=0;
				}	
				fCheckDTMF=0;
	    		pReadNumber=pWriteNumber=0;
			}
		}
		
		if(InComingCall()){
			if((bDispStatus!=0)&&(bDispStatus!=8)){
				bDispStatus=0;
            	memset(aLargeBuf,0,20);
            	DispCurrentTime();
				fDispD=1;
            	fDispLock=0;
            	fDispUnLock=0; 
            }	

			// DTMF 检测来电显示 	
			if((cbRingTimes>=1)&&(ciRingHigh>=20)){			// 若检测到振铃,就启动检测FSK信号 //
				if((!fEnCallId)&&(bAutoOffHookTimes!=0));
				else if(!fCheckFSK){
					for(bTemp=0;bTemp<55;bTemp++)			// 清缓冲区 
						aCallID[bTemp]=0;
					TR2=1;
					ET2=1;
					fCheckFSK=1;
					fDataOver=0;
					fFinishFSK=0;
					// 打开使能
					Close(MD_CS);
					// 开定时器 2,检测来电号码
				}	
				else if(fDataOver){			// 数据接收完毕 // 
					fFinishFSK=1;
					fDataOver=0;
					TR2=0;
					ET2=0;
					bFSKWord=0;				// 变量初始化 // 
					Open(MD_CS);
					//
					// 调试用,向串口发送来电显示数据
//					SCON=0x40;							// 串口工作模式1,8位UART
//   					TH1=L9600;TL1=L9600;			// 串口9600BPS定时常数
//					TR1=1;ES=1;REN=1;TI=0;RI=0;
//					for(bTemp=0;bTemp<30;bTemp++)
//						TxByte(aCallID[bTemp]);
//					REN=0;TR1=0;ES=0;
            		//
            		//
					bTemp=CheckCallID();			// 判断来电显示号码 
					if(fEnCallId&&(bTemp==2)){		// 显示来电号码 
						memset(aLargeBuf,0,20);
						memset(aSmallBuf,0,5);
						aLargeBuf[1]|=0x08;
						DispNum(LargeLcd);
						DispNum(SmallLcd);
						pReadNumber++;
						SaveCallId();
						pReadNumber--;
						AutoReadPara(67);
    					iTalkRecord=iTalkPointer=iParaWord;						
						DispDiscount();
						AutoReadPara(81);			// 延时显示时间 
						bDispStatus=8;
						cbDelaySecond=bParaByte;
						fDelaySecond=0;
					}
					else if(bTemp==1){
						while(ciRingHigh<20)
							IDLE;
						if(DetectConnectTone(2))
		    				bStatusWord=S_DOWNCALL;
//	    				Open(POWER_ON);    
						return;
					}
				}
			}
			if(!fDispUnLock){
   	    		DispSymbol(LARGE_UNLOCK);					// 若有被叫,则不显示锁机标记
   	    		fDispUnLock=1;
   	    	}
   	    	fDispLock=0;
   	    	if(!fFlagDisapear){
   	    		fFlagDisapear=1;
   	    		if(aLargeBuf[8]==0x20){
					aLargeBuf[8]=0;
            		aSmallBuf[2]=0;
            		DispOut();
            	}	
            }	   	  
   	    }
   	 	else{							// 振铃结束 
   	 		fFlagDisapear=0;
			if(fLocked){
				if(!fDispLock){
					fDispLock=1;
					DispSymbol(LARGE_LOCK);
				}
				fDispUnLock=0;
			}		

   	 		if(fCheckFSK){
	 			TR2=0;
				ET2=0;
				bFSKWord=0;
				fCheckFSK=0;
				Open(MD_CS);
			}	
			if(fFinishFSK)
				fFinishFSK=0;
		}
		if(JudgeAutoOffHook())
			return;	
        if(JudgeOffHook())
        	return;
		if(!fLocked){
			if(!fDispUnLock){
   	    		DispSymbol(LARGE_UNLOCK);					// 若有被叫,则不显示锁机标记
   	    		fDispUnLock=1;
   	    	}	
   	    	fDispLock=0;
		}	
		// 
 	    switch(bDispStatus){
 	        case 0:
				if(InComingCall()||(!fLocked));
		   	    else{
		   	    	if(!fDispLock){
       					DispSymbol(LARGE_LOCK);
       					fDispLock=1;
       				}	
       				fDispUnLock=0;
       			}	
       			if((cbRingTimes==0)||(bFSKWord<3)){			// 振铃时,不更新显示 
                	if(fSecond){
		        	    fSecond=0;
        	    	    DispCurrentTime();
        	    	    Page(6);
						if(fDispD||(XBYTE[0xc000]==0)){		// 只有在秒为0时才检查是否是折扣时间
							fDispD=0;
							Page(5);
	        		        DispDiscount();
	        		    }
	        		    Page(5);
		        	    if(fMustReport){
			    			if(ReportBills())
			    				return;
	    				}		
		        	    DispSymbol(LARGE_PHONE);
		        	}
       				Flash(0);
       			}	
		        break;
		        
		    case 1:
		    	memset(aSmallBuf,'\0',5);  
		    	fDispDate=0;
                GetTalkRecord(iTalkPointer);	
               	DispTalk(iTalkPointer);				//显示话单
       			DispSymbol(LARGE_UNLOCK);	
            	DispSymbol(LARGE_UNPHONE);
                bDispStatus=5;
                break;
                
            case 2:                					//用户累计通话次数及总话费
				memset(aLargeBuf,'\0',20);
				memset(aSmallBuf,'\0',5);
				iAddress=PARA_60;
				DispTotal(6,0);
    	        bDispStatus=6;
	            break;

	        case 3:									//日分项合计
	            memset(aLargeBuf,'\0',20);
	            memset(aSmallBuf,'\0',5);
	            //DispClr();
				if(fToday){							//当日日分项合计
					fToday=0;
					iAddress=0xc02c;
                	DispMD(6);
                	iAddress+=2;
                	DispTotal(6,1);
                }
                else{
	                GetDayAddr(bDayTotalPointer);	
	                DispMD(1);
                	iAddress+=2;
        	        DispTotal(1,1);
        	    }    
	            bDispStatus=7;
	        	break;
	        	
			case 4:									// 话毕,显示话单状态
            case 5:                             	// 显示话单状态
            case 6:									// 显示用户累计值 			
            case 7:									// 显示日分项和用户合计	
            case 8:									// 来电延时显示		
            	break;
            	
            default:
				fDispD=1;
                fDispLock=0;
                fDispUnLock=0;		  
            	bDispStatus=0;
            	break;	
        } 
        // 
        CheckFDD();
        PowerAlarm();
        if((!fLocked)&&fUnLockStat&&fWorkMode	// 若开锁,延时后进入开锁状态
          &&(!fEndLockEnable)){					// 只有在新模式下,且开锁统计参数设为有效
           	cbDelay5MS=190;
          	fDelay5MS=0;
           	while(!fDelay5MS) {IDLE;}
            bStatusWord=S_NEWUNLOCKWAIT;
            fDelaySecond=1;    
    	    lSubTariff=0;
		    iSubTimes=0;
            return; 
        }
   		if(fDateUpdate){
        	fDateUpdate=0;
            WriteDayTotal();	
        	AutoReadPara(71);
        	bDayTotalPointer=bParaByte;				//更新日分项合计指针
	    }
	    if(fDelaySecond&&(bDispStatus>3)){
	    	if(bDispStatus==8){
	    		fCheckDTMF=0;
	    		pReadNumber=0;
	    		pWriteNumber=0;
	    	}	
	        fDelaySecond=0;
            bDispStatus=0;
            memset(aLargeBuf,0,20);
            DispCurrentTime();
			fDispD=1;
            fDispLock=0;
            fSecond=1;
            fDispUnLock=0;
        } 
		if(!fFirstKey){
			if(bKeyBuf==0xf0)
				fFirstKey=1;
			continue;	
		}		
		
		if(bFSKWord>2)
			continue;
			
   		if(fKey){
        	fKey=0;
        	if((bDispStatus==4)||(bDispStatus==8)){		   	// 话毕显示话单时,按任意键退出
        		if(cbKey>199)
        			continue;
                bDispStatus=0;					  
                DispClr();
                fSecond=1;
                fFirstKey=0;
				fDispD=1;
                fDispLock=0;
                fDispUnLock=0;
			    continue;
			}        
	        switch(bKeyBuf){
		        case K1:							 		// 显示累计总通话次数、话费      				
                    if(bDispStatus==5){	
                    	if(!fDispDate){
                    		DispBillTime();
                    		PrintTalkRecord();
                    		fFirstKey=0;
                    		fDispDate=1;
                    	}
                    	else{	
                    		cbDelaySecond=6;
                    		fDelaySecond=0;
                    		bDispStatus=1;	
                    	}
                        break;
                    }    
                    if((bDispStatus==6)&&(cbKey<30))
                        fDelaySecond=1;    
					if((bDispStatus!=0)||(cbKey<220)) //只能从锁机显示时间状态进入
                        break;						  //,查询累计值状态
                    bDispStatus=2;					  //长按键
                    cbDelaySecond=7;
                    fDelaySecond=0;
			        break;

       			case K2:
       				if(bDispStatus>5)
       					break;
       				if(cbKey>199)
       					cbKey=150;	
		            if((iTalkPointer--)==00)		//向前查询话单
		            	iTalkPointer=iTalkLength;
                    cbDelaySecond=6;
                    fDelaySecond=0;
                    bDispStatus=1;
   			        break;    
    
	       		case K3:
       				if(bDispStatus>5)
       					break;
       				if(cbKey>199)
       					cbKey=150;	
		            if(iTalkPointer==iTalkRecord){	//向后查询到尽头
		                if((iTalkPointer--)==0)
		                	iTalkPointer=iTalkLength;
		                Speaker(15);    
		            }  
		            if(iTalkPointer==iTalkLength)	//向后查询话单
		                iTalkPointer=0;
		            else
		            	iTalkPointer++;    
		            if(iTalkPointer==iTalkRecord){
		                if((iTalkPointer--)==0)
		                	iTalkPointer=iTalkLength;
		                Speaker(15);    
		            }        
                    cbDelaySecond=6;
                    fDelaySecond=0;
                    bDispStatus=1;    
   			        break;
       			
       			case K4:							//开锁
       				if(cbKey>30)
       					break;
       				if(bDispStatus==0){
       					if(!fLockContinue){	
       						if(fLocked)
       							fLockRequest=1;
   	    		    		fLocked=~fLocked;
				        }    
   	    		    }
       				else
       					fDelaySecond=1;
		            break;
	
		        case K12:							//向前查询日分项累计和
       				if(bDispStatus==5)				//need
       					break;
					if(cbKey>199)
						cbKey=100;
		        	if((bDayTotalPointer--)==0)
		        		bDayTotalPointer=bDayTotalLength;
		        	cbDelaySecond=6;
		        	fDelaySecond=0;
		        	bDispStatus=3;
   			        break;

    			case K13:							    //向后查询日分项累计和
       				if(bDispStatus==5)					//need
       					break;
					if(cbKey>199)
						cbKey=100;
       				AutoReadPara(71);	
       				if(bDayTotalPointer==bParaByte){
       					Speaker(15);
       					fToday=1;
       				}	
		        	else if(bDayTotalPointer==bDayTotalLength)	
		        		bDayTotalPointer=0;
		        	else{
		        		bDayTotalPointer++;	
		        		if(bDayTotalPointer==bParaByte)
		        			fToday=1;
		        	}		
		        	cbDelaySecond=6;
		        	fDelaySecond=0;
		        	bDispStatus=3;
	       		    break;

		        default:
		            break;

⌨️ 快捷键说明

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