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

📄 jbserver.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
📖 第 1 页 / 共 2 页
字号:

/*****************************************************************************
 *
 *				文件名: jbServer.c
 *
 *				说  明: JJF24-1B 维护程序源文件
 *
 *****************************************************************************/
 //#pragma src
#include <jbServer.h>

  
/*****************************************************************************
 *
 *				函数名: Server
 *
 *				说  明: 维护模块主调度程序,并菜单显示和选择
 *
 *****************************************************************************/
void Server(void)											// OK !
{
	bool fLastEnd=1;
	bMenuLevel=1;
 	bMenuSelect=CHANGE;
 	if(!CheckPassword()){									//  密码检查
 		fLockRequest=1;
 		bErrorCode=ERR_06;
 		DispErrorCode();
		bStatusWord=S_HARDWAREINIT;
		return;
	}
	fLockRequest=1;
 	fFDToneRequest=0;
	AutoReadPara(36);
	if(bParaByte<10)
		bParaByte=10;
 	cbDelaySecond=bParaByte;
 	fDelaySecond=0;
 	while(TRUE){
		IDLE;
		if(bMenuLevel==0){
			bStatusWord=S_HARDWAREINIT;
			bEnterFlag=0x69;
			return;
		}
		if(bMenuLevel==2){
			fLastEnd=0;
			switch(bMenuSelect){
				case CHANGE:
					ChangeWorkMode();
					break;
					
				case ALLCLEAR:	
					ClrTotal();					// 清内部统计纪录
					DispOK(3);
					bMenuLevel=1;
					break;
					
				case PARAQUERY:	
					QueryPara();				// 参数查询
					break;
					
				case PARASETUP:	
					UpdatePara();				// 参数修改设置
					break;
					
				case MENUEXIT:	
					bMenuLevel=0;				// 退出维护
					break;
					
				default:   
					bMenuSelect=CHANGE;		// 退回主菜单
					break;
			}
			bMenuLevel=1;
		}
 		memset(aLargeBuf,0x00,20);				// 菜单显示
 		memcpy(aLargeBuf,pStr[bMenuSelect],7);
		ConvertCode();
		FD_Lock(HOOKNO);
		DispOut();								// 防盗过程
 		if(bKeyBuf!=K1) 
 			fLastEnd=1;
 		if(!fKey) 
 			continue;
 		fKey=0;
 		if(cbKey>=200) 
 			cbKey=170;
 		switch(bKeyBuf){						// 菜单选择
 			case K1:
 				if(!fLastEnd) 
 					break;
 				if(bMenuSelect==MENUEXIT)				// 按K1键退出
 					bMenuLevel=0;
 				else
 					bMenuSelect=MENUEXIT;
 				break;
 				
 			case K2:
 			   if(bMenuSelect==CHANGE)
 					bMenuSelect=MENUEXIT;
 				else 
 					bMenuSelect--;						// 按K2键前翻
 				break;
 				
 			case K3:
 				if(bMenuSelect==MENUEXIT)
 					bMenuSelect=CHANGE;
 				else 
 					bMenuSelect++;						// 按K3键后翻
 				break;
 				
 			case K4:	
 				bMenuLevel=2;
 				break;
 														// 按K4键进入操作
 			default:	
 				Speaker(5); 							// 其他按键方式不接受
 				break;
 		}
	}
} // End of Server() OK !
   
  
/*****************************************************************************
 *
 *				函数名: QueryPara
 *
 *				说  明: 参数查询
 *
 *****************************************************************************/
 void QueryPara()									// OK !
 {
 	bool fModify=0;												// 修改标志
 	bool fLastEnd=0;
 	byte bParaNo=01;
 	AutoReadPara(36);
 	if(bParaByte<10)
 		bParaByte=10;
 	cbDelaySecond=bParaByte;
 	fDelaySecond=0;
 	fFDToneRequest=1;
 	pReadNumber=0;
	pWriteNumber=0;
	fKey=0;
 	while(bMenuLevel==2)
 	{
 	 	IDLE;
 		if(!fModify)
			DispPara(bParaNo);
		FD_Lock(HOOKDISP);
		DispOut();
		if(bKeyBuf!=K4) fLastEnd=1;
		if(!fLastEnd) continue;
		if((pWriteNumber==0)&&(!fKey))						// 等待选择参数显示
			continue;		
		fModify=0;
		if(SelectPara(bParaNo,ENQUERY))
			bParaNo=aServer[0];
		else
			fModify=1;
	 }
  } // End of QueryPara()	OK !

/*****************************************************************************
 *
 *				函数名: UpdatePara
 *
 *				说  明: 参数设置
 *
 *****************************************************************************/ 
 void UpdatePara()
 {
 	bool fLastEnd=0;
 	bool fModify=0;									// 修改标志
 	bool fAidSelect=0;								// 0: 选择参数	1: 修改参数
 	byte bWork,bFirst_Flash=0x10;
 	byte bLength,bParaNo=01;
 	AutoReadPara(36);
 	if(bParaByte<10)
 		bParaByte=10;
 	fFDToneRequest=1;
 	cbDelaySecond=bParaByte;
 	fDelaySecond=0;
 	pReadNumber=0;
	pWriteNumber=0;
	fKey=0;
 	while(bMenuLevel==2)
 	{
 	 	IDLE;
 		if(!fModify)
 		{
 	 		DispPara(bParaNo);					// 显示参数内容
 	 		GetParaAttr(bParaNo);
 	 		bLength=GetParaContent(bParaNo);
 	 		fModify=1;
 	 	}
		bFirst_Flash=DispFlash(bLength,fAidSelect,bFirst_Flash);
 		FD_Lock(HOOKDISP);
		DispOut();
		if(bKeyBuf!=K4) fLastEnd=1;
		if(!fLastEnd) continue;
		if((pWriteNumber==0)&&(!fKey))			// 等待选择参数
			continue;
		// 选择参数或修改参数
		bFirst_Flash=bFirst_Flash|0x10;
		if(!fAidSelect){
			bWork=0;		
			if((pReadNumber==0)&&((fKey&&(bKeyBuf==K4))
			  ||((pWriteNumber!=0)&&(aNumBuf[0]==12))))
			  	bWork=1;
			if(SelectPara(bParaNo,ENMODIFY)){
				bParaNo=aServer[0];
				fModify=0;
				if(bWork!=0) 
					fAidSelect=1;
			}
			else 
				fModify=1;				// bAidSelect=0;
			continue;
		}
		if(fKey){
			bWork=bKeyBuf;
			fKey=0;
			switch(bWork){
				case K1 :
				case K4 :
					if(bWork==K1) Cancel(bParaNo);
					else{
						if(Confirm(bParaNo)){
							fLockRequest=1; 
							cbDelaySecond=20;
							fDelaySecond=0;
							DispOK(1);
						}	
					}
					fModify=0;
					fAidSelect=0;
					break;
				case K2 :
				case K3 :
					fModify=1;
					if(bWork==K2)
					{
						if(pReadNumber==0)
							Speaker(5);
						else pReadNumber--;
						fAidSelect=1;
					}
					else
					{
						if(++pReadNumber>=bLength)
						{
							pReadNumber=bLength;
							Speaker(5);
						 }
					}
					break;
				default : Speaker(5);
			 }
			continue;
		} 
	// 电话机按键输入
		bWork=aNumBuf[0];
		pWriteNumber=0;
		if(bWork<10)
		{
			fModify=1;
			if(pReadNumber<=bLength)
			{
			 	if((aParaBuf[2]&0x0F)==0x05)
			 	{
			 		if(bWork>0) bWork=1;
			 	}
				aServer[pReadNumber++]=bWork;
			}
		}
		else
		{
			if(bWork==11)
				Cancel(bParaNo);
			else if(bWork==12)
			{
				if(Confirm(bParaNo)){
					fLockRequest=1; 
					fDelaySecond=0;
					cbDelaySecond=20;
					DispOK(1);
				}	
				else 
					Speaker(20);
			}
			else 
				continue;
			fModify=0;
			fAidSelect=0;
		}
		continue;
	 } // End of while{}
  } // End of UpdatePara()
  
/*****************************************************************************
 *
 *				函数名: CheckPassWord
 *
 *				说  明: 进入维护操作前的密码检查
 *
 *****************************************************************************/
 bool CheckPassWord()
 {
 	byte code SuperPassword[]={7,1,6,8};
	byte xdata aBuf[4];
 	byte i,cbTime=0;
 	byte bWork;
 	AutoReadPara(36);
 	if(bParaByte<10)
 		bParaByte=10;
 	fFDToneRequest=1;
 	cbDelaySecond=bParaByte;
 	fDelaySecond=0;
 	pReadNumber=0;
	pWriteNumber=0;
	ciDelaySecond=20;
	fiDelaySecond=0;
	AutoReadPara(23);
	for(i=0;i<2;i++)
	{
		aServer[2*i]=aParaBuf[i]>>4;
		aServer[2*i+1]=aParaBuf[i]&0x0F;
	}		
	memset(&aLargeBuf,0x20,4);		
 	while(TRUE)
 	{
		IDLE;
		if(fiDelaySecond) return FALSE;
		if(OnHook()&&pReadNumber>0)
		{
			pReadNumber=0;
			memset(&aLargeBuf,0x20,4);		
		}
		FD_Lock(HOOKDISP);											// 防盗过程
		DispOut();
		if(pWriteNumber==0)
			continue;
		bWork=aNumBuf[0];
		pWriteNumber=0;
		if(bWork>10)
			continue;
		aBuf[pReadNumber]=bWork;
		aLargeBuf[pReadNumber++]=0xE4;
		if(pReadNumber<4)
			continue;
		cbDelay5MS=50;
		fDelay5MS=0;
		while(!fDelay5MS)
		{
			IDLE;
			FD_Lock(HOOKDISP);
			DispOut();
		}
		Speaker(20);	
		if((memcmp(&aServer,&aBuf,4)==0)||(memcmp(&SuperPassword,&aBuf,4)==0))
			return	TRUE;
		if(++cbTime>=3) return FALSE;
		memset(&aLargeBuf,0x20,4);		
		pReadNumber=0;
		ciDelaySecond=20;
		fiDelaySecond=0;
	 }
} // End of CheckPassword()
 				
/*****************************************************************************
 *
 *				函数名: DispPara
 *
 *				说  明: 显示参数内容
 *
 *****************************************************************************/
 void DispPara(byte bParaNo)
 {
 	byte i,j;
 	byte bLength,bWork;
	memset(aLargeBuf,0x00,20);
 	aServer[0]=bParaNo;
 	BINConvBCD(1);					
	aLargeBuf[14]=0x73;									// 显示参数代码号
 	if(aServer[0])
 		ToDisplay(0,13);
 	ToDisplay(1,12);
	ToDisplay(2,11);
	GetParaAttr(bParaNo);
	bLength=GetParaContent(bParaNo);
	switch(bParaNo)
	{
		case 21 :										// 显示备用费率起始或终止时间
		case 22 :
			for(i=0,j=0;i<12;i++)
			{
				if(i<8) bWork=j;
				else bWork=29-j;
				ToDisplay(i,bWork);
				j++;
				if((i==3)||(i==5))
					aLargeBuf[j++]=0x20;
				else if(i==9)
				{
					aLargeBuf[29-j]=0x20;
					j++;
				 }
			 }
			break;
		case 50 :
			/*
			for(i=0;i<10;i++)
				ToDisplay(i,i);
			*/	
			break;
		case 213 :										// 显示备用费率起始终止时间(old)
			for(i=0;i<16;i++)
			{
				if(i<11)
					bWork=i;
				else bWork=30-i;
					ToDisplay(i,bWork);
			 }
			break;
		case 214 :										// 显示日常折扣时间
			for(j=0,i=0;i<8;i++)
			{
				ToDisplay(i,j);
				j++;
				if((i==1)||(i==5)) aLargeBuf[j++]=0x20;
				if(i==3) j++;
			 }
			break;
		case 215 :										// 显示特定折扣时间
		case 216 :
		case 217 :
		case 218 :
		case 219 :
		case 220 :
			for(i=0,j=0;i<10;i++)
			{
				if(i<6) bWork=j;
				else bWork=27-j;
				ToDisplay(i,bWork);
				j++;
				if((i==1)||(i==3)) aLargeBuf[j++]=0x20;
				if(i==7) aLargeBuf[27-j++]=0x20;
			 }
			break;
		case 221 :										// 显示折扣率(老格式)
			for(i=0,j=0;i<12;i++)
			{
				if(i<8) bWork=j;
				else bWork=31-j;
				ToDisplay(i,bWork);
				j++;
				if(i%2) j++;
			 }
			break;
		case 232 :										// 区号表起始地址
		case 233 :
			for(i=0,j=0;i<6;i++)
			{
				ToDisplay(i,j);
				j++;
				if(i==3) j++;
			 }
			break;
		default :
			for(i=0;i<bLength;i++)
			{
				if(i<11) bWork=i;
				else bWork=30-i;
				ToDisplay(i,bWork);
			 }
	 }
  } // End of DispPara();
 				
/*****************************************************************************
 *
 *				函数名: DispFlash
 *
 *				说  明: 闪烁显示参数内容
 *
 *****************************************************************************/
 byte DispFlash(byte bLength,bool fAidSelect,byte bFirst_Flash)
 {
 	byte i,bWork;
	if(!fAidSelect)									// 不闪烁
		return bFirst_Flash;
 	if((bFirst_Flash&0xF0)!=0)
 	{
 		bFirst_Flash=0x00;
 		cbDelay5MS=120;
 		fDelay5MS=0;
 	 }
 	else if(fDelay5MS)
 	{
 		if((bFirst_Flash&0x0F)==0)
 			bFirst_Flash=bFirst_Flash|0x01;
 		else bFirst_Flash=bFirst_Flash&0xFE;
 		cbDelay5MS=100;
 		fDelay5MS=0;
 	}
 	if((bFirst_Flash&0x0F)!=0)
 	{
	 	if(pReadNumber<bLength)							// 单个字符闪烁
	 	{
	 		bWork=pReadNumber;
	 		if(pReadNumber>10)
	 			bWork=30-pReadNumber;

⌨️ 快捷键说明

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