// 文件编码: GB18030
/*
 * vofa_client.c
 *
 *  Created on: 2025年4月4日
 *      Author: LHYe200
 */

#include "vofa_client.h"
#include "esp8266.h"

float vofa_data[VOFA_RECEIVE_CH] = {0}; // 记录接收数据
float vofa_last_data = 0;
uint8 vofa_last_ch = -1;
uint8 vofa_receive_new_data[VOFA_RECEIVE_CH] = {0}; // 接收新数据标志位
uint8 rev_count = 0; // 接收计数
uint8 rev_buffer[8] = {0}; // 接收缓冲区

uint8 failed_flag = 1;

typedef union
{
    uint8 send[4];
    float data;
}float_data;

float_data fdata[VOFA_RECEIVE_CH + 1];
uint8 endian_flag = 0; // 大小端标志位
uint8 tail[4] = {0x00, 0x00, 0x80, 0x7f};

static inline void Chage_BS(uint8 *data)
{
    if(endian_flag)
    {
        return;
    }

    for(int i = 0; i < 2; i++)
    {
        uint8 temp = data[i];
        data[i] = data[3 - i];
        data[3 - i] = temp;
    }
}

void VOFA_Data_Init()
{
    unsigned int x = 1;
    uint8 *endian_check = (uint8*)&x;
    if(endian_check[0] != 1)
    {
        endian_flag = 0;
    }
//  printf("flag:%d\n\r",endian_flag);
    memcpy(fdata[VOFA_SEND_CH].send, tail, sizeof(tail));

    memset(vofa_data, 0, sizeof(vofa_data)); // 清除接收数据
    memset(vofa_receive_new_data, 0, sizeof(vofa_receive_new_data)); // 清除接收新数据标志位
}


uint8 VOFA_Connection_Init()
{
    #if VOFA_CLIENT_COM_INTERFACE == 0
    // 使用串口通信
    uart_init(VOFA_CLIENT_UART_PORT, VOFA_CLIENT_UART_BAUDRATE, VOFA_CLIENT_UART_RX, VOFA_CLIENT_UART_TX);      // 串口初始化
    uart_rx_interrupt(VOFA_CLIENT_UART_PORT, 1);
    #elif VOFA_CLIENT_COM_INTERFACE == 1
    // 使用WIFI SPI通信
    uint32 failure_count = 0;
    while(wifi_spi_init(VOFA_CLIENT_WIFI_SSID, VOFA_CLIENT_WIFI_PASSWORD))
    {
        #if VOFA_CLIENT_WIFI_ENABLE_PRINTF
        printf("\r\n connect wifi failed. \r\n");
        #endif
        failure_count ++;
        if(failure_count > VOFA_CLIENT_WIFI_FAILURE_RETRY)                          // 如果连接失败超过指定次数则退出
        {
            return 0;
        }
        system_delay_ms(100);                                                   // 初始化失败 等待 100ms
    }

    #if VOFA_CLIENT_WIFI_ENABLE_PRINTF
    printf("\r\n module version:%s",wifi_spi_version);                          // 模块固件版本
    printf("\r\n module mac    :%s",wifi_spi_mac_addr);                         // 模块 MAC 信息
    printf("\r\n module ip     :%s",wifi_spi_ip_addr_port);                     // 模块 IP 地址
    #endif
    failure_count = 0;
    if(0 == WIFI_SPI_AUTO_CONNECT)                                              // 如果没有开启自动连接 就需要手动连接目标 IP
    {
        while(wifi_spi_socket_connect(                                          // 向指定目标 IP 的端口建立 TCP 连接
            "TCP",                                                              // 指定使用TCP方式通讯
            VOFA_CLIENT_WIFI_TARGET_IP,                                                 // 指定远端的IP地址，填写上位机的IP地址
            VOFA_CLIENT_WIFI_TARGET_PORT,                                               // 指定远端的端口号，填写上位机的端口号，通常上位机默认是8080
            VOFA_CLIENT_WIFI_LOCAL_PORT))                                               // 指定本机的端口号
        {
            #if VOFA_CLIENT_WIFI_ENABLE_PRINTF
            printf("\r\n socket connect failed. \r\n");
            #endif
            failure_count ++;
            if(failure_count > VOFA_CLIENT_WIFI_FAILURE_RETRY)                  // 如果连接失败超过指定次数则退出
            {
                return 0;
            }
            system_delay_ms(100);                                               // 建立连接失败 等待 100ms
        }
    }

    #elif VOFA_CLIENT_COM_INTERFACE == 2
    // 填写自定义接口的初始化代码

    #endif
    failed_flag = 0;
    return 1;
}


uint8 VOFA_Client_Init()
{
    VOFA_Data_Init();
    return VOFA_Connection_Init();
}

void VOFA_Sender(uint8 *p, uint32 len)
{
    if(failed_flag) // 如果初始化失败则不发送数据
    {
        return;
    }
    #if VOFA_CLIENT_COM_INTERFACE == 0

    ESP8266_send_data(p,len);
    // uart_write_buffer(VOFA_CLIENT_UART_PORT,p,len);
    #elif VOFA_CLIENT_COM_INTERFACE == 1
    wifi_spi_send_buffer(p,len);
    #elif VOFA_CLIENT_COM_INTERFACE == 2
    // 填写自定义接口的发送代码

    #endif
}

void VOFA_Receiver_Callback(uint8 rev_data)
{
    if(failed_flag) // 如果初始化失败则不发送数据
    {
        return;
    }
    uint8 rev_tmp = 0;
    uint8 tmp[4] = {0};
    #if VOFA_CLIENT_COM_INTERFACE == 0
    rev_tmp = rev_data;
    // while(uart_query_byte(VOFA_CLIENT_UART_PORT, &rev_tmp))
    #elif VOFA_CLIENT_COM_INTERFACE == 1
    while(wifi_spi_read_buffer(&rev_tmp,1))
    #elif VOFA_CLIENT_COM_INTERFACE == 2
    // 填写自定义接口的接收代码,每次获取一个字节循环进行处理
    #endif
    {
        if(rev_tmp == 0xA6 && rev_buffer[0] != 0xA6) // 判断帧头
        {
            rev_count = 0; // 未收到帧头或者未正确包含帧头则重新接收
        }
        rev_buffer[rev_count++] = rev_tmp; // 保存数据
        if(rev_count >= 7) // 判断是否接收到指定数量的数据
        {
            if(rev_buffer[0] == 0xA6) // 判断帧头是否正确
            {
                if(rev_buffer[1] == rev_buffer[6] && rev_buffer[1] < VOFA_RECEIVE_CH)
                {
                    tmp[0] = rev_buffer[2]; // 低字节
                    tmp[1] = rev_buffer[3]; // 高字节
                    tmp[2] = rev_buffer[4]; // 低字节
                    tmp[3] = rev_buffer[5]; // 高字节
//                     Chage_BS(tmp);
                    vofa_last_ch = rev_buffer[1]; // 保存上次接收通道
                    memcpy(&vofa_data[vofa_last_ch], tmp, 4); // 拷贝数据
                    vofa_receive_new_data[rev_buffer[1]] = 1; // 接收新数据标志位置位
                    vofa_last_data = vofa_data[vofa_last_ch]; // 保存上次接收数据
                }
            }
            rev_count = 0; // 清除缓冲区计数值
            rev_buffer[0] = 0; // 清除缓冲区数据
        }
    }
}



void VOFA_Set_JustFloat_Data(int CH, float data)
{
    fdata[CH].data = data;
//     Chage_BS(fdata[CH].send);
}

void VOFA_Set_JustFloat_Datas_From_Start(int num,...)
{
    va_list Valist;
    int i = 0;
    va_start(Valist, num);

    for(i = 0; i < num; ++i)
    {
        fdata[i].data = va_arg(Valist, float);
        Chage_BS(fdata[i].send);
    }
    va_end(Valist);
}

void VOFA_Send_Datas(int num)
{
    uint8 *p = fdata[0].send;
    memcpy(fdata[num].send, tail, sizeof(tail));
    VOFA_Sender(p, 4 * (num + 1));
}


void VOFA_Send_JustFloat_Image(int IMG_ID, int IMG_WIDTH, int IMG_HEIGHT,int IMG_DATA_SIZE, ImgFormat IMG_FORMAT,uint8* IMG_DATA)
{
    int preFrame[7] = {
        IMG_ID, 
        IMG_DATA_SIZE,
        IMG_WIDTH, 
        IMG_HEIGHT, 
        (int)IMG_FORMAT, 
        0x7F800000,
        0x7F800000
    };
    uint8 preFrameData[28] = {0};
    memcpy(preFrameData, preFrame, sizeof(int)*7); // 拷贝预处理数据
    VOFA_Sender(preFrameData, sizeof(int)*7); // 发送预处理数据
    VOFA_Sender(IMG_DATA, IMG_DATA_SIZE); // 发送图像数据
}

