From bd9ffa3de2d09eb7e534b003529e1da02228a317 Mon Sep 17 00:00:00 2001 From: OPTOC <9159397+optoc@user.noreply.gitee.com> Date: Thu, 4 Sep 2025 16:01:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BD=93=E8=A7=A3=E6=9E=90=E4=B8=8D=E5=87=BA?= =?UTF-8?q?=E9=A3=9E=E6=8E=A7=E6=95=B0=E6=8D=AE=E6=97=B6=E9=97=AA=E7=BA=A2?= =?UTF-8?q?=E7=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/drivers/sertrf/device.h | 2 +- app/drivers/sertrf/protocol/MSP.c | 8 ++- app/drivers/sertrf/protocol/MSP.h | 3 +- app/drivers/sertrf/protocol/mavlink_control.c | 10 +-- app/drivers/sertrf/protocol/mavlink_control.h | 3 +- app/drivers/sertrf/protocol/p_protocol.c | 21 +++++- app/drivers/sertrf/protocol/p_protocol.h | 15 +++++ app/drivers/sertrf/sertrf.c | 66 ++++++++++++++++--- app/drivers/sertrf/sertrf.h | 6 +- 9 files changed, 112 insertions(+), 22 deletions(-) diff --git a/app/drivers/sertrf/device.h b/app/drivers/sertrf/device.h index 8516b5d..ac79173 100644 --- a/app/drivers/sertrf/device.h +++ b/app/drivers/sertrf/device.h @@ -76,7 +76,7 @@ typedef struct uint8_t connect_pc; // int (*embedded_read)(device_t *port, void *buffer, uint32_t length); // int (*embedded_write)(device_t *port, const void *data, uint32_t size); - + uint8_t last_color; }device_t; diff --git a/app/drivers/sertrf/protocol/MSP.c b/app/drivers/sertrf/protocol/MSP.c index 817bf82..dd803dd 100644 --- a/app/drivers/sertrf/protocol/MSP.c +++ b/app/drivers/sertrf/protocol/MSP.c @@ -466,21 +466,23 @@ void msp_recv_loop(msp_port_t *msp) } } } -void msp_recv_buf(msp_port_t *msp, void *data, uint32_t size) +int msp_recv_buf(msp_port_t *msp, void *data, uint32_t size) { + uint8_t res = 0; uint32_t size_lat = size; uint8_t* data_char = (uint8_t*)data; while (size_lat --) { - uint8_t c = data_char[size - size_lat - 1]; + uint8_t c = data_char[size - size_lat - 1]; if (msp_parse_received_data(msp, c)) { if (msp->c_state == MSP_COMMAND_RECEIVED) { msp_process_received_command(msp); - // break; + res ++; } } } + return res; } diff --git a/app/drivers/sertrf/protocol/MSP.h b/app/drivers/sertrf/protocol/MSP.h index e45a207..81b0090 100644 --- a/app/drivers/sertrf/protocol/MSP.h +++ b/app/drivers/sertrf/protocol/MSP.h @@ -318,8 +318,9 @@ void msp_recv_loop(msp_port_t *msp); * @param msp 接口 * @param data 接收数据 * @param size 接收数据长度 + * @retval 解析成功次数 */ -void msp_recv_buf(msp_port_t *msp,void *data, uint32_t size); +int msp_recv_buf(msp_port_t *msp,void *data, uint32_t size); /** * @brief MSP数据包解析 * diff --git a/app/drivers/sertrf/protocol/mavlink_control.c b/app/drivers/sertrf/protocol/mavlink_control.c index 10c4fdc..5f02039 100644 --- a/app/drivers/sertrf/protocol/mavlink_control.c +++ b/app/drivers/sertrf/protocol/mavlink_control.c @@ -179,10 +179,11 @@ void mavlink_recv_loop(mavlink_device_t* mavlink_device) } } -void mavlink_recv_buf(mavlink_device_t* mavlink_device, void *data, uint32_t size) +int mavlink_recv_buf(mavlink_device_t* mavlink_device, void *data, uint32_t size) { + uint8_t res = 0; bool success = false; - + mavlink_message_t message; uint32_t size_lat = size; @@ -196,8 +197,9 @@ void mavlink_recv_buf(mavlink_device_t* mavlink_device, void *data, uint32_t siz if(success){ // printf("Received message from serial with ID #%d (sys:%d|comp:%d):\n", message.msgid, message.sysid, message.compid); mavlik_packet_processing(mavlink_device,&message); - // break; + success = false; + res++; } } - + return res; } \ No newline at end of file diff --git a/app/drivers/sertrf/protocol/mavlink_control.h b/app/drivers/sertrf/protocol/mavlink_control.h index b7f5a98..31bf0c8 100644 --- a/app/drivers/sertrf/protocol/mavlink_control.h +++ b/app/drivers/sertrf/protocol/mavlink_control.h @@ -101,7 +101,8 @@ void mavlink_recv_loop(mavlink_device_t* mavlink_device); * @param mavlink_device 接口 * @param data 数据 * @param size 大小 + * @retval 解析成功次数 */ -void mavlink_recv_buf(mavlink_device_t* mavlink_device, void *data, uint32_t size); +int mavlink_recv_buf(mavlink_device_t* mavlink_device, void *data, uint32_t size); #endif \ No newline at end of file diff --git a/app/drivers/sertrf/protocol/p_protocol.c b/app/drivers/sertrf/protocol/p_protocol.c index ff017f4..fcd8990 100644 --- a/app/drivers/sertrf/protocol/p_protocol.c +++ b/app/drivers/sertrf/protocol/p_protocol.c @@ -128,10 +128,27 @@ void Protocol_buf_decode(void* data, uint32_t size) protocol.pro_type = Protocol_buf_search(data, size); break; case PROTOCOL_MSP: - msp_recv_buf(&protocol.msp, data, size); + protocol.analysis_sussess_count += msp_recv_buf(&protocol.msp, data, size); break; case PROTOCOL_MAVLINK: - mavlink_recv_buf(&protocol.mavlink_device, data, size); + protocol.analysis_sussess_count += mavlink_recv_buf(&protocol.mavlink_device, data, size); break; } +} + +protocol_status_t get_protocol_status(void) +{ + protocol.protocol_status = PROTOCOL_STATUS_OK; + + if(protocol.pro_type == PROTOCOL_IDLE) + { + protocol.protocol_status = PROTOCOL_STATUS_TYPE_IDLE; + } else if(protocol.analysis_sussess_count == 0) + { + protocol.protocol_status = PROTOCOL_STATUS_NO_DATA; + } + + protocol.analysis_sussess_count = 0; + + return protocol.protocol_status; } \ No newline at end of file diff --git a/app/drivers/sertrf/protocol/p_protocol.h b/app/drivers/sertrf/protocol/p_protocol.h index 6625908..c457224 100644 --- a/app/drivers/sertrf/protocol/p_protocol.h +++ b/app/drivers/sertrf/protocol/p_protocol.h @@ -23,6 +23,13 @@ typedef enum PORT_LINUX_UART = 0, PORT_LINUX_SBDATA, }port_type_m; +typedef enum +{ + PROTOCOL_STATUS_OK = 0, + PROTOCOL_STATUS_NO_DATA, //没有收到数据,或者数据小于一定量 + PROTOCOL_STATUS_TYPE_IDLE, //协议类型未知 + PROTOCOL_STATUS_ANALYSIS_ERROR, //长时间解析失败 +}protocol_status_t; typedef struct { protocol_port_t port; @@ -32,6 +39,8 @@ typedef struct mavlink_device_t mavlink_device; msp_port_t msp; + protocol_status_t protocol_status; + uint16_t analysis_sussess_count; //数据解析成功次数 }protocol_t; /** @@ -66,4 +75,10 @@ int Protocol_buf_search(void* data, uint32_t size); * @param size 数据长度 */ void Protocol_buf_decode(void* data, uint32_t size); +/** + * @brief 获取协议状态 + * + * @retval 协议状态 + */ +protocol_status_t get_protocol_status(void); #endif \ No newline at end of file diff --git a/app/drivers/sertrf/sertrf.c b/app/drivers/sertrf/sertrf.c index d9a8ae3..63d6f1f 100644 --- a/app/drivers/sertrf/sertrf.c +++ b/app/drivers/sertrf/sertrf.c @@ -27,6 +27,12 @@ void sertrf_start(void) NULL, 4096, 20); + os_thread_create(&sertrf.task_thread, + "task_thread", + task_thread, + NULL, + 2048, + 10); } void embedded_thread(void* arg) { @@ -54,15 +60,52 @@ void embedded_thread(void* arg) embedded_device_write(&sertrf.device, data, pc_size); } // printf_chill_time(10,1000); - pc_link_rgb_color(&sertrf.device); + //需要添加一些延时,否则会卡死,导致看门狗复位 // vTaskDelay(( TickType_t ) 1000 / configTICK_RATE_HZ); os_thread_sleep(1); } } +void task_thread(void* arg) +{ + while(true) + { + size_t start_time = os_get_sys_time(); + pc_link_rgb_color(&sertrf.device); + + if(sertrf.device.connect_pc > DISCONNECT) + { + size_t end_time = 0; + if(start_time - end_time > 1000) + { + switch(get_protocol_status()) + { + case PROTOCOL_STATUS_OK: + rgb_color_change(0, sertrf.device.last_color); + break; + case PROTOCOL_STATUS_NO_DATA: + rgb_color_change(0, RGB_COLOR_RAD); + break; + case PROTOCOL_STATUS_TYPE_IDLE: + rgb_color_change(0, RGB_COLOR_RAD); + break; + case PROTOCOL_STATUS_ANALYSIS_ERROR: + rgb_color_change(0, RGB_COLOR_RAD); + break; + default: + break; + } + end_time = os_get_sys_time(); + } + } + + os_thread_sleep(100); + } +} void pc_link_rgb_color(device_t* device) { static uint8_t last_connect = 255, last_wifi_mode = 0; + uint8_t new_color = 0; if(device->connect_pc != last_connect || last_wifi_mode != device->init_device.wifi_mode) { switch (device->connect_pc) @@ -70,34 +113,39 @@ void pc_link_rgb_color(device_t* device) case DISCONNECT: { if(device->init_device.wifi_mode == WIFI_NETIF_MODE_AP) - rgb_color_change(0, RGB_COLOR_GREEN_WHITE); + new_color = RGB_COLOR_GREEN_WHITE; else - rgb_color_change(0, RGB_COLOR_GREEN_PURPLE); - + new_color = RGB_COLOR_GREEN_PURPLE; break; } case CONNECT_WIFI_TCP: { if(device->init_device.wifi_mode == WIFI_NETIF_MODE_AP) - rgb_color_change(0, RGB_COLOR_WHITE); + new_color = RGB_COLOR_WHITE; else - rgb_color_change(0, RGB_COLOR_PURPLE); + new_color = RGB_COLOR_PURPLE; break; } case CONNECT_WIFI_UDP: { if(device->init_device.wifi_mode == WIFI_NETIF_MODE_AP) - rgb_color_change(0, RGB_COLOR_WHITE); + new_color = RGB_COLOR_WHITE; else - rgb_color_change(0, RGB_COLOR_PURPLE); + new_color = RGB_COLOR_PURPLE; break; } case CONNECT_BLE: - rgb_color_change(0, RGB_COLOR_GREEN); + new_color = RGB_COLOR_GREEN; break; } + + if(device->last_color != new_color) + rgb_color_change(0,new_color); + + device->last_color = new_color; + last_connect = device->connect_pc; last_wifi_mode = device->init_device.wifi_mode; } diff --git a/app/drivers/sertrf/sertrf.h b/app/drivers/sertrf/sertrf.h index fa2e3c2..88ca35d 100644 --- a/app/drivers/sertrf/sertrf.h +++ b/app/drivers/sertrf/sertrf.h @@ -9,7 +9,7 @@ typedef struct { device_t device; os_thread_t embedded_thread; - + os_thread_t task_thread; }sertrf_t; /** @@ -36,6 +36,10 @@ void sertrf_status(void); * @brief embedded thread */ void embedded_thread(void* arg); +/** + * @brief task thread + */ +void task_thread(void* arg); /** * @brief 根据连接状态显示不同的颜色 *