ota_xsp.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. #include "ota_xsp.h"
  2. #include "includes.h"
  3. offline_ota_state_t xsp_ota_state;
  4. //采集器主动发送(串口发送,升级显示屏)
  5. void coll_msg_send_uart(collect_gateway_msg_format_t *p_msg, uint16_t msg_type, uint16_t len)
  6. {
  7. static uint32_t msg_no = 0;
  8. // char *msg = NULL;
  9. uint16_t p_crc;
  10. p_msg->frame_header = 0xfefe;
  11. p_msg->proto_Ver = PROTOCOL_VERSION_2;
  12. p_msg->msg_id = msg_no++;
  13. p_msg->first_type = FIRST_UPDATE_TYPE;
  14. p_msg->second_type = msg_type;
  15. p_msg->msg_len = len+2;//后面加两字节的CRC
  16. p_crc = CRC16_get((uint8_t *)p_msg,p_msg->msg_len+FRAME_HEADER_LEN-2);
  17. p_msg->info[len] = p_crc&0xff;
  18. p_msg->info[len+1] = (p_crc>>8)&0xff;
  19. uart_msg_send(UART_485,(char *)p_msg,FRAME_HEADER_LEN + len+2);
  20. // data_dump("xsp ota send",(uint8_t *)p_msg,FRAME_HEADER_LEN + len+2);
  21. }
  22. //升级开始指令
  23. void ota_xsp_start(void)
  24. {
  25. uint32_t timer = 0;
  26. collect_gateway_msg_format_t msg;
  27. ota_xsp_start_info_t *p_ota = (ota_xsp_start_info_t *)msg.info;
  28. p_ota->rcv_device_type = ota_master.des_device_type; //device_info.device_type;
  29. p_ota->rcv_device_sn = ota_master.des_device_sn; //0xffffffff;
  30. p_ota->des_device_type = ota_master.des_device_type; // device_info.device_type;
  31. p_ota->des_device_sn = ota_master.des_device_sn; //0xffffffff;
  32. p_ota->firmware_type = FIRM_MCU_TYPE; //ota_master.firmware_type;
  33. p_ota->update_version = ota_master.update_version; //device_fixed_info.Soft_ver_app;
  34. p_ota->total_bytes = ota_master.total_bytes;
  35. p_ota->each_max_bytes = OTA_XSP_EACH_MAX_BYTES;
  36. p_ota->losepage = OTA_XSP_LOSEPAGE;
  37. p_ota->Send_interval = UPDATE_EACH_TIME;
  38. printf("total_bytes = %d, send interval = %d\n",p_ota->total_bytes, timer);
  39. coll_msg_send_uart(&msg, SECOND_UPDATE_START, OTA_XSP_START_INFO_LEN);
  40. }
  41. //连续发送阶段
  42. void ota_xsp_continues(void)
  43. {
  44. collect_gateway_msg_format_t msg;
  45. ota_xsp_continues_info_t *p_ota = (ota_xsp_continues_info_t *)msg.info;
  46. uint32_t timer = 0;
  47. uint8_t buff[128] = {0};
  48. // uint16_t i=0;
  49. printf("ota_xsp_continues\r\n");
  50. p_ota->rcv_device_type = ota_master.des_device_type;
  51. p_ota->rcv_device_sn = ota_master.des_device_sn;
  52. p_ota->des_device_type = ota_master.des_device_type;
  53. p_ota->des_device_sn = ota_master.des_device_sn;
  54. p_ota->total_pkgs = ota_master.total_pkgs;
  55. p_ota->sub_pkg_len = OTA_XSP_UPDATE_PAYLAOA_LEN;
  56. timer = UPDATE_EACH_TIME;
  57. printf("timer = %d\r\n", timer);
  58. printf("xsp_update total_pkgs = %d\r\n",ota_master.total_pkgs);
  59. if(ota_master.sub_pkg_id <= ota_master.total_pkgs) {
  60. printf("ota_xsp_continues {%d/%d}\r\n", ota_master.total_pkgs,ota_master.sub_pkg_id);
  61. p_ota->sub_pkg_id = ota_master.sub_pkg_id++;
  62. Flash_BufferRead(OFFLINE_MASTER_DOWN_ADDR + (p_ota->sub_pkg_id - 1)*OTA_XSP_UPDATE_PAYLAOA_LEN,
  63. (uint8_t *)buff, OTA_XSP_UPDATE_PAYLAOA_LEN);
  64. memcpy(p_ota->pkg_content,buff,OTA_XSP_UPDATE_PAYLAOA_LEN);
  65. coll_msg_send_uart(&msg, SECOND_UPDATE_CONTINUE, OTA_XSP_CONTINUES_INFO_LEN);
  66. // printf("ota_xsp_continues1 {%d/%d}\r\n", ota_master.total_pkgs,ota_master.sub_pkg_id);
  67. if(ota_master.sub_pkg_id > ota_master.total_pkgs)//最后一包
  68. {
  69. xsp_ota_state.flag = 0;
  70. // memset(&xsp_ota_state,0,sizeof(offline_ota_state_t));
  71. //连续发送完成,打开等待定时器,如果一定时间内没收到重传请求或状态上报则认为升级结束
  72. ota_timer_retransmit_master_set(OPEN,OTA_MASTER_WAIT_TIME_TICK);
  73. xsp_ota_state.state = OTA_RETRANSMIT;
  74. }
  75. }
  76. else
  77. {
  78. xsp_ota_state.flag = 0;
  79. // memset(&xsp_ota_state,0,sizeof(offline_ota_state_t));
  80. //连续发送完成,打开等待定时器,如果一定时间内没收到重传请求或状态上报则认为升级结束
  81. ota_timer_retransmit_master_set(OPEN,OTA_MASTER_WAIT_TIME_TICK);
  82. xsp_ota_state.state = OTA_RETRANSMIT;
  83. }
  84. }
  85. //发送重传包
  86. void ota_xsp_retransmit_resp(ota_xsp_retransmit_req_t *p_req)
  87. {
  88. collect_gateway_msg_format_t msg;
  89. ota_xsp_continues_info_t *p_ota = (ota_xsp_continues_info_t *)msg.info;
  90. uint8_t buff[128] = {0};
  91. printf("repeat pkg id:%d\n",p_req->repeat_sub_pkg_id);
  92. p_ota->rcv_device_type = ota_master.des_device_type;
  93. p_ota->rcv_device_sn = ota_master.des_device_sn;
  94. p_ota->des_device_type = ota_master.des_device_type;
  95. p_ota->des_device_sn = ota_master.des_device_sn;
  96. p_ota->total_pkgs = ota_master.total_pkgs;
  97. p_ota->sub_pkg_len = OTA_XSP_UPDATE_PAYLAOA_LEN;
  98. p_ota->sub_pkg_id = p_req->repeat_sub_pkg_id;
  99. Flash_BufferRead(OFFLINE_MASTER_DOWN_ADDR + (p_req->repeat_sub_pkg_id - 1)*OTA_XSP_UPDATE_PAYLAOA_LEN,
  100. (uint8_t *)buff, OTA_XSP_UPDATE_PAYLAOA_LEN);
  101. memcpy(p_ota->pkg_content,buff,OTA_XSP_UPDATE_PAYLAOA_LEN);
  102. coll_msg_send_uart(&msg, SECOND_UPDATE_RETRA_DOWN, OTA_XSP_CONTINUES_INFO_LEN);
  103. // printf("repeat pkg id1:%d\n",p_req->repeat_sub_pkg_id);
  104. }
  105. //上传升级状态
  106. void xsp_upload_state(ota_xsp_state_upload_t *p_msg)
  107. {
  108. collect_gateway_msg_format_t msg;
  109. ota_state_upload_t *p_ota = (ota_state_upload_t *)msg.info;
  110. printf("ota state,des type:%02x,des sn:%u\n",p_msg->des_device_type,p_msg->des_device_sn);
  111. p_ota->rcv_device_type = device_info.device_type;
  112. p_ota->rcv_device_sn = device_info.device_sn;
  113. p_ota->des_device_type = p_msg->des_device_type;
  114. p_ota->des_device_sn = p_msg->des_device_sn;
  115. p_ota->des_bt_ver = p_msg->des_bt_ver;
  116. p_ota->des_app_ver = p_msg->des_app_ver;
  117. p_ota->update_state = p_msg->update_state;
  118. p_ota->reserve = 0;
  119. coll_msg_send(&msg, net_msg_type_update_status_upload, OTA_STATE_UPLOAD_LEN);
  120. }
  121. //收到重传请求后下发命令
  122. void xsp_master_ota_proc(uint8_t *data, uint16_t len)
  123. {
  124. collect_gateway_msg_format_t *p_msg = (collect_gateway_msg_format_t *)data;
  125. uint16_t p_crc, crc;
  126. ota_xsp_retransmit_req_t *p_req = (ota_xsp_retransmit_req_t *)p_msg->info;
  127. ota_xsp_state_upload_t *p_ota = (ota_xsp_state_upload_t *)p_msg->info;
  128. if(p_msg->frame_header!=0xfefe)//帧头错误
  129. {
  130. // printf("p_msg->header:%04x\n",p_msg->frame_header);
  131. printf("header error\n");
  132. return;
  133. }
  134. if(p_msg->msg_len+FRAME_HEADER_LEN > len)//命令的数据长度大于实际长度
  135. {
  136. printf("datalen err\n");
  137. return;
  138. }
  139. //crc 校验
  140. p_crc = p_msg->info[p_msg->msg_len-2+1];//高位
  141. p_crc = (p_crc<<8)|p_msg->info[p_msg->msg_len-2];//低位
  142. crc = CRC16_get((uint8_t *)p_msg,p_msg->msg_len+FRAME_HEADER_LEN-2);
  143. if(p_crc != crc)
  144. {
  145. printf("crc err\n");
  146. return;
  147. }
  148. switch(p_msg->first_type) {
  149. case FIRST_UPDATE_TYPE://升级类
  150. switch(p_msg->second_type)
  151. {
  152. case SECOND_UPDATE_RETRA_UP://重传请求
  153. // ota_xsp_retransmit_req_t *p_req = (ota_xsp_retransmit_req_t *)p_msg->info;
  154. ota_xsp_retransmit_resp(p_req);
  155. ota_timer_retransmit_master_set(OPEN,OTA_MASTER_WAIT_TIME_TICK);//主设备等待定时器
  156. break;
  157. case SECOND_UPDATE_STATE_UP://升级状态上行
  158. // ota_xsp_state_upload_t *p_ota = (ota_xsp_state_upload_t *)p_msg->info;
  159. xsp_upload_state(p_ota);
  160. ota_timer_retransmit_master_set(OPEN,OTA_MASTER_WAIT_TIME_TICK);//主设备等待定时器
  161. // //直接通过Lora上传64
  162. // msg_para.Coll_no = 0;
  163. // msg_para.Devices_type = XSP_0904;
  164. // gateway_down_business_return(COLL_GATE_XSP_REPLY,UART_SUCCESS,data,len);//
  165. // msg_para_init();//清除存储的下发参数
  166. break;
  167. default:
  168. break;
  169. }
  170. break;
  171. default:
  172. break;
  173. }
  174. }
  175. //显示屏升级时初始化
  176. int xsp_ota_info_Init(void)
  177. {
  178. memset(&ota_master, 0, sizeof(ota_pkg_info_t));
  179. ota_master.des_device_type = ota_slave.des_device_type;
  180. ota_master.des_device_sn = ota_slave.des_device_sn;
  181. ota_master.rcv_device_sn = ota_slave.rcv_device_sn;
  182. ota_master.rcv_device_type = ota_slave.rcv_device_type;
  183. ota_master.update_version = ota_slave.update_version;
  184. ota_master.total_bytes = ota_slave.total_bytes;
  185. ota_master.total_crc = ota_slave.total_crc;
  186. ota_master.total_pkgs = ota_master.total_bytes/OTA_UPDATE_PAYLAOA_LEN;
  187. ota_master.lastRightPkgNum = 1;
  188. if(ota_master.total_bytes%OTA_UPDATE_PAYLAOA_LEN) {
  189. ota_master.total_pkgs += 1;
  190. }
  191. ota_master.sub_pkg_id = 1;
  192. return 0;
  193. }
  194. //显示屏升级时的主设备
  195. void xsp_upgrade_master(void)
  196. {
  197. //打开总定时器
  198. ota_timer_total_master_set(OPEN,OTA_TOTAL_TIMEOUT_TIME_TICK);
  199. xsp_ota_info_Init();
  200. memset(&xsp_ota_state,0,sizeof(offline_ota_state_t));
  201. xsp_ota_state.flag = 1;
  202. xsp_ota_state.state = OTA_START;
  203. xsp_ota_state.start_num = 0;
  204. timeout_setValue(&xsp_ota_state.tt_send,10,1);
  205. }
  206. //显示屏升级发送流程
  207. void ota_xsp_send_proce(void)
  208. {
  209. if(xsp_ota_state.flag)
  210. {
  211. if(timeout_isOut(&xsp_ota_state.tt_send))
  212. {
  213. switch(xsp_ota_state.state)
  214. {
  215. case OTA_START:
  216. timeout_setValue(&xsp_ota_state.tt_send,OFFLINE_OTA_START_TIME,1);
  217. ota_xsp_start();
  218. xsp_ota_state.start_num++;
  219. if(xsp_ota_state.start_num >= 5)
  220. {
  221. xsp_ota_state.start_num = 0;
  222. xsp_ota_state.state = OTA_CONTINUE;
  223. xsp_ota_state.pkg_id = 0;
  224. timeout_setValue(&xsp_ota_state.tt_send,OFFLINE_OTA_CONTINUE_TIME,1);
  225. }
  226. break;
  227. case OTA_CONTINUE:
  228. timeout_setValue(&xsp_ota_state.tt_send,OFFLINE_OTA_CONTINUE_TIME,1);
  229. ota_xsp_continues();
  230. break;
  231. default:
  232. break;
  233. }
  234. }
  235. }
  236. }
  237. //显示屏升级处理
  238. void xsp_ota_handle(void)
  239. {
  240. if(device_fixed_info.xsp_update_start)
  241. {
  242. device_fixed_info.xsp_update_start = 0;
  243. device_fixed_info.Work_State = DEV_WORK_STATE_UPDATING;
  244. ota_state.update_mode = OTA_WORK_STATE_XSP;
  245. xsp_upgrade_master();//离线升级时的主设备下发升级包
  246. }
  247. ota_xsp_send_proce();
  248. }