system.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  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 "./mcu_sdk/zigbee.h" //directory by ddw
  15. #include "gd32f30x.h"
  16. #include <stdio.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. // for(int i=0;i<len;i++)
  141. // printf("%x ",zigbee_uart_tx_buf[i]);
  142. // printf("\r\n%s\r\n",zigbee_uart_tx_buf);
  143. // char send_data[64]="AT+NAME=test_13\r\n";
  144. zigbee_uart_write_data((unsigned char *)zigbee_uart_tx_buf, my_strlen((unsigned char *)zigbee_uart_tx_buf));
  145. }
  146. /**
  147. * @brief send product info and mcu version
  148. * @param[in] {void}
  149. * @return void
  150. */
  151. static void product_info_update(void)
  152. {
  153. unsigned short length = 0;
  154. length = set_zigbee_uart_buffer(length, "{\"p\":\"", my_strlen("{\"p\":\""));
  155. length = set_zigbee_uart_buffer(length,(unsigned char *)PRODUCT_KEY,my_strlen((unsigned char *)PRODUCT_KEY));
  156. length = set_zigbee_uart_buffer(length, "\",\"v\":\"", my_strlen("\",\"v\":\""));
  157. length = set_zigbee_uart_buffer(length,(unsigned char *)MCU_VER,my_strlen((unsigned char *)MCU_VER));
  158. length = set_zigbee_uart_buffer(length, "\"}", my_strlen("\"}"));
  159. zigbee_uart_write_frame(PRODUCT_INFO_CMD, length);
  160. }
  161. /**
  162. * @brief get the serial number of dpid in dp array
  163. * @param[in] {dpid} dp id
  164. * @return serial number of dp
  165. */
  166. static unsigned char get_dowmload_dpid_index(unsigned char dpid)
  167. {
  168. unsigned char index;
  169. unsigned char total = get_download_cmd_total();
  170. for(index = 0; index < total; index ++){
  171. if(download_cmd[index].dp_id == dpid){
  172. break;
  173. }
  174. }
  175. return index;
  176. }
  177. /**
  178. * @brief handle received dp data from zigbee module
  179. * @param[in] {value} dp data
  180. * @return result of handle
  181. */
  182. static unsigned char zigbee_data_point_handle(const unsigned char value[])
  183. {
  184. unsigned char dp_id,index;
  185. unsigned char dp_type;
  186. unsigned char ret;
  187. unsigned short dp_len;
  188. dp_id = value[0];
  189. dp_type = value[1];
  190. dp_len = value[2] * 0x100;
  191. dp_len += value[3];
  192. index = get_dowmload_dpid_index(dp_id);
  193. if(dp_type != download_cmd[index].dp_type){
  194. return 0;
  195. }
  196. else{
  197. ret = dp_download_handle(dp_id,value + 4,dp_len);
  198. }
  199. return ret;
  200. }
  201. /**
  202. * @brief handle received frame from zigbee module baseon frame cmd id
  203. * @param[in] {void}
  204. * @return result of handle
  205. */
  206. int data_handle(unsigned short offset)
  207. {
  208. unsigned char cmd_type = 0;
  209. unsigned short total_len = 0, seq_num = 0;
  210. unsigned short dp_len;
  211. unsigned char ret;
  212. unsigned short i;
  213. cmd_type = zigbee_uart_rx_buf[offset + FRAME_TYPE];
  214. total_len = zigbee_uart_rx_buf[offset + LENGTH_HIGH] * 0x100;
  215. total_len += zigbee_uart_rx_buf[offset + LENGTH_LOW];
  216. seq_num = zigbee_uart_rx_buf[offset + SEQ_HIGH] << 8;
  217. seq_num += zigbee_uart_rx_buf[offset + SEQ_LOW];
  218. switch(cmd_type)
  219. {
  220. case ZIGBEE_FACTORY_NEW_CMD:{
  221. zigbee_notify_factory_new_hanlde(); // response
  222. }
  223. break;
  224. case PRODUCT_INFO_CMD:{
  225. product_info_update();
  226. }
  227. break;
  228. case ZIGBEE_STATE_CMD:{
  229. unsigned char current_state = zigbee_uart_rx_buf[offset + DATA_START];
  230. zigbee_work_state_event(current_state);
  231. }
  232. break;
  233. case ZIGBEE_CFG_CMD:{
  234. mcu_reset_zigbee_event(zigbee_uart_rx_buf[offset + DATA_START]);
  235. }
  236. break;
  237. case ZIGBEE_DATA_REQ_CMD:{
  238. for(i = 0;i < total_len;){
  239. dp_len = zigbee_uart_rx_buf[offset + DATA_START + i + 2] * 0x100;
  240. dp_len += zigbee_uart_rx_buf[offset + DATA_START + i + 3];
  241. ret = zigbee_data_point_handle((unsigned char *)zigbee_uart_rx_buf + offset + DATA_START + i);
  242. if(SUCCESS == ret){
  243. }
  244. else{
  245. }
  246. i += (dp_len + 4);
  247. }
  248. }
  249. break;
  250. case DATA_DATA_RES_CMD:{
  251. }
  252. case DATA_REPORT_CMD:{
  253. }
  254. break;
  255. case QUERY_KEY_INFO_CMD:{
  256. }
  257. break;
  258. case CALL_SCENE_CMD:{
  259. }
  260. break;
  261. case ZIGBEE_RF_TEST_CMD:{
  262. }
  263. break;
  264. case MCU_OTA_VERSION_CMD:{
  265. response_mcu_ota_version_event();
  266. }
  267. break;
  268. #ifdef SUPPORT_MCU_OTA
  269. case MCU_OTA_NOTIFY_CMD:{
  270. response_mcu_ota_notify_event(offset);
  271. }
  272. break;
  273. case MCU_OTA_DATA_REQUEST_CMD:{
  274. mcu_ota_fw_request_event(offset);
  275. }
  276. break;
  277. case MCU_OTA_RESULT_CMD:{
  278. mcu_ota_result_event(offset);
  279. }
  280. break;
  281. #endif
  282. case CHECK_MCU_TYPE_CMD:
  283. {
  284. #ifdef CHECK_MCU_TYPE
  285. response_mcu_type();
  286. #endif
  287. }
  288. break;
  289. case TIME_GET_CMD:{
  290. #ifdef SUPPORT_MCU_RTC_CHECK
  291. mcu_write_rtctime((unsigned char *)(zigbee_uart_rx_buf + offset + DATA_START));
  292. #endif
  293. }
  294. break;
  295. #ifdef BEACON_TEST
  296. case SEND_BEACON_NOTIFY_CMD:{
  297. mcu_received_beacon_test_handle();
  298. }
  299. break;
  300. #endif
  301. case READ_MCU_DP_DATA_CMD:{ // gw read DP
  302. all_data_update();
  303. }
  304. break;
  305. default:
  306. return 0;
  307. }
  308. return 1;
  309. }
  310. /**
  311. * @brief mcu send a cmd which used to making zigbee module reset
  312. * @param[in] {void}
  313. * @return void
  314. */
  315. void mcu_exit_zigbee(void)
  316. {
  317. unsigned short length = 0;
  318. length = set_zigbee_uart_byte(length,0x00);
  319. zigbee_uart_write_frame(ZIGBEE_CFG_CMD, length);
  320. }
  321. /**
  322. * @brief mcu send this commond starting zigbee module join network
  323. * this commond must be call after reveived checking proudect info, or after get zigbee network info
  324. * @param[in] {void}
  325. * @return void
  326. */
  327. void mcu_join_zigbee(void)
  328. {
  329. unsigned short length = 0;
  330. length = set_zigbee_uart_byte(length,0x01);
  331. zigbee_uart_write_frame(ZIGBEE_CFG_CMD, length);
  332. }
  333. /**
  334. * @brief mcu send a cmd which used to getting zigbee network state
  335. * @param[in] {void}
  336. * @return void
  337. */
  338. void mcu_get_zigbee_state(void)
  339. {
  340. zigbee_uart_write_frame(ZIGBEE_STATE_CMD, 0);
  341. }
  342. #ifdef CHECK_MCU_TYPE
  343. /**
  344. * @brief response zigbee check mcu type cmd
  345. * @param[in] {void}
  346. * @return void
  347. */
  348. static void response_mcu_type(void)
  349. {
  350. unsigned short length = 0;
  351. length = set_zigbee_uart_byte(length,mcu_type);
  352. zigbee_uart_write_frame(CHECK_MCU_TYPE_CMD, length);
  353. }
  354. #endif
  355. #ifdef SUPPORT_MCU_RTC_CHECK
  356. /**
  357. * @brief mcu send a cmd which used to getting timestamp
  358. * @param[in] {void}
  359. * @return void
  360. */
  361. void mcu_get_system_time(void)
  362. {
  363. zigbee_uart_write_frame(TIME_GET_CMD,0);
  364. }
  365. /**
  366. * @brief is a leap year
  367. * @param[in] {pyear}
  368. * @return leap year return 1
  369. */
  370. static unsigned char Is_Leap_Year(unsigned int pyear)
  371. {
  372. if(0 == (pyear%4)) {
  373. if(0 == (pyear%100)){
  374. if(0 == (pyear%400))
  375. return 1;
  376. else
  377. return 0;
  378. }
  379. else
  380. return 1;
  381. }
  382. else
  383. return 0;
  384. }
  385. /**
  386. * @brief get calendar time from timestamp
  387. * @param[in] {secCount} input timestamp
  388. * @param[out] {calendar} output calendar
  389. * @return result of changing
  390. */
  391. static unsigned char RTC_Get(unsigned int secCount,_calendar_obj *calendar)
  392. {
  393. static unsigned int dayCount=0;
  394. unsigned int tmp=0;
  395. unsigned int tmp1=0;
  396. tmp=secCount/86400;
  397. if(dayCount!=tmp){
  398. dayCount=tmp;
  399. tmp1=1970;
  400. while(tmp>=365){
  401. if(Is_Leap_Year(tmp1)){
  402. if(tmp>=366)
  403. tmp-=366;
  404. else{
  405. break;
  406. }
  407. }
  408. else
  409. tmp-=365;
  410. tmp1++;
  411. }
  412. calendar->w_year=tmp1;
  413. tmp1=0;
  414. while(tmp>=28){
  415. if(Is_Leap_Year(calendar->w_year)&&tmp1==1){
  416. if(tmp>=29)
  417. tmp-=29;
  418. else
  419. break;
  420. }
  421. else{
  422. if(tmp>=mon_table[tmp1])
  423. tmp-=mon_table[tmp1];
  424. else
  425. break;
  426. }
  427. tmp1++;
  428. }
  429. calendar->w_month=tmp1+1;
  430. calendar->w_date=tmp+1;
  431. }
  432. tmp=secCount%86400;
  433. calendar->hour=tmp/3600;
  434. calendar->min=(tmp%3600)/60;
  435. calendar->sec=(tmp%3600)%60;
  436. return 0;
  437. }
  438. /**
  439. * @brief calculta time from frame
  440. * @param[in] {void}
  441. * @return void
  442. */
  443. void zigbee_timestamp_to_time(void)
  444. {
  445. unsigned int time_stamp = byte_to_int(timestamp);
  446. RTC_Get(time_stamp,&_time);
  447. }
  448. #endif
  449. #ifdef BROADCAST_DATA_SEND
  450. /**
  451. * @brief mcu can send a broadcast data in zigbee network
  452. * @param[in] {buf} array of buf which to be sended
  453. * @param[in] {buf_len} send buf length
  454. * @return void
  455. */
  456. void mcu_send_broadcast_data(unsigned char buf[], unsigned char buf_len)
  457. {
  458. unsigned short length = 0;
  459. length = set_zigbee_uart_buffer(length,(unsigned char *)buf, buf_len);
  460. zigbee_uart_write_frame(SEND_BROADCAST_DATA_CMD,length);
  461. }
  462. #endif
  463. #ifdef SET_ZIGBEE_NWK_PARAMETER
  464. /**
  465. * @brief mcu can set zigbee nwk parameter
  466. * @param[in] {parameter_t *}
  467. * @param
  468. * @return void
  469. */
  470. void mcu_set_zigbee_nwk_parameter(nwk_parameter_t *Pparameter)
  471. {
  472. unsigned short length = 0;
  473. #error "please set network parameter in here, when zigbee received this message, it will start reboot"
  474. //Pparameter->app_trigger_rejoin = 0x00;
  475. //Pparameter->fast_poll_period = 0x00;
  476. length = set_zigbee_uart_byte(length,(Pparameter->heart_period >>8));
  477. length = set_zigbee_uart_byte(length,(Pparameter->heart_period));
  478. length = set_zigbee_uart_byte(length,(Pparameter->join_nwk_time >>8));
  479. length = set_zigbee_uart_byte(length,(Pparameter->join_nwk_time));
  480. length = set_zigbee_uart_byte(length,(Pparameter->rejion_period >>8));
  481. length = set_zigbee_uart_byte(length,(Pparameter->rejion_period));
  482. length = set_zigbee_uart_byte(length,(Pparameter->poll_period >>8));
  483. length = set_zigbee_uart_byte(length,(Pparameter->poll_period));
  484. length = set_zigbee_uart_byte(length,(Pparameter->fast_poll_period >>8));
  485. length = set_zigbee_uart_byte(length,(Pparameter->fast_poll_period));
  486. length = set_zigbee_uart_byte(length,(Pparameter->poll_failure_times));
  487. length = set_zigbee_uart_byte(length,(Pparameter->app_trigger_rejoin));
  488. length = set_zigbee_uart_byte(length,(Pparameter->rejoin_try_times));
  489. length = set_zigbee_uart_byte(length,(Pparameter->rf_send_power));
  490. zigbee_uart_write_frame(SET_ZIGBEE_NEK_PARAMETER_CMD,length);
  491. }
  492. #endif
  493. /**
  494. * @brief mcu version string to char
  495. * @param[in] {void}
  496. * @return result of version
  497. */
  498. unsigned char get_current_mcu_fw_ver(void)
  499. {
  500. unsigned char *fw_ver = (unsigned char*) MCU_VER; //Current version
  501. unsigned char current_mcu_fw_ver = 0;
  502. if((fw_ver[4] >= 0x30)&&(fw_ver[5] >= 0x30))
  503. { // 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. else
  509. { // 3 number
  510. current_mcu_fw_ver = (assic_to_hex(fw_ver[0]) & 0x03) << 6; //high ver
  511. current_mcu_fw_ver |= (assic_to_hex(fw_ver[2]) & 0x03) << 4; //mid ver
  512. current_mcu_fw_ver |= (assic_to_hex(fw_ver[4]) & 0x0F); //low ver
  513. }
  514. return current_mcu_fw_ver;
  515. }
  516. #ifdef SUPPORT_MCU_OTA
  517. /**
  518. * @brief get mcu pid data saved in current_mcu_pid
  519. * @param[in] {void}
  520. * @return result of handle
  521. */
  522. void current_mcu_fw_pid(void)
  523. {
  524. unsigned char i = 0;
  525. unsigned char *fw_pid = (unsigned char*) PRODUCT_KEY;
  526. while(i < 8){
  527. current_mcu_pid[i] = fw_pid[i];
  528. i++;
  529. }
  530. }
  531. /**
  532. * @brief mcu ota offset requset
  533. * @param[in] {packet_offset} packet offset
  534. * @return viod
  535. */
  536. //when call this function, should set timeout event, if not received zigbee send response should res
  537. void mcu_ota_fw_request(void)
  538. {
  539. unsigned char i = 0;
  540. unsigned short length = 0;
  541. if(ota_fw_info.mcu_current_offset >= ota_fw_info.mcu_ota_fw_size) //outside
  542. return;
  543. while(i < 8){
  544. length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_pid[i]); //ota fw pid
  545. i++;
  546. }
  547. length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_ver); //ota fw version
  548. i = 0;
  549. while(i < 4){
  550. length = set_zigbee_uart_byte(length , ota_fw_info.mcu_current_offset >> (24 - i * 8)); //pakage offset request
  551. i++;
  552. }
  553. length = set_zigbee_uart_byte(length ,FW_SINGLE_PACKET_SIZE); // packet size request
  554. zigbee_uart_write_frame(MCU_OTA_DATA_REQUEST_CMD,length);
  555. }
  556. /**
  557. * @brief mcu ota result report
  558. * @param[in] {status} result of mcu ota
  559. * @return void
  560. */
  561. void mcu_ota_result_report(unsigned char status)
  562. {
  563. unsigned short length = 0;
  564. unsigned char i = 0;
  565. length = set_zigbee_uart_byte(length,status); //upgrade result status(0x00:ota success;0x01:ota failed)
  566. while(i < 8){
  567. length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_pid[i]); //PID
  568. i++;
  569. }
  570. length = set_zigbee_uart_byte(length,ota_fw_info.mcu_ota_ver); //ota fw version
  571. zigbee_uart_write_frame(MCU_OTA_RESULT_CMD,length); //response
  572. }
  573. #endif
  574. /**
  575. * @brief compare str1 and str2
  576. * @param[in] {str1} str1
  577. * @param[in] {str2} str2
  578. * @param[in] {len} len
  579. * @return equal return 0 else return -1
  580. */
  581. int strcmp_barry(unsigned char *str1,unsigned char *str2,unsigned char len)
  582. {unsigned char i;
  583. for(i = 0; i < len; i++){
  584. if(str1[i] < str2[i]){
  585. return -1; //str1 < str2
  586. }
  587. else if(str1[i] > str2[i]){
  588. return 1; //str1 > str2
  589. }
  590. }
  591. return 0; //str1 == str2
  592. }
  593. /**
  594. * @brief translate assic to hex
  595. * @param[in] {assic_num} assic number
  596. * @return hex data
  597. */
  598. char assic_to_hex(unsigned char assic_num)
  599. {
  600. if(assic_num<0x30 || assic_num > 0x39) //0~9
  601. return -1;
  602. else
  603. return assic_num % 0x30;
  604. }