STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
test_gnss_core.c
Go to the documentation of this file.
1/* gnss_core against a simulated MAX-M10S, 1 ms virtual-time steps. */
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5
6#include "fake_gnss.h"
7#include "gnss_core.h"
8
9#define CHECK(c) \
10 do { \
11 if (!(c)) { \
12 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, #c); \
13 exit(1); \
14 } \
15 } while (0)
16
17static void truth(uint32_t t, ubx_pvt_t* v) {
18 v->itow_ms = 100000U + t / 1000U;
19 v->fix_type = 3;
20 v->flags = 1;
21 v->num_sv = 9;
22 v->lat_e7 = 378719000 + (int32_t)(t / 1000U);
23 v->lon_e7 = -1222585000;
24 v->hmsl_mm = 120000 + (int32_t)(t / 100U);
25 v->vel_d_mms = -(int32_t)(t / 10000U);
26 v->hacc_mm = 1500;
27 v->vacc_mm = 2200;
28 v->pdop_e2 = 120;
29}
30
31typedef struct {
32 unsigned n;
34 unsigned bad;
35} sink_t;
36
37static void record(void* ctx, uint8_t type, const void* data, uint8_t len) {
38 sink_t* s = ctx;
39 if (type != REC_GNSS || len != sizeof(rec_gnss_t)) {
40 s->bad++;
41 return;
42 }
43 memcpy(&s->last, data, len);
44 s->n++;
45}
46
53
54static void rig(rig_t* r, uint32_t module_baud) {
55 memset(r, 0, sizeof(*r));
56 fake_gnss_init(&r->module, module_baud, truth);
57 r->core.io = fake_gnss_io(&r->module);
58 r->core.sink.record = record;
59 r->core.sink.ctx = &r->sink;
60 gnss_core_init(&r->core, 0);
61}
62
63static void run(rig_t* r, uint32_t until) {
64 uint8_t buf[512];
65 for (; r->now < until; r->now += 1000U) {
66 size_t n = fake_gnss_emit(&r->module, r->now, buf, sizeof(buf));
67 gnss_core_feed(&r->core, buf, n, r->now);
68 gnss_core_poll(&r->core, r->now);
69 }
70}
71
73 static rig_t r;
74 rig(&r, 9600); /* data sheet p.13 default */
75 run(&r, 10000000U);
76 CHECK(r.core.state == GNSS_RUN);
77 CHECK(r.core.detected_baud == 9600);
78 CHECK(r.core.baud == 115200 && r.module.module_baud == 115200);
79 CHECK(r.module.baud_changes == 1 && r.module.acks == 1);
80 CHECK(!r.module.nmea_on && r.module.pvt_on);
81 CHECK(r.module.rate_ms == 100 && r.module.dynmodel == 8);
82 CHECK(r.sink.n >= 95 && r.sink.n <= 100); /* ~10 Hz once configured */
83 CHECK(r.sink.bad == 0);
84 ubx_pvt_t want;
85 truth(r.sink.last.t_us, &want);
86 CHECK(r.sink.last.fix_type == 3 && r.sink.last.num_sv == 9);
87 CHECK(r.sink.last.lat_e7 == want.lat_e7);
88 CHECK(r.sink.last.lon_e7 == want.lon_e7);
89 CHECK(r.sink.last.hmsl_mm == want.hmsl_mm);
90 CHECK(r.sink.last.vel_d_mms == want.vel_d_mms);
91}
92
94 static rig_t r;
95 rig(&r, 115200);
96 run(&r, 8000000U); /* 9600 and 38400 windows are silent first */
97 CHECK(r.core.state == GNSS_RUN);
98 CHECK(r.core.detected_baud == 115200);
99 CHECK(r.module.baud_changes == 0);
100 CHECK(r.sink.n > 30);
101}
102
104 static rig_t r;
105 rig(&r, 9600);
106 r.module.nak_next = true;
107 run(&r, 15000000U);
108 CHECK(r.core.naks == 1);
109 CHECK(r.core.state == GNSS_RUN && r.core.configs == 1);
110}
111
113 static rig_t r;
114 rig(&r, 9600);
115 run(&r, 5000000U);
116 CHECK(r.core.state == GNSS_RUN);
117 unsigned before = r.sink.n;
118 r.module.mute = true;
119 run(&r, 8000000U);
120 CHECK(r.core.state != GNSS_RUN && r.core.resets == 1);
121 fake_gnss_power_cycle(&r.module, r.now); /* back to 9600, NMEA */
122 run(&r, 20000000U);
123 CHECK(r.core.state == GNSS_RUN && r.core.configs == 2);
124 CHECK(r.sink.n > before + 50);
125}
126
127static void test_pps_is_stamped(void) {
128 static rig_t r;
129 rig(&r, 9600);
130 run(&r, 6000000U);
131 gnss_core_set_pps(&r.core, 5999123U);
132 run(&r, 6500000U);
133 CHECK(r.sink.last.pps_us == 5999123U);
134}
135
void fake_gnss_power_cycle(fake_gnss_t *f, uint32_t now_us)
Definition fake_gnss.c:128
size_t fake_gnss_emit(fake_gnss_t *f, uint32_t now_us, uint8_t *out, size_t cap)
Definition fake_gnss.c:177
gnss_io_t fake_gnss_io(fake_gnss_t *f)
Definition fake_gnss.c:136
void fake_gnss_init(fake_gnss_t *f, uint32_t baud, fake_gnss_truth_t truth)
Definition fake_gnss.c:118
void gnss_core_feed(gnss_core_t *c, const uint8_t *bytes, size_t n, uint32_t now_us)
Definition gnss_core.c:139
void gnss_core_set_pps(gnss_core_t *c, uint32_t edge_us)
Definition gnss_core.c:60
void gnss_core_init(gnss_core_t *c, uint32_t now_us)
Definition gnss_core.c:53
void gnss_core_poll(gnss_core_t *c, uint32_t now_us)
Definition gnss_core.c:149
@ GNSS_RUN
Definition gnss_core.h:48
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:24474
Definition run.py:1
rec_gnss_t
Definition records.h:63
@ REC_GNSS
Definition records.h:23
static uint32_t until(uint32_t now, uint32_t t)
sink_t sink
uint32_t now
gnss_core_t core
fake_gnss_t module
unsigned n
unsigned bad
rec_gnss_t last
int32_t lon_e7
Definition ubx.h:71
uint16_t pdop_e2
Definition ubx.h:76
int32_t lat_e7
Definition ubx.h:71
uint8_t fix_type
Definition ubx.h:68
int32_t vel_d_mms
Definition ubx.h:74
uint32_t hacc_mm
Definition ubx.h:73
int32_t hmsl_mm
Definition ubx.h:72
uint8_t num_sv
Definition ubx.h:70
uint32_t itow_ms
Definition ubx.h:65
uint8_t flags
Definition ubx.h:69
uint32_t vacc_mm
Definition ubx.h:73
int main()
static boot_report_t r
static void rig(rig_t *r, uint32_t module_baud)
static void truth(uint32_t t, ubx_pvt_t *v)
static void test_warm_module_at_115200_needs_no_baud_change(void)
static void test_pps_is_stamped(void)
#define CHECK(c)
static void test_nak_restarts_and_recovers(void)
static void test_silence_then_power_cycle_reconfigures(void)
static void record(void *ctx, uint8_t type, const void *data, uint8_t len)
static void test_cold_start_at_9600_reaches_10hz(void)