common.c 7.7 KB

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