STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
ubx.c
Go to the documentation of this file.
1#include "ubx.h"
2
3#include <string.h>
4
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)) {
9 return 0;
10 }
11 out[0] = 0xB5;
12 out[1] = 0x62;
13 out[2] = cls;
14 out[3] = id;
15 out[4] = (uint8_t)len;
16 out[5] = (uint8_t)(len >> 8);
17 if (len) {
18 memcpy(&out[6], payload, len);
19 }
20 uint8_t a = 0, b = 0;
21 for (size_t i = 2; i < 6U + len; ++i) {
22 a = (uint8_t)(a + out[i]);
23 b = (uint8_t)(b + a);
24 }
25 out[6 + len] = a;
26 out[7 + len] = b;
27 return total;
28}
29
30size_t ubx_valset(uint8_t* out, size_t cap, const ubx_item_t* items,
31 size_t count) {
32 uint8_t payload[4 + 8 * 16];
33 if (!items || count == 0 || count > 16) {
34 return 0;
35 }
36 size_t n = 0;
37 payload[n++] = 0x00; /* version */
38 payload[n++] = 0x01; /* layers: RAM */
39 payload[n++] = 0x00; /* reserved */
40 payload[n++] = 0x00;
41 for (size_t i = 0; i < count; ++i) {
42 uint8_t size = items[i].size;
43 if (size != 1 && size != 2 && size != 4) {
44 return 0;
45 }
46 for (int k = 0; k < 4; ++k) {
47 payload[n++] = (uint8_t)(items[i].key >> (8 * k));
48 }
49 for (int k = 0; k < size; ++k) {
50 payload[n++] = (uint8_t)(items[i].value >> (8 * k));
51 }
52 }
54 (uint16_t)n);
55}
56
57static uint32_t u32(const uint8_t* p) {
58 return (uint32_t)p[0] | (uint32_t)p[1] << 8 | (uint32_t)p[2] << 16 |
59 (uint32_t)p[3] << 24;
60}
61
62static int32_t i32(const uint8_t* p) {
63 return (int32_t)u32(p);
64}
65
66bool ubx_parse_nav_pvt(const uint8_t* p, uint16_t len, ubx_pvt_t* out) {
67 if (!p || !out || len != UBX_NAV_PVT_LEN) {
68 return false;
69 }
70 /* Offsets: Interface Description 3.15.11, p.95-96 */
71 out->itow_ms = u32(p + 0);
72 out->year = (uint16_t)(p[4] | p[5] << 8);
73 out->month = p[6];
74 out->day = p[7];
75 out->hour = p[8];
76 out->min = p[9];
77 out->sec = p[10];
78 out->valid = p[11];
79 out->fix_type = p[20];
80 out->flags = p[21];
81 out->num_sv = p[23];
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);
93 return true;
94}
95
96size_t ubx_poll(uint8_t* out, size_t cap, uint8_t cls, uint8_t id) {
97 return ubx_frame(out, cap, cls, id, NULL, 0);
98}
99
100static uint16_t u16(const uint8_t* p) {
101 return (uint16_t)(p[0] | p[1] << 8);
102}
103
104bool ubx_parse_mon_rf(const uint8_t* p, uint16_t len, ubx_rf_t* out) {
105 /* 4-byte header, then nBlocks blocks of 24 (3.14.6, p.86) */
106 if (!p || !out || len < 4U + 24U || p[1] < 1U) {
107 return false;
108 }
109 const uint8_t* b = p + 4;
110 out->jamming = (uint8_t)(b[1] & 3U); /* flags bits 1..0 */
111 out->ant_status = b[2];
112 out->ant_power = b[3];
113 out->noise = u16(b + 12);
114 out->agc = u16(b + 14);
115 out->cw = b[16];
116 return true;
117}
118
119bool ubx_sat_summary(const uint8_t* p, uint16_t len, ubx_sats_t* out) {
120 /* 8-byte header, then numSvs blocks of 12 (3.15.13, p.98) */
121 if (!p || !out || len < 8U) {
122 return false;
123 }
124 memset(out, 0, sizeof(*out));
125 out->listed = p[5];
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;
130 uint8_t cno = sv[2];
131 uint32_t flags = u32(sv + 8);
132 out->seen++;
133 if (cno > 0U) {
134 out->with_signal++;
135 }
136 if ((flags & 7U) >= 4U) { /* qualityInd */
137 out->locked++;
138 }
139 if (flags & (1UL << 3)) { /* svUsed */
140 out->used++;
141 }
142 if (cno > out->best_cno) {
143 out->best_cno = cno;
144 }
145 }
146 return true;
147}
int32_t p
Definition flight_e2e.c:78
#define NULL
Definition usbd_def.h:44
*brief create JSON pointer *sa reference_tokens const string_t const string_t & b
Definition json.hpp:13878
*brief create JSON pointer *sa reference_tokens const string_t & a
Definition json.hpp:13877
size_type count(const key_type &key) const
Definition json.hpp:19264
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:24474
uint8_t size
Definition ubx.h:52
Definition ubx.h:96
bool ubx_parse_mon_rf(const uint8_t *p, uint16_t len, ubx_rf_t *out)
Definition ubx.c:104
static uint32_t u32(const uint8_t *p)
Definition ubx.c:57
size_t ubx_valset(uint8_t *out, size_t cap, const ubx_item_t *items, size_t count)
Definition ubx.c:30
bool ubx_parse_nav_pvt(const uint8_t *p, uint16_t len, ubx_pvt_t *out)
Definition ubx.c:66
size_t ubx_frame(uint8_t *out, size_t cap, uint8_t cls, uint8_t id, const uint8_t *payload, uint16_t len)
Definition ubx.c:5
size_t ubx_poll(uint8_t *out, size_t cap, uint8_t cls, uint8_t id)
Definition ubx.c:96
static int32_t i32(const uint8_t *p)
Definition ubx.c:62
static uint16_t u16(const uint8_t *p)
Definition ubx.c:100
bool ubx_sat_summary(const uint8_t *p, uint16_t len, ubx_sats_t *out)
Definition ubx.c:119
#define UBX_CLASS_CFG
Definition ubx.h:33
#define UBX_ID_CFG_VALSET
Definition ubx.h:40
#define UBX_NAV_PVT_LEN
Definition ubx.h:41