ota.c 33 KB

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