soft_usharprada.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "common.h"
  2. #include "soft_usharpradar.h"
  3. #include <stdbool.h>
  4. #include <stdint.h>
  5. typedef struct
  6. {
  7. uint16_t obstacle0_dist;
  8. uint16_t obstacle1_dist;
  9. uint16_t obstacle2_dist;
  10. uint16_t obstacle3_dist;
  11. uint16_t obstacle4_dist;
  12. char obstacle0_snr;
  13. char obstacle1_snr;
  14. char obstacle2_snr;
  15. char obstacle3_snr;
  16. char obstacle4_snr;
  17. } uSharp_Radar;
  18. static uSharp_Radar uSharpRadarData;
  19. static comp_status uSharpRadarLinkStatus = COMP_NOEXIST;
  20. uint8_t usharpRadar_analysis(uint8_t *pdata, uint16_t length)
  21. {
  22. uint16_t index = 0;
  23. // 如果不足 18 个数, 则不是一帧完整的协议
  24. if (length < 18)
  25. {
  26. return 0;
  27. }
  28. // 检查帧头
  29. if (pdata[index++] == 0xff && pdata[index++] == 0xff)
  30. {
  31. // 计算校验
  32. uint8_t checkSum = 0;
  33. for (uint8_t i = 0; i < 17; ++i)
  34. {
  35. checkSum += pdata[i];
  36. }
  37. checkSum = checkSum & 0xff;
  38. if (checkSum == pdata[17])
  39. {
  40. uSharpRadarData.obstacle0_dist = pdata[index++];
  41. uSharpRadarData.obstacle0_dist += ((uint16_t)pdata[index++] << 8);
  42. uSharpRadarData.obstacle1_dist = pdata[index++];
  43. uSharpRadarData.obstacle1_dist += ((uint16_t)pdata[index++] << 8);
  44. uSharpRadarData.obstacle2_dist = pdata[index++];
  45. uSharpRadarData.obstacle2_dist += ((uint16_t)pdata[index++] << 8);
  46. uSharpRadarData.obstacle3_dist = pdata[index++];
  47. uSharpRadarData.obstacle3_dist += ((uint16_t)pdata[index++] << 8);
  48. uSharpRadarData.obstacle4_dist = pdata[index++];
  49. uSharpRadarData.obstacle4_dist += ((uint16_t)pdata[index++] << 8);
  50. uSharpRadarData.obstacle0_snr = pdata[index++];
  51. uSharpRadarData.obstacle1_snr = pdata[index++];
  52. uSharpRadarData.obstacle2_snr = pdata[index++];
  53. uSharpRadarData.obstacle3_snr = pdata[index++];
  54. uSharpRadarData.obstacle4_snr = pdata[index++];
  55. return 1;
  56. }
  57. else
  58. {
  59. return 0;
  60. }
  61. }
  62. else
  63. {
  64. return 0;
  65. }
  66. }
  67. // @brief 找到最近的障碍距离
  68. // @retval 最近的障碍物距离,若没有障碍物返回 -1, 有障碍则返回最小的障碍值
  69. int usharpRadar_getObstacleDist(void)
  70. {
  71. int obstacle_dist;
  72. // 如果 5 个障碍物都没有则返回false
  73. if (uSharpRadarData.obstacle0_snr > 5)
  74. {
  75. obstacle_dist = uSharpRadarData.obstacle0_dist;
  76. }
  77. else if (uSharpRadarData.obstacle1_snr > 5)
  78. {
  79. obstacle_dist = uSharpRadarData.obstacle1_dist;
  80. }
  81. else if (uSharpRadarData.obstacle2_snr > 5)
  82. {
  83. obstacle_dist = uSharpRadarData.obstacle2_dist;
  84. }
  85. else if (uSharpRadarData.obstacle3_snr > 5)
  86. {
  87. obstacle_dist = uSharpRadarData.obstacle3_dist;
  88. }
  89. else if (uSharpRadarData.obstacle4_snr > 5)
  90. {
  91. obstacle_dist = uSharpRadarData.obstacle4_dist;
  92. }
  93. else
  94. {
  95. obstacle_dist = -1;
  96. }
  97. return obstacle_dist;
  98. }
  99. // @brief 设置 usharp 雷达连接状态
  100. // @param 连接状态
  101. void usharpRadar_setLinkStatus(comp_status status)
  102. {
  103. uSharpRadarLinkStatus = status;
  104. }
  105. // @brief 获取 usharp 雷达连接状态
  106. // @retval usharp 雷达连接状态
  107. comp_status usharpRadar_getLinkStatus(void) { return uSharpRadarLinkStatus; }