um482.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #ifndef _UM482_H_
  2. #define _UM482_H_
  3. #include "common.h"
  4. #include <stdint.h>
  5. enum um482_sol_status
  6. {
  7. UM482_SOL_STATUS_COMPUTED = 0, /* 已解出 */
  8. UM482_SOL_STATUS_INSUFFICIENT_OBS = 1, /* 观测数据不足 */
  9. UM482_SOL_STATUS_NO_CONVERGENCE = 2, /* 无法收敛 */
  10. UM482_SOL_STATUS_COV_TRACE = 4, /* 协方差阵 trace 过大 */
  11. };
  12. enum um482_pos_type
  13. {
  14. UM482_POS_TYPE_NONE = 0, /* 无定位 */
  15. UM482_POS_TYPE_FIXEDPOS = 1, /* 外部指定定位 */
  16. UM482_POS_TYPE_FIXEDHEIGHT = 2, /* 暂未支持 */
  17. UM482_POS_TYPE_DOPPLER_VEL = 8, /* 速度由多普勒信息解算 */
  18. UM482_POS_TYPE_SINGLE = 16, /* 单点定位 */
  19. UM482_POS_TYPE_PSRDIFF = 17, /* 伪距差分定位 */
  20. UM482_POS_TYPE_WAAS = 18, /* sbas 定位 */
  21. UM482_POS_TYPE_L1_FLOAT = 32, /* L1 浮点定位 */
  22. UM482_POS_TYPE_IONOFREE_FLOAT = 33,
  23. UM482_POS_TYPE_NARROW_FLOAT = 34,
  24. UM482_POS_TYPE_L1_INT = 48,
  25. UM482_POS_TYPE_WIDE_INT = 49,
  26. UM482_POS_TYPE_NARROW_INT = 50,
  27. UM482_POS_TYPE_INS = 52,
  28. UM482_POS_TYPE_INS_PSRSP = 53,
  29. UM482_POS_TYPE_INS_PSRDIFF = 54,
  30. UM482_POS_TYPE_INS_RTKFLOAT = 55,
  31. UM482_POS_TYPE_INS_RTKFIXED = 56
  32. };
  33. struct um482_msg_header
  34. {
  35. uint8_t sync[3]; /* 固定为 0XAA 0X44 0X12 */
  36. uint8_t header_len; /* 帧头长度 */
  37. uint16_t msg_id; /* 消息 ID */
  38. uint8_t msg_type; /* 消息类型 */
  39. uint8_t reserve0; /* 预留 */
  40. uint16_t msg_len; /* 消息长度,不包括 header 和 校验 */
  41. uint16_t reserve1; /* 预留 */
  42. uint8_t idle_time; /* */
  43. uint8_t time_status; /* */
  44. uint16_t week; /* */
  45. uint32_t ms; /* */
  46. uint32_t reserve2; /* */
  47. uint16_t bd_second; /* */
  48. uint16_t reserve3; /* */
  49. } __attribute__((aligned(1)));
  50. typedef struct um482_msg
  51. {
  52. struct um482_msg_header header;
  53. uint8_t data[256];
  54. uint32_t crc32_check;
  55. uint8_t _parse_state;
  56. uint8_t _head_rx_index;
  57. uint8_t _data_rx_index;
  58. uint8_t _check_rx_index;
  59. } um482_msg_t;
  60. struct um482_bestpos_data
  61. {
  62. uint32_t sol_status; /* 解状态, 参考 enum um482_sol_status */
  63. uint32_t pos_type; /* 定位状态, 参考 enum um482_pos_type */
  64. double lat_deg; /* 经度 */
  65. double lon_deg; /* 纬度 */
  66. double hgt_m; /* 海拔 */
  67. float undulation; /* 大地水准面差距 */
  68. uint32_t datum_id; /* 坐标系 ID, 当前仅支持 61 #wgs84 */
  69. float lat_theta; /* 经度标准差 */
  70. float lon_theta; /* 纬度标准差 */
  71. float hgt_theta; /* 高度标准差 */
  72. char stn_id[4]; /* 基站 ID */
  73. float diff_age_sec; /* 差分龄期 s */
  74. float sol_age_sec; /* 解的龄期 s */
  75. uint8_t svs; /* 跟踪的卫星数 */
  76. uint8_t soln_svs; /* 解使用的卫星数 */
  77. uint8_t reserve0;
  78. uint8_t reserve1;
  79. uint8_t reserve2;
  80. uint8_t ext_sol_stat;
  81. uint8_t reserve3;
  82. uint8_t sig_mask;
  83. } __attribute__((aligned(1)));
  84. struct um482_bestvel_data
  85. {
  86. uint32_t sol_status; /* 解状态, 参考 enum um482_sol_status */
  87. uint32_t vel_type; /* 速度状态 */
  88. float latency; /* 延迟值 */
  89. float age_sec; /* 差分龄期 */
  90. double hor_spd_mps; /* 对地水平速度 m/s */
  91. double trk_gnd_deg; /* 运动航迹角 deg */
  92. double vert_spd_mps; /* 垂直速度 m/s */
  93. uint32_t reserve0; /* 预留 */
  94. } __attribute__((aligned(1)));
  95. struct um482_haeding_data
  96. {
  97. uint32_t sol_status; /* 解状态, 参考 enum um482_sol_status */
  98. uint32_t pos_type; /* 定位状态, 参考 enum um482_pos_type */
  99. float length_m; /* 基线长 m */
  100. float heading; /* 航向 0~360deg */
  101. float pitch; /* 俯仰 +- 90 deg */
  102. float reserve0; /* 预留 */
  103. float hdgstddev; /* 航向标准差 */
  104. float ptchstddev; /* 俯仰标准差 */
  105. char stn_id[4]; /* 基站 ID */
  106. uint8_t svs; /* 跟踪的卫星数 */
  107. uint8_t soln_svs; /* 解使用的卫星数 */
  108. uint8_t obs; /* 截至高度角 */
  109. uint8_t multi; /* 截止高度角上有 L2 观测的卫星数 */
  110. uint8_t reserve1; /* 预留 */
  111. uint8_t ext_sol_stat;
  112. uint8_t reserve2;
  113. uint8_t sig_mask;
  114. } __attribute__((aligned(1)));
  115. typedef struct um482_rx_data
  116. {
  117. struct um482_bestpos_data bestpos;
  118. struct um482_bestvel_data bestvel;
  119. struct um482_haeding_data heading;
  120. comp_status bestpos_data_link_status; /* bestpos 包接收状态 */
  121. comp_status bestvel_data_link_status; /* bestvel 包接收状态 */
  122. comp_status heading_data_link_status; /* heading 包接收状态 */
  123. uint32_t bestpos_rx_count; /* bestpos 包接收计数 */
  124. uint32_t bestvel_rx_count; /* bestvel 包接收计数 */
  125. uint32_t heading_rx_count; /* heading 包接收计数 */
  126. uint8_t rx_count; /* 总接收包计数 */
  127. /* bestpos 包接收回调 */
  128. void (*bestpos_rx_callback)(struct um482_rx_data *pdata);
  129. /* bestpos 包接收回调 */
  130. void (*bestvel_rx_callback)(struct um482_rx_data *pdata);
  131. /* bestpos 包接收回调 */
  132. void (*heading_rx_callback)(struct um482_rx_data *pdata);
  133. } um482_rx_data_t;
  134. void um482_rxmsg_init(um482_msg_t *msg);
  135. int8_t um482_rxmsg_parse_char(uint8_t c, um482_msg_t *msg);
  136. void um482_rxmsg_decode(um482_msg_t *msg, um482_rx_data_t *rx_data);
  137. void um482_rxmsg_link_check(um482_rx_data_t *rx_data);
  138. #endif