| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- #ifndef _UM482_H_
- #define _UM482_H_
- #include "common.h"
- #include <stdint.h>
- enum um482_sol_status
- {
- UM482_SOL_STATUS_COMPUTED = 0, /* 已解出 */
- UM482_SOL_STATUS_INSUFFICIENT_OBS = 1, /* 观测数据不足 */
- UM482_SOL_STATUS_NO_CONVERGENCE = 2, /* 无法收敛 */
- UM482_SOL_STATUS_COV_TRACE = 4, /* 协方差阵 trace 过大 */
- };
- enum um482_pos_type
- {
- UM482_POS_TYPE_NONE = 0, /* 无定位 */
- UM482_POS_TYPE_FIXEDPOS = 1, /* 外部指定定位 */
- UM482_POS_TYPE_FIXEDHEIGHT = 2, /* 暂未支持 */
- UM482_POS_TYPE_DOPPLER_VEL = 8, /* 速度由多普勒信息解算 */
- UM482_POS_TYPE_SINGLE = 16, /* 单点定位 */
- UM482_POS_TYPE_PSRDIFF = 17, /* 伪距差分定位 */
- UM482_POS_TYPE_WAAS = 18, /* sbas 定位 */
- UM482_POS_TYPE_L1_FLOAT = 32, /* L1 浮点定位 */
- UM482_POS_TYPE_IONOFREE_FLOAT = 33,
- UM482_POS_TYPE_NARROW_FLOAT = 34,
- UM482_POS_TYPE_L1_INT = 48,
- UM482_POS_TYPE_WIDE_INT = 49,
- UM482_POS_TYPE_NARROW_INT = 50,
- UM482_POS_TYPE_INS = 52,
- UM482_POS_TYPE_INS_PSRSP = 53,
- UM482_POS_TYPE_INS_PSRDIFF = 54,
- UM482_POS_TYPE_INS_RTKFLOAT = 55,
- UM482_POS_TYPE_INS_RTKFIXED = 56
- };
- struct um482_msg_header
- {
- uint8_t sync[3]; /* 固定为 0XAA 0X44 0X12 */
- uint8_t header_len; /* 帧头长度 */
- uint16_t msg_id; /* 消息 ID */
- uint8_t msg_type; /* 消息类型 */
- uint8_t reserve0; /* 预留 */
- uint16_t msg_len; /* 消息长度,不包括 header 和 校验 */
- uint16_t reserve1; /* 预留 */
- uint8_t idle_time; /* */
- uint8_t time_status; /* */
- uint16_t week; /* */
- uint32_t ms; /* */
- uint32_t reserve2; /* */
- uint16_t bd_second; /* */
- uint16_t reserve3; /* */
- } __attribute__((aligned(1)));
- typedef struct um482_msg
- {
- struct um482_msg_header header;
- uint8_t data[256];
- uint32_t crc32_check;
- uint8_t _parse_state;
- uint8_t _head_rx_index;
- uint8_t _data_rx_index;
- uint8_t _check_rx_index;
- } um482_msg_t;
- struct um482_bestpos_data
- {
- uint32_t sol_status; /* 解状态, 参考 enum um482_sol_status */
- uint32_t pos_type; /* 定位状态, 参考 enum um482_pos_type */
- double lat_deg; /* 经度 */
- double lon_deg; /* 纬度 */
- double hgt_m; /* 海拔 */
- float undulation; /* 大地水准面差距 */
- uint32_t datum_id; /* 坐标系 ID, 当前仅支持 61 #wgs84 */
- float lat_theta; /* 经度标准差 */
- float lon_theta; /* 纬度标准差 */
- float hgt_theta; /* 高度标准差 */
- char stn_id[4]; /* 基站 ID */
- float diff_age_sec; /* 差分龄期 s */
- float sol_age_sec; /* 解的龄期 s */
- uint8_t svs; /* 跟踪的卫星数 */
- uint8_t soln_svs; /* 解使用的卫星数 */
- uint8_t reserve0;
- uint8_t reserve1;
- uint8_t reserve2;
- uint8_t ext_sol_stat;
- uint8_t reserve3;
- uint8_t sig_mask;
- } __attribute__((aligned(1)));
- struct um482_bestvel_data
- {
- uint32_t sol_status; /* 解状态, 参考 enum um482_sol_status */
- uint32_t vel_type; /* 速度状态 */
- float latency; /* 延迟值 */
- float age_sec; /* 差分龄期 */
- double hor_spd_mps; /* 对地水平速度 m/s */
- double trk_gnd_deg; /* 运动航迹角 deg */
- double vert_spd_mps; /* 垂直速度 m/s */
- uint32_t reserve0; /* 预留 */
- } __attribute__((aligned(1)));
- struct um482_haeding_data
- {
- uint32_t sol_status; /* 解状态, 参考 enum um482_sol_status */
- uint32_t pos_type; /* 定位状态, 参考 enum um482_pos_type */
- float length_m; /* 基线长 m */
- float heading; /* 航向 0~360deg */
- float pitch; /* 俯仰 +- 90 deg */
- float reserve0; /* 预留 */
- float hdgstddev; /* 航向标准差 */
- float ptchstddev; /* 俯仰标准差 */
- char stn_id[4]; /* 基站 ID */
- uint8_t svs; /* 跟踪的卫星数 */
- uint8_t soln_svs; /* 解使用的卫星数 */
- uint8_t obs; /* 截至高度角 */
- uint8_t multi; /* 截止高度角上有 L2 观测的卫星数 */
- uint8_t reserve1; /* 预留 */
- uint8_t ext_sol_stat;
- uint8_t reserve2;
- uint8_t sig_mask;
- } __attribute__((aligned(1)));
- typedef struct um482_rx_data
- {
- struct um482_bestpos_data bestpos;
- struct um482_bestvel_data bestvel;
- struct um482_haeding_data heading;
- comp_status bestpos_data_link_status; /* bestpos 包接收状态 */
- comp_status bestvel_data_link_status; /* bestvel 包接收状态 */
- comp_status heading_data_link_status; /* heading 包接收状态 */
- uint32_t bestpos_rx_count; /* bestpos 包接收计数 */
- uint32_t bestvel_rx_count; /* bestvel 包接收计数 */
- uint32_t heading_rx_count; /* heading 包接收计数 */
- uint8_t rx_count; /* 总接收包计数 */
- /* bestpos 包接收回调 */
- void (*bestpos_rx_callback)(struct um482_rx_data *pdata);
- /* bestpos 包接收回调 */
- void (*bestvel_rx_callback)(struct um482_rx_data *pdata);
- /* bestpos 包接收回调 */
- void (*heading_rx_callback)(struct um482_rx_data *pdata);
- } um482_rx_data_t;
- void um482_rxmsg_init(um482_msg_t *msg);
- int8_t um482_rxmsg_parse_char(uint8_t c, um482_msg_t *msg);
- void um482_rxmsg_decode(um482_msg_t *msg, um482_rx_data_t *rx_data);
- void um482_rxmsg_link_check(um482_rx_data_t *rx_data);
- #endif
|