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

📄 jbscall.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
字号:

/**********************************************************
*                                                           
*           FileName:  jScall.c                          
*           Function:  被叫程序                                                
*                                                         
**********************************************************/

//#pragma DEBUG

#include <jbScall.h>

void OldSlaveCall(void)
{
    byte bSlaveStatus=0x30;							// 被叫状态控制字 
    byte bUnitTariff;								// 被叫计费费率
    byte bUnitTime;									// 被叫计费时长
    byte bDelayTime;
	bool fMustSaveRecord=0;
    pReadNumber=0;
    pWriteNumber=0;
    memset(&aNumBuf,0x0c,16);    
	fFanjiRequest=1;
	fFanJi=0;
    DispClr();
    DispSymbol(LARGE_HOOK);
    AutoReadPara(206);
    bUnitTime=bParaByte;							// 被叫计费时长
    AutoReadPara(207);
    bUnitTariff=bParaByte;							// 被叫计费费率
    AutoReadPara(208);
    bDelayTime=bParaByte;							// 被叫计费延时时间
    iTotalTime=1;									// 计费时间提前1秒
    lTotalTariff=0;
	bDialType=0;
    if(fSlaveCallEnable&&(bUnitTariff!=0)){			// 被叫是否允许计费
   		bSlaveStatus=0x31;
   		if(!fSlaveCalcForm)
   			bSlaveStatus=0x32;						// 手动计费状态
	}    		
	SaveCurrentTime();
	ciDelaySecond=0;
	fiDelaySecond=0;
	iAddress=0;
    while(TRUE){
        switch(bSlaveStatus){
            case 0x30:								// 免费通话过程
                fDelay5MS=1;
                fDelayLock=0;
                while(1){
                    IDLE;                           
                    Flash(1);
                    if(OnHookDelay()||(pReadNumber==4)||(fFanJi&&(pReadNumber>2))){
                        fLockRequest=1;             // 若挂机,则锁机退出
                        bSlaveStatus=0x34;
                        break;
                    }
                    JudgeNum();
                    if(fSecond){
                    	fSecond=0;
                    	iAddress++;
                    }
                    if(KeyPro()){
                    	fLockRequest=1;
                    	bSlaveStatus=0x34;			
                    	break;
                    }	
                } // End while(1)
                break;
                
            case 0x31:
            	if(bDelayTime==0){
					bSlaveStatus=0x33;
					break;
				}	
				ciDelaySecond=bDelayTime;			//自动计费延时过程
				fiDelaySecond=0;				
                while(1){
                    IDLE;
                    Flash(1);
                    if(OnHookDelay()||(pReadNumber==4)||(fFanJi&&(pReadNumber>2))){
                        fLockRequest=1;
                        bSlaveStatus=0x34;
                        break;
                    }      
                    JudgeNum();
                    if(fiDelaySecond){ 
                        bSlaveStatus=0x33;          // 自动计费延时时间到
                        break;
                    }    
                    if(fSecond){
                    	fSecond=0;
                    	iAddress++;
                    }
                    if(KeyPro()){
                    	fLockRequest=1;
                    	bSlaveStatus=0x34;			
                    	break;
                    }	
				} // End while(1)
				break;
				
            case 0x32:								// 等待手动启动计费
                while(1){
                    IDLE;
                    Flash(1);
                    if(OnHookDelay()||(pReadNumber==4)||(fFanJi&&(pReadNumber>2))){
                        fLockRequest=1;
                        bSlaveStatus=0x34;
                        break;
                    }  
					JudgeNum();                    
                    if(fSecond){
                    	fSecond=0;
                    	iAddress++;
                    }
                    if(fKey&&(bKeyBuf==K4)){		// 手动计费状态下,启动计费
                        fKey=0;
                        bSlaveStatus=0x33;       	// 手动计费开始
                        break;
                    }
                } // End while(1)
                break;    
 
            case 0x33:								//被叫计费状态
                lTotalTariff+=(ulint)bUnitTariff;
                fMustSaveRecord=1;
                DispCharge(lTotalTariff,1);   
                DispCharge(lTotalTariff,2); 
                DispTime(iTotalTime);
                fSecond=0;
                if(bUnitTime==0){
                	bSlaveStatus=0x30;
                	break;	
                }	
                ciDelaySecond=bUnitTime;
                fiDelaySecond=0;
                while(1){
                    IDLE;
                    Flash(1);
                    if(fSecond){
                        fSecond=0;
                        DispTime(++iTotalTime);
                        iAddress++;
                        if(fiDelaySecond)
                        	break;
					}                        	
                    if(OnHookDelay()||(fFanJi&&(pReadNumber>2))||(pReadNumber==4)){
                    	fLockRequest=1;
                        bSlaveStatus=0x34;
                        break; 
                    }      
                    JudgeNum();
                    if(KeyPro()){
                    	fLockRequest=1;
                    	bSlaveStatus=0x34;			
                    	break;
                    }	
                } // End while(1)    
                break;
            
            case 0x34:								// 被叫通话结束,统计、存储过程
                cbFangDao=200;
               	Close(MLD);
                DispSymbol(LARGE_UNHOOK);         
                DispSymbol(LARGE_UNFLASH);
                DispSymbol(LARGE_PHONE);
                if(fLocked)
                	DispSymbol(LARGE_LOCK);
                fDelaySecond=1;
                Speaker(255);
                if(fMustSaveRecord){
                	fMustSaveRecord=0;
                    memset(aNumBuf,0x0c,15);        // 被叫存储零号码话单
                    bIDL=0;
	                SaveRecord();
                    if(!fLOCPrintLimit)
                        PrintTalkRecord();
	                cbDelaySecond=5;
    	            fDelaySecond=0;
                }        
                SaveTotal();	 					// 被叫通话次数、收费累计
                pReadNumber=pWriteNumber=0;
           		bStatusWord=S_OLDLOCKWAIT;
            	return;
        }        
        // End switch(bSlaveStatus)
    } 
    // End while(1)
}
// End function: SlaveCall()            


void NewSlaveCall(void)
{
	byte bSlaveStatus=0x30;
	uint iMTTime;
	uint iRT0Time;
	uint iRT1Time;
	uint iRF0Tariff;
	uint iRF1Tariff;
	bool fMustDelay=0;
	//初始化被叫被叫参数
	AutoReadPara(24);
	iMTTime=iParaWord;				// 被叫限时时长
	AutoReadPara(25);
	iRF0Tariff=iParaWord;			// 被叫初始收费
	AutoReadPara(26);
	iRT0Time=iParaWord;				// 被叫初始时长
	AutoReadPara(27);
	iRF1Tariff=iParaWord;			// 被叫单位收费
	AutoReadPara(28);
	iRT1Time=iParaWord;				// 被叫单位时长
	pReadNumber=0;
	pWriteNumber=0;
	memset(aNumBuf,0x0c,16);
	fFanjiRequest=1;
	fFanJi=0;
	DispClr();
	DispSymbol(LARGE_HOOK);
    if((iMTTime==0)||((iRT1Time==0)&&(iRT0Time==0)))
		bSlaveStatus=0x33;
	else if((iRF0Tariff==0)&&(iRF1Tariff==0))
		bSlaveStatus=0x30;
	else if(fSlaveCalcForm)						// 呼入计费方式
		bSlaveStatus=0x31;						// 自动计费	
	lTotalTariff=0;
	iTotalTime=1;								// 预设1秒钟
	fDelayLock=0;
	bDialType=0;
	fSecond=0;
	fDelay5MS=1;
	iAddress=0;
	bClass=0;
	SaveCurrentTime();
	while(1){
		switch(bSlaveStatus){
			case 0x30:									// 手动计时状态下,或被叫不计费,未启动计费
				while(1){
					IDLE;
					Flash(1);
					if(OnHookDelay()||(pReadNumber==4)){
						bSlaveStatus=0x33;
						break;
					}
					if(fFanJiFangDao&&fFanJi){
						
						//if(bClass>2){
							bSlaveStatus=0x33;
							break;
						//}
						//fFanjiRequest=1;
						//fFanJi=0;
					}		 
					JudgeNum();
					if(fSecond){
						fSecond=0;
						iAddress++;
						iTotalTime++;
						if(iMTTime!=9999){				// 是否要被叫限时
							if((iTotalTime-1)>=iMTTime){
								bSlaveStatus=0x33;
								break;
							}
						}
					}	
					if((!fSlaveCalcForm)&&fKey){		// 允许手动计费时,手动启动计费
						fKey=0;
						if(bKeyBuf==K4){
							bSlaveStatus=0x31;
							break;
						}
					}		
				}			
				break; 
			
			case 0x31:									// 自动或手动计费准备
				TotalAdd(iRF0Tariff);
				ciDelaySecond=iRT0Time;
				fiDelaySecond=0;
				fSecond=0;
				fMustDelay=1;
				iTotalTime=1;
				bSlaveStatus=0x32;
				break;
				
			case 0x32:	
				DispCharge(lTotalTariff,1);
				DispCharge(lTotalTariff,2);
				DispTime(iTotalTime);
				while(1){
					IDLE;
					Flash(1);
					if(fSecond){
						fSecond=0;
						iAddress++;
						DispTime(++iTotalTime);
						if(iMTTime!=9999){				//是否要被叫限时
							if((iTotalTime-1)>=iMTTime){
								bSlaveStatus=0x33;
								break;
							}
						}
						if(fiDelaySecond){
							fiDelaySecond=0;
							ciDelaySecond=iRT1Time;
							TotalAdd(iRF1Tariff);
							break;
						}
					}
					if(OnHookDelay()||(pReadNumber==4)||KeyPro()){
						bSlaveStatus=0x33;
						break;
					}
					if(fFanJiFangDao&&fFanJi){
						//if(bClass>2){
							bSlaveStatus=0x33;
							break;
						//}
						//fFanjiRequest=1;
						//fFanJi=0;
					}		 
					JudgeNum();
				}
				break;
				
			case 0x33:
               	Close(MLD);
				fLockRequest=1;
                Speaker(255);
                SaveTotal();			 				//被叫通话次数、收费累计
	            cbFangDao=200;							//关闭防盗联络音
   	    	    if(fMustDelay){
	                DispSymbol(LARGE_UNFLASH);
    	            DispSymbol(LARGE_PHONE);
        	        if(fLocked)
            	    	DispSymbol(LARGE_LOCK);
	                bIDL=0;
    	            memset(aNumBuf,0x0c,16);        	//被叫存储零号码话单
	    	        if(fSaveInTalk)
	        	      	SaveRecord();
                	if(!fLOCPrintLimit)
                    	PrintTalkRecord();
	   	    	    cbDelaySecond=5;
    	        	fDelaySecond=0;
    	        }	
    	        else
    	        	fDelaySecond=1;
            	if(fLocked)
            		bStatusWord=S_NEWLOCKWAIT;
            	else
            		bStatusWord=S_NEWUNLOCKWAIT;	    
            	return;
        }
    }    
}                

void JudgeNum(void)
{
    if(iAddress>90)
    	return;
    if(pReadNumber<pWriteNumber){
    	bClass++;
		pReadNumber++;
		cbDelaySecond=10;
	}
	if(cbDelaySecond==0){
		pReadNumber=0;
		pWriteNumber=0;
	}	
}


/*
    if(pReadNumber<pWriteNumber){
       	if(iAddress>60){
       		pReadNumber=0;
        	pWriteNumber=0;
        }
        else{
			pReadNumber++;
			cbDelaySecond=8;
			fDelaySecond=0;
		}	
	}
	if(fDelaySecond){
		fDelaySecond=0;
		pReadNumber=0;
		pWriteNumber=0;
	}
}	
*/


bool OnHookDelay(void)
{
	if(fiiDelaySecond){
		Close(MLD);
	 	if(OnHook())
	 		return TRUE;
	 	else
	 		return FALSE;
	} 		
	AutoReadPara(55);
	if((bParaByte==1)&&(ciiDelaySecond==1))				//不并模拟负载
		Close(MLD);
	return FALSE;
}

bool KeyPro(void)
{
	if(!fKey)
		return FALSE;
	fKey=0;
    if((bKeyBuf==K4)&&(cbKey>=225)){
		if(!fDelayLock){
        	fDelayLock=1;
            cbKey=30;
        }    
        else
        	return TRUE;
	}
	return FALSE;        	
}
// End function: KeyPro()                    

⌨️ 快捷键说明

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