23#ifndef PROTOCORE_UBX_H
24#define PROTOCORE_UBX_H
33#define PC_UBX_SYNC1 0xB5u
34#define PC_UBX_SYNC2 0x62u
42 const uint8_t *payload;
49void pc_ubx_checksum(
const uint8_t *body,
size_t len, uint8_t *ck_a, uint8_t *ck_b);
56size_t pc_ubx_build(uint8_t *buf,
size_t cap, uint8_t cls, uint8_t
id,
const uint8_t *payload, uint16_t len);
59size_t pc_ubx_build_poll(uint8_t *buf,
size_t cap, uint8_t cls, uint8_t
id);
66bool pc_ubx_parse(
const uint8_t *s,
size_t len, pc_ubx *out);
73int pc_ubx_ack(
const pc_ubx *m, uint8_t *acked_cls, uint8_t *acked_id);
76uint16_t pc_ubx_u16(
const uint8_t *p,
size_t off);
77uint32_t pc_ubx_u32(
const uint8_t *p,
size_t off);
78int16_t pc_ubx_i16(
const uint8_t *p,
size_t off);
79int32_t pc_ubx_i32(
const uint8_t *p,
size_t off);
83#define PC_UBX_CLASS_NAV 0x01
84#define PC_UBX_NAV_PVT 0x07
85#define PC_UBX_NAV_PVT_LEN 92
86#define PC_UBX_PVT_FIX_OK 0x01u
95 PC_UBX_FIX_GNSS_DR = 4,
112 uint32_t time_acc_ns;
126 int32_t head_mot_1e5;
128 uint32_t head_acc_1e5;
137bool pc_ubx_parse_nav_pvt(
const pc_ubx *m, pc_ubx_nav_pvt *out);
141#define PC_UBX_NAV_SAT 0x35
142#define PC_UBX_NAV_SAT_HDR_LEN 8
143#define PC_UBX_NAV_SAT_ENTRY_LEN 12
144#define PC_UBX_SAT_QUALITY_MASK 0x07u
145#define PC_UBX_SAT_USED 0x08u
148struct pc_ubx_nav_sat_hdr
172bool pc_ubx_parse_nav_sat(
const pc_ubx *m, pc_ubx_nav_sat_hdr *out);
178bool pc_ubx_nav_sat_get(
const pc_ubx *m, uint8_t index, pc_ubx_sat *out);
182#define PC_UBX_NAV_TIMEUTC 0x21
183#define PC_UBX_NAV_TIMEUTC_LEN 20
184#define PC_UBX_TIMEUTC_VALID_TOW 0x01u
185#define PC_UBX_TIMEUTC_VALID_WKN 0x02u
186#define PC_UBX_TIMEUTC_VALID_UTC 0x04u
189struct pc_ubx_nav_time_utc
192 uint32_t time_acc_ns;
208bool pc_ubx_parse_nav_timeutc(
const pc_ubx *m, pc_ubx_nav_time_utc *out);
212#define PC_UBX_CLASS_CFG 0x06
213#define PC_UBX_CFG_MSG 0x01
214#define PC_UBX_CFG_RATE 0x08
215#define PC_UBX_TIME_REF_UTC 0
216#define PC_UBX_TIME_REF_GPS 1
225size_t pc_ubx_build_cfg_msg(uint8_t *buf,
size_t cap, uint8_t cls, uint8_t
id, uint8_t rate);
234size_t pc_ubx_build_cfg_rate(uint8_t *buf,
size_t cap, uint16_t meas_rate_ms, uint16_t nav_rate, uint16_t time_ref);
241 PC_UBX_PASSTHROUGH = 2,
257 uint8_t buf[PC_UBX_MAX_PAYLOAD];
261void pc_ubx_stream_init(pc_ubx_stream *st);
269int pc_ubx_stream_feed(pc_ubx_stream *st, uint8_t b, pc_ubx *out, uint8_t *passthrough);
User-facing configuration for ProtoCore.