与APP对接OTA固件升级
This commit is contained in:
@@ -14,8 +14,15 @@ typedef struct
|
|||||||
const esp_partition_t *update;
|
const esp_partition_t *update;
|
||||||
esp_ota_handle_t ota_handle;
|
esp_ota_handle_t ota_handle;
|
||||||
int total_size;
|
int total_size;
|
||||||
|
uint16_t ota_data_cnt;
|
||||||
|
uint8_t ota_buff[20480 + 512];
|
||||||
}ota_u_t;
|
}ota_u_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t ota_file_size;
|
||||||
|
}ota_parm_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 获取当前ota信息
|
* @brief 获取当前ota信息
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -135,7 +135,10 @@ void Protocol_buf_decode(void* data, uint32_t size)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void protocol_set_message_status(message_status_m status)
|
||||||
|
{
|
||||||
|
protocol.message_status = status;
|
||||||
|
}
|
||||||
protocol_status_t get_protocol_status(void)
|
protocol_status_t get_protocol_status(void)
|
||||||
{
|
{
|
||||||
protocol.protocol_status = PROTOCOL_STATUS_OK;
|
protocol.protocol_status = PROTOCOL_STATUS_OK;
|
||||||
@@ -146,6 +149,9 @@ protocol_status_t get_protocol_status(void)
|
|||||||
} else if(protocol.analysis_sussess_count == 0)
|
} else if(protocol.analysis_sussess_count == 0)
|
||||||
{
|
{
|
||||||
protocol.protocol_status = PROTOCOL_STATUS_NO_DATA;
|
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;
|
protocol.analysis_sussess_count = 0;
|
||||||
|
|||||||
@@ -24,11 +24,17 @@ typedef enum
|
|||||||
PORT_LINUX_SBDATA,
|
PORT_LINUX_SBDATA,
|
||||||
}port_type_m;
|
}port_type_m;
|
||||||
typedef enum
|
typedef enum
|
||||||
|
{
|
||||||
|
MESSAGE_IDLE = 0,
|
||||||
|
MESSAGE_OTA,
|
||||||
|
}message_status_m;
|
||||||
|
typedef enum
|
||||||
{
|
{
|
||||||
PROTOCOL_STATUS_OK = 0,
|
PROTOCOL_STATUS_OK = 0,
|
||||||
PROTOCOL_STATUS_NO_DATA, //没有收到数据,或者数据小于一定量
|
PROTOCOL_STATUS_NO_DATA, //没有收到数据,或者数据小于一定量
|
||||||
PROTOCOL_STATUS_TYPE_IDLE, //协议类型未知
|
PROTOCOL_STATUS_TYPE_IDLE, //协议类型未知
|
||||||
PROTOCOL_STATUS_ANALYSIS_ERROR, //长时间解析失败
|
PROTOCOL_STATUS_ANALYSIS_ERROR, //长时间解析失败
|
||||||
|
PROTOCOL_STATUS_IN_OTA, //OTA中
|
||||||
}protocol_status_t;
|
}protocol_status_t;
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -40,7 +46,9 @@ typedef struct
|
|||||||
msp_port_t msp;
|
msp_port_t msp;
|
||||||
|
|
||||||
protocol_status_t protocol_status;
|
protocol_status_t protocol_status;
|
||||||
uint16_t analysis_sussess_count; //数据解析成功次数
|
uint16_t analysis_sussess_count; //数据解析成功次数
|
||||||
|
|
||||||
|
message_status_m message_status;
|
||||||
}protocol_t;
|
}protocol_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -75,10 +83,17 @@ int Protocol_buf_search(void* data, uint32_t size);
|
|||||||
* @param size 数据长度
|
* @param size 数据长度
|
||||||
*/
|
*/
|
||||||
void Protocol_buf_decode(void* data, uint32_t size);
|
void Protocol_buf_decode(void* data, uint32_t size);
|
||||||
|
/**
|
||||||
|
* @brief 设置消息状态
|
||||||
|
*
|
||||||
|
* @param status 消息状态
|
||||||
|
*/
|
||||||
|
void protocol_set_message_status(message_status_m status);
|
||||||
/**
|
/**
|
||||||
* @brief 获取协议状态
|
* @brief 获取协议状态
|
||||||
*
|
*
|
||||||
* @retval 协议状态
|
* @retval 协议状态
|
||||||
*/
|
*/
|
||||||
protocol_status_t get_protocol_status(void);
|
protocol_status_t get_protocol_status(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -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_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);
|
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;//标志位清零
|
sertrf.resend_device.handle_flag = 0;//标志位清零
|
||||||
break;
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -166,6 +170,8 @@ void task_thread(void* arg)
|
|||||||
case PROTOCOL_STATUS_ANALYSIS_ERROR:
|
case PROTOCOL_STATUS_ANALYSIS_ERROR:
|
||||||
rgb_color_change(1, RGB_COLOR_RAD);
|
rgb_color_change(1, RGB_COLOR_RAD);
|
||||||
break;
|
break;
|
||||||
|
case PROTOCOL_STATUS_IN_OTA:
|
||||||
|
rgb_color_change(1, RGB_COLOR_BLUE);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -297,28 +303,51 @@ void resend_user_parse(void *resend_device)
|
|||||||
os_thread_sleep(1000);
|
os_thread_sleep(1000);
|
||||||
esp_restart();
|
esp_restart();
|
||||||
break;
|
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:
|
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);
|
resend_send_cmd(resend_device, RESEND_CMD_ACK, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RESEND_CMD_OTA_DATA:
|
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");
|
SYS_LOG_DBG("KUYI_CMD_OTA_DATA %d\n", sertrf.resend_device.rx_frame.seq);
|
||||||
otau_write(&sertrf.otau, sertrf.resend_device.rx_frame.payload, sertrf.resend_device.rx_frame.len);
|
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);
|
resend_send_cmd(resend_device, RESEND_CMD_ACK, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RESEND_CMD_OTA_END:
|
case RESEND_CMD_OTA_END:
|
||||||
{
|
{
|
||||||
if(!sertrf.resend_device.status.resend_flag)
|
if(sertrf.otau.ota_data_cnt > 0)
|
||||||
otau_end(&sertrf.otau);
|
{
|
||||||
|
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);
|
resend_send_cmd(resend_device, RESEND_CMD_ACK, 0);
|
||||||
os_thread_sleep(2);
|
os_thread_sleep(2);
|
||||||
esp_restart();
|
esp_restart();
|
||||||
|
|||||||
Reference in New Issue
Block a user