diff --git a/vofa/vofa_client.c b/vofa/vofa_client.c new file mode 100644 index 0000000..d1c9219 --- /dev/null +++ b/vofa/vofa_client.c @@ -0,0 +1,220 @@ +// 文件编码: GB18030 +/* + * vofa_client.c + * + * Created on: 2025年4月4日 + * Author: LHYe200 + */ + +#include "vofa_client.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; + } +} + + +uint8 VOFA_Client_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)); // 清除接收新数据标志位 + #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; +} + +void VOFA_Sender(uint8 *p, uint32 len) +{ + if(failed_flag) // 如果初始化失败则不发送数据 + { + return; + } + #if VOFA_CLIENT_COM_INTERFACE == 0 + 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() +{ + if(failed_flag) // 如果初始化失败则不发送数据 + { + return; + } + uint8 rev_tmp = 0; + uint8 tmp[4] = {0}; + #if VOFA_CLIENT_COM_INTERFACE == 0 + 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); // 发送图像数据 +} +