12 16 KB

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