/*
 * msp_BJ_Auto_IPC.c
 *
 *  Created on: Feb 1, 2024
 *      Author: Administrator
 */
#include "MSP/msp_BJ_Auto_IPC.h"
#include "MSP/msp_Modbus_crc16.h"
#include "MSP/Port_Config_Letter.h"


UART_HandleTypeDef* Huart_Cont_IPC;
SP_MSP_Controller_IPC_parameters *Control_IPC;
uint8_t Control_IPC_Val[10];
int Control_Flag=4;
void IPC_T_Cont_unscramble();
void  bytes_to_float(const unsigned char bytes[4], double *f_NUm);
void Handshake_Reply_IPC( );
void NG_Reply_Function_20();
void Reply_Function_20();

void NG_Reply_Function_21();
void Reply_Function_21();

void NG_Reply_Function_22();
void Reply_Function_22();
float uint32ToFloat(uint32_t value);

int NG_Flag=0;

uint8_t GF_MSP_BJ_IPC_Init(UART_HandleTypeDef* huart,SP_MSP_Controller_IPC_parameters *_Control_IPC)
{
	Huart_Cont_IPC=huart;
	GF_BSP_Interrupt_Add_CallBack(DF_BSP_InterCall_RS485_2_RxCpltCallback, IPC_T_Cont_unscramble);//这句话的理解有问题
	HAL_UART_Receive_IT(Huart_Cont_IPC,Control_IPC_Val,1);
	Control_IPC = _Control_IPC;
	Control_IPC->Handshake_Counter=0;

	uint8_t RS485_Type_=20;
	RS485_SBUS_Port_Cofig(huart, & RS485_Type_);

	return 1;
}

//小车电量；//是否故障；//
//单独开始检测；
void GF_MSP_Cont_T_IPC_Value(int16_t battery_Level,int16_t Robot_Fault, int16_t Robot_Mode, int16_t Start_Detect_Signal, uint8_t Ship_Weld_mARK[],uint8_t *Cont_T_IPC)
{
	uint8_t Order[50];
	int Array_Num=0;
	Order[0]=0X66;Order[1]=0X66;
	unsigned short CRC_Value;
	if(Start_Detect_Signal!=0)
	{
		Control_Flag=(int)Start_Detect_Signal;
	}
	switch(Control_Flag)
	{
		case 4:                //是否故障//测距传感器的距离值
			Order[2]=0X04;
			Order[3]=0X00;//
			Order[4]=0X01;//
			Order[5]=0x01;//01无故障//02前方障碍//03前方边界

			CRC_Value=ModBusCRC16(Order, 6); // CRC校验
			Order[6]= (uint8_t)CRC_Value;
			Order[7]= (uint8_t)( CRC_Value>>8);
			GF_BSP_UART_Transmit(2, Order, 8);//这句话的关联有问题

			break;
		case 3:    //小车状态，电池电量，操作模式
			Order[2]=0X03;
			Order[3]=0X00;//Data_Length High
			Order[4]=0X04;//Data_Length Low

			Order[5]=(uint8_t)(battery_Level>>8);
			Order[6]=(uint8_t)(battery_Level);

			Order[7]=02;
			Order[8]=02;

			CRC_Value=ModBusCRC16(Order, 9); // CRC校验
			Order[9]= (uint8_t)CRC_Value;
			Order[10]= (uint8_t)( CRC_Value>>8);
			GF_BSP_UART_Transmit(2, Order, 11);//这句话的关联有问题

			break;
		case 2:           //到位相机开始采集信息
			if(Start_Detect_Signal!=0)
			{
			Order[2]=0X02;
			Order[3]=0X00;//Data_Length High
			Order[4]=0X01;//Data_Length Low

			Order[5]=0X0A;

			CRC_Value=ModBusCRC16(Order, 6); // CRC校验
			Order[6]= (uint8_t) CRC_Value;
			Order[7]= (uint8_t)(CRC_Value>>8);
			GF_BSP_UART_Transmit(2, Order, 8);//这句话的关联有问题
			}
			break;
		case 1: //检测船段信息（由遥控器发送给控制器的字段）
			if((Ship_Weld_mARK[0]==0X66)&&(Ship_Weld_mARK[1]==0X66)&&(Ship_Weld_mARK[2]==0X01))
			{
				Array_Num=(int)((Ship_Weld_mARK[3]<<8)|(Ship_Weld_mARK[4]));
				for(int i=0;i<Array_Num+7;i++)
				{
					Order[i]=(uint8_t)(Ship_Weld_mARK[i]);
				}
				 GF_BSP_UART_Transmit(2, Order, 7+Array_Num);//这句话的关联有问题 */
			}
			break;
		case 21: //未收到偏移角/偏移量//进行数据NG回复操作

			Order[0]=0X66;
			Order[1]=0X66;
			Order[2]=0X21;
			Order[3]=0X00;
			Order[4]=0X01;//Data_Length High
			Order[5]=0X02;//Data_Length Low
			CRC_Value=ModBusCRC16(Order, 6); // CRC校验
			Order[6]= (uint8_t)CRC_Value;
			Order[7]= (uint8_t)( CRC_Value>>8);
			GF_BSP_UART_Transmit(2, Order, 8);//这句话的关联有问题 */
			Control_Flag=4;
			break;
		default:   //错误时将状态全部置位
//			Order[2]=0X04;
//			Order[3]=0X00;//
//			Order[4]=01;//01无故障//02前方障碍//03前方边界
//			CRC_Value=ModBusCRC16(Order, 5); // CRC校验
//			Order[5]= (uint8_t)( CRC_Value>>8);
//			Order[6]= (uint8_t)CRC_Value;
//			GF_BSP_UART_Transmit(2, Order, 7);//这句话的关联有问题
			break;
	}
	Control_Flag=Control_Flag-1;
	if(Control_Flag<1)
	{
	Control_Flag=4;
	}
}

void GF_MSP_Cont_T_IPC_Value_1(int16_t battery_Level,int16_t Dis_Sensor_State, int16_t Robot_Opera_Mode, int16_t Start_Detect_Signal, uint8_t Ship_Weld_mARK[])
{
	uint8_t Order[50];
	int Array_Num=0;
	Order[0]=0X66;Order[1]=0X66;
	unsigned short CRC_Value;
	if(Start_Detect_Signal!=0)
	{
		Control_Flag=(int)Start_Detect_Signal;
	}
	switch(Control_Flag)
	{
		case 4:                //是否故障//测距传感器的距离值
			Order[2]=0X04;
			Order[3]=0X00;//
			Order[4]=0X01;//
			Order[5]=Dis_Sensor_State;//01无故障//02前方障碍//03前方边界

			CRC_Value=ModBusCRC16(Order, 6); // CRC校验
			Order[6]= (uint8_t)CRC_Value;
			Order[7]= (uint8_t)( CRC_Value>>8);
			GF_BSP_UART_Transmit(2, Order, 8);//这句话的关联有问题

			break;
		case 3:    //小车状态，电池电量，操作模式
			Order[2]=0X03;
			Order[3]=0X00;//Data_Length High
			Order[4]=0X04;//Data_Length Low

			Order[5]=(uint8_t)(battery_Level>>8);
			Order[6]=(uint8_t)(battery_Level);

			Order[7]=0x00;
			Order[8]=(uint8_t)(Robot_Opera_Mode);

			CRC_Value=ModBusCRC16(Order, 9); // CRC校验
			Order[9]= (uint8_t)CRC_Value;
			Order[10]= (uint8_t)( CRC_Value>>8);
			GF_BSP_UART_Transmit(2, Order, 11);//这句话的关联有问题

			break;
		case 2:           //到位相机开始采集信息
			if(Start_Detect_Signal!=0)
			{
			Order[2]=0X02;
			Order[3]=0X00;//Data_Length High
			Order[4]=0X01;//Data_Length Low
			Order[5]=0X0A;

			CRC_Value=ModBusCRC16(Order, 6); // CRC校验
			Order[6]= (uint8_t) CRC_Value;
			Order[7]= (uint8_t)(CRC_Value>>8);
			GF_BSP_UART_Transmit(2, Order, 8);//这句话的关联有问题
			}
			break;
		case 1: //检测船段信息（由遥控器发送给控制器的字段）
			if((Ship_Weld_mARK[0]==0X66)&&(Ship_Weld_mARK[1]==0X66)&&(Ship_Weld_mARK[2]==0X01))
			{
				Array_Num=(int)((Ship_Weld_mARK[3]<<8)|(Ship_Weld_mARK[4]));
				for(int i=0;i<Array_Num+7;i++)
				{
					Order[i]=(uint8_t)(Ship_Weld_mARK[i]);
				}
				 GF_BSP_UART_Transmit(2, Order, 7+Array_Num);//这句话的关联有问题 */
			}
			break;
		case 21: //未收到偏移角/偏移量//进行数据NG回复操作

			Order[0]=0X66;
			Order[1]=0X66;
			Order[2]=0X21;
			Order[3]=0X00;
			Order[4]=0X01;//Data_Length High
			Order[5]=0X02;//Data_Length Low
			CRC_Value=ModBusCRC16(Order, 6); // CRC校验
			Order[6]= (uint8_t)CRC_Value;
			Order[7]= (uint8_t)( CRC_Value>>8);
			GF_BSP_UART_Transmit(2, Order, 8);//这句话的关联有问题 */
			Control_Flag=4;
			break;
		default:   //错误时将状态全部置位

			break;
	}
	Control_Flag=Control_Flag-1;
	if(Control_Flag<1)
	{
	Control_Flag=4;
	}
}






int IPC_Falg=1;
uint8_t IPC_stas[20]={0};
unsigned short CRC_Value_IPC;
int Data_Length_Val=1;

//正确函数__添加校验
void IPC_T_Cont_unscramble()
{
	unsigned char Bytes_Num[] = {0xF0, 0xA7, 0x06, 0xBF}; // 示例字节数组，代表某个float值

	uint32_t  Float_Num=0;
	uint8_t Order_1[10];

	double Num_value[1];
	switch(IPC_Falg)
	{
	case 1:
		if(IPC_stas[0]==0X66)
		{
			HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,1);//接收RS485数据
			IPC_Falg=2;
		}
		else
		{
			HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,1);//接收RS485数据
			IPC_Falg=1;
		}
		break;
	case 2:
		if(IPC_stas[0]==0X66)
		{
			HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,1);//接收RS485数据
			IPC_Falg=3;
		}
		else
		{
			HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,1);//接收RS485数据
			IPC_Falg=1;
		}
		break;
	case 3:
		if(IPC_stas[0]==0X20)//焊缝检测结果
		{
			Control_IPC->Weld_Dete_Res[0]=0x66;
			Control_IPC->Weld_Dete_Res[1]=0x66;
			Control_IPC->Weld_Dete_Res[2]=IPC_stas[0];

			Control_IPC->Weld_Dete_Res_IPC[0]=0x66;
			Control_IPC->Weld_Dete_Res_IPC[1]=0x66;
			Control_IPC->Weld_Dete_Res_IPC[2]=IPC_stas[0];

			HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收数据长度
			IPC_Falg=4;
		}
		else if(IPC_stas[0]==0X21)//偏移量，偏移角
		{
			Control_IPC->Offset_Data[0]=0x66;
			Control_IPC->Offset_Data[1]=0x66;
			Control_IPC->Offset_Data[2]=IPC_stas[0];

			HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收数据长度
			IPC_Falg=5;
		}
		else if(IPC_stas[0]==0X22)
		{
			Control_IPC->IPC_State[0]=0x66;
			Control_IPC->IPC_State[1]=0x66;
			Control_IPC->IPC_State[2]=IPC_stas[0];

			HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收数据长度
			IPC_Falg=6;
		}


//		int16_t IPC_Ship_Reply[10];//01OK //02NG
//		int16_t IPC_Strat_Dect_Reply[10];//01OK //02NG
//		int16_t IPC_Vertical_State_Reply[10];//01OK //02NG
//		int16_t IPC_Defult_Reply[10];//01OK //02NG
		//回复报文
//		else if(IPC_stas[0]==0X01)
//		{
//			Control_IPC->IPC_Ship_Reply[0]=0x66;
//			Control_IPC->IPC_Ship_Reply[1]=0x66;
//			Control_IPC->IPC_Ship_Reply[2]=IPC_stas[0];
//
//			HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收数据长度
//			IPC_Falg=13 ;
//		}
//		else if(IPC_stas[0]==0X02)
//		{
//			Control_IPC->IPC_Strat_Dect_Reply[0]=0x66;
//			Control_IPC->IPC_Strat_Dect_Reply[1]=0x66;
//			Control_IPC->IPC_Strat_Dect_Reply[2]=IPC_stas[0];
//
//			HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收数据长度
//			IPC_Falg=16;
//		}
//		else if(IPC_stas[0]==0X03)
//		{
//			Control_IPC->IPC_Vertical_State_Reply[0]=0x66;
//			Control_IPC->IPC_Vertical_State_Reply[1]=0x66;
//			Control_IPC->IPC_Vertical_State_Reply[2]=IPC_stas[0];
//
//			HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收数据长度
//			IPC_Falg=19;
//		}
//		else if(IPC_stas[0]==0X04)
//		{
//			Control_IPC->IPC_Defult_Reply[0]=0x66;
//			Control_IPC->IPC_Defult_Reply[1]=0x66;
//			Control_IPC->IPC_Defult_Reply[2]=IPC_stas[0];
//
//			HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收数据长度
//			IPC_Falg=22;
//		}
		else
		{
			HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,1);//接收RS485数据
			IPC_Falg=1;
		}
		break;
	case 4:
		Data_Length_Val=(int)(IPC_stas[0]|(IPC_stas[1]<<8));
		if(Data_Length_Val>100)
		{
			Data_Length_Val=1;
		}
		Control_IPC->Weld_Dete_Res_IPC[3]=IPC_stas[0];
		Control_IPC->Weld_Dete_Res_IPC[4]=IPC_stas[1];

		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,Data_Length_Val);
		IPC_Falg=7;
		break;
	case 7:
		Control_IPC->Weld_fault_signal=IPC_stas[0];//焊缝检测结果

		for (int i=0 ; i<(Data_Length_Val) ;i++)
		{
			Control_IPC->Weld_Dete_Res_IPC[5+i]=IPC_stas[i];
		}
		CRC_Value_IPC=ModBusCRC16(Control_IPC->Weld_Dete_Res_IPC, 5+Data_Length_Val); // CRC校验

		Control_IPC->Weld_Dete_Res_IPC[6+Data_Length_Val]= (uint8_t) CRC_Value_IPC;
		Control_IPC->Weld_Dete_Res_IPC[7+Data_Length_Val]= (uint8_t)(CRC_Value_IPC>>8);

		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收CRC Verify
		IPC_Falg=10;
		break;
	case 10:   //需要将数据转换为串口所需要数据格式,数据重组
		if((Control_IPC->Weld_Dete_Res_IPC[6+Data_Length_Val]==IPC_stas[0])&&(Control_IPC->Weld_Dete_Res_IPC[7+Data_Length_Val]==IPC_stas[1]))
		{
			Control_IPC->Weld_Dete_Res[3]=(uint8_t) ((Data_Length_Val-1)>>8);
			Control_IPC->Weld_Dete_Res[4]=(uint8_t) ((Data_Length_Val-1));

			for(int i=0 ; i<(Data_Length_Val-1);i++)
			{
				//Control_IPC->Weld_Dete_Res_Proto_Buf[i]=Control_IPC->Weld_Dete_Res_IPC[i+6];
			}
//			CRC_Value_IPC=ModBusCRC16(Control_IPC->Weld_Dete_Res, 4+Data_Length_Val); // CRC校验
//			Control_IPC->Weld_Dete_Res[4+Data_Length_Val]= (uint8_t) CRC_Value_IPC;
//			Control_IPC->Weld_Dete_Res[5+Data_Length_Val]= (uint8_t)(CRC_Value_IPC>>8);

		}
		else
		{
			Control_IPC->Weld_Dete_Res[1]=0X00;
			Control_IPC->Weld_Dete_Res[2]=0X00;
		}
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,1);
		IPC_Falg=1;
		break;
	case 5:
		Data_Length_Val=(int)((IPC_stas[0])|(IPC_stas[1]<<8));
		if(Data_Length_Val>10)
		{
			Data_Length_Val=1;
		}
		Control_IPC->Offset_Data[3]=IPC_stas[0];
		Control_IPC->Offset_Data[4]=IPC_stas[1];

		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,Data_Length_Val);//接收偏移量和偏移角
		IPC_Falg=8;

		break;
	case 8:
		for (int i=0 ; i<(Data_Length_Val) ;i++)
		{
			Control_IPC->Offset_Data[5+i]=IPC_stas[i];
		}

		for (int i=0 ; i<(5+Data_Length_Val) ;i++)
		{
			Order_1[i]=Control_IPC->Offset_Data[i];
		}

		CRC_Value_IPC=ModBusCRC16(Order_1, 5+Data_Length_Val); // CRC校验

		Control_IPC->Offset_Data[5+Data_Length_Val]= (uint8_t) CRC_Value_IPC;
		Control_IPC->Offset_Data[6+Data_Length_Val]= (uint8_t)(CRC_Value_IPC>>8);

		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收CRC Verify
		IPC_Falg=11;
		break;
	case 11:  //偏移角和偏移量
		if((Control_IPC->Offset_Data[5+Data_Length_Val]==IPC_stas[0])&&(Control_IPC->Offset_Data[6+Data_Length_Val]==IPC_stas[1]))
		{
			Control_IPC->Weld_status=Control_IPC->Offset_Data[7];//焊缝状态

			Bytes_Num[0] = Control_IPC->Offset_Data[5];
			Bytes_Num[1] = Control_IPC->Offset_Data[6];
			Bytes_Num[2] = Control_IPC->Offset_Data[7];
			Bytes_Num[3] = Control_IPC->Offset_Data[8];

			Float_Num=(uint32_t)((Bytes_Num[0])|(Bytes_Num[1]<<8)|(Bytes_Num[2]<<16)|(Bytes_Num[3]<<24));

			Num_value[0]=uint32ToFloat(Float_Num);
			Control_IPC->Offset_angle[0]=(int16_t)(Num_value[0]*1000);

			Bytes_Num[0] = Control_IPC->Offset_Data[9];
			Bytes_Num[1] = Control_IPC->Offset_Data[10];
			Bytes_Num[2] = Control_IPC->Offset_Data[11];
			Bytes_Num[3] = Control_IPC->Offset_Data[12];

			Float_Num=(uint32_t)((Bytes_Num[0])|(Bytes_Num[1]<<8)|(Bytes_Num[2]<<16)|(Bytes_Num[3]<<24));

			Num_value[0]=uint32ToFloat(Float_Num);
			Control_IPC->Offset_angle[1]=(int16_t)(Num_value[0]);

			Control_IPC->STM32_Reply_State=3;
		}
		else
		{
			//Control_IPC->STM32_Reply_State=4;
		}
		Control_IPC->Offset_Data[0]=0X00;
		Control_IPC->Offset_Data[1]=0X00;
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,1);
		IPC_Falg=1;
		break;

	case 6:
		Data_Length_Val=(int)(IPC_stas[0]|(IPC_stas[1]<<8));
		if(Data_Length_Val>100)
		{
			Data_Length_Val=1;
		}
		Control_IPC->IPC_State[3]=IPC_stas[0];
		Control_IPC->IPC_State[4]=IPC_stas[1];
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,Data_Length_Val);
		IPC_Falg=9;
		break;
	case 9:
		for (int i=0 ; i<(Data_Length_Val) ;i++)
		{
			Control_IPC->IPC_State[5+i]=IPC_stas[i];
		}
		CRC_Value_IPC=ModBusCRC16(Control_IPC->IPC_State, 5+Data_Length_Val); // CRC校验
		Control_IPC->IPC_State[5+Data_Length_Val]= (uint8_t) CRC_Value_IPC;
		Control_IPC->IPC_State[6+Data_Length_Val]= (uint8_t)(CRC_Value_IPC>>8);
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收CRC Verify
		IPC_Falg=12;
		break;
	case 12:
		if((Control_IPC->IPC_State[5+Data_Length_Val]==IPC_stas[0])&&(Control_IPC->IPC_State[6+Data_Length_Val]==IPC_stas[1]))
		{
			if(Control_IPC->IPC_State[5]==0x01)
			{
				Control_IPC->IPC_2D_Came_State=0;
			}
			else
			{
				Control_IPC->IPC_2D_Came_State=1;
			}

			if(Control_IPC->IPC_State[6]==0x01)
			{
				Control_IPC->IPC_3D_Came_State=0;
			}
			else
			{
				Control_IPC->IPC_3D_Came_State=1;
			}
					}
		else
		{
			Control_IPC->IPC_State[0]=0X00;
			Control_IPC->IPC_State[1]=0X00;
			Control_IPC->STM32_Reply_State=06;
		}
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,1);
		IPC_Falg=1;
		break;


	//回复报文校验01
	case 13:
		Data_Length_Val=(int)(IPC_stas[0]|(IPC_stas[1]<<8));
		if(Data_Length_Val>100)
		{
			Data_Length_Val=1;
		}
		Control_IPC->IPC_Ship_Reply[3]=IPC_stas[0];
		Control_IPC->IPC_Ship_Reply[4]=IPC_stas[1];
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,Data_Length_Val);
		IPC_Falg=10;
		break;
	case 14:
		for (int i=0 ; i<(Data_Length_Val) ;i++)
		{
			Control_IPC->Weld_Dete_Res_IPC[5+i]=IPC_stas[i];
		}
		CRC_Value_IPC=ModBusCRC16(Control_IPC->Weld_Dete_Res_IPC, 5+Data_Length_Val); // CRC校验

		Control_IPC->IPC_Ship_Reply[5+Data_Length_Val]= (uint8_t) CRC_Value_IPC;
		Control_IPC->IPC_Ship_Reply[6+Data_Length_Val]= (uint8_t)(CRC_Value_IPC>>8);

		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收CRC Verify
		IPC_Falg=15;
		break;
	case 15:   //需要将数据转换为串口所需要数据格式,数据重组
		if((Control_IPC->IPC_Ship_Reply[5+Data_Length_Val]==IPC_stas[0])&&(Control_IPC->IPC_Ship_Reply[6+Data_Length_Val]==IPC_stas[1]))
		{
			Control_IPC->IPC_Ship_Reply[0]=0X01;
		}
		else
		{
			Control_IPC->IPC_Ship_Reply[0]=0X02;
		}
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,1);
		IPC_Falg=1;
		break;


		//回复报文校验02
	case 16:
		Data_Length_Val=(int)((IPC_stas[0])|(IPC_stas[1]<<8));
		if(Data_Length_Val>100)
		{
			Data_Length_Val=1;
		}
		IPC_Falg=17;
		if(Data_Length_Val>10)
		{
			Data_Length_Val=10;
			IPC_Falg=1;
		}

		Control_IPC->IPC_Strat_Dect_Reply[3]=IPC_stas[0];
		Control_IPC->IPC_Strat_Dect_Reply[4]=IPC_stas[1];
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,Data_Length_Val);

		break;
	case 17:
		for (int i=0 ; i<(Data_Length_Val) ;i++)
		{
			Control_IPC->IPC_Strat_Dect_Reply[5+i]=IPC_stas[i];
		}

		for (int i=0 ; i<(5+Data_Length_Val) ;i++)
		{
			Order_1[i]=Control_IPC->IPC_Strat_Dect_Reply[i];
		}

		CRC_Value_IPC=ModBusCRC16(Order_1,6); // CRC校验


		Control_IPC->IPC_Strat_Dect_Reply[5+Data_Length_Val]= (uint8_t) CRC_Value_IPC;
		Control_IPC->IPC_Strat_Dect_Reply[6+Data_Length_Val]= (uint8_t)(CRC_Value_IPC>>8);

		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收CRC Verify
		IPC_Falg=18;
		break;
	case 18:   //需要将数据转换为串口所需要数据格式,数据重组
		if((Control_IPC->IPC_Strat_Dect_Reply[5+Data_Length_Val]==IPC_stas[0])&&(Control_IPC->IPC_Strat_Dect_Reply[6+Data_Length_Val]==IPC_stas[1]))
		{
			Control_IPC->IPC_Strat_Dect_Reply[0]=0X01;
		}
		else
		{
			Control_IPC->IPC_Strat_Dect_Reply[0]=0X02;
		}
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,1);
		IPC_Falg=1;
		break;


		//回复报文校验03
	case 19:
		Data_Length_Val=(int)(IPC_stas[0]|(IPC_stas[1]<<8));
		if(Data_Length_Val>100)
		{
			Data_Length_Val=1;
		}
		Control_IPC->IPC_Vertical_State_Reply[3]=IPC_stas[0];
		Control_IPC->IPC_Vertical_State_Reply[4]=IPC_stas[1];
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,Data_Length_Val);
		IPC_Falg=20;
		break;
	case 20:
		for (int i=0 ; i<(Data_Length_Val) ;i++)
		{
			Control_IPC->IPC_Vertical_State_Reply[5+i]=IPC_stas[i];
		}



		CRC_Value_IPC=ModBusCRC16(Control_IPC->Weld_Dete_Res_IPC, 5+Data_Length_Val); // CRC校验


		Control_IPC->IPC_Vertical_State_Reply[5+Data_Length_Val]=(uint8_t)(CRC_Value_IPC>>8);
		Control_IPC->IPC_Vertical_State_Reply[6+Data_Length_Val]= (uint8_t)(CRC_Value_IPC);

		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收CRC Verify
		IPC_Falg=21;
		break;
	case 21:   //需要将数据转换为串口所需要数据格式,数据重组
		if((Control_IPC->IPC_Ship_Reply[5+Data_Length_Val]==IPC_stas[0])&&(Control_IPC->IPC_Ship_Reply[6+Data_Length_Val]==IPC_stas[1]))
		{
			Control_IPC->IPC_Vertical_State_Reply[0]=0X01;
		}
		else
		{
			Control_IPC->IPC_Vertical_State_Reply[0]=0X02;
		}
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,1);
		IPC_Falg=1;
		break;


		//回复报文校验04
	case 22:
		Data_Length_Val=(int)(IPC_stas[0]|(IPC_stas[1]<<8));
		if(Data_Length_Val>100)
		{
			Data_Length_Val=1;
		}
		Control_IPC->IPC_Defult_Reply[3]=IPC_stas[0];
		Control_IPC->IPC_Defult_Reply[4]=IPC_stas[1];
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,Data_Length_Val);
		IPC_Falg=23;
		break;
	case 23:
		for (int i=0 ; i<(Data_Length_Val) ;i++)
		{
			Control_IPC->IPC_Defult_Reply[5+i]=IPC_stas[i];
		}
		CRC_Value_IPC=ModBusCRC16(Control_IPC->Weld_Dete_Res_IPC, 5+Data_Length_Val); // CRC校验

		Control_IPC->IPC_Defult_Reply[5+Data_Length_Val]= (uint8_t) CRC_Value_IPC;
		Control_IPC->IPC_Defult_Reply[6+Data_Length_Val]= (uint8_t)(CRC_Value_IPC>>8);

		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,2);//接收CRC Verify
		IPC_Falg=24;
		break;
	case 24:   //需要将数据转换为串口所需要数据格式,数据重组
		if((Control_IPC->IPC_Ship_Reply[5+Data_Length_Val]==IPC_stas[0])&&(Control_IPC->IPC_Ship_Reply[6+Data_Length_Val]==IPC_stas[1]))
		{
			Control_IPC->IPC_Defult_Reply[0]=0X01;
		}
		else
		{
			Control_IPC->IPC_Defult_Reply[0]=0X02;
		}
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,1);
		IPC_Falg=1;
		break;





	default:
		HAL_UART_Receive_IT(Huart_Cont_IPC,IPC_stas,1);//接收RS485数据
		IPC_Falg=1;
		break;
	}
}



//void  bytes_to_float(const unsigned char bytes[4], double *f_NUm) {
//    float f;
//    memcpy(&f, bytes, sizeof(f));
//    f_NUm[0]=(double)f;
//}



float uint32ToFloat(uint32_t value)
{
    union
	{
        uint32_t i;
        float f;
    } converter;
    converter.i = value;
    return converter.f;

}



void GF_MSP_Handshake_Reply_IPC()
{

//	int  Handshake_Flag =(int)Control_IPC->STM32_Reply_State;
//	unsigned short CRC_Value;
//	uint8_t Order_1[10]; Order_1[0]=0X66;Order_1[1]=0X66;
//
//	Order_1[2]=0X04;
//	Order_1[3]=0X00;//
//	switch(Handshake_Flag)
//	{
//	case 0:
//		Control_IPC->Handshake_Counter=0;
//		break;
//	case 1:
//		Order_1[2]=0X20;
//		Order_1[3]=0X00;//
//		Order_1[4]=0X01;//01无故障//02前方障碍//03前方边界
//		Order_1[5]=0X01;//01无故障//02前方障碍//03前方边界
//
//		CRC_Value=ModBusCRC16(Order_1,6); // CRC校验
//		Order_1[6]= (uint8_t)( CRC_Value>>8);
//		Order_1[7]= (uint8_t)CRC_Value;
//		Control_IPC->STM32_Reply_State=0;
//
//		NG_Flag=0;
//		GF_BSP_UART_Transmit(2, Order_1,8);//这句话的关联有问题
//		break;
//	case 2:
//		NG_Reply_Function_20();
//		break;
//	case 3:
//		Order_1[2]=0X21;
//		Order_1[3]=0X00;//
//		Order_1[4]=0X01;//01无故障//02前方障碍//03前方边界
//		Order_1[5]=0X03;//01无故障//02前方障碍//03前方边界
//
//		CRC_Value=ModBusCRC16(Order_1,6); // CRC校验
//		Order_1[6]= (uint8_t)( CRC_Value>>8);
//		Order_1[7]= (uint8_t)CRC_Value;
//		Control_IPC->STM32_Reply_State=0;
//		NG_Flag=0;
//		GF_BSP_UART_Transmit(2, Order_1,8);//这句话的关联有问题
//		break;
//	case 4:
//		NG_Reply_Function_21();
//		break;
//
//	case 5:
//		Order_1[2]=0X22;
//		Order_1[3]=0X00;//
//		Order_1[4]=0X01;//01无故障//02前方障碍//03前方边界
//		Order_1[5]=0X05;//01无故障//02前方障碍//03前方边界
//
//		CRC_Value=ModBusCRC16(Order_1,6); // CRC校验
//		Order_1[6]= (uint8_t)( CRC_Value>>8);
//		Order_1[7]= (uint8_t)CRC_Value;
//		Control_IPC->STM32_Reply_State=0;
//		NG_Flag=0;
//		GF_BSP_UART_Transmit(2, Order_1,8);//这句话的关联有问题
//		break;
//	case 6:
//		NG_Reply_Function_22();
//
//		break;
//	default:
//		Handshake_Flag=0;
//		NG_Flag=0;
//		Control_IPC->Handshake_Counter=0;
//		break;
//
//	}


}


void NG_Reply_Function_20()
{
//	switch(NG_Flag)
//	{
//	case 0:	case 500: case 1000: case 1500: case 2000: case 2500: case 3000: case 3500: case 4000: case 4500: case 5000:
//		Reply_Function_20();
//		break;
//	case 5100:
//		//	请发出IPC重启指令
//		break;
//	default:
//		NG_Flag++;
//		if(NG_Flag>5100)
//		{
//			NG_Flag=5100;
//		}
//		break;
//	}
}

void Reply_Function_20()
{
//	unsigned short CRC_Value_1;
//	uint8_t Order_2[10]; Order_2[0]=0X66;Order_2[1]=0X66;
//	Control_IPC->Handshake_Counter++;
//	Order_2[2]=0X20;
//	Order_2[3]=0X00;//
//	Order_2[4]=0X01;//01无故障//02前方障碍//03前方边界
//	Order_2[5]=0X02;//01无故障//02前方障碍//03前方边界
//
//	CRC_Value_1=ModBusCRC16(Order_2,6); // CRC校验
//	Order_2[6]= (uint8_t)( CRC_Value_1>>8);
//	Order_2[7]= (uint8_t)CRC_Value_1;
//	GF_BSP_UART_Transmit(2, Order_2,8);//这句话的关联有问题
}

void NG_Reply_Function_21()
{
//	switch(NG_Flag)
//	{
//	case 0:	case 500: case 1000: case 1500: case 2000: case 2500: case 3000: case 3500: case 4000: case 4500: case 5000:
//		Reply_Function_21();
//		break;
//	case 5100:
//		//	请发出IPC重启指令
//		break;
//	default:
//		NG_Flag++;
//		if(NG_Flag>5100)
//		{
//			NG_Flag=5100;
//		}
//		break;
//	}
}


void Reply_Function_21()
{
//	unsigned short CRC_Value_1;
//	uint8_t Order_2[10]; Order_2[0]=0X66;Order_2[1]=0X66;
//	Control_IPC->Handshake_Counter++;
//	Order_2[2]=0X21;
//	Order_2[3]=0X00;//
//	Order_2[4]=0X01;//01无故障//02前方障碍//03前方边界
//	Order_2[5]=0X02;//01无故障//02前方障碍//03前方边界
//
//	CRC_Value_1=ModBusCRC16(Order_2,6); // CRC校验
//	Order_2[6]= (uint8_t)( CRC_Value_1>>8);
//	Order_2[7]= (uint8_t)CRC_Value_1;
//	GF_BSP_UART_Transmit(2, Order_2,8);//这句话的关联有问题
}



void NG_Reply_Function_22()
{
//	switch(NG_Flag)
//	{
//	case 0:	case 500: case 1000: case 1500: case 2000: case 2500: case 3000: case 3500: case 4000: case 4500: case 5000:
//		Reply_Function_22();
//		break;
//	case 5100:
//		//	请发出IPC重启指令
//		break;
//	default:
//		NG_Flag++;
//		if(NG_Flag>5100)
//		{
//			NG_Flag=5100;
//		}
//		break;
//	}
}


//void Reply_Function_22()
//{
//	unsigned short CRC_Value_1;
//	uint8_t Order_2[10]; Order_2[0]=0X66;Order_2[1]=0X66;
//	Control_IPC->Handshake_Counter++;
//	Order_2[2]=0X22;
//	Order_2[3]=0X00;//
//	Order_2[4]=0X01;//01无故障//02前方障碍//03前方边界
//	Order_2[5]=0X02;//01无故障//02前方障碍//03前方边界
//
//	CRC_Value_1=ModBusCRC16(Order_2,6); // CRC校验
//	Order_2[6]= (uint8_t)( CRC_Value_1>>8);
//	Order_2[7]= (uint8_t)CRC_Value_1;
//	GF_BSP_UART_Transmit(2, Order_2,8);//这句话的关联有问题
//}




