ota.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. #include "ota.h"
  2. #include "../network_mgr/sx1268/peripherals/radio/radio.h"
  3. #include "../storage/AT24C128Opt.h"
  4. #include "../toolkit/CH455G.h"
  5. #include "../network_mgr/sx1268/lora.h"
  6. #if 0
  7. typedef struct _ota_retransmit_resp {//重传响应, 同ota_continues_info_t
  8. } ota_retransmit_resp_t;
  9. #endif
  10. uint8_t ota_continuous_end_flag = 0;
  11. uint8_t updata_state = 0;
  12. uint16_t updata_state_save = 0;
  13. uint8_t cad_ch_activitydetected = 0;
  14. timeout_t ota_retransmit_delay;
  15. timeout_t ota_total_timer;
  16. uint8_t ota_total_timer_start = 0;
  17. device_fixed_info_t device_fixed_info;
  18. ota_pkg_info_t ota_info;
  19. updata_state_t updata_state_info;
  20. #define OTA_START_INFO_LEN sizeof(ota_start_info_t)
  21. #define OTA_CONTINUES_INFO_LEN sizeof(ota_continues_info_t)
  22. #define OTA_RETRNSMIT_INFO_LEN sizeof(ota_retransmit_req_t)
  23. #define OTA_UPDATE_PAYLAOA_LEN 128
  24. typedef void (*timeout_cb)(void *p_tmr, void *p_arg);
  25. extern void lora_gw_ota_timeout(void *p_tmr, void *p_arg);
  26. extern void collect_msg_frame_fill(gateway_collect_com_t *p_msg,uint8_t msg_type,uint16_t len);
  27. extern void net_msg_frame_fill(gateway_collect_com_t *p_msg, uint8_t msg_type, uint16_t len);
  28. void lora_timer_one_shot(system_network_t *p_sys_net, uint8_t timeout, timeout_cb cb)
  29. {
  30. OS_ERR err;
  31. OSTmrCreate(&ota_info.ota_tmr, "ota_timer", timeout, timeout, OS_OPT_TMR_ONE_SHOT, cb, p_sys_net, &err);
  32. OSTmrStart(&ota_info.ota_tmr, &err);
  33. }
  34. void lora_gw_ota_start(system_network_t *p_sys_net)
  35. {
  36. uint16_t crc = 0;//, p_crc = 0,len = 0;
  37. gateway_collect_com_t msg;
  38. ota_start_info_t *p_ota = (ota_start_info_t *)msg.taxinfo.info;
  39. p_ota->des_device_type = ota_info.des_device_type;
  40. p_ota->des_device_id = ota_info.des_device_id;
  41. p_ota->rcv_device_id = ota_info.rcv_device_id;
  42. p_ota->rcv_device_type = ota_info.rcv_device_type;
  43. p_ota->update_version = ota_info.update_version;
  44. p_ota->update_version = ota_info.update_version;
  45. p_ota->total_bytes = ota_info.total_bytes;
  46. p_ota->time = UPDATE_EACH_TIME;
  47. collect_msg_frame_fill(&msg, net_msg_type_update_start, OTA_START_INFO_LEN+2);
  48. //len = GATE_COLL_HEAD_LEN + OTA_START_INFO_LEN;
  49. crc = _crc16_get((uint8_t *)&msg,msg.len + GATE_COLL_HEAD_LEN -2 );
  50. msg.taxinfo.info[msg.len -2] = crc&0xff;
  51. msg.taxinfo.info[msg.len - 1] = (crc>>8)&0xff;
  52. data_dump("send start updata", (uint8_t *)&msg, msg.len + 12);
  53. p_sys_net->downlink_send((char *)&msg, GATE_COLL_HEAD_LEN + msg.len);
  54. p_sys_net->workstate = DEV_WORK_STATE_UPDATING;
  55. }
  56. void lora_gw_ota_continues(system_network_t *p_sys_net,uint32_t address)
  57. {
  58. gateway_collect_com_t msg;
  59. ota_continues_info_t *p_ota = (ota_continues_info_t *)msg.taxinfo.info;
  60. OS_ERR err;
  61. uint32_t timer = 0;
  62. uint16_t crc = 0;
  63. char buff[256] = {0};
  64. uint16_t i=0;
  65. printf("lora_gw_ota_continues\r\n");
  66. p_ota->total_pkgs = ota_info.total_pkgs;
  67. p_ota->sub_pkg_len = OTA_UPDATE_PAYLAOA_LEN;
  68. p_ota->des_device_type = ota_info.des_device_type;
  69. p_ota->des_device_id = ota_info.des_device_id;
  70. p_ota->rcv_device_id = ota_info.rcv_device_id;
  71. p_ota->rcv_device_type = ota_info.rcv_device_type;
  72. timer = RadioTimeOnAir2(MODEM_LORA,140);
  73. timer = (timer>UPDATE_EACH_TIME) ? timer : UPDATE_EACH_TIME;
  74. printf("timer = %d\r\n", timer);
  75. printf("lora_update total_pkgs = %d\r\n",ota_info.total_pkgs);
  76. while(ota_info.sub_pkg_id <= ota_info.total_pkgs) {
  77. printf("lora_gw_ota_continues %d\r\n", ota_info.sub_pkg_id);
  78. p_ota->sub_pkg_id = ota_info.sub_pkg_id++;
  79. Flash_BufferRead(address + (p_ota->sub_pkg_id - 1)*OTA_UPDATE_PAYLAOA_LEN,
  80. ((uint8_t *)p_ota) + OTA_CONTINUES_INFO_LEN, OTA_UPDATE_PAYLAOA_LEN);
  81. collect_msg_frame_fill(&msg, net_msg_type_update_continues, OTA_CONTINUES_INFO_LEN + OTA_UPDATE_PAYLAOA_LEN+2);
  82. crc = _crc16_get((uint8_t *)&msg,msg.len-2+GATE_COLL_HEAD_LEN);
  83. msg.taxinfo.info[msg.len-2] = crc&0xff;
  84. msg.taxinfo.info[msg.len-1] = (crc>>8)&0xff;
  85. // memcpy(buff,(char*)&msg,msg.len + GATE_COLL_HEAD_LEN);
  86. memcpy(buff,(char*)&(msg.taxinfo.info[OTA_CONTINUES_INFO_LEN]),128);
  87. for(i=0;i< msg.len +GATE_COLL_HEAD_LEN;i++){
  88. printf("%02x ",buff[i]);
  89. }
  90. printf("\r\n");
  91. p_sys_net->downlink_send((char *)&msg, GATE_COLL_HEAD_LEN + msg.len);
  92. set_led_update_status(ota_info.total_pkgs - ota_info.sub_pkg_id);
  93. OSTimeDlyHMSM(0, 0, 0, timer, OS_OPT_TIME_DLY, &err);
  94. }
  95. p_sys_net->workstate = DEV_WORK_STATE_UPDATE_RETRANSMIT;
  96. lora_timer_one_shot(p_sys_net, 60, lora_gw_ota_timeout);
  97. }
  98. void lora_gw_ota_retransmit_resp(system_network_t *p_sys_net, ota_retransmit_req_t *p_req,uint32_t address)
  99. {
  100. char buff[256] = {0};
  101. uint16_t i=0;
  102. uint16_t crc = 0;
  103. gateway_collect_com_t msg;
  104. ota_continues_info_t *p_ota = (ota_continues_info_t *)msg.taxinfo.info;
  105. p_ota->total_pkgs = ota_info.total_pkgs;
  106. p_ota->sub_pkg_id = p_req->repeat_sub_pkg_id;
  107. p_ota->sub_pkg_len = OTA_UPDATE_PAYLAOA_LEN;
  108. p_ota->des_device_type =ota_info.des_device_type;
  109. p_ota->des_device_id = ota_info.des_device_id;
  110. p_ota->rcv_device_id = ota_info.rcv_device_id;
  111. p_ota->rcv_device_type = ota_info.rcv_device_type;
  112. Flash_BufferRead(address + (p_req->repeat_sub_pkg_id - 1)*OTA_UPDATE_PAYLAOA_LEN,
  113. ((uint8_t *)p_ota) + OTA_CONTINUES_INFO_LEN, OTA_UPDATE_PAYLAOA_LEN);
  114. collect_msg_frame_fill(&msg, net_msg_type_update_retransmit_rsp, OTA_CONTINUES_INFO_LEN + OTA_UPDATE_PAYLAOA_LEN + 2);
  115. crc = _crc16_get((uint8_t *)&msg,msg.len-2+GATE_COLL_HEAD_LEN);
  116. msg.taxinfo.info[msg.len-2] = crc&0xff;
  117. msg.taxinfo.info[msg.len-1] = (crc>>8)&0xff;
  118. memcpy(buff,(char*)&msg,msg.len + GATE_COLL_HEAD_LEN);
  119. // memcpy(buff,(char*)&(msg.taxinfo.info[OTA_CONTINUES_INFO_LEN]),128);
  120. for(i=0;i< msg.len +GATE_COLL_HEAD_LEN;i++){
  121. printf("%02x ",buff[i]);
  122. }
  123. printf("\r\n");
  124. p_sys_net->downlink_send((char *)&msg, GATE_COLL_HEAD_LEN + msg.len);
  125. // p_sys_net->downlink_send((char *)&msg, GATE_COLL_HEAD_LEN + OTA_CONTINUES_INFO_LEN + OTA_UPDATE_PAYLAOA_LEN);
  126. }
  127. void lora_gw_ota_timeout(void *p_tmr, void *p_arg)
  128. {
  129. // OS_ERR err;
  130. system_network_t *p_sys_net = (system_network_t *)p_arg;
  131. switch(p_sys_net->workstate) {
  132. case DEV_WORK_STATE_NORMAL:
  133. break;
  134. case DEV_WORK_STATE_UPDATING:
  135. break;
  136. case DEV_WORK_STATE_UPDATE_RETRANSMIT:
  137. p_sys_net->workstate = DEV_WORK_STATE_NORMAL;
  138. break;
  139. case DEV_WORK_STATE_ONLOOKER:
  140. p_sys_net->workstate = DEV_WORK_STATE_NORMAL;
  141. break;
  142. default:
  143. break;
  144. }
  145. }
  146. int lora_gw_ota_info_Init(update_msg_format *p_update, uint32_t total_len, uint32_t total_crc)
  147. {
  148. memset(&ota_info, 0, sizeof(ota_pkg_info_t));
  149. ota_info.des_device_type = p_update->des_device_type;
  150. ota_info.des_device_id= p_update->des_device_id;
  151. ota_info.rcv_device_id = p_update->rcv_device_id;
  152. ota_info.rcv_device_type = p_update->rcv_device_type;
  153. //ota_info.update_type = p_update->update_type;
  154. ota_info.update_version = p_update->update_version;
  155. ota_info.total_bytes = total_len;
  156. ota_info.total_crc = total_crc;
  157. ota_info.total_pkgs = total_len/OTA_UPDATE_PAYLAOA_LEN;
  158. ota_info.lastRightPkgNum = 1;
  159. if(total_len%OTA_UPDATE_PAYLAOA_LEN) {
  160. ota_info.total_pkgs += 1;
  161. }
  162. ota_info.sub_pkg_id = 1;
  163. return 0;
  164. }
  165. int lora_node_ota_info_Init(ota_start_info_t *p_ota)
  166. {
  167. memset(&ota_info, 0, sizeof(ota_pkg_info_t));
  168. ota_info.rcv_device_type = p_ota->rcv_device_type;
  169. ota_info.rcv_device_id = p_ota->rcv_device_id;
  170. ota_info.des_device_type = p_ota->des_device_type;
  171. ota_info.des_device_id = p_ota->des_device_id;
  172. ota_info.update_version = p_ota->update_version;
  173. ota_info.total_bytes = p_ota->total_bytes;
  174. ota_info.total_pkgs = p_ota->total_bytes/OTA_UPDATE_PAYLAOA_LEN;
  175. ota_info.lossPkgIndex = 0;
  176. ota_info.lastRightPkgNum = 1;
  177. if(p_ota->total_bytes%OTA_UPDATE_PAYLAOA_LEN) {
  178. ota_info.total_pkgs += 1;
  179. }
  180. ota_info.lossPkgCounter = 0;
  181. ota_info.sub_pkg_id = 1;
  182. ota_info.Send_interval = p_ota->time;
  183. return 0;
  184. }
  185. void lora_gw_ota_proc(system_network_t *p_sys_net, gateway_collect_com_t *p_msg)
  186. {
  187. ota_retransmit_req_t *p_req = NULL;
  188. uint32_t address = OTA_UPDATE_APP3_FLASH_START_ADDR;
  189. //if(p_sys_net->dev_type != DEV_TYPE_GATEWAY) {
  190. // return;
  191. //}
  192. p_req = (ota_retransmit_req_t *)p_msg->taxinfo.info;
  193. if((p_req->rcv_devict_type&0x0200) == 0x0200) address = OTA_UPDATE_APP3_FLASH_START_ADDR;
  194. else if(p_req->rcv_devict_type == 0x0101)address = OTA_UPDATE_APP1_FLASH_START_ADDR;
  195. printf("retransmit add = 0x%08x\r\n",address);
  196. switch(p_msg->type) {
  197. case net_msg_type_update_retransmit_req:
  198. set_led_update_status(p_req->repeat_sub_pkg_id);
  199. lora_gw_ota_retransmit_resp(p_sys_net, p_req,address);
  200. break;
  201. case net_msg_type_update_status:
  202. break;
  203. default:
  204. break;
  205. }
  206. }
  207. //旁观者定时器
  208. void ota_timer_onlooker_one_shot(uint16_t timeout, timeout_cb cb)
  209. {
  210. OS_ERR err;
  211. OSTmrCreate(&ota_info.ota_onlooker_tmr, "ota_timer_onlooker", timeout, timeout, OS_OPT_TMR_ONE_SHOT, cb, NULL, &err);
  212. OSTmrStart(&ota_info.ota_onlooker_tmr, &err);
  213. //升级指示灯
  214. //ota_start_led_init(); gch
  215. //Led_Single_State_Set(UPDATA_ONLOOKER_LED,LED_ON); gch
  216. //Data_last4bit_led(0xff,1); gch
  217. set_led_update_status(0);
  218. }
  219. void ota_timeout_onlooker(void *p_tmr, void *p_arg)
  220. {
  221. OS_ERR err;
  222. // if(device_info.alrd == DEVICE_ALRD)//已初始化
  223. // {
  224. device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
  225. // }
  226. // else
  227. // {
  228. // device_fixed_info.Work_State = DEV_WORK_STATE_UNINIT;
  229. // //未初始化时,将设备sn置为0xffffffff;设备类型是默认的
  230. // device_info.device_id = 0xffffffff;
  231. // device_info.device_type = (SOFTWARE_VERSION_APP&0xffff0000)>>16;
  232. // }
  233. OSTmrStop(&ota_info.ota_continuous_tmr, OS_OPT_TMR_NONE, NULL, &err);
  234. OSTmrStop(&ota_info.ota_retransmit_tmr, OS_OPT_TMR_NONE, NULL, &err);
  235. ota_total_timer_start = 0;//关闭升级总定时器
  236. printf("onlooker timeout \n");
  237. g_runData.bUpdate = 0;
  238. g_updateProg.rec0x16 = 0x00;
  239. //升级指示灯
  240. // LED_OFF_ALL();
  241. // Data_lastNbit_led(SOFTWARE_VERSION_APP,2,1);//APP版本后2位常亮
  242. }
  243. /* 重传定时器 */
  244. void ota_timer_retransmit_one_shot(uint16_t timeout, timeout_cb cb)
  245. {
  246. OS_ERR err;
  247. OSTmrCreate(&ota_info.ota_retransmit_tmr, "ota_timer_retransmit", timeout, timeout, OS_OPT_TMR_ONE_SHOT, cb, NULL, &err);
  248. OSTmrStart(&ota_info.ota_retransmit_tmr, &err);
  249. }
  250. void ota_timeout_retransmit(void *p_tmr, void *p_arg)
  251. {
  252. device_fixed_info.Work_State = DEV_WORK_STATE_ONLOOKER;
  253. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //′ò?a??1????¨ê±?÷
  254. updata_state = RETRANSMIT_TIMEOUT;
  255. updata_state_save = set_updata_state(updata_state);
  256. BKP_WriteBackupRegister(BKP_DR3, updata_state_save);
  257. printf("retransmit timeout \n");
  258. }
  259. //连续接收定时器
  260. void ota_timer_continuous_one_shot(uint16_t timeout, timeout_cb cb)
  261. {
  262. OS_ERR err;
  263. OSTmrCreate(&ota_info.ota_continuous_tmr, "ota_timer_continuous", timeout, timeout, OS_OPT_TMR_ONE_SHOT, cb, NULL, &err);
  264. OSTmrStart(&ota_info.ota_continuous_tmr, &err);
  265. }
  266. void ota_timeout_continuous(void *p_tmr, void *p_arg)
  267. {
  268. uint16_t i;
  269. switch(device_fixed_info.Work_State)
  270. {
  271. case DEV_WORK_STATE_OTA_BEGIN:
  272. device_fixed_info.Work_State = DEV_WORK_STATE_ONLOOKER;
  273. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //打开旁观者定时器
  274. updata_state = PACKET_LOSS_MORE;
  275. updata_state_save = set_updata_state(updata_state);
  276. BKP_WriteBackupRegister(BKP_DR3, updata_state_save);
  277. break;
  278. case DEV_WORK_STATE_OTA_CONTINUOUS:
  279. //更新收包相关状态
  280. for(i = ota_info.lastRightPkgNum;i < ota_info.total_pkgs+1;i++) {
  281. ota_info.lossPkgCounter++;
  282. ota_info.lossPkgId[ota_info.lossPkgIndex++] = i;//+1因为子包编号从0开始,
  283. //丢包太多了,超过了MAX_LOSS_PKG_COUNT,结束本次升级。
  284. if(ota_info.lossPkgCounter == MAX_LOSS_PKG_COUNT) {//降为旁观者, 放弃本次升级
  285. device_fixed_info.Work_State = DEV_WORK_STATE_ONLOOKER;
  286. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //打开旁观者定时器
  287. updata_state = PACKET_LOSS_MORE;
  288. updata_state_save = set_updata_state(updata_state);
  289. BKP_WriteBackupRegister(BKP_DR3, updata_state_save);
  290. return;
  291. }
  292. }
  293. if(ota_info.lossPkgCounter == 0) //没有丢包
  294. {
  295. ota_continuous_end_flag = OTA_CONTINUOUS_DIRECT;
  296. device_fixed_info.Work_State = DEV_WORK_STATE_OTA_UPGRADE_RCV_END;
  297. printf("check begin\n");
  298. }
  299. else //有丢包
  300. {
  301. //进入连续接收完成任务处理函数
  302. ota_continuous_end_flag = OTA_CONTINUOUS_DIRECT;
  303. device_fixed_info.Work_State = DEV_WORK_STATE_OTA_RETRANSMIT;
  304. ota_timer_retransmit_one_shot(RETRANSMIT_TIMEOUT_TIME,ota_timeout_retransmit); //打开重传定时器
  305. printf("retransmit begin\n");
  306. }
  307. break;
  308. default:
  309. break;
  310. }
  311. printf("continuous timeout \n");
  312. }
  313. //总定时器
  314. void ota_timer_total_one_shot(uint16_t timeout, timeout_cb cb)
  315. {
  316. OS_ERR err;
  317. OSTmrCreate(&ota_info.ota_total_tmr, "ota_timer_total", timeout, timeout, OS_OPT_TMR_ONE_SHOT, cb, NULL, &err);
  318. OSTmrStart(&ota_info.ota_total_tmr, &err);
  319. }
  320. void ota_timeout_total(void *p_tmr, void *p_arg)
  321. {
  322. OS_ERR err;
  323. // if(device_info.alrd == DEVICE_ALRD)//已初始化
  324. // {
  325. // device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
  326. // }
  327. // else
  328. {
  329. device_fixed_info.Work_State = DEV_WORK_STATE_UNINIT;
  330. //未初始化时,将设备sn置为0xffffffff;设备类型是默认的
  331. // device_info.device_id = 0xffffffff; gch
  332. // device_info.device_type = (SOFTWARE_VERSION_APP&0xffff0000)>>16; gch
  333. }
  334. device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
  335. OSTmrStop(&ota_info.ota_onlooker_tmr, OS_OPT_TMR_NONE, NULL, &err);
  336. OSTmrStop(&ota_info.ota_continuous_tmr, OS_OPT_TMR_NONE, NULL, &err);
  337. OSTmrStop(&ota_info.ota_retransmit_tmr, OS_OPT_TMR_NONE, NULL, &err);
  338. updata_state = UPDATA_TOTAL_TIMEOUT;
  339. updata_state_save = set_updata_state(updata_state);
  340. BKP_WriteBackupRegister(BKP_DR3, updata_state_save);
  341. g_runData.bUpdate = 0;
  342. printf("total timeout \n");
  343. //升级指示灯
  344. // LED_OFF_ALL();
  345. // Data_lastNbit_led(SOFTWARE_VERSION_APP,2,1);//APP版本后2位常亮
  346. }
  347. //升级重传函数
  348. void ota_retransmit_req(uint16_t repeat_sub_pkg_id)
  349. {
  350. char *p_msg = NULL;
  351. gateway_collect_com_t msg;
  352. ota_retransmit_req_t *p_ota = (ota_retransmit_req_t *)msg.taxinfo.info;
  353. p_ota->rcv_devict_type = ota_info.rcv_device_type;
  354. p_ota->rcv_device_id = ota_info.rcv_device_id;
  355. p_ota->repeat_sub_pkg_id = repeat_sub_pkg_id;
  356. net_msg_frame_fill(&msg, net_msg_type_update_retransmit_req, OTA_RETRNSMIT_INFO_LEN);
  357. p_msg = (char *)lora_queue_mem_calloc_must();
  358. if(p_msg) {
  359. memcpy(p_msg, (char *)&msg, FRAME_HEADER_LEN + OTA_RETRNSMIT_INFO_LEN+2);
  360. lora_queue_insert((char *)p_msg, FRAME_HEADER_LEN + OTA_RETRNSMIT_INFO_LEN+2);
  361. }
  362. else
  363. {
  364. lora_queue_mem_free(p_msg);
  365. }
  366. }
  367. uint16_t OTA_Continuous_Timeout = 0;
  368. //网关下发的升级命令分析
  369. void gateway_lora_ota_proc(gateway_collect_com_t *p_msg)
  370. {
  371. OS_ERR err;
  372. uint32_t i;
  373. uint32_t remain_pkg = 0;
  374. ota_start_info_t *p_start = NULL;
  375. ota_continues_info_t *p_cont = NULL;
  376. g_runData.bUpdate = 1;
  377. if(device_fixed_info.Work_State == DEV_WORK_STATE_ONLOOKER)//旁观者模式
  378. {
  379. printf("p_msg->type:%x\n",p_msg->type);
  380. OSTmrStop(&ota_info.ota_onlooker_tmr, OS_OPT_TMR_NONE, NULL, &err);
  381. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //打开旁观者定时器
  382. }
  383. else //非旁观者模式
  384. {
  385. switch(p_msg->type)
  386. {
  387. case net_msg_type_update_start: //开始升级指令
  388. g_runData.bUpdate = 1;
  389. p_start = (ota_start_info_t *)p_msg->taxinfo.info;
  390. printf("p_msg->type:%x, work_state=%d\n",p_msg->type,device_fixed_info.Work_State);
  391. /* 校验当前设备是否为接收对象 */
  392. if(device_type_and_id_cmp(p_start->rcv_device_type, p_start->rcv_device_id))
  393. {
  394. OSTmrStop(&ota_info.ota_continuous_tmr, OS_OPT_TMR_NONE, NULL, &err); //关闭连续接收定时器
  395. if(device_fixed_info.Work_State == DEV_WORK_STATE_NORMAL || device_fixed_info.Work_State == DEV_WORK_STATE_UNINIT)
  396. {
  397. Flash_RangeErase(OTA_UPDATE_APP3_FLASH_START_ADDR, OTA_UPDATE_APP3_FLASH_SIZE); //擦除app3
  398. //打开升级总定时器
  399. ota_total_timer_start = 1;
  400. ota_total_timer.counter = TickCounter;
  401. ota_total_timer.timeout = OTA_TOTAL_TIMEOUT_TIME_TICK;
  402. printf("open total timer\n");
  403. //收到升级指令
  404. updata_state = START_UPDATA;
  405. updata_state_save = set_updata_state(updata_state);
  406. BKP_WriteBackupRegister(BKP_DR3, updata_state_save);
  407. //升级指示灯
  408. // ota_start_led_init(); gch
  409. // Led_Single_State_Set(UPDATA_SLAVE_LED,LED_ON); gch
  410. }
  411. //本设备为接收对象
  412. device_fixed_info.Work_State = DEV_WORK_STATE_OTA_BEGIN;
  413. lora_node_ota_info_Init(p_start);
  414. OTA_Continuous_Timeout = (ota_info.total_pkgs * ota_info.Send_interval)/1000 + CONTINUOUS_TIMEOUT_DELAY_TIME;//连续接收定时时间
  415. if(OTA_Continuous_Timeout > CONTINUOUS_TIMEOUT_TIME_MUX)//发送时间太长
  416. {
  417. printf("continuous time to long\n");
  418. printf("ota continuous time:%d\n",OTA_Continuous_Timeout);
  419. device_fixed_info.Work_State = DEV_WORK_STATE_ONLOOKER;
  420. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //打开旁观者定时器
  421. return;
  422. }
  423. ota_timer_continuous_one_shot(OTA_Continuous_Timeout,ota_timeout_continuous);//打开连续接收定时器
  424. printf("ota_totle_byte:%d, ota_totle_pkg:%d\n",ota_info.total_bytes,ota_info.total_pkgs);
  425. printf("send interval:%d, continuous time:%d\n",ota_info.Send_interval,OTA_Continuous_Timeout);
  426. }
  427. else
  428. {
  429. device_fixed_info.Work_State = DEV_WORK_STATE_ONLOOKER;
  430. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //打开旁观者定时器
  431. }
  432. break;
  433. case net_msg_type_update_continues: //连续发包指令
  434. g_runData.bUpdate = 1;
  435. p_cont = (ota_continues_info_t *)p_msg->taxinfo.info;
  436. if(device_fixed_info.Work_State == DEV_WORK_STATE_OTA_BEGIN || device_fixed_info.Work_State == DEV_WORK_STATE_OTA_CONTINUOUS)
  437. {
  438. if(device_type_and_id_cmp(p_cont->rcv_device_type, p_cont->rcv_device_id)) //是当前设备
  439. {
  440. if(p_cont->sub_pkg_len > OTA_UPDATE_PAYLAOA_LEN)//收到的包长度大于128,收到的数据错误
  441. return;
  442. if(device_fixed_info.Work_State == DEV_WORK_STATE_OTA_BEGIN)
  443. {
  444. device_fixed_info.Work_State = DEV_WORK_STATE_OTA_CONTINUOUS;
  445. }
  446. if(p_cont->total_pkgs == ota_info.total_pkgs)
  447. {
  448. OSTmrStop(&ota_info.ota_continuous_tmr, OS_OPT_TMR_NONE, NULL, &err); //关闭连续接收定时器
  449. printf("update continues: type = 0x%x, id = 0x%x, {%d/%d/%d}\r\n",
  450. p_cont->rcv_device_type, p_cont->rcv_device_id,
  451. p_cont->total_pkgs, p_cont->sub_pkg_id,ota_info.lossPkgCounter);
  452. //接受本包并写入flash的对应位置
  453. Flash_BufferWrite(OTA_UPDATE_APP3_FLASH_START_ADDR + (p_cont->sub_pkg_id - 1)*OTA_UPDATE_PAYLAOA_LEN,
  454. (uint32_t *)(&(p_msg->taxinfo.info[OTA_CONTINUES_INFO_LEN])), p_cont->sub_pkg_len);
  455. //更新收包相关状态
  456. for(i = ota_info.lastRightPkgNum;i < p_cont->sub_pkg_id;i++) {
  457. ota_info.lossPkgCounter++;
  458. ota_info.lossPkgId[ota_info.lossPkgIndex++] = i;//+1因为子包编号从0开始,
  459. //丢包太多了,超过了MAX_LOSS_PKG_COUNT,结束本次升级。
  460. if(ota_info.lossPkgCounter == MAX_LOSS_PKG_COUNT) {//降为旁观者, 放弃本次升级
  461. device_fixed_info.Work_State = DEV_WORK_STATE_ONLOOKER;
  462. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //打开旁观者定时器
  463. updata_state = PACKET_LOSS_MORE;
  464. updata_state_save = set_updata_state(updata_state);
  465. BKP_WriteBackupRegister(BKP_DR3, updata_state_save);
  466. return;
  467. }
  468. }
  469. ota_info.lastRightPkgNum = p_cont->sub_pkg_id + 1;
  470. if(p_cont->sub_pkg_id == ota_info.total_pkgs)//当前是最后一包
  471. {
  472. if(ota_info.lossPkgCounter == 0) //没有丢包
  473. {
  474. ota_continuous_end_flag = OTA_CONTINUOUS_DIRECT;
  475. device_fixed_info.Work_State = DEV_WORK_STATE_OTA_UPGRADE_RCV_END;
  476. printf("check begin\n");
  477. }
  478. else //有丢包
  479. {
  480. //进入连续接收完成任务处理函数
  481. ota_retransmit_delay.timeout = OTA_FIRST_DELAYTIME;
  482. ota_retransmit_delay.counter = TickCounter;
  483. ota_continuous_end_flag = OTA_CONTINUOUS_DELAY;
  484. device_fixed_info.Work_State = DEV_WORK_STATE_OTA_RETRANSMIT;
  485. ota_timer_retransmit_one_shot(RETRANSMIT_TIMEOUT_TIME,ota_timeout_retransmit); //打开重传定时器
  486. printf("retransmit begin\n");
  487. }
  488. }
  489. else //收到最后一包不再打开连续定时器
  490. {
  491. //连续接收定时时间
  492. OTA_Continuous_Timeout = ((ota_info.total_pkgs-p_cont->sub_pkg_id) * ota_info.Send_interval)/1000 + CONTINUOUS_TIMEOUT_DELAY_TIME;
  493. ota_timer_continuous_one_shot(OTA_Continuous_Timeout,ota_timeout_continuous);//打开连续接收定时器
  494. printf("send interval:%d, continuous time:%d\n",ota_info.Send_interval,OTA_Continuous_Timeout);
  495. }
  496. //指示灯显示
  497. remain_pkg = ota_info.total_pkgs-p_cont->sub_pkg_id;// gch
  498. // Data_last4bit_led(remain_pkg,1); gch
  499. set_led_update_status(remain_pkg);
  500. }
  501. }
  502. else
  503. {
  504. device_fixed_info.Work_State = DEV_WORK_STATE_ONLOOKER;
  505. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //打开旁观者定时器
  506. OSTmrStop(&ota_info.ota_continuous_tmr, OS_OPT_TMR_NONE, NULL, &err); //关闭连续接收定时器
  507. }
  508. }
  509. else
  510. {
  511. device_fixed_info.Work_State = DEV_WORK_STATE_ONLOOKER;
  512. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //打开旁观者定时器
  513. OSTmrStop(&ota_info.ota_continuous_tmr, OS_OPT_TMR_NONE, NULL, &err); //关闭连续接收定时器
  514. }
  515. break;
  516. case net_msg_type_update_retransmit_rsp: //重传发包指令
  517. g_runData.bUpdate = 1;
  518. p_cont = (ota_continues_info_t *)p_msg->taxinfo.info;
  519. if(device_fixed_info.Work_State == DEV_WORK_STATE_OTA_RETRANSMIT)
  520. {
  521. OSTmrStop(&ota_info.ota_retransmit_tmr, OS_OPT_TMR_NONE, NULL, &err); //关闭重传定时器
  522. if(device_type_and_id_cmp(p_cont->rcv_device_type, p_cont->rcv_device_id)&&
  523. (p_cont->total_pkgs == ota_info.total_pkgs))
  524. {
  525. if(p_cont->sub_pkg_len > OTA_UPDATE_PAYLAOA_LEN)//收到的包长度大于128,收到的数据错误
  526. return;
  527. //判定该包是否为本设备丢的那些包之中的子包
  528. for(i = 0;i < ota_info.lossPkgIndex;i++) {
  529. if(ota_info.lossPkgId[i] == p_cont->sub_pkg_id) {
  530. ota_info.lossPkgCounter--;
  531. ota_info.lossPkgId[i] = 0;
  532. //接受本包并写入flash的对应位置
  533. Flash_BufferWrite(OTA_UPDATE_APP3_FLASH_START_ADDR + (p_cont->sub_pkg_id - 1)*OTA_UPDATE_PAYLAOA_LEN,
  534. (uint32_t *)(&(p_msg->taxinfo.info[OTA_CONTINUES_INFO_LEN]) ), p_cont->sub_pkg_len);
  535. printf("rcv retransmit pkgid:%d\n",p_cont->sub_pkg_id);
  536. break;
  537. }
  538. }
  539. if(ota_info.lossPkgCounter == 0) //丢包已收完
  540. {
  541. ota_continuous_end_flag = OTA_CONTINUOUS_DIRECT;
  542. device_fixed_info.Work_State = DEV_WORK_STATE_OTA_UPGRADE_RCV_END;
  543. }
  544. printf("ota_info.lossPkgCounter = %d, lossPkgId:%d\r\n", ota_info.lossPkgCounter,p_cont->sub_pkg_id);
  545. //指示灯显示
  546. remain_pkg = ota_info.lossPkgCounter; //gch
  547. //Data_last4bit_led(remain_pkg,1); gch
  548. set_led_update_status(remain_pkg);
  549. }
  550. ota_timer_retransmit_one_shot(RETRANSMIT_TIMEOUT_TIME,ota_timeout_retransmit); //打开重传定时器
  551. }
  552. else
  553. {
  554. device_fixed_info.Work_State = DEV_WORK_STATE_ONLOOKER;
  555. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //打开旁观者定时器
  556. OSTmrStop(&ota_info.ota_continuous_tmr, OS_OPT_TMR_NONE, NULL, &err); //关闭连续接收定时器
  557. }
  558. break;
  559. default: break;
  560. }
  561. }
  562. }
  563. //连续接收完成任务处理函数
  564. void ota_continuous_end_handle(void)
  565. {
  566. OS_ERR err;
  567. uint32_t crcVl,fixChar,fileVer,filelen;
  568. uint32_t getcrc;
  569. uint16_t i;
  570. switch(device_fixed_info.Work_State)
  571. {
  572. case DEV_WORK_STATE_OTA_UPGRADE_RCV_END:
  573. OSTmrStop(&ota_info.ota_retransmit_tmr, OS_OPT_TMR_NONE, NULL, &err); //关闭重传定时器
  574. crcVl = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+ota_info.total_bytes-4); //CRC校验
  575. fixChar = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+ota_info.total_bytes-8); // 固定字符 WBJW
  576. fileVer = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+ota_info.total_bytes-12); // 固件信息
  577. filelen = *(uint32_t*)(OTA_UPDATE_APP3_FLASH_START_ADDR+ota_info.total_bytes-20); // 文件总长度
  578. printf("read_fixchar:%08x, fixchar:%08x\n",fixChar,0x57424A57);
  579. if(fixChar != 0x57424A57) //固定字符错误
  580. {
  581. device_fixed_info.Work_State = DEV_WORK_STATE_ONLOOKER;
  582. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //打开旁观者定时器
  583. updata_state = FIXED_CHARACTER_ERROR;
  584. updata_state_save = set_updata_state(updata_state);
  585. BKP_WriteBackupRegister(BKP_DR3, updata_state_save);
  586. printf("fixChar error\r\n");// 升级文件固定字符校验错误
  587. return;
  588. }
  589. printf("read_filever:%08x, device_type:%08x\n",fileVer,0x01013000);
  590. if((fileVer&0xfffff000) != 0x01013000) //固件信息错误
  591. {
  592. device_fixed_info.Work_State = DEV_WORK_STATE_ONLOOKER;
  593. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //打开旁观者定时器
  594. updata_state = DEVICE_TYPE_ERROR;
  595. updata_state_save = set_updata_state(updata_state);
  596. BKP_WriteBackupRegister(BKP_DR3, updata_state_save);
  597. printf("fileVer error\r\n");// 升级文件固件信息校验错误
  598. return;
  599. }
  600. printf("read_filelen:%08x, total_bytes:%08x\n",filelen,(ota_info.total_bytes-20));
  601. if(ota_info.total_bytes != (filelen+20))//长度错误
  602. {
  603. //
  604. device_fixed_info.Work_State = DEV_WORK_STATE_ONLOOKER;
  605. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //打开旁观者定时器
  606. updata_state = UPDATA_PACKAGE_LENGTH_ERROR;
  607. updata_state_save = set_updata_state(updata_state);
  608. BKP_WriteBackupRegister(BKP_DR3, updata_state_save);
  609. printf("filelen error\r\n");// 升级文件长度校验错误
  610. return;
  611. }
  612. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);
  613. CRC_ResetDR();
  614. CRC_CalcBlockCRC((uint32_t*)OTA_UPDATE_APP3_FLASH_START_ADDR, (ota_info.total_bytes -4)/4);
  615. getcrc = CRC_GetCRC();
  616. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,DISABLE);
  617. printf("read_crc:%x, get_crc:%x\n",crcVl,getcrc);
  618. if(getcrc!=crcVl) { //校验错误
  619. printf("update file crc error\r\n");// 升级文件crc校验错误
  620. device_fixed_info.Work_State = DEV_WORK_STATE_ONLOOKER;
  621. ota_timer_onlooker_one_shot(ONLOOKER_TIMEOUT_TIME,ota_timeout_onlooker); //打开旁观者定时器
  622. updata_state = UPDATA_CRC_ERROR;
  623. updata_state_save = set_updata_state(updata_state);
  624. BKP_WriteBackupRegister(BKP_DR3, updata_state_save);
  625. return;
  626. }
  627. printf("收包正确\n");
  628. updata_state = UPDATA_DATA_SUCCESS;
  629. updata_state_save = set_updata_state(updata_state);
  630. BKP_WriteBackupRegister(BKP_DR3, updata_state_save);
  631. //置升级标志
  632. updata_state_info.updata_flag = set_updata_state(UPDATA_FLAG);
  633. BKP_WriteBackupRegister(BKP_DR2, updata_state_info.updata_flag);
  634. /* 置网关下发的升级状态 */
  635. BKP_WriteBackupRegister(BKP_DR5, UP_PROG_FROM_GAT); // 升级的来源 0x44 来源来网关下发的
  636. //存储APP3版本
  637. //device_version_info.APP3_ver = fileVer;
  638. //eeprom_write_data(EECFG_APP3_VER0,(uint8_t *)&device_version_info.APP3_ver,4);
  639. g_firmwareMsg.gatewayMsg.verMsg.gate_appVr3 = fileVer;
  640. fram_write_gateway_version();
  641. NVIC_SystemReset();
  642. break;
  643. case DEV_WORK_STATE_OTA_RETRANSMIT:
  644. for(i = 0;i < ota_info.lossPkgIndex;i++) {
  645. if(ota_info.lossPkgId[i])
  646. {
  647. ota_retransmit_req(ota_info.lossPkgId[i]);
  648. printf("send retransmit pkgid:%d\n",ota_info.lossPkgId[i]);
  649. break;
  650. }
  651. }
  652. break;
  653. default:
  654. break;
  655. }
  656. }
  657. void ota_process_handle(void)
  658. {
  659. //连续接收完成延时处理
  660. if(ota_continuous_end_flag == OTA_CONTINUOUS_DIRECT)
  661. {
  662. ota_continuous_end_flag = OTA_CONTINUOUS_CLOSE;
  663. ota_continuous_end_handle();
  664. }
  665. else if(ota_continuous_end_flag == OTA_CONTINUOUS_DELAY)
  666. {
  667. if(TickCounter - ota_retransmit_delay.counter >= ota_retransmit_delay.timeout)
  668. {
  669. ota_continuous_end_flag = OTA_CONTINUOUS_CLOSE;
  670. ota_continuous_end_handle();
  671. //g_runData.bUpdate = 0;
  672. }
  673. }
  674. //升级总定时器计时
  675. if(ota_total_timer_start)
  676. {
  677. if(TickCounter - ota_total_timer.counter >= ota_total_timer.timeout)
  678. {
  679. ota_total_timer_start = 0;
  680. ota_timeout_total(NULL,NULL);
  681. }
  682. }
  683. }