| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- #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();
- }
|