#include "ota_xsp.h" #include "includes.h" offline_ota_state_t xsp_ota_state; //采集器主动发送(串口发送,升级显示屏) void coll_msg_send_uart(collect_gateway_msg_format_t *p_msg, uint16_t msg_type, uint16_t len) { static uint32_t msg_no = 0; // char *msg = NULL; uint16_t p_crc; p_msg->frame_header = 0xfefe; p_msg->proto_Ver = PROTOCOL_VERSION_2; p_msg->msg_id = msg_no++; p_msg->first_type = FIRST_UPDATE_TYPE; p_msg->second_type = msg_type; p_msg->msg_len = len+2;//后面加两字节的CRC p_crc = CRC16_get((uint8_t *)p_msg,p_msg->msg_len+FRAME_HEADER_LEN-2); p_msg->info[len] = p_crc&0xff; p_msg->info[len+1] = (p_crc>>8)&0xff; uart_msg_send(UART_485,(char *)p_msg,FRAME_HEADER_LEN + len+2); // data_dump("xsp ota send",(uint8_t *)p_msg,FRAME_HEADER_LEN + len+2); } //升级开始指令 void ota_xsp_start(void) { uint32_t timer = 0; collect_gateway_msg_format_t msg; ota_xsp_start_info_t *p_ota = (ota_xsp_start_info_t *)msg.info; p_ota->rcv_device_type = ota_master.des_device_type; //device_info.device_type; p_ota->rcv_device_sn = ota_master.des_device_sn; //0xffffffff; p_ota->des_device_type = ota_master.des_device_type; // device_info.device_type; p_ota->des_device_sn = ota_master.des_device_sn; //0xffffffff; p_ota->firmware_type = FIRM_MCU_TYPE; //ota_master.firmware_type; p_ota->update_version = ota_master.update_version; //device_fixed_info.Soft_ver_app; p_ota->total_bytes = ota_master.total_bytes; p_ota->each_max_bytes = OTA_XSP_EACH_MAX_BYTES; p_ota->losepage = OTA_XSP_LOSEPAGE; p_ota->Send_interval = UPDATE_EACH_TIME; printf("total_bytes = %d, send interval = %d\n",p_ota->total_bytes, timer); coll_msg_send_uart(&msg, SECOND_UPDATE_START, OTA_XSP_START_INFO_LEN); } //连续发送阶段 void ota_xsp_continues(void) { collect_gateway_msg_format_t msg; ota_xsp_continues_info_t *p_ota = (ota_xsp_continues_info_t *)msg.info; uint32_t timer = 0; uint8_t buff[128] = {0}; // uint16_t i=0; printf("ota_xsp_continues\r\n"); p_ota->rcv_device_type = ota_master.des_device_type; p_ota->rcv_device_sn = ota_master.des_device_sn; p_ota->des_device_type = ota_master.des_device_type; p_ota->des_device_sn = ota_master.des_device_sn; p_ota->total_pkgs = ota_master.total_pkgs; p_ota->sub_pkg_len = OTA_XSP_UPDATE_PAYLAOA_LEN; timer = UPDATE_EACH_TIME; printf("timer = %d\r\n", timer); printf("xsp_update total_pkgs = %d\r\n",ota_master.total_pkgs); if(ota_master.sub_pkg_id <= ota_master.total_pkgs) { printf("ota_xsp_continues {%d/%d}\r\n", ota_master.total_pkgs,ota_master.sub_pkg_id); p_ota->sub_pkg_id = ota_master.sub_pkg_id++; Flash_BufferRead(OFFLINE_MASTER_DOWN_ADDR + (p_ota->sub_pkg_id - 1)*OTA_XSP_UPDATE_PAYLAOA_LEN, (uint8_t *)buff, OTA_XSP_UPDATE_PAYLAOA_LEN); memcpy(p_ota->pkg_content,buff,OTA_XSP_UPDATE_PAYLAOA_LEN); coll_msg_send_uart(&msg, SECOND_UPDATE_CONTINUE, OTA_XSP_CONTINUES_INFO_LEN); // printf("ota_xsp_continues1 {%d/%d}\r\n", ota_master.total_pkgs,ota_master.sub_pkg_id); if(ota_master.sub_pkg_id > ota_master.total_pkgs)//最后一包 { xsp_ota_state.flag = 0; // memset(&xsp_ota_state,0,sizeof(offline_ota_state_t)); //连续发送完成,打开等待定时器,如果一定时间内没收到重传请求或状态上报则认为升级结束 ota_timer_retransmit_master_set(OPEN,OTA_MASTER_WAIT_TIME_TICK); xsp_ota_state.state = OTA_RETRANSMIT; } } else { xsp_ota_state.flag = 0; // memset(&xsp_ota_state,0,sizeof(offline_ota_state_t)); //连续发送完成,打开等待定时器,如果一定时间内没收到重传请求或状态上报则认为升级结束 ota_timer_retransmit_master_set(OPEN,OTA_MASTER_WAIT_TIME_TICK); xsp_ota_state.state = OTA_RETRANSMIT; } } //发送重传包 void ota_xsp_retransmit_resp(ota_xsp_retransmit_req_t *p_req) { collect_gateway_msg_format_t msg; ota_xsp_continues_info_t *p_ota = (ota_xsp_continues_info_t *)msg.info; uint8_t buff[128] = {0}; printf("repeat pkg id:%d\n",p_req->repeat_sub_pkg_id); p_ota->rcv_device_type = ota_master.des_device_type; p_ota->rcv_device_sn = ota_master.des_device_sn; p_ota->des_device_type = ota_master.des_device_type; p_ota->des_device_sn = ota_master.des_device_sn; p_ota->total_pkgs = ota_master.total_pkgs; p_ota->sub_pkg_len = OTA_XSP_UPDATE_PAYLAOA_LEN; p_ota->sub_pkg_id = p_req->repeat_sub_pkg_id; Flash_BufferRead(OFFLINE_MASTER_DOWN_ADDR + (p_req->repeat_sub_pkg_id - 1)*OTA_XSP_UPDATE_PAYLAOA_LEN, (uint8_t *)buff, OTA_XSP_UPDATE_PAYLAOA_LEN); memcpy(p_ota->pkg_content,buff,OTA_XSP_UPDATE_PAYLAOA_LEN); coll_msg_send_uart(&msg, SECOND_UPDATE_RETRA_DOWN, OTA_XSP_CONTINUES_INFO_LEN); // printf("repeat pkg id1:%d\n",p_req->repeat_sub_pkg_id); } //上传升级状态 void xsp_upload_state(ota_xsp_state_upload_t *p_msg) { collect_gateway_msg_format_t msg; ota_state_upload_t *p_ota = (ota_state_upload_t *)msg.info; printf("ota state,des type:%02x,des sn:%u\n",p_msg->des_device_type,p_msg->des_device_sn); p_ota->rcv_device_type = device_info.device_type; p_ota->rcv_device_sn = device_info.device_sn; p_ota->des_device_type = p_msg->des_device_type; p_ota->des_device_sn = p_msg->des_device_sn; p_ota->des_bt_ver = p_msg->des_bt_ver; p_ota->des_app_ver = p_msg->des_app_ver; p_ota->update_state = p_msg->update_state; p_ota->reserve = 0; coll_msg_send(&msg, net_msg_type_update_status_upload, OTA_STATE_UPLOAD_LEN); } //收到重传请求后下发命令 void xsp_master_ota_proc(uint8_t *data, uint16_t len) { collect_gateway_msg_format_t *p_msg = (collect_gateway_msg_format_t *)data; uint16_t p_crc, crc; ota_xsp_retransmit_req_t *p_req = (ota_xsp_retransmit_req_t *)p_msg->info; ota_xsp_state_upload_t *p_ota = (ota_xsp_state_upload_t *)p_msg->info; if(p_msg->frame_header!=0xfefe)//帧头错误 { // printf("p_msg->header:%04x\n",p_msg->frame_header); printf("header error\n"); return; } if(p_msg->msg_len+FRAME_HEADER_LEN > len)//命令的数据长度大于实际长度 { printf("datalen err\n"); return; } //crc 校验 p_crc = p_msg->info[p_msg->msg_len-2+1];//高位 p_crc = (p_crc<<8)|p_msg->info[p_msg->msg_len-2];//低位 crc = CRC16_get((uint8_t *)p_msg,p_msg->msg_len+FRAME_HEADER_LEN-2); if(p_crc != crc) { printf("crc err\n"); return; } switch(p_msg->first_type) { case FIRST_UPDATE_TYPE://升级类 switch(p_msg->second_type) { case SECOND_UPDATE_RETRA_UP://重传请求 // ota_xsp_retransmit_req_t *p_req = (ota_xsp_retransmit_req_t *)p_msg->info; ota_xsp_retransmit_resp(p_req); ota_timer_retransmit_master_set(OPEN,OTA_MASTER_WAIT_TIME_TICK);//主设备等待定时器 break; case SECOND_UPDATE_STATE_UP://升级状态上行 // ota_xsp_state_upload_t *p_ota = (ota_xsp_state_upload_t *)p_msg->info; xsp_upload_state(p_ota); ota_timer_retransmit_master_set(OPEN,OTA_MASTER_WAIT_TIME_TICK);//主设备等待定时器 // //直接通过Lora上传64 // msg_para.Coll_no = 0; // msg_para.Devices_type = XSP_0904; // gateway_down_business_return(COLL_GATE_XSP_REPLY,UART_SUCCESS,data,len);// // msg_para_init();//清除存储的下发参数 break; default: break; } break; default: break; } } //显示屏升级时初始化 int xsp_ota_info_Init(void) { memset(&ota_master, 0, sizeof(ota_pkg_info_t)); ota_master.des_device_type = ota_slave.des_device_type; ota_master.des_device_sn = ota_slave.des_device_sn; ota_master.rcv_device_sn = ota_slave.rcv_device_sn; ota_master.rcv_device_type = ota_slave.rcv_device_type; ota_master.update_version = ota_slave.update_version; ota_master.total_bytes = ota_slave.total_bytes; ota_master.total_crc = ota_slave.total_crc; ota_master.total_pkgs = ota_master.total_bytes/OTA_UPDATE_PAYLAOA_LEN; ota_master.lastRightPkgNum = 1; if(ota_master.total_bytes%OTA_UPDATE_PAYLAOA_LEN) { ota_master.total_pkgs += 1; } ota_master.sub_pkg_id = 1; return 0; } //显示屏升级时的主设备 void xsp_upgrade_master(void) { //打开总定时器 ota_timer_total_master_set(OPEN,OTA_TOTAL_TIMEOUT_TIME_TICK); xsp_ota_info_Init(); memset(&xsp_ota_state,0,sizeof(offline_ota_state_t)); xsp_ota_state.flag = 1; xsp_ota_state.state = OTA_START; xsp_ota_state.start_num = 0; timeout_setValue(&xsp_ota_state.tt_send,10,1); } //显示屏升级发送流程 void ota_xsp_send_proce(void) { if(xsp_ota_state.flag) { if(timeout_isOut(&xsp_ota_state.tt_send)) { switch(xsp_ota_state.state) { case OTA_START: timeout_setValue(&xsp_ota_state.tt_send,OFFLINE_OTA_START_TIME,1); ota_xsp_start(); xsp_ota_state.start_num++; if(xsp_ota_state.start_num >= 5) { xsp_ota_state.start_num = 0; xsp_ota_state.state = OTA_CONTINUE; xsp_ota_state.pkg_id = 0; timeout_setValue(&xsp_ota_state.tt_send,OFFLINE_OTA_CONTINUE_TIME,1); } break; case OTA_CONTINUE: timeout_setValue(&xsp_ota_state.tt_send,OFFLINE_OTA_CONTINUE_TIME,1); ota_xsp_continues(); break; default: break; } } } } //显示屏升级处理 void xsp_ota_handle(void) { if(device_fixed_info.xsp_update_start) { device_fixed_info.xsp_update_start = 0; device_fixed_info.Work_State = DEV_WORK_STATE_UPDATING; ota_state.update_mode = OTA_WORK_STATE_XSP; xsp_upgrade_master();//离线升级时的主设备下发升级包 } ota_xsp_send_proce(); }