system.c 18 KB

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