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

📄 jbserver.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
📖 第 1 页 / 共 2 页
字号:
	 		aLargeBuf[bWork]=0x00;
   		 }
	 	else
 		{
	 		memset(aLargeBuf,0x00,11);
			memset(&aLargeBuf[15],0x00,5);
		 }
	 }
	else 
	{
		for(i=0;i<bLength;i++)
		{
			if(i<11) bWork=i;
			else bWork=30-i;
			ToDisplay(i,bWork);
		 }
	 }
	return bFirst_Flash;
  } // End of DispFlash()

/*****************************************************************************
 *
 *				函数名: SelectPara
 *
 *				说  明: 选择参数显示内容
 *
 *****************************************************************************/
 bool SelectPara(byte bParaNo,bool fAttribute)
 {
 	byte i,bWork,btemp;
	btemp=bParaNo;
	if(pWriteNumber>0)  	 // 话机键盘输入
	{
		bWork=aNumBuf[0];
		pWriteNumber=0;
	 	if(pReadNumber==0)
	 		memset(aLargeBuf,0x00,20);
	 	/*	
		while(pReadNumber==0)						// 第一个键为大于3的数字键
		{	
			//
			if((bWork>3)&&(bWork<10));
			else
				break;
			//	yang add	
			if(bParaNo==btemp)
			{
				aServer[0]=btemp;
				return TRUE;
			}
			if(GetParaNo(bParaNo,fAttribute))
			{
				aServer[0]=bParaNo;
				return TRUE;
			}
		}
		*/
	 	if(bWork<10)							// 按数字键
 		{
 			if(pReadNumber<3)
 			{
 				aServer[pReadNumber++]=bWork;
				aLargeBuf[14]=0x73;
 				for(i=0;i<pReadNumber;i++)
	 				ToDisplay(pReadNumber-i-1,11+i);
	 		}
	 		else 
	 			Speaker(5);
 			return FALSE;
		}
		if(bWork==11)							// 按 * 键
		{
			if(pReadNumber==0)
				bMenuLevel=1;
			else{
				aServer[0]=btemp;
				pReadNumber=0;
			}
			return TRUE;
		}
		if(bWork==12)							// 按 # 键
		{
			if(pReadNumber==0)
				aServer[0]=btemp;
			else{
				bWork=BCDConvBIN(pReadNumber,1);
				pReadNumber=0;
				if((bWork>1)||(aServer[0]==255)
				 ||(!GetParaNo(aServer[0],fAttribute))){
					aServer[0]=btemp;
					Speaker(10);
				}
				fDelaySecond=1;						//add by yang
			}
			return TRUE;
		}
		if(pReadNumber>0)
			return FALSE;
		aServer[0]=btemp;
		return TRUE;
	}
	bWork=bKeyBuf;								// 计费器按键输入
	fKey=0;
	if(cbKey>=200) cbKey=180;
	switch(bWork){
		case K1 :
			if(pReadNumber==0)
				bMenuLevel=1;
			else
				aServer[0]=btemp;
			pReadNumber=0;
			return TRUE;
		case K2 :
		case K3 :
 			if(pReadNumber!=0)
 			{
 				Speaker(5);
 				aServer[0]=btemp;
 				return FALSE;
 			 }
 			while(TRUE)								// 找参数代码
 			{
		 		if(bWork==K2){
		 			if(bParaNo<=01)
		 				bParaNo=233;
					else bParaNo--;
				}
				else{
					if(bParaNo>=233)
						bParaNo=01;
					else bParaNo++;
				}
				if(bParaNo==btemp){
					aServer[0]=btemp;
					break;
				}
				if(GetParaNo(bParaNo,fAttribute)){
					aServer[0]=bParaNo;
					break;
				 }
			 }
			 return TRUE;
		case K4 :
			if(pReadNumber==0)
				aServer[0]=btemp;
			else
			{
				bWork=BCDConvBIN(pReadNumber,1);
				pReadNumber=0;
				if((aServer[0]==255)||(bWork>1)
				  ||(!GetParaNo(aServer[0],fAttribute)))
				{
					aServer[0]=btemp;
					Speaker(10);
				}
				 fDelaySecond=1;
			 }
			 return TRUE;
		default :
			Speaker(5);
			aServer[0]=btemp;
			return TRUE;
	}
} // End of SelectPara();
			
/*****************************************************************************
 *
 *				函数名: Cancel
 *
 *				说  明: 取消输入
 *
 *****************************************************************************/
 void Cancel(byte bParaNo)
 {
 	pWriteNumber=0;
 	if(pReadNumber==0)
 		return;
 	if((bParaNo==01)||(bParaNo==02)||(bParaNo==202)||(bParaNo==210))
 		memset(aServer,0x0C,20);
 	else memset(aServer,0x00,20);
 	Confirm(bParaNo);
 	return;
  } // End of Cancel()
			
/*****************************************************************************
 *
 *				函数名: Confirm
 *
 *				说  明: 确认输入
 *
 *****************************************************************************/
 bool Confirm(byte bParaNo)
 {
 	byte i,bWork;
 	uint pAddress;
 	if(pReadNumber==0)
		return TRUE;
	pReadNumber=0;
	GetParaAttr(bParaNo);
	pAddress=((uint)aParaBuf[3]<<8)+aParaBuf[4];
	if((bParaNo==203)||(bParaNo==204))
	{
		BCDConvBIN(2,1);
		bWork=aServer[0];
		if(bWork>15)
			return FALSE;
		if(bParaNo==203)
		{
			GetParaContent(204);
			BCDConvBIN(2,1);
			aServer[0]=(bWork<<4)|aServer[0];
		 }
		else
		{
			GetParaContent(203);
			BCDConvBIN(2,1);
			aServer[0]=bWork|(aServer[0]<<4);
		 }
			
	 }
	else if((aParaBuf[2]&0x0F)==0x01)
	{
		for(i=0;i<aParaBuf[1];i++)
			aServer[i]=(aServer[2*i]<<4)+aServer[2*i+1];
	 }
	else if((aParaBuf[2]&0x0F)==0x05)
	{
		aServer[0]=aServer[0]<<7;
		for(i=1;i<8;i++)
		{
			bWork=aServer[i];
			aServer[0]=aServer[0]|(bWork<<(7-i));
		}
	}
	else
	{
		bWork=BCDConvBIN(aBCDNumber[aParaBuf[1]-1],aParaBuf[1]);
		if(bWork>aParaBuf[1]) return FALSE;
	 }
	WriteData(aParaBuf[5],pAddress,aParaBuf[1],&aServer);
	return TRUE;
 } // End of Confirm()

/*****************************************************************************
 *
 *				函数名: GetParaNo
 *
 *				说  明: 取参数号码
 *
 *****************************************************************************/
 bool GetParaNo(byte bParaNo,bool fAttri)
 {
	byte code *Point;
	Point=PARA_START;
	//if((bParaNo==00)||(bParaNo==75)||(bParaNo==200))
	if(bParaNo==75)
		return FALSE;
	while(TRUE)							// 找参数代码
	{
		if((*Point)==bParaNo)
			break;
		Point+=6;
		if(Point>=PARA_END)
			return FALSE;			
	 }
	if(!fAttri) return TRUE;
	if(((*(Point+2))&0x80)==0)
		return FALSE;
	return TRUE;
  }
/*****************************************************************************
 *
 *				函数名: GetParaAttr
 *
 *				说  明: 取参数属性
 *
 *****************************************************************************/
 bool GetParaAttr(byte bParaNo)
 {
	byte i;
	byte code *Point;
	Point=PARA_START;
	while(TRUE)							// 找参数代码
	{
		if(*Point==bParaNo)
			break;
		Point+=6;
		if(Point>=PARA_END)
			return FALSE;			
	 }
	for(i=0;i<6;i++,Point++)
		aParaBuf[i]=*Point;
	return TRUE;
 } // End of GetparaAttr()

/*****************************************************************************
 *
 *				函数名: GetParaContent
 *
 *				说  明: 取参数内容
 *
 *****************************************************************************/
 byte GetParaContent(byte bParaNo)
 {
	byte i,bWork,bLength;
	uint iAddr;
	if(!GetParaAttr(bParaNo))
		return 0;
	iAddr=(((uint)aParaBuf[3])<<8)+aParaBuf[4];
	ReadData(aParaBuf[5],iAddr,aParaBuf[1],aServer);	// 读出参数内容
	if(bParaNo==221)
	{
		memcpy(aCallTime,aServer,6);					// 共用缓冲区aCallTime[]
		for(i=0;i<6;i++)
		{
			aServer[0]=aCallTime[i];
			BINConvBCD(1);
			aSelfForm[2*i]=aServer[1];
			aSelfForm[2*i+1]=aServer[2];
		 }
		memcpy(aServer,aSelfForm,12);
		bLength=12;
	 }
	else if((bParaNo==203)||(bParaNo==204))
	{
		if(bParaNo==203)
			bWork=aServer[0]>>4;
		if(bParaNo==204)
			bWork=aServer[0]&0x0F;
		aServer[0]=bWork;
		BINConvBCD(1);
		aServer[0]=aServer[1];
		aServer[1]=aServer[2];
		bLength=2;
	 }
	else if(bParaNo==50)
	{
		for(i=0;i<10;i++)
 			aLargeBuf[i]=ASCIICode(aServer[i]);
 		bLength=10;
   	 }
	else if((bParaNo==232)||(bParaNo==233)||(aParaBuf[2]&0x0F==1))
	{
		for(i=0;i<3;i++)
		{
			bWork=aServer[2-i];
			aServer[4-2*i]=bWork>>4;
			aServer[5-2*i]=bWork&0x0F;
		 }
		bLength=6;
	 }
	else if((aParaBuf[2]&0x0F)==1)
	{
		for(i=0;i<8;i++)
		{
			bWork=aServer[7-i];
			aServer[14-2*i]=bWork>>4;
			aServer[15-2*i]=bWork&0x0F;
		 }
		bLength=2*aParaBuf[1];
	 }
	else if((aParaBuf[2]&0x0F)==5)
	{
		bWork=aServer[0];
		for(i=0;i<8;i++)
			aServer[i]=(bWork>>(7-i))&0x01;
		bLength=8;
	 }
	else
	{
		BINConvBCD(aParaBuf[1]);
		bLength=aBCDNumber[aParaBuf[1]-1];
	 }
	return bLength;
 }

/*****************************************************************************
 *
 *				函数名: ASCIICode
 *
 *				说  明: 把ASCII码转换为七段显示码
 *
 *****************************************************************************/
 byte ASCIICode(byte bInNumber)
 {
	byte code *pDispCode;
	pDispCode=DISP_CODE_ADDR;
	while(1)
	{  
		if(pDispCode>DISP_CODE_END)
			return 0x00;
		if(bInNumber==*pDispCode)		//查字符表
		{
			bInNumber=*(++pDispCode);
			return bInNumber;
		}
		else
			pDispCode+=2;
    }    
  } // End of ASCIICode()
/*****************************************************************************
 *
 *				函数名: BINConvBCD
 *
 *				说  明: 把长度为bLongth(<=3)个字节的BIN型数据转换为BCD型数据
 *
 *****************************************************************************/
 byte BINConvBCD(byte bLongth)   //  OK !  blongth=3
 {
 	byte i,j,bWork;
 	byte * pWork;
 	ulint lWork0,lWork1=1;
 	bWork=aBCDNumber[bLongth-1];
 	if(bLongth>4) return 99;
 	lWork0=0;
 	pWork=(byte *)&lWork0;
 	for(i=0;i<bLongth;i++) pWork[3-i]=aServer[bLongth-1-i];
 	for(i=0;i<bWork-1;i++) lWork1=lWork1*10;
 	for(i=0;i<bWork;i++)
 	{
 		for(j=0;j<10;j++)
 		{
 			if(lWork0<lWork1) break;
 			lWork0=lWork0-lWork1;
 		 }
 		if(j==10) return 99;
 		aServer[i]=j;
 		lWork1=lWork1/10;
	 }
	return bWork;
 } // End of BINConvBCD()

/*****************************************************************************
 *
 *				函数名: BCDConvBIN
 *
 *				说  明: 把BCD型数据转换为BIN型数据
 *
 *****************************************************************************/
 byte BCDConvBIN(byte cbInput,byte cbOutput )        // OK !
 {
 	byte * ptemp,i;
 	ulint lWork0=0;
 	ulint lWork1=1;
	for(i=0;i<cbInput;i++)
 	{
 		lWork0=lWork0+(uint)(aServer[cbInput-1-i]*lWork1);
 		lWork1=lWork1*10;
 	 }
 	ptemp=(byte *)&lWork0;
	for(i=0;i<cbOutput;i++) aServer[cbOutput-1-i]=ptemp[3-i];
	for(i=0;i<4;i++) if(ptemp[i]!=0) break;
	return (4-i);
  } // End of BCDConvBIN()

/*****************************************************************************
 *
 *				函数名: FD_Lock
 *
 *				说  明: 计费器防盗打
 *
 *****************************************************************************/
 void FD_Lock(bool fHook)
 {
	byte btemp;
	btemp=cbFangDao;
	if(OffHook())
	{
		if(fFDToneRequest){
			if(cbFangDao>150)
				cbFangDao=0;
		}		
		else 
			cbFangDao=200;
		AutoReadPara(36);
		if(bParaByte<10)
			bParaByte=10;
		if(fDelaySecond) fLockRequest=1;
		if(fDelaySecond||(fFDToneRequest&&(btemp>=200)))
		{
			cbDelaySecond=bParaByte;
			fDelaySecond=0;
		 }
		if(fHook)
		{
			aLargeBuf[1]=aLargeBuf[1]&0xF7;
			aLargeBuf[2]=aLargeBuf[2]|0x08;
		 }
	 }	 
	else
	{
		cbFangDao=200;
		if(fHook)
		{
			aLargeBuf[1]=aLargeBuf[1]|0x08;
			aLargeBuf[2]=aLargeBuf[2]&0xF7;
		 }
	 }
  } // End of FD_Lock();

/*****************************************************************************
 *
 *				函数名: ToDisplay
 *
 *				说  明: 把中的数据转换成七段显示码送至显示缓冲区
 *
 *****************************************************************************/
 void ToDisplay(byte paServer,byte pDispBuf)
 {
	aLargeBuf[pDispBuf]=aDispCode[aServer[paServer]];
  } // End of ToDisplay()

⌨️ 快捷键说明

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