common.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. #include "tim.h"
  2. #include "common.h"
  3. #include "string.h"
  4. #include "soft_obstacle.h"
  5. int findStrInArray( uint8_t *array, int aLen, const char *str )
  6. {
  7. int strLen = strlen( str );
  8. uint8_t s1 = str[0];
  9. if ( aLen < strLen )
  10. return 0;
  11. for ( int i = 0; i < aLen; i++ )
  12. {
  13. if ( array[i] == s1 )
  14. {
  15. if ( memcmp( &array[i], str, strLen ) == 0 )
  16. return 1;
  17. }
  18. }
  19. return 0;
  20. }
  21. void buf2int( int *tint, unsigned char *buf )
  22. {
  23. int i;
  24. unsigned char *p1 = ( unsigned char * )tint;
  25. unsigned char *p3 = buf;
  26. for ( i = 0; i < 4; i++ )
  27. {
  28. *p1 = *p3;
  29. p1++;
  30. p3++;
  31. }
  32. }
  33. /*****************************uint16从大到小排列*************************/
  34. void u16t_buf_sort( uint16_t *arr, uint16_t length )
  35. {
  36. if ( length < 2 )
  37. {
  38. return;
  39. }
  40. uint16_t num = 0, num1 = 0;
  41. uint16_t tmp = 0;
  42. for ( num = length - 1; num >= 1; num-- )
  43. {
  44. for ( num1 = 0; num1 <= num - 1; num1++ )
  45. {
  46. if ( *( arr + num1 ) > *( arr + num1 + 1 ) )
  47. {
  48. tmp = *( arr + num1 );
  49. *( arr + num1 ) = *( arr + num1 + 1 );
  50. *( arr + num1 + 1 ) = tmp;
  51. }
  52. }
  53. }
  54. }
  55. /*****************************恩曌雷达排序************************/
  56. void mimo_buf_sort( mimo_part_radar *arr, uint16_t length )
  57. {
  58. if ( length < 2 )
  59. {
  60. return;
  61. }
  62. uint16_t num = 0, num1 = 0;
  63. mimo_part_radar tmp;
  64. for ( num = length - 1; num >= 1; num-- )
  65. {
  66. for ( num1 = 0; num1 <= num - 1; num1++ )
  67. {
  68. if ( ( ( arr + num1 )->Distance ) > ( ( arr + num1 + 1 )->Distance ) )
  69. {
  70. tmp = *( arr + num1 );
  71. *( arr + num1 ) = *( arr + num1 + 1 );
  72. *( arr + num1 + 1 ) = tmp;
  73. }
  74. }
  75. }
  76. }
  77. /****************************short 类型放到buf中***************/
  78. void short2buf( unsigned char *buf, short *tshort )
  79. {
  80. int i;
  81. unsigned char *p1 = ( unsigned char * )tshort;
  82. unsigned char *p3 = buf;
  83. for ( i = 0; i < 2; i++ )
  84. {
  85. *p3 = *p1;
  86. p1++;
  87. p3++;
  88. }
  89. }
  90. /*
  91. int转hex转string
  92. */
  93. void char_to_hex_string( unsigned char *cdata, short lenc, char *sbuf, short lens, char *ES )
  94. {
  95. short tmp_lens = lens;
  96. for ( int i = 0 ; i < lenc && tmp_lens >= 2 ; i++ )
  97. {
  98. char hight = ( cdata[i] >> 4 ) & 0x0f;
  99. char low = cdata[i] & 0x0f;
  100. if ( hight > 9 )
  101. sbuf[lens - tmp_lens] = 'A' + hight - 10;
  102. else
  103. sbuf[lens - tmp_lens] = '0' + hight;
  104. tmp_lens--;
  105. if ( low > 9 )
  106. sbuf[lens - tmp_lens] = 'A' + low - 10;
  107. else
  108. sbuf[lens - tmp_lens] = '0' + low;
  109. tmp_lens--;
  110. }
  111. int i = 0;
  112. //尾缀
  113. for ( ; tmp_lens > 0 ; tmp_lens-- )
  114. {
  115. if ( *( ES + i ) != '\0' )
  116. {
  117. sbuf[lens - tmp_lens] = *( ES + i );
  118. }
  119. else
  120. {
  121. break;
  122. }
  123. i++;
  124. }
  125. }
  126. /*
  127. @brief:
  128. num: 整型数值
  129. str: 字符串地址
  130. radix:进制
  131. */
  132. char* itoa( int num, char* str, int radix )
  133. {
  134. char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //索引表
  135. unsigned unum;//存放要转换的整数的绝对值,转换的整数可能是负数
  136. int i = 0, j, k; //i用来指示设置字符串相应位,转换之后i其实就是字符串的长度;转换后顺序是逆序的,有正负的情况,k用来指示调整顺序的开始位置;j用来指示调整顺序时的交换。
  137. //获取要转换的整数的绝对值
  138. if ( radix == 10 && num < 0 ) //要转换成十进制数并且是负数
  139. {
  140. unum = ( unsigned ) - num; //将num的绝对值赋给unum
  141. str[i++] = '-'; //在字符串最前面设置为'-'号,并且索引加1
  142. }
  143. else unum = ( unsigned )num; //若是num为正,直接赋值给unum
  144. //转换部分,注意转换后是逆序的
  145. do
  146. {
  147. str[i++] = index[unum % ( unsigned )radix]; //取unum的最后一位,并设置为str对应位,指示索引加1
  148. unum /= radix; //unum去掉最后一位
  149. }
  150. while ( unum ); //直至unum为0退出循环
  151. str[i] = '\0'; //在字符串最后添加'\0'字符,c语言字符串以'\0'结束。
  152. //将顺序调整过来
  153. if ( str[0] == '-' ) k = 1; //如果是负数,符号不用调整,从符号后面开始调整
  154. else k = 0; //不是负数,全部都要调整
  155. char temp;//临时变量,交换两个值时用到
  156. for ( j = k; j <= ( i - 1 ) / 2; j++ ) //头尾一一对称交换,i其实就是字符串的长度,索引最大值比长度少1
  157. {
  158. temp = str[j]; //头部赋值给临时变量
  159. str[j] = str[i - 1 + k - j]; //尾部赋值给头部
  160. str[i - 1 + k - j] = temp; //将临时变量的值(其实就是之前的头部值)赋给尾部
  161. }
  162. return str;//返回转换后的字符串
  163. }
  164. char* Int2String(int num,char *str,uint8_t size)//10进制
  165. {
  166. int i = 0;//指示填充str
  167. if(num<0)//如果num为负数,将num变正
  168. {
  169. num = -num;
  170. str[i++] = '-';
  171. }
  172. //转换
  173. do
  174. {
  175. if(size>0)
  176. {
  177. str[i++] = num%10+48;
  178. }
  179. size--;
  180. num /= 10;
  181. }while(num);
  182. str[i] = '\0';
  183. //确定开始调整的位置
  184. int j = 0;
  185. if(str[0]=='-')//如果有负号,负号不用调整
  186. {
  187. j = 1;//从第二位开始调整
  188. ++i;//由于有负号,所以交换的对称轴也要后移1位
  189. }
  190. //对称交换
  191. for(;j<i/2;j++)
  192. {
  193. //对称交换两端的值 其实就是省下中间变量交换a+b的值:a=a+b;b=a-b;a=a-b;
  194. str[j] = str[j] + str[i-1-j];
  195. str[i-1-j] = str[j] - str[i-1-j];
  196. str[j] = str[j] - str[i-1-j];
  197. }
  198. return str;//返回转换后的值
  199. }
  200. /**
  201. * @file Check_dev_link
  202. * @brief 检测设备连接状态
  203. * @param dev 设备 ms 时间毫秒 p数据地址 size数据大小
  204. * @details
  205. * @author Zhang Sir
  206. **/
  207. void Check_dev_link(Connect_check *dev,uint16_t ms,char *p,uint16_t size)
  208. {
  209. if(dev->connect_status == COMP_NOEXIST)
  210. return;
  211. dev->error_time = HAL_GetTick() - dev->recv_time;
  212. if (dev->connect_status == COMP_NORMAL && (dev->error_time > ms))
  213. {
  214. if(p != NULL)
  215. memset(p, 0, size);
  216. dev->connect_status = COMP_LOST;
  217. }
  218. }
  219. /**
  220. * @file Check_Timer_Ready
  221. * @brief 定时器循环检测
  222. * @param
  223. * @details
  224. * @author Zhang Sir
  225. **/
  226. bool Check_Timer_Ready(uint32_t *time,uint16_t HZ)
  227. {
  228. if(HAL_GetTick() - *time >= HZ)
  229. {
  230. *time = HAL_GetTick();
  231. return true;
  232. }
  233. return false;
  234. }
  235. int16_t math_cons_i16( int16_t value, int16_t min, int16_t max )
  236. {
  237. return ( ( value ) < ( min ) ? ( min ) : ( ( value ) > ( max ) ? ( max ) : ( value ) ) );
  238. }
  239. //数组array是否为空,只有'\0'以及'0'
  240. bool StrArrayNull( uint8_t *array, int aLen )
  241. {
  242. for ( int i = 0; i < aLen; i++ )
  243. {
  244. if(array[i] != 0 && array[i] != '0')
  245. return false;
  246. }
  247. return true;
  248. }