server.c

来自「LWIP在STM32裸机上的移植」· C语言 代码 · 共 826 行 · 第 1/2 页

C
826
字号
						while(((CAN2->TSR>>26)& 0x07) == 0);
						CAN_Transmit(CAN2, &TxMessage);
					}
					if(InputAddr[1] != 0)
					{
						TxMessage.Data[0] = (AddVoltage[1][0]|(AddVoltage[1][1]<<1)|
											(AddVoltage[1][2]<<2)|(AddVoltage[1][3]<<3))& 0x0F;	
						TxMessage.StdId = InputAddr[1];
						while(((CAN2->TSR>>26)& 0x07) == 0);
						CAN_Transmit(CAN2, &TxMessage);
					}
					if(InputAddr[2] != 0)
					{
						TxMessage.Data[0] = (AddVoltage[2][0]|(AddVoltage[2][1]<<1)|
											(AddVoltage[2][2]<<2)|(AddVoltage[2][3]<<3))& 0x0F;	
						TxMessage.StdId = InputAddr[2];
						while(((CAN2->TSR>>26)& 0x07) == 0);
						CAN_Transmit(CAN2, &TxMessage);
					}
					if(InputAddr[3] != 0)
					{
						TxMessage.Data[0] = (AddVoltage[3][0]|(AddVoltage[3][1]<<1)|
											(AddVoltage[3][2]<<2)|(AddVoltage[3][3]<<3))& 0x0F;	
						TxMessage.StdId = InputAddr[3];
						while(((CAN2->TSR>>26)& 0x07) == 0);
						CAN_Transmit(CAN2, &TxMessage);
					}
					if(InputAddr[4] != 0)
					{
						TxMessage.Data[0] = (AddVoltage[4][0]|(AddVoltage[4][1]<<1)|
											(AddVoltage[4][2]<<2)|(AddVoltage[4][3]<<3))& 0x0F;	
						TxMessage.StdId = InputAddr[4];
						while(((CAN2->TSR>>26)& 0x07) == 0);
						CAN_Transmit(CAN2, &TxMessage);
					}
	
					//设置输出通道数据
					TxMessage.RTR = CAN_RTR_DATA;
					TxMessage.IDE = CAN_ID_STD;
					TxMessage.DLC = 4;
					if(OutputAddr[0] != 0)
					{	
						for(j=0;j<4;j++)
							TxMessage.Data[j] = OutputSet[j];
						TxMessage.StdId = OutputAddr[0];
						while(((CAN2->TSR>>26)& 0x07) == 0);
						CAN_Transmit(CAN2, &TxMessage);
					}	
					if(OutputAddr[1] != 0)
					{
						for(j=0;j<4;j++)
							TxMessage.Data[j] = OutputSet[j+4];
						TxMessage.StdId = OutputAddr[1];
						while(((CAN2->TSR>>26)& 0x07) == 0);
						CAN_Transmit(CAN2, &TxMessage);
					}
					if(OutputAddr[2] != 0)
					{
						for(j=0;j<4;j++)
							TxMessage.Data[j] = OutputSet[j+8];
						TxMessage.StdId = OutputAddr[2];
						while(((CAN2->TSR>>26)& 0x07) == 0);
						CAN_Transmit(CAN2, &TxMessage);
					}
					if(OutputAddr[3] != 0)
					{
						for(j=0;j<4;j++)
							TxMessage.Data[j] = OutputSet[j+12];
						TxMessage.StdId = OutputAddr[3];
						while(((CAN2->TSR>>26)& 0x07) == 0);
						CAN_Transmit(CAN2, &TxMessage);
					}
					if(OutputAddr[4] != 0)
					{
						for(j=0;j<4;j++)
							TxMessage.Data[j] = OutputSet[j+16];
						TxMessage.StdId = OutputAddr[4];
						while(((CAN2->TSR>>26)& 0x07) == 0);
						CAN_Transmit(CAN2, &TxMessage);
					}
				}
				break;

			case (0x79):	//下载场景
				switch(ScenNum)
				{
					case (0x01):
						I2C_EE_BufferWrite(revdata,EEP_ScenNum1_Address,311);//场景一
						break;
					case (0x02):
						I2C_EE_BufferWrite(revdata,EEP_ScenNum2_Address,311);//场景二
						break;
					case (0x03):
						I2C_EE_BufferWrite(revdata,EEP_ScenNum3_Address,311);//场景三
						break;
					case (0x04):
						I2C_EE_BufferWrite(revdata,EEP_ScenNum4_Address,311);//场景四
						break;

					default:
						break;
				}
				//如果按下某个"场景"键时,刷新此场景(比如按下"场景"按键1时,刷新场景1)
				if(ScenKeyBK)
				{
					u8 temp = 0;
					temp = 1<<(ScenNum-1);
					if(temp == (ScenKeyBK & 0x0F))	//刷新按下"场景"键的场景
					{
						SceneSetFlag = ScenKeyBK & 0x0F;
					}
				}
				break;

			case (0x74): 	//效果设置时测试(CAN2)
				for(j=0;j<13;j++)
					EffectTest[j] = revdata[j];
				for(j=0;j<20;j++)	
				{
					if(EffectAddr[j][0] == EffectTest[0])
					{
						EffectAddr[j][2] = 1;	//[话筒输入地址,效果编号,是否测试]
						break;
					}
				}	
				TxMessage.StdId = (((EffectTest[0]& 0xF0)<<4)|(EffectTest[0] & 0x0F))& 0x7FF;
				printf("The EffectAddr = 0x%X\n",TxMessage.StdId);
				TxMessage.RTR = CAN_RTR_DATA;
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 7;
				TxMessage.Data[0] = 0x01;	//帧编号(0x01) 
				for(j=1,k=1;j<6;j++)
				{
					TxMessage.Data[j] = EffectTest[k];
					k += 2;
				}
				TxMessage.Data[6] = EffectTest[11];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);

				TxMessage.Data[0] = 0x02;	//帧编号(0x02) 
				for(j=1,k=2;j<6;j++)
				{
					TxMessage.Data[j] = EffectTest[k];
					k += 2;
				}
				TxMessage.Data[6] = EffectTest[12];
				while(((CAN2->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN2, &TxMessage);
				break;
			
			case (0x75):	//效果设置数据保存
				u=0;k=0;
				for(j=0;j<48;j++)
				{
					EffectData[k][u] = revdata[j];	//4个效果,每个效果12字节数据
					u++;
					if(u%12==0)
					{
						k++;
						u=0;
					}
				}
				I2C_EE_PageWrite(revdata,EEP_EffectData_Address,48);			
				break;

			case (0x7A):	//停止效果测试,恢复原来效果(CAN2)
				for(j=0;j<20;j++)
				{
					if(EffectAddr[j][2] == 1)	//测试
					{
						printf("EffectAddr[%d][1] = %d\n",j,EffectAddr[j][1]);	//以前设置的是哪一个效果
						EffectAddr[j][2] = 0;	//清空测试标记
						TxMessage.StdId = (((EffectAddr[j][0] & 0xF0)<<4)|(EffectAddr[j][0] & 0x0F))& 0x7FF;
						TxMessage.RTR = CAN_RTR_DATA;
						TxMessage.IDE = CAN_ID_STD;
						TxMessage.DLC = 7;
						switch(EffectAddr[j][1])
						{				
							case (0x01)://效果1
								TxMessage.Data[0] = 0x01;	//帧编号(0x01) 
								for(k=1,u=0;k<6;k++)
								{	
									TxMessage.Data[k] = EffectData[0][u];
									u += 2;
								}	
								TxMessage.Data[6] = EffectData[0][10];
								while(((CAN2->TSR>>26)& 0x07) == 0);
								CAN_Transmit(CAN2, &TxMessage);
								
								TxMessage.Data[0] = 0x02;	//帧编号(0x02) 
								for(k=1,u=1;k<6;k++)
								{	
									TxMessage.Data[k] = EffectData[0][u];
									u += 2;
								}	
								TxMessage.Data[6] = EffectData[0][11];
								while(((CAN2->TSR>>26)& 0x07) == 0);
								CAN_Transmit(CAN2, &TxMessage);
								break;
													
							case (0x02)://效果2
								TxMessage.Data[0] = 0x01;	//帧编号(0x01) 
								for(k=1,u=0;k<6;k++)
								{	
									TxMessage.Data[k] = EffectData[1][u];
									u += 2;
								}	
								TxMessage.Data[6] = EffectData[1][10];
								while(((CAN2->TSR>>26)& 0x07) == 0);
								CAN_Transmit(CAN2, &TxMessage);
								
								TxMessage.Data[0] = 0x02;	//帧编号(0x02) 
								for(k=1,u=1;k<6;k++)
								{	
									TxMessage.Data[k] = EffectData[1][u];
									u += 2;
								}	
								TxMessage.Data[6] = EffectData[1][11];
								while(((CAN2->TSR>>26)& 0x07) == 0);
								CAN_Transmit(CAN2, &TxMessage);
								break;
								
							case (0x03)://效果3
								TxMessage.Data[0] = 0x01;	//帧编号(0x01) 
								for(k=1,u=0;k<6;k++)
								{	
									TxMessage.Data[k] = EffectData[2][u];
									u += 2;
								}	
								TxMessage.Data[6] = EffectData[2][10];
								while(((CAN2->TSR>>26)& 0x07) == 0);
								CAN_Transmit(CAN2, &TxMessage);
								
								TxMessage.Data[0] = 0x02;	//帧编号(0x02) 
								for(k=1,u=1;k<6;k++)
								{
									TxMessage.Data[k] = EffectData[2][u];
									u += 2;
								}
								TxMessage.Data[6] = EffectData[2][11];
								while(((CAN2->TSR>>26)& 0x07) == 0);
								CAN_Transmit(CAN2, &TxMessage);
								break;
							
							case (0x04)://效果4	
								TxMessage.Data[0] = 0x01;	//帧编号(0x01) 
								for(k=1,u=0;k<6;k++)
								{
									TxMessage.Data[k] = EffectData[3][u];
									u += 2;
								}
								TxMessage.Data[6] = EffectData[3][10];
								while(((CAN2->TSR>>26)& 0x07) == 0);
								CAN_Transmit(CAN2, &TxMessage);
								
								TxMessage.Data[0] = 0x02;	//帧编号(0x02) 
								for(k=1,u=1;k<6;k++)
								{
									TxMessage.Data[k] = EffectData[3][u];
									u += 2;
								}
								TxMessage.Data[6] = EffectData[3][11];
								while(((CAN2->TSR>>26)& 0x07) == 0);
								CAN_Transmit(CAN2, &TxMessage);
								break;
							
							default:	//未用效果
								TxMessage.RTR = CAN_RTR_DATA;
								TxMessage.IDE = CAN_ID_STD;
								TxMessage.DLC = 1;
								TxMessage.Data[0] = 0;				//取消效果帧
								while(((CAN2->TSR>>26)& 0x07) == 0);
								CAN_Transmit(CAN2, &TxMessage);
								break;									
						}
					}
				}
				break;
			
			case (0x76): 	//设置调音台时间
				TxMessage.RTR = CAN_RTR_DATA;
				TxMessage.IDE = CAN_ID_STD;
				TxMessage.DLC = 3;
				TxMessage.StdId = 0x02A;
				for(j=0;j<3;j++)
					TxMessage.Data[j] = revdata[j];
				while(((CAN1->TSR>>26)& 0x07) == 0);
				CAN_Transmit(CAN1, &TxMessage);				
				break;
			
			case (0x77):	//设置调音台IP地址
				Cmd77_SetFlg = 1;
				I2C_EE_PageWrite(revdata,EEP_IP_Address,len);
//				NVIC_SystemReset();
				break;
			
			case (0x78):	//设置调音台播出时间表
				u = 0;
				k = 0;				
				for(j=0;j<len;j++)
				{
					PlayTable[k][u] = revdata[j];
					u++;
					if(u%6 == 0)
					{
						k++;
						u=0;
					}
				}
				TabTotal = len;
				I2C_EE_ByteWrite(len,EEP_Tablen_Address);			//保存列表长度
				I2C_EE_PageWrite(revdata,EEP_PlayTable_Address,len);//保持列表数据
				break;
			
			default:
				break;
		}
	}

	//处理返回值(指令0x72和0x79的返回值情况特殊)
	if((ins == 0x72)&&(askdata[2] == 0xFA)&&(askdata[4] == 0xEE))	//应答正确
	{
		UDPData[0] = 0x55;
		UDPData[1] = 0x72;
		UDPData[2] = 0x0F;		//数据包长度为15
		for(j=3;j<8;j++)		//推子模块地址:01 - 05
		{
			if(TuiziAddr[j-3] != 0)
				UDPData[j] = j-2;			
			else
				UDPData[j] = 0xFF;
		}
		for(j=8;j<13;j++)		//输入模块数据:01 - 03(表示信号类型)
		{
			if(InputAddr[j-8] !=0)
				UDPData[j] = InputAddr[j-8] & 0x0F;
			else
				UDPData[j] = 0xFF;	
		}
		for(j=13;j<18;j++)		//输出模块数据:04 - 05(表示信号类型)
		{
			if(OutputAddr[j-13] != 0)
				UDPData[j] = OutputAddr[j-13] & 0x0F;
			else 
				UDPData[j] = 0xFF;
		}
//		printf("\nUDPData = ");
		check = 0;
		for(j=0;j<18;j++){
			check += UDPData[j];
//			printf("0x%X ",UDPData[j]);
		}
		UDPData[18] = check;
		UDPData[19] = 0xEE;
//		printf("0x%X ",UDPData[18]);
//		printf("0x%X \n\n",UDPData[19]);

		p->payload = (void *)UDPData; 		//发送字符串地址
		p->len = sizeof(UDPData);  			//发送字符串长度(len和tot_len的值都必须改变)
		p->tot_len = sizeof(UDPData);
	}
	else
	{
		p->payload = (void *)UDPAsk;		//发送字符串地址
		p->len = sizeof(UDPAsk);			//发送字符串长度(len和tot_len的值都必须改变)
		p->tot_len = sizeof(UDPAsk);
//		p->payload = (void *)askdata;		//发送字符串地址
//		p->len = sizeof(askdata);			//发送字符串长度(len和tot_len的值都必须改变)
//		p->tot_len = sizeof(askdata);
	}			 
  	/* Connect to the remote client */
  	udp_connect(upcb, addr, port);
    
  	/* Tell the client that we have accepted it */
  	udp_send(upcb, p);

  	/* free the UDP connection, so we can accept new clients */
	udp_disconnect(upcb);
	
  	/* Bind the upcb to IP_ADDR_ANY address and the UDP_PORT port*/
  	/* Be ready to get a new request from another client */  
//	udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);
	
  	/* Set a receive callback for the upcb */
//	udp_recv(upcb, udp_server_callback, NULL);    	

  	/* Free the p buffer */
  	pbuf_free(p);

	//*** 设置系统IP地址后,重启 ***//
	if((ins == 0x77)&&(Cmd77_SetFlg == 1))	
	{	
//		Cmd77_SetFlg = 1;
		I2C_EE_ByteWrite(Cmd77_SetFlg,EEP_Cmd77_Address);
			
		for(j=0;j<5;j++)	//保存推子模块地址
		{	
			I2C_EE_WordWrite(TuiziAddr[j],EEP_Tuizi_Address + 2*j);
		}	
		for(j=0;j<5;j++)	//保存输入板卡地址
		{	
			I2C_EE_WordWrite(InputAddr[j],EEP_Input_Address + 2*j);
		}		
		for(j=0;j<5;j++)	//保存输出板卡地址
		{	
			I2C_EE_WordWrite(OutputAddr[j],EEP_Output_Address + 2*j);
		}		
						
		NVIC_SystemReset(); 
	}	
}

⌨️ 快捷键说明

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