#ifndef _UM482_H_ #define _UM482_H_ #include "common.h" #include 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