From 601659e9f170a0f619510073ee49797b4c320ecb Mon Sep 17 00:00:00 2001 From: OPTOC <9159397+optoc@user.noreply.gitee.com> Date: Mon, 22 Sep 2025 14:32:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8EAPP=E5=AF=B9=E6=8E=A5OTA=E5=9B=BA?= =?UTF-8?q?=E4=BB=B6=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/drivers/sertrf/ota_u.h | 7 ++++ app/drivers/sertrf/protocol/p_protocol.c | 8 +++- app/drivers/sertrf/protocol/p_protocol.h | 17 +++++++- app/drivers/sertrf/sertrf.c | 49 +++++++++++++++++++----- 4 files changed, 69 insertions(+), 12 deletions(-) diff --git a/app/drivers/sertrf/ota_u.h b/app/drivers/sertrf/ota_u.h index a15f6ca..a14fa8f 100644 --- a/app/drivers/sertrf/ota_u.h +++ b/app/drivers/sertrf/ota_u.h @@ -14,8 +14,15 @@ typedef struct const esp_partition_t *update; esp_ota_handle_t ota_handle; int total_size; + uint16_t ota_data_cnt; + uint8_t ota_buff[20480 + 512]; }ota_u_t; +typedef struct +{ + uint32_t ota_file_size; +}ota_parm_t; + /** * @brief 获取当前ota信息 */ diff --git a/app/drivers/sertrf/protocol/p_protocol.c b/app/drivers/sertrf/protocol/p_protocol.c index fcd8990..ac54aed 100644 --- a/app/drivers/sertrf/protocol/p_protocol.c +++ b/app/drivers/sertrf/protocol/p_protocol.c @@ -135,7 +135,10 @@ void Protocol_buf_decode(void* data, uint32_t size) break; } } - +void protocol_set_message_status(message_status_m status) +{ + protocol.message_status = status; +} protocol_status_t get_protocol_status(void) { protocol.protocol_status = PROTOCOL_STATUS_OK; @@ -146,6 +149,9 @@ protocol_status_t get_protocol_status(void) } else if(protocol.analysis_sussess_count == 0) { protocol.protocol_status = PROTOCOL_STATUS_NO_DATA; + } else if(protocol.message_status == MESSAGE_OTA) + { + protocol.protocol_status = PROTOCOL_STATUS_IN_OTA; } protocol.analysis_sussess_count = 0; diff --git a/app/drivers/sertrf/protocol/p_protocol.h b/app/drivers/sertrf/protocol/p_protocol.h index c457224..e13f8be 100644 --- a/app/drivers/sertrf/protocol/p_protocol.h +++ b/app/drivers/sertrf/protocol/p_protocol.h @@ -24,11 +24,17 @@ typedef enum PORT_LINUX_SBDATA, }port_type_m; typedef enum +{ + MESSAGE_IDLE = 0, + MESSAGE_OTA, +}message_status_m; +typedef enum { PROTOCOL_STATUS_OK = 0, PROTOCOL_STATUS_NO_DATA, //没有收到数据,或者数据小于一定量 PROTOCOL_STATUS_TYPE_IDLE, //协议类型未知 PROTOCOL_STATUS_ANALYSIS_ERROR, //长时间解析失败 + PROTOCOL_STATUS_IN_OTA, //OTA中 }protocol_status_t; typedef struct { @@ -40,7 +46,9 @@ typedef struct msp_port_t msp; protocol_status_t protocol_status; - uint16_t analysis_sussess_count; //数据解析成功次数 + uint16_t analysis_sussess_count; //数据解析成功次数 + + message_status_m message_status; }protocol_t; /** @@ -75,10 +83,17 @@ int Protocol_buf_search(void* data, uint32_t size); * @param size 数据长度 */ void Protocol_buf_decode(void* data, uint32_t size); +/** + * @brief 设置消息状态 + * + * @param status 消息状态 +*/ +void protocol_set_message_status(message_status_m status); /** * @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 92c4b9c..120b7bc 100644 --- a/app/drivers/sertrf/sertrf.c +++ b/app/drivers/sertrf/sertrf.c @@ -110,11 +110,15 @@ void app_thread(void* arg) strcpy(sertrf_stauct.wifi_sta_ssid, g_cfg_app->app_config_wifi_para.wifi_sta_ssid); strcpy(sertrf_stauct.wifi_sta_password, g_cfg_app->app_config_wifi_para.wifi_sta_password); - resend_send_data(&sertrf.resend_device, RESEND_CMD_GET_PARAM, &sertrf_stauct, sizeof(sertrf_stauct_t), 100); + resend_send_data(&sertrf.resend_device, RESEND_CMD_GET_PARAM, &sertrf_stauct, sizeof(sertrf_stauct_t), 1000); sertrf.resend_device.handle_flag = 0;//标志位清零 break; - case 1: + case RESEND_CMD_OTA_GET_PARAM: + printf("RESEND_CMD_OTA_GET_PARAM\r\n"); + ota_parm_t ota_parm; + resend_send_data(&sertrf.resend_device, RESEND_CMD_OTA_GET_PARAM, &ota_parm, sizeof(ota_parm_t), 1000); + sertrf.resend_device.handle_flag = 0;//标志位清零 break; default: break; @@ -166,6 +170,8 @@ void task_thread(void* arg) case PROTOCOL_STATUS_ANALYSIS_ERROR: rgb_color_change(1, RGB_COLOR_RAD); break; + case PROTOCOL_STATUS_IN_OTA: + rgb_color_change(1, RGB_COLOR_BLUE); default: break; } @@ -297,28 +303,51 @@ void resend_user_parse(void *resend_device) os_thread_sleep(1000); esp_restart(); break; + case RESEND_CMD_OTA_GET_PARAM: + { + if(sizeof(ota_parm_t) != resend_parse->rx_frame.len) + { + printf("RESEND_CMD_OTA_GET_PARAM len error\r\n"); + } + ota_parm_t* ota_parm = (ota_parm_t*)resend_parse->rx_frame.payload; + printf("RESEND_CMD_OTA_GET_PARAM %d\n", ota_parm->ota_file_size); + resend_send_cmd(resend_device, RESEND_CMD_ACK, 0); + } + break; case RESEND_CMD_OTA_START: { - if(!sertrf.resend_device.status.resend_flag) - otau_init(&sertrf.otau); + + protocol_set_message_status(MESSAGE_OTA); + // if(!sertrf.resend_device.status.resend_flag) + otau_init(&sertrf.otau); resend_send_cmd(resend_device, RESEND_CMD_ACK, 0); } break; case RESEND_CMD_OTA_DATA: { - if(!sertrf.resend_device.status.resend_flag) + + memcpy(sertrf.otau.ota_buff + sertrf.otau.ota_data_cnt, sertrf.resend_device.rx_frame.payload, sertrf.resend_device.rx_frame.len); + + sertrf.otau.ota_data_cnt += sertrf.resend_device.rx_frame.len; + // if(!sertrf.resend_device.status.resend_flag) + if(sertrf.otau.ota_data_cnt >= 20480 ) { - SYS_LOG_DBG("KUYI_CMD_OTA_DATA"); - otau_write(&sertrf.otau, sertrf.resend_device.rx_frame.payload, sertrf.resend_device.rx_frame.len); + SYS_LOG_DBG("KUYI_CMD_OTA_DATA %d\n", sertrf.resend_device.rx_frame.seq); + otau_write(&sertrf.otau, sertrf.otau.ota_buff, sertrf.otau.ota_data_cnt); + sertrf.otau.ota_data_cnt = 0; } - resend_send_cmd(resend_device, RESEND_CMD_ACK, 0); } break; case RESEND_CMD_OTA_END: { - if(!sertrf.resend_device.status.resend_flag) - otau_end(&sertrf.otau); + if(sertrf.otau.ota_data_cnt > 0) + { + otau_write(&sertrf.otau, sertrf.otau.ota_buff, sertrf.otau.ota_data_cnt); + sertrf.otau.ota_data_cnt = 0; + } + // if(!sertrf.resend_device.status.resend_flag) + otau_end(&sertrf.otau); resend_send_cmd(resend_device, RESEND_CMD_ACK, 0); os_thread_sleep(2); esp_restart();