Files
TC264_300W_Power/code/vofa_client.c
2025-10-19 19:08:23 +08:00

235 lines
6.8 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 文件编码: 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); // 发送图像数据
}