system.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752
  1. /**
  2. * @file system.c
  3. * @brief this file contains frame analysis of communication between MCU and zigbee
  4. * and construct these functions which used send data in a frame format
  5. * @author qinlang
  6. * @date 2022.05.06
  7. * @par email:
  8. * @par email:qinlang.chen@tuya.com
  9. * @copyright HANGZHOU TUYA INFORMATION TECHNOLOGY CO.,LTD
  10. * @par company
  11. * http://www.tuya.com
  12. */
  13. #define SYSTEM_GLOBAL
  14. #include "zigbee.h"
  15. #include "iap.h"
  16. #include "HLW8110.h"
  17. extern const DOWNLOAD_CMD_S download_cmd[];
  18. #ifdef SUPPORT_MCU_RTC_CHECK
  19. const unsigned char mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  20. #endif
  21. #ifdef CHECK_MCU_TYPE
  22. MCU_TYPE_E mcu_type = MCU_TYPE_DC_POWER;
  23. #endif
  24. static volatile unsigned short global_seq_num;
  25. #ifdef CHECK_MCU_TYPE
  26. static void response_mcu_type(void);
  27. #endif
  28. #ifdef SET_ZIGBEE_NWK_PARAMETER
  29. nwk_parameter_t nwk_paremeter;
  30. #endif
  31. #ifdef SET_ZIGBEE_NWK_PARAMETER
  32. void init_nwk_paremeter(void)
  33. {
  34. #error "please call this fuction in main init"
  35. nwk_paremeter.fast_poll_period = 0xfffe;
  36. nwk_paremeter.heart_period = 0xfffe;
  37. nwk_paremeter.join_nwk_time = 0xfffe;
  38. nwk_paremeter.rejion_period = 0xfffe;
  39. nwk_paremeter.poll_period = 0xfffe;
  40. nwk_paremeter.fast_poll_period = 0xfffe;
  41. nwk_paremeter.poll_failure_times = 0xfe;
  42. nwk_paremeter.rejoin_try_times = 0xfe;
  43. nwk_paremeter.app_trigger_rejoin = 0xfe;
  44. nwk_paremeter.rf_send_power = 0xfe;
  45. }
  46. #endif
  47. /**
  48. * @brief get frame seq_num
  49. * @param[in] {void}
  50. * @return seq_num
  51. */
  52. static unsigned short seq_num_get(void)
  53. {
  54. global_seq_num ++;
  55. if(global_seq_num > 0xfff0){
  56. global_seq_num = 1;
  57. }
  58. return global_seq_num;
  59. }
  60. /**
  61. * @brief padding a byte in send buf base on dest
  62. * @param[in] {dest} the location of padding byte
  63. * @param[in] {byte} padding byte
  64. * @return sum of frame after this operation
  65. */
  66. unsigned short set_zigbee_uart_byte(unsigned short dest, unsigned char byte)
  67. {
  68. unsigned char *obj = (unsigned char *)zigbee_uart_tx_buf + DATA_START + dest;
  69. *obj = byte;
  70. dest += 1;
  71. return dest;
  72. }
  73. /**
  74. * @brief padding buf in send buf base on dest
  75. * @param[in] {dest} the location of padding
  76. * @param[in] {src} the head address of padding buf
  77. * @param[in] {len} the length of padding buf
  78. * @return sum of frame after this operation
  79. */
  80. unsigned short set_zigbee_uart_buffer(unsigned short dest, unsigned char *src, unsigned short len)
  81. {
  82. unsigned char *obj = (unsigned char *)zigbee_uart_tx_buf + DATA_START + dest;
  83. my_memcpy(obj,src,len);
  84. dest += len;
  85. return dest;
  86. }
  87. /**
  88. * @brief send len bytes data
  89. * @param[in] {in} the head address of send data
  90. * @param[in] {len} the length of send data
  91. * @return void
  92. */
  93. void zigbee_uart_write_data(unsigned char *in, unsigned short len)
  94. {
  95. if((NULL == in) || (0 == len)){
  96. return;
  97. }
  98. while(len --){
  99. uart_transmit_output(*in);
  100. in ++;
  101. }
  102. }
  103. /**
  104. * @brief calculate the sum of the array
  105. * @param[in] {pack} the head address of array
  106. * @param[in] {pack_len} the length of array
  107. * @return sum
  108. */
  109. unsigned char get_check_sum(unsigned char *pack, unsigned short pack_len)
  110. {
  111. unsigned short i;
  112. unsigned char check_sum = 0;
  113. for(i = 0; i < pack_len; i ++){
  114. check_sum += *pack ++;
  115. }
  116. return check_sum;
  117. }
  118. /**
  119. * @brief send a frame data
  120. * @param[in] {fr_cmd} frame cmd id
  121. * @param[in] {len} len of frame data
  122. * @return void
  123. */
  124. void zigbee_uart_write_frame(unsigned char fr_cmd, unsigned short len)
  125. {
  126. unsigned char check_sum = 0;
  127. unsigned short seq;
  128. zigbee_uart_tx_buf[HEAD_FIRST] = FIRST_FRAME_HEAD;
  129. zigbee_uart_tx_buf[HEAD_SECOND] = SECOND_FRAME_HEAD;
  130. zigbee_uart_tx_buf[PROTOCOL_VERSION] = SERIAL_PROTOCOL_VER;
  131. seq = seq_num_get();
  132. zigbee_uart_tx_buf[SEQ_HIGH] = (seq << 8);
  133. zigbee_uart_tx_buf[SEQ_LOW] = (seq & 0xff);
  134. zigbee_uart_tx_buf[FRAME_TYPE] = fr_cmd;
  135. zigbee_uart_tx_buf[LENGTH_HIGH] = len >> 8;
  136. zigbee_uart_tx_buf[LENGTH_LOW] = len & 0xff;
  137. len += PROTOCOL_HEAD;
  138. check_sum = get_check_sum((unsigned char *)zigbee_uart_tx_buf, len-1);
  139. zigbee_uart_tx_buf[len -1] = check_sum;
  140. zigbee_uart_write_data((unsigned char *)zigbee_uart_tx_buf, len);
  141. }
  142. /**
  143. * @brief send product info and mcu version
  144. * @param[in] {void}
  145. * @return void
  146. */
  147. static void product_info_update(void)
  148. {
  149. unsigned short length = 0;
  150. length = set_zigbee_uart_buffer(length, "{\"p\":\"", my_strlen("{\"p\":\""));
  151. length = set_zigbee_uart_buffer(length,(unsigned char *)PRODUCT_KEY,my_strlen((unsigned char *)PRODUCT_KEY));
  152. length = set_zigbee_uart_buffer(length, "\",\"v\":\"", my_strlen("\",\"v\":\""));
  153. length = set_zigbee_uart_buffer(length,(unsigned char *)MCU_VER,my_strlen((unsigned char *)MCU_VER));
  154. length = set_zigbee_uart_buffer(length, "\"}", my_strlen("\"}"));
  155. zigbee_uart_write_frame(PRODUCT_INFO_CMD, length);
  156. }
  157. /**
  158. * @brief get the serial number of dpid in dp array
  159. * @param[in] {dpid} dp id
  160. * @return serial number of dp
  161. */
  162. static unsigned char get_dowmload_dpid_index(unsigned char dpid)
  163. {
  164. unsigned char index;
  165. unsigned char total = get_download_cmd_total();
  166. for(index = 0; index < total; index ++){
  167. if(download_cmd[index].dp_id == dpid){
  168. break;
  169. }
  170. }
  171. return index;
  172. }
  173. /**
  174. * @brief handle received dp data from zigbee module
  175. * @param[in] {value} dp data
  176. * @return result of handle
  177. */
  178. static unsigned char zigbee_data_point_handle(const unsigned char value[])
  179. {
  180. unsigned char dp_id,index;
  181. unsigned char dp_type;
  182. unsigned char ret;
  183. unsigned short dp_len;
  184. dp_id = value[0];
  185. dp_type = value[1];
  186. dp_len = value[2] * 0x100;
  187. dp_len += value[3];
  188. index = get_dowmload_dpid_index(dp_id);
  189. if(dp_type != download_cmd[index].dp_type){
  190. return FALSE;
  191. }
  192. else{
  193. ret = dp_download_handle(dp_id,value + 4,dp_len);
  194. }
  195. return ret;
  196. }
  197. /**
  198. * @brief handle received frame from zigbee module baseon frame cmd id
  199. * @param[in] {void}
  200. * @return result of handle
  201. */
  202. int data_handle(unsigned short offset)
  203. {
  204. unsigned char cmd_type = 0;
  205. unsigned short total_len = 0, seq_num = 0;
  206. unsigned short dp_len;
  207. unsigned char ret;
  208. unsigned short i;
  209. cmd_type = zigbee_uart_rx_buf[offset + FRAME_TYPE];
  210. total_len = zigbee_uart_rx_buf[offset + LENGTH_HIGH] * 0x100;
  211. total_len += zigbee_uart_rx_buf[offset + LENGTH_LOW];
  212. seq_num = zigbee_uart_rx_buf[offset + SEQ_HIGH] << 8;
  213. seq_num += zigbee_uart_rx_buf[offset + SEQ_LOW];
  214. switch(cmd_type)
  215. {
  216. case ZIGBEE_FACTORY_NEW_CMD:{
  217. zigbee_notify_factory_new_hanlde(); // response,APP删除设备,这里确认是否恢复出厂设置
  218. }
  219. break;
  220. case PRODUCT_INFO_CMD:{
  221. product_info_update();
  222. }
  223. break;
  224. case ZIGBEE_STATE_CMD:{
  225. unsigned char current_state = zigbee_uart_rx_buf[offset + DATA_START];
  226. zigbee_work_state_event(current_state);
  227. }
  228. break;
  229. case ZIGBEE_CFG_CMD:{
  230. mcu_reset_zigbee_event(zigbee_uart_rx_buf[offset + DATA_START]);
  231. }
  232. break;
  233. case ZIGBEE_DATA_REQ_CMD:{
  234. for(i = 0;i < total_len;){
  235. dp_len = zigbee_uart_rx_buf[offset + DATA_START + i + 2] * 0x100;
  236. dp_len += zigbee_uart_rx_buf[offset + DATA_START + i + 3];
  237. ret = zigbee_data_point_handle((unsigned char *)zigbee_uart_rx_buf + offset + DATA_START + i);
  238. if(SUCCESS == ret){
  239. }
  240. else{
  241. }
  242. i += (dp_len + 4);
  243. }
  244. }
  245. break;
  246. case DATA_DATA_RES_CMD:{
  247. }
  248. case DATA_REPORT_CMD:{
  249. }
  250. break;
  251. case QUERY_KEY_INFO_CMD:{
  252. }
  253. break;
  254. case CALL_SCENE_CMD:{
  255. }
  256. break;
  257. case ZIGBEE_RF_TEST_CMD:{
  258. }
  259. break;
  260. case MCU_OTA_VERSION_CMD:{
  261. response_mcu_ota_version_event();
  262. }
  263. break;
  264. #ifdef SUPPORT_MCU_OTA
  265. case MCU_OTA_NOTIFY_CMD:{
  266. response_mcu_ota_notify_event(offset);
  267. }
  268. break;
  269. case MCU_OTA_DATA_REQUEST_CMD:{
  270. mcu_ota_fw_request_event(offset);
  271. }
  272. break;
  273. case MCU_OTA_RESULT_CMD:{
  274. mcu_ota_result_event(offset);
  275. }
  276. break;
  277. #endif
  278. case CHECK_MCU_TYPE_CMD:
  279. {
  280. #ifdef CHECK_MCU_TYPE
  281. response_mcu_type();
  282. #endif
  283. }
  284. break;
  285. case TIME_GET_CMD:{
  286. #ifdef SUPPORT_MCU_RTC_CHECK
  287. mcu_write_rtctime((unsigned char *)(zigbee_uart_rx_buf + offset + DATA_START));
  288. #endif
  289. }
  290. break;
  291. #ifdef BEACON_TEST
  292. case SEND_BEACON_NOTIFY_CMD:{
  293. mcu_received_beacon_test_handle();
  294. }
  295. break;
  296. #endif
  297. case READ_MCU_DP_DATA_CMD:{ // gw read DP
  298. all_data_update();
  299. }
  300. break;
  301. default:
  302. return 0;
  303. }
  304. return 1;
  305. }
  306. /**
  307. * @brief mcu send a cmd which used to making zigbee module reset
  308. * @param[in] {void}
  309. * @return void
  310. */
  311. void mcu_exit_zigbee(void)
  312. {
  313. unsigned short length = 0;
  314. length = set_zigbee_uart_byte(length,0x00);
  315. zigbee_uart_write_frame(ZIGBEE_CFG_CMD, length);
  316. }
  317. /**
  318. * @brief mcu send this commond starting zigbee module join network
  319. * this commond must be call after reveived checking proudect info, or after get zigbee network info
  320. * @param[in] {void}
  321. * @return void
  322. */
  323. void mcu_join_zigbee(void)
  324. {
  325. unsigned short length = 0;
  326. length = set_zigbee_uart_byte(length,0x01);
  327. zigbee_uart_write_frame(ZIGBEE_CFG_CMD, length);
  328. }
  329. /**
  330. * @brief mcu send a cmd which used to getting zigbee network state
  331. * @param[in] {void}
  332. * @return void
  333. */
  334. void mcu_get_zigbee_state(void)
  335. {
  336. zigbee_uart_write_frame(ZIGBEE_STATE_CMD, 0);
  337. }
  338. #ifdef CHECK_MCU_TYPE
  339. /**
  340. * @brief response zigbee check mcu type cmd
  341. * @param[in] {void}
  342. * @return void
  343. */
  344. static void response_mcu_type(void)
  345. {
  346. unsigned short length = 0;
  347. length = set_zigbee_uart_byte(length,mcu_type);
  348. zigbee_uart_write_frame(CHECK_MCU_TYPE_CMD, length);
  349. }
  350. #endif
  351. #ifdef SUPPORT_MCU_RTC_CHECK
  352. /**
  353. * @brief mcu send a cmd which used to getting timestamp
  354. * @param[in] {void}
  355. * @return void
  356. */
  357. void mcu_get_system_time(void)
  358. {
  359. zigbee_uart_write_frame(TIME_GET_CMD,0);
  360. }
  361. /**
  362. * @brief is a leap year
  363. * @param[in] {pyear}
  364. * @return leap year return 1
  365. */
  366. static unsigned char Is_Leap_Year(unsigned int pyear)
  367. {
  368. if(0 == (pyear%4)) {
  369. if(0 == (pyear%100)){
  370. if(0 == (pyear%400))
  371. return 1;
  372. else
  373. return 0;
  374. }
  375. else
  376. return 1;
  377. }
  378. else
  379. return 0;
  380. }
  381. /**
  382. * @brief get calendar time from timestamp
  383. * @param[in] {secCount} input timestamp
  384. * @param[out] {calendar} output calendar
  385. * @return result of changing
  386. */
  387. static unsigned char RTC_Get(unsigned int secCount,_calendar_obj *calendar)
  388. {
  389. static unsigned int dayCount=0;
  390. unsigned int tmp=0;
  391. unsigned int tmp1=0;
  392. tmp=secCount/86400;
  393. if(dayCount!=tmp){
  394. dayCount=tmp;
  395. tmp1=1970;
  396. while(tmp>=365){
  397. if(Is_Leap_Year(tmp1)){
  398. if(tmp>=366)
  399. tmp-=366;
  400. else{
  401. break;
  402. }
  403. }
  404. else
  405. tmp-=365;
  406. tmp1++;
  407. }
  408. calendar->w_year=tmp1;
  409. tmp1=0;
  410. while(tmp>=28){
  411. if(Is_Leap_Year(calendar->w_year)&&tmp1==1){
  412. if(tmp>=29)
  413. tmp-=29;
  414. else
  415. break;
  416. }
  417. else{
  418. if(tmp>=mon_table[tmp1])
  419. tmp-=mon_table[tmp1];
  420. else
  421. break;
  422. }
  423. tmp1++;
  424. }
  425. calendar->w_month=tmp1+1;
  426. calendar->w_date=tmp+1;
  427. }
  428. tmp=secCount%86400;
  429. calendar->hour=tmp/3600;
  430. calendar->min=(tmp%3600)/60;
  431. calendar->sec=(tmp%3600)%60;
  432. return 0;
  433. }
  434. /**
  435. * @brief calculta time from frame
  436. * @param[in] {void}
  437. * @return void
  438. */
  439. void zigbee_timestamp_to_time(void)
  440. {
  441. unsigned int time_stamp = byte_to_int(timestamp);
  442. RTC_Get(time_stamp,&_time);
  443. }
  444. #endif
  445. #ifdef BROADCAST_DATA_SEND
  446. /**
  447. * @brief mcu can send a broadcast data in zigbee network
  448. * @param[in] {buf} array of buf which to be sended
  449. * @param[in] {buf_len} send buf length
  450. * @return void
  451. */
  452. void mcu_send_broadcast_data(unsigned char buf[], unsigned char buf_len)
  453. {
  454. unsigned short length = 0;
  455. length = set_zigbee_uart_buffer(length,(unsigned char *)buf, buf_len);
  456. zigbee_uart_write_frame(SEND_BROADCAST_DATA_CMD,length);
  457. }
  458. #endif
  459. #ifdef SET_ZIGBEE_NWK_PARAMETER
  460. /**
  461. * @brief mcu can set zigbee nwk parameter
  462. * @param[in] {parameter_t *}
  463. * @param
  464. * @return void
  465. */
  466. void mcu_set_zigbee_nwk_parameter(nwk_parameter_t *Pparameter)
  467. {
  468. unsigned short length = 0;
  469. #error "please set network parameter in here, when zigbee received this message, it will start reboot"
  470. //Pparameter->app_trigger_rejoin = 0x00;
  471. //Pparameter->fast_poll_period = 0x00;
  472. length = set_zigbee_uart_byte(length,(Pparameter->heart_period >>8));
  473. length = set_zigbee_uart_byte(length,(Pparameter->heart_period));
  474. length = set_zigbee_uart_byte(length,(Pparameter->join_nwk_time >>8));
  475. length = set_zigbee_uart_byte(length,(Pparameter->join_nwk_time));
  476. length = set_zigbee_uart_byte(length,(Pparameter->rejion_period >>8));
  477. length = set_zigbee_uart_byte(length,(Pparameter->rejion_period));
  478. length = set_zigbee_uart_byte(length,(Pparameter->poll_period >>8));
  479. length = set_zigbee_uart_byte(length,(Pparameter->poll_period));
  480. length = set_zigbee_uart_byte(length,(Pparameter->fast_poll_period >>8));
  481. length = set_zigbee_uart_byte(length,(Pparameter->fast_poll_period));
  482. length = set_zigbee_uart_byte(length,(Pparameter->poll_failure_times));
  483. length = set_zigbee_uart_byte(length,(Pparameter->app_trigger_rejoin));
  484. length = set_zigbee_uart_byte(length,(Pparameter->rejoin_try_times));
  485. length = set_zigbee_uart_byte(length,(Pparameter->rf_send_power));
  486. zigbee_uart_write_frame(SET_ZIGBEE_NEK_PARAMETER_CMD,length);
  487. }
  488. #endif
  489. /**
  490. * @brief mcu version string to char
  491. * @param[in] {void}
  492. * @return result of version
  493. */
  494. unsigned char get_current_mcu_fw_ver(void)
  495. {
  496. /*unsigned char *fw_ver = (unsigned char*) MCU_VER; //Current version
  497. unsigned char current_mcu_fw_ver = 0;
  498. if(assic_to_hex(fw_ver[5]) == -1){ // 3 number
  499. current_mcu_fw_ver = (assic_to_hex(fw_ver[0]) & 0x03) << 6; //high ver
  500. current_mcu_fw_ver |= (assic_to_hex(fw_ver[2]) & 0x03) << 4; //mid ver
  501. current_mcu_fw_ver |= (assic_to_hex(fw_ver[4]) & 0x0F); //low ver
  502. }
  503. else{ // 4 number
  504. current_mcu_fw_ver = (assic_to_hex(fw_ver[0]) & 0x03) << 6; //high ver
  505. current_mcu_fw_ver |= (assic_to_hex(fw_ver[2]) & 0x03) << 4; //mid ver
  506. current_mcu_fw_ver |= ((assic_to_hex(fw_ver[4])*10 + assic_to_hex(fw_ver[5])) & 0x0F); //low ver
  507. }
  508. return current_mcu_fw_ver;*/
  509. //modified by zzw 优化版本查询函数
  510. //unsigned char *fw_ver = (unsigned char*) MCU_VER; //Current version
  511. unsigned char fw_ver[10];//modified by zzw 20240326
  512. unsigned char current_mcu_fw_ver = 0;
  513. my_memcpy(fw_ver, (unsigned char *)MCU_VER,my_strlen((unsigned char *)MCU_VER));
  514. if(my_strlen((unsigned char *)MCU_VER)<=5)//1.0.1,5个字节
  515. {
  516. // 3 number
  517. current_mcu_fw_ver = (assic_to_hex(fw_ver[0]) & 0x03) << 6; //high ver
  518. current_mcu_fw_ver |= (assic_to_hex(fw_ver[2]) & 0x03) << 4; //mid ver
  519. current_mcu_fw_ver |= (assic_to_hex(fw_ver[4]) & 0x0F); //low ver
  520. }
  521. else
  522. {
  523. // 4 number
  524. current_mcu_fw_ver = (assic_to_hex(fw_ver[0]) & 0x03) << 6; //high ver
  525. current_mcu_fw_ver |= (assic_to_hex(fw_ver[2]) & 0x03) << 4; //mid ver
  526. current_mcu_fw_ver |= ((assic_to_hex(fw_ver[4])*10 + assic_to_hex(fw_ver[5])) & 0x0F); //low ver
  527. }
  528. /*if((fw_ver[4] >= 0x30)&&(fw_ver[5] >= 0x30))
  529. { // 4 number
  530. current_mcu_fw_ver = (assic_to_hex(fw_ver[0]) & 0x03) << 6; //high ver
  531. current_mcu_fw_ver |= (assic_to_hex(fw_ver[2]) & 0x03) << 4; //mid ver
  532. current_mcu_fw_ver |= ((assic_to_hex(fw_ver[4])*10 + assic_to_hex(fw_ver[5])) & 0x0F); //low ver
  533. }
  534. else
  535. { // 3 number
  536. current_mcu_fw_ver = (assic_to_hex(fw_ver[0]) & 0x03) << 6; //high ver
  537. current_mcu_fw_ver |= (assic_to_hex(fw_ver[2]) & 0x03) << 4; //mid ver
  538. current_mcu_fw_ver |= (assic_to_hex(fw_ver[4]) & 0x0F); //low ver
  539. }*/
  540. return current_mcu_fw_ver;
  541. }
  542. #ifdef SUPPORT_MCU_OTA
  543. /**
  544. * @brief get mcu pid data saved in current_mcu_pid
  545. * @param[in] {void}
  546. * @return result of handle
  547. */
  548. void current_mcu_fw_pid(void)
  549. {
  550. unsigned char i = 0;
  551. //unsigned char *fw_pid = (unsigned char*) PRODUCT_KEY;
  552. unsigned char fw_pid[10];//modified by zzw 20240326
  553. my_memcpy(fw_pid,(unsigned char *)PRODUCT_KEY,my_strlen((unsigned char *)PRODUCT_KEY));
  554. while(i < 8){
  555. current_mcu_pid[i] = fw_pid[i];
  556. i++;
  557. }
  558. }
  559. /**
  560. * @brief mcu ota offset requset
  561. * @param[in] {packet_offset} packet offset
  562. * @return viod
  563. */
  564. //when call this function, should set timeout event, if not received zigbee send response should res
  565. void mcu_ota_fw_request(void)
  566. {
  567. unsigned char i = 0;
  568. unsigned short length = 0;
  569. if(ota_fw_info.mcu_current_offset >= ota_fw_info.mcu_ota_fw_size) //outside
  570. return;
  571. while(i < 8){
  572. length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_pid[i]); //ota fw pid
  573. i++;
  574. }
  575. length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_ver); //ota fw version
  576. i = 0;
  577. while(i < 4){
  578. length = set_zigbee_uart_byte(length , ota_fw_info.mcu_current_offset >> (24 - i * 8)); //pakage offset request
  579. i++;
  580. }
  581. length = set_zigbee_uart_byte(length ,FW_SINGLE_PACKET_SIZE); // packet size request
  582. zigbee_uart_write_frame(MCU_OTA_DATA_REQUEST_CMD,length);
  583. }
  584. /**
  585. * @brief mcu ota result report
  586. * @param[in] {status} result of mcu ota
  587. * @return void
  588. */
  589. void mcu_ota_result_report(unsigned char status)
  590. {
  591. unsigned short length = 0;
  592. unsigned char i = 0;
  593. length = set_zigbee_uart_byte(length,status); //upgrade result status(0x00:ota success;0x01:ota failed)
  594. while(i < 8){
  595. length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_pid[i]); //PID
  596. i++;
  597. }
  598. length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_ver); //ota fw version
  599. zigbee_uart_write_frame(MCU_OTA_RESULT_CMD,length); //response
  600. }
  601. #endif
  602. /**
  603. * @brief compare str1 and str2
  604. * @param[in] {str1} str1
  605. * @param[in] {str2} str2
  606. * @param[in] {len} len
  607. * @return equal return 0 else return -1
  608. */
  609. int strcmp_barry(unsigned char *str1,unsigned char *str2,unsigned char len)
  610. {
  611. unsigned char i;
  612. for(i = 0; i < len; i++){
  613. if(str1[i] < str2[i]){
  614. return -1; //str1 < str2
  615. }
  616. else if(str1[i] > str2[i]){
  617. return 1; //str1 > str2
  618. }
  619. }
  620. return 0; //str1 == str2
  621. }
  622. /**
  623. * @brief translate assic to hex
  624. * @param[in] {assic_num} assic number
  625. * @return hex data
  626. */
  627. char assic_to_hex(unsigned char assic_num)
  628. {
  629. if(assic_num<0x30 || assic_num > 0x39) //0~9
  630. return -1;
  631. else
  632. return assic_num % 0x30;
  633. }