16 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, #c); \
30static void record(
void* ctx, uint8_t type,
const void* data, uint8_t len) {
37 memcpy(&t, data,
sizeof(t));
38 if (s->
n[i] && (int32_t)(t - s->
last_t[i]) <= 0) {
44 memcpy(&s->
imu, data, len);
46 memcpy(&s->
highg, data, len);
48 memcpy(&s->
baro, data, len);
61 memset(
r, 0,
sizeof(*
r));
63 r->imu.regs[0x0F] = 0x6B;
64 r->imu.self_clear_reg = 0x12;
65 r->imu.self_clear_bits = 0x01;
66 r->imu.clear_after_reads = 1;
67 r->imu.self_clear_rearm = 1;
68 static const uint8_t imu_out[14] = {0x00, 0x02, 1, 0, 2, 0, 3,
69 0, 0x00, 0xF8, 0, 0, 0, 0x08};
70 memcpy(&
r->imu.regs[0x20], imu_out,
sizeof(imu_out));
72 r->highg.regs[0x0F] = 0x32;
73 r->highg.regs[0x29] = (uint8_t)-13;
74 r->highg.regs[0x2B] = 0;
75 r->highg.regs[0x2D] = 64;
83 r->core.sink.ctx = &
r->sink;
85 r->imu_edges =
r->highg_edges = 1;
91#define kWakeLatencyUs 37U
93static int32_t
diff(uint32_t
a, uint32_t
b) {
94 return (int32_t)(
a -
b);
104 if (wake ==
r->now) {
107 if (
r->imu_edges &&
diff(
r->next_imu, wake) < 0)
109 if (
r->highg_edges &&
diff(
r->next_highg, wake) < 0)
110 wake =
r->next_highg;
114 if (
r->imu_edges &&
diff(
r->next_imu, wake) <= 0) {
116 r->edge_imu =
r->next_imu;
119 if (
r->highg_edges &&
diff(
r->next_highg, wake) <= 0) {
121 r->edge_highg =
r->next_highg;
125 if (
diff(now,
r->now) > 0)
134 CHECK(
r.core.imu.ok &&
r.core.highg.ok &&
r.core.baro.ok);
135 run(&
r, 1000 + 1000000);
136 CHECK(
r.sink.n[0] >= 832 &&
r.sink.n[0] <= 834);
137 CHECK(
r.sink.n[1] == 400);
138 CHECK(
r.sink.n[2] >= 49 &&
r.sink.n[2] <= 50);
139 CHECK(
r.core.imu.missed_drdy == 0 &&
r.core.highg.missed_drdy == 0);
140 CHECK(
r.sink.non_monotonic == 0);
142 CHECK(
r.sink.imu.temp == 0x0200);
143 CHECK(
r.sink.imu.gyro[0] == 1 &&
r.sink.imu.gyro[2] == 3);
144 CHECK(
r.sink.imu.accel[0] == -2048 &&
r.sink.imu.accel[2] == 2048);
145 CHECK(
r.sink.highg.accel[0] == -13 &&
r.sink.highg.accel[2] == 64);
146 CHECK(
r.sink.baro.temp_c100 == 2007 &&
r.sink.baro.pressure_pa == 100009);
148 CHECK(
r.sink.imu.t_us ==
r.edge_imu);
149 CHECK(
r.sink.highg.t_us ==
r.edge_highg);
159 CHECK(
r.sink.n[1] >= 199 &&
r.sink.n[1] <= 200);
160 CHECK(
r.core.highg.missed_drdy ==
r.sink.n[1]);
161 CHECK(
r.sink.n[0] >= 832);
168 unsigned before =
r.sink.n[0];
169 r.imu.fail_after = (int)
r.imu.transfers;
171 CHECK(
r.sink.n[0] == before);
175 CHECK(
r.sink.n[1] > 0 &&
r.core.highg.ok);
176 r.imu.fail_after = -1;
177 r.imu.self_clear_reg = 0x12;
178 r.imu.clear_after_reads = 1;
181 CHECK(
r.core.imu.inits == 2);
182 CHECK(
r.sink.n[0] > before + 80);
187 memset(&
r, 0,
sizeof(
r));
189 r.highg.regs[0x0F] = 0x00;
190 r.core.highg.ok =
false;
191 r.core.highg.retry_at_us = 0;
194 CHECK(
r.core.highg.inits >= 4);
214 CHECK(
r.imu.regs[0x10] == 0x00 &&
r.imu.regs[0x11] == 0x00);
215 CHECK(
r.highg.regs[0x20] == 0x07);
216 CHECK(!
r.core.imu.ok && !
r.core.highg.ok && !
r.core.baro.ok);
217 CHECK(
r.core.baro_phase == 0);
218 unsigned before =
r.sink.n[0];
221 CHECK(
r.imu.regs[0x10] == 0x74 &&
r.highg.regs[0x20] == 0x37);
225 run(&
r, t + 1000000U);
226 CHECK(
r.sink.n[0] - before >= 832 &&
r.sink.n[0] - before <= 834);
241 CHECK(
r.sink.n[0] >= 832 &&
r.sink.n[1] == 400);
243 CHECK(
r.sink.non_monotonic == 0);
255 puts(
"sensors_core: all tests passed");
const uint16_t fake_baro_datasheet_prom[8]
dev_bus_t fake_baro_bus(fake_baro_t *f)
dev_bus_t fake_regs_bus(fake_regs_t *f)
void fake_regs_init(fake_regs_t *f, bool ms_bit)
*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
*brief user defined string literal for JSON values *sa std::size_t n
uint32_t sensors_core_wait_us(const sensors_core_t *c, uint32_t now_us)
void sensors_core_init(sensors_core_t *c, uint32_t now_us)
static uint32_t until(uint32_t now, uint32_t t)
void sensors_core_stop(sensors_core_t *c)
void sensors_core_step(sensors_core_t *c, uint32_t events, uint32_t imu_edge_us, uint32_t highg_edge_us, uint32_t now_us)
#define SENSORS_BARO_STEP_US
#define SENSORS_MAX_ERRORS
#define SENSORS_HIGHG_PERIOD_US
#define SENSORS_IMU_PERIOD_US
static void record(void *ctx, uint8_t type, const void *data, uint8_t len)
static int32_t diff(uint32_t a, uint32_t b)
static void test_dead_baro_bus_is_reported(void)
static void test_clock_wrap_is_harmless(void)
static void test_highg_without_edges_is_read_on_timeout(void)
static void test_nominal_rates_values_and_timestamps(void)
static void test_stop_powers_down_and_init_restarts(void)
static void rig_init(rig_t *r, uint32_t start_us)
static void record(void *ctx, uint8_t type, const void *data, uint8_t len)
static void test_failing_imu_is_dropped_and_recovered(void)
static void test_wrong_chip_never_produces_and_keeps_retrying(void)
static void test_wait_never_overshoots_a_deadline(void)