5size_t ubx_frame(uint8_t* out,
size_t cap, uint8_t cls, uint8_t
id,
6 const uint8_t*
payload, uint16_t len) {
7 size_t total = (size_t)len + 8U;
8 if (!out || total > cap || (len && !
payload)) {
15 out[4] = (uint8_t)len;
16 out[5] = (uint8_t)(len >> 8);
21 for (
size_t i = 2; i < 6U + len; ++i) {
22 a = (uint8_t)(
a + out[i]);
41 for (
size_t i = 0; i <
count; ++i) {
42 uint8_t size = items[i].
size;
43 if (size != 1 && size != 2 && size != 4) {
46 for (
int k = 0; k < 4; ++k) {
47 payload[
n++] = (uint8_t)(items[i].key >> (8 * k));
49 for (
int k = 0; k < size; ++k) {
57static uint32_t
u32(
const uint8_t*
p) {
58 return (uint32_t)
p[0] | (uint32_t)
p[1] << 8 | (uint32_t)
p[2] << 16 |
62static int32_t
i32(
const uint8_t*
p) {
63 return (int32_t)
u32(
p);
71 out->itow_ms =
u32(
p + 0);
72 out->year = (uint16_t)(
p[4] |
p[5] << 8);
79 out->fix_type =
p[20];
82 out->lon_e7 =
i32(
p + 24);
83 out->lat_e7 =
i32(
p + 28);
84 out->height_mm =
i32(
p + 32);
85 out->hmsl_mm =
i32(
p + 36);
86 out->hacc_mm =
u32(
p + 40);
87 out->vacc_mm =
u32(
p + 44);
88 out->vel_n_mms =
i32(
p + 48);
89 out->vel_e_mms =
i32(
p + 52);
90 out->vel_d_mms =
i32(
p + 56);
91 out->sacc_mms =
u32(
p + 68);
92 out->pdop_e2 = (uint16_t)(
p[76] |
p[77] << 8);
96size_t ubx_poll(uint8_t* out,
size_t cap, uint8_t cls, uint8_t
id) {
100static uint16_t
u16(
const uint8_t*
p) {
101 return (uint16_t)(
p[0] |
p[1] << 8);
106 if (!
p || !out || len < 4U + 24U ||
p[1] < 1U) {
109 const uint8_t*
b =
p + 4;
110 out->jamming = (uint8_t)(
b[1] & 3U);
111 out->ant_status =
b[2];
112 out->ant_power =
b[3];
113 out->noise =
u16(
b + 12);
114 out->agc =
u16(
b + 14);
121 if (!
p || !out || len < 8U) {
124 memset(out, 0,
sizeof(*out));
126 uint16_t fit = (uint16_t)((len - 8U) / 12U);
127 uint8_t
n = out->listed < fit ? out->listed : (uint8_t)fit;
128 for (uint8_t i = 0; i <
n; ++i) {
129 const uint8_t* sv =
p + 8 + 12U * i;
131 uint32_t flags =
u32(sv + 8);
136 if ((flags & 7U) >= 4U) {
139 if (flags & (1UL << 3)) {
142 if (cno > out->best_cno) {
*brief create JSON pointer *sa reference_tokens const string_t const string_t & b
*brief create JSON pointer *sa reference_tokens const string_t & a
size_type count(const key_type &key) const
*brief user defined string literal for JSON values *sa std::size_t n
bool ubx_parse_mon_rf(const uint8_t *p, uint16_t len, ubx_rf_t *out)
static uint32_t u32(const uint8_t *p)
size_t ubx_valset(uint8_t *out, size_t cap, const ubx_item_t *items, size_t count)
bool ubx_parse_nav_pvt(const uint8_t *p, uint16_t len, ubx_pvt_t *out)
size_t ubx_frame(uint8_t *out, size_t cap, uint8_t cls, uint8_t id, const uint8_t *payload, uint16_t len)
size_t ubx_poll(uint8_t *out, size_t cap, uint8_t cls, uint8_t id)
static int32_t i32(const uint8_t *p)
static uint16_t u16(const uint8_t *p)
bool ubx_sat_summary(const uint8_t *p, uint16_t len, ubx_sats_t *out)
#define UBX_ID_CFG_VALSET