#include "vofa.h"
#include "zf_common_headfile.h"


int state_left;
int eiq_left;
int Usart_RxFlag;
//*/
typedef union
{
    float fdata;
    unsigned long ldata;
} FloatLongType;
///*
//将浮点数f转化为4个字节数据存放在byte[4]中
//*/
void Float_to_Byte(float f,unsigned char byte[])
{
    FloatLongType fl;
    fl.fdata=f;
    byte[0]=(unsigned char)fl.ldata;
    byte[1]=(unsigned char)(fl.ldata>>8);
    byte[2]=(unsigned char)(fl.ldata>>16);
    byte[3]=(unsigned char)(fl.ldata>>24);
}

void JustFloat_Test(void)	//justfloat 数据协议测试
{
  static float a=1,b=2;	//发送的数据 两个通道
  int byte[4]={0};		//float转化为4个字节数据
  int tail[4]={0x00, 0x00, 0x80, 0x7f};	//帧尾
	//向上位机发送两个通道数据
  
	Float_to_Byte(encoder_real[1],byte);
	uart_write_buffer(UART_1, &byte, 4);	//1转化为4字节数据 就是  0x00 0x00 0x80 0x3F
	Float_to_Byte(b,byte);
	uart_write_buffer(UART_1, &byte, 4);//2转换为4字节数据 就是  0x00 0x00 0x00 0x40 
	//发送帧尾
  
	//uart_write_buffer(UART_4, &tail, 4);	//帧尾为 0x00 0x00 0x80 0x7f
	uart_write_byte(UART_1, 0x00);
  	uart_write_byte(UART_1, 0x00);
  	uart_write_byte(UART_1, 0x80);
  	uart_write_byte(UART_1, 0x7f);
}
////////////////////////////////////////////////////////////

uint8_t Usart_GetRxFlag(void)
{
	if(Usart_RxFlag==1)
	{
		Usart_RxFlag=0;
		return 1;
	}
	return 0;
}




int Cq,Cw,Ce,Cr,Ct,Cy,Cu,Ci,Co,Cp;  //usart	
double x_pic,y_pic;
int error_x_sign,error_y_sign;
int open_close_left;
int a,b;
void uart_rx_interrupt_handler (void)
{	  	
	static uint8_t RxState_1=0;
	static int Usart_RxData=0;
	
    uart_query_byte(UART_1, &Usart_RxData);	
	if(RxState_1==0&&Usart_RxData==0x2C) 
	{
		//ips200_show_int(25,120,Usart_RxData,3);
		RxState_1=1;
	}
	else if(RxState_1==1&&Usart_RxData==0x12) 
	{	
		//ips200_show_int(25,140,Usart_RxData,3);		
		RxState_1=2;
	}
	else if(RxState_1==2)
	{	
		ips200_show_int(25,160,Usart_RxData,3);
        state_left=Usart_RxData;
	    RxState_1=3;
	}
	else if(RxState_1==3)
	{		
		ips200_show_int(25,180,Usart_RxData,3);		
		a=Usart_RxData;
		RxState_1=4;
	}	
	else if(RxState_1==4)
	{	
		ips200_show_int(25,200,Usart_RxData,3);
        b=Usart_RxData;
		RxState_1=5;
	}		
	else if(RxState_1==5)
	{	
		ips200_show_int(25,220,Usart_RxData,3);
		error_x_sign = Usart_RxData;				
		if(error_x_sign==1)
		{
			x_pic=-a;
		}
		else
		{
			x_pic=a;
		}
		RxState_1=6;
	}				
	else if(RxState_1==6)
	{	
		ips200_show_int(25,240,Usart_RxData,3);
	    error_y_sign = Usart_RxData;				
		if(error_y_sign==1)
		{
			y_pic=-b;
		}				
		else
		{
			y_pic=b;
		}
		RxState_1=7;
	}			
	else if(RxState_1==7)
	{	
		ips200_show_int(25,260,Usart_RxData,3);
		eiq_left=Usart_RxData;
		RxState_1=8;
	}		
	else if(RxState_1==8)		 
	{	
		ips200_show_int(25,280,Usart_RxData,3);
		eiq_mode_left_flag=Usart_RxData;
		RxState_1=9;
	}		
	else if(RxState_1==9)
	{		
		ips200_show_int(25,300,Usart_RxData,3);
		Ci=Usart_RxData;
		open_close_left=Usart_RxData;		
		RxState_1=10;
	}
	else if(RxState_1==10&&Usart_RxData==0x5B)
	{
		RxState_1=0;		
	}			
}




///***********************全局变量定义***************************/
//int Cq, Cw, Ce, Cr, Ct, Cy, Cu, Ci, Co, Cp;  // 串口数据变量
//double x_pic, y_pic;  // 图像坐标变量
//int error_x_sign, error_y_sign;  // 错误标志变量
//int open_close_left;  // 开闭状态变量

//// 上一次正确接收到的数据保存变量
//static int prev_state_left = 0;
//static double prev_x_pic = 0.0;
//static double prev_y_pic = 0.0;
//static int prev_error_x_sign = 0;
//static int prev_error_y_sign = 0;
//static int prev_open_close_left = 0;
//static int prev_eiq_left = 0;
//static int prev_Cu = 0;
//static int prev_Ci = 0;

///***********************串口接收中断处理函数***************************/
//void uart_rx_interrupt_handler(void)
//{
//    static uint8_t RxState_1 = 0;  // 接收状态机变量，初始状态为0
//    static int Usart_RxData = 0;  // 串口接收数据变量

//    uart_query_byte(UART_1, &Usart_RxData);  // 从串口查询接收到的数据

//    // 状态机处理串口接收数据
//    if (RxState_1 == 0 && Usart_RxData == 0x2C) 
//    {
//        RxState_1 = 1;  // 接收到帧头0x2C，进入下一个状态
//    }
//    else if (RxState_1 == 1 && Usart_RxData == 0x12)
//    {
//        RxState_1 = 2;  // 接收到第二个数据0x12，进入下一个状态
//    }
//    else if (RxState_1 == 2)
//    {
//        state_left = Usart_RxData;  // 接收到状态信息，保存到全局变量
//        RxState_1 = 3;  // 进入下一个状态
//    }
//    else if (RxState_1 == 3)
//    {
//        x_pic = Usart_RxData;  // 接收到X坐标数据，保存到全局变量
//        RxState_1 = 4;  // 进入下一个状态
//    }
//    else if (RxState_1 == 4)
//    {
//        y_pic = Usart_RxData;  // 接收到Y坐标数据，保存到全局变量
//        RxState_1 = 5;  // 进入下一个状态
//    }
//    else if (RxState_1 == 5)
//    {
//        error_x_sign = Usart_RxData;  // 接收到X坐标错误标志，保存到全局变量
//        if (error_x_sign == 1)
//        {
//            x_pic = -x_pic;  // 如果错误标志为1，对X坐标进行修正
//        }
//        RxState_1 = 6;  // 进入下一个状态
//    }
//    else if (RxState_1 == 6)
//    {
//        error_y_sign = Usart_RxData;  // 接收到Y坐标错误标志，保存到全局变量
//        if (error_y_sign == 1)
//        {
//            y_pic = -y_pic;  // 如果错误标志为1，对Y坐标进行修正
//        }
//        RxState_1 = 7;  // 进入下一个状态
//    }
//    else if (RxState_1 == 7)
//    {
//        eiq_left = Usart_RxData;  // 接收到eiq_left数据，保存到全局变量
//        RxState_1 = 8;  // 进入下一个状态
//    }
//    else if (RxState_1 == 8)
//    {
//        Cu = Usart_RxData;  // 接收到Cu数据，保存到全局变量
//        RxState_1 = 9;  // 进入下一个状态
//    }
//    else if (RxState_1 == 9)
//    {
//        Ci = Usart_RxData;  // 接收到Ci数据，保存到全局变量
//        open_close_left = Usart_RxData;  // 同时更新开闭状态变量
//        RxState_1 = 10;  // 进入下一个状态
//    }
//    else if (RxState_1 == 10 && Usart_RxData == 0x5B)
//    {
//        RxState_1 = 0;  // 接收到帧尾0x5B，重置状态机为初始状态
//    }
//    else
//    {
//        // 如果接收到非预期数据，保留上一次正确接收到的数据
//        state_left = prev_state_left;
//        x_pic = prev_x_pic;
//        y_pic = prev_y_pic;
//        error_x_sign = prev_error_x_sign;
//        error_y_sign = prev_error_y_sign;
//        eiq_left = prev_eiq_left;
//        Cu = prev_Cu;
//        Ci = prev_Ci;
//        open_close_left = prev_open_close_left;
//        
//        // 可以选择在此处添加日志记录或错误处理代码
//    }

//    // 保存当前正确接收到的数据，以备下次处理错误数据时使用
//    prev_state_left = state_left;
//    prev_x_pic = x_pic;
//    prev_y_pic = y_pic;
//    prev_error_x_sign = error_x_sign;
//    prev_error_y_sign = error_y_sign;
//    prev_eiq_left = eiq_left;
//    prev_Cu = Cu;
//    prev_Ci = Ci;
//    prev_open_close_left = open_close_left;
//}
