STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
test_boot_report.c
Go to the documentation of this file.
1/* battery + boot_report: the start-up self-test's verdict and text. */
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5
6#include "battery.h"
7#include "boot_report.h"
8#include "self_test_devices.h"
9
10#define CHECK(c) \
11 do { \
12 if (!(c)) { \
13 fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, #c); \
14 exit(1); \
15 } \
16 } while (0)
17
18/* Counts computed independently in Python from the schematic:
19 * mV = round(counts x 3320 / 0.3125 / 65535). Aaron's PR #162 examples:
20 * 40712 -> 6600, 51818 -> 8400. Physically, a full 8.40 V pack puts
21 * 8.40 x 0.3125 = 2.625 V on PA0 = 2.625 / 3.32 x 65535 = 51816 counts. */
22static void test_conversion(void) {
24 CHECK(battery_counts_to_mv(65535) == 10624);
25 CHECK(battery_counts_to_mv(40712) == 6600);
26 CHECK(battery_counts_to_mv(51818) == 8400);
27 CHECK(battery_counts_to_mv(51816) == 8400);
28 CHECK(battery_counts_to_mv(48853) == 7920);
29 CHECK(battery_counts_to_mv(65536) == 0); /* not a 16-bit reading */
30}
31
32static void test_thresholds(void) {
33 CHECK(battery_assess(true, 51816, false).state == BATTERY_OK);
34 CHECK(battery_assess(true, 43177, false).state == BATTERY_OK); /* 7000 */
35 CHECK(battery_assess(true, 43176, false).state == BATTERY_WARN); /* 6999 */
36 CHECK(battery_assess(true, 40710, false).state == BATTERY_WARN); /* 6600 */
37 CHECK(battery_assess(true, 40709, false).state == BATTERY_FAIL); /* 6599 */
38 CHECK(battery_assess(true, 54286, false).state == BATTERY_OK); /* 8800 */
39 CHECK(battery_assess(true, 54287, false).state == BATTERY_FAIL); /* 8801 */
40 CHECK(battery_assess(true, 0, false).state == BATTERY_FAIL); /* none */
41 /* On USB the reading is USB_5V, never judged as the pack. */
42 battery_t usb = battery_assess(true, 30840, true);
43 CHECK(usb.state == BATTERY_USB && usb.mv == 5000);
44 CHECK(battery_assess(true, 0, true).state == BATTERY_USB);
45 CHECK(battery_assess(false, 51816, false).state == BATTERY_INVALID);
46 CHECK(battery_assess(false, 51816, false).mv == 0);
47}
48
49/* The board's 8 checks, all passing; required as in bringup_task.c. */
51 static const struct {
52 uint16_t id;
53 bool required;
54 } inv[8] = {
59 };
61 memset(&s, 0, sizeof(s));
62 s.device_count = 8;
63 for (int i = 0; i < 8; ++i) {
64 s.devices[i].device_id = inv[i].id;
65 s.devices[i].required = inv[i].required;
66 s.devices[i].complete = true;
67 s.devices[i].attempts = 1;
69 }
70 return s;
71}
72
74
77 boot_report_build(&r, &s, battery_assess(true, 48853, false), 3250);
78 CHECK(r.verdict == BOOT_READY);
79 CHECK(r.result_bits == 0x00FF); /* device ids 0..7 all passed */
80 CHECK(r.required_failed == 0 && r.optional_failed == 0);
81 CHECK(strstr(r.text, "t = 3.2 s"));
82 CHECK(strstr(r.text, "IMU ISM330DHCX PASS\n"));
83 CHECK(strstr(r.text, "battery 7.92 V OK"));
84 CHECK(strstr(r.text, "verdict READY"));
85}
86
89 s.devices[5].reply.result = SELF_TEST_TIMEOUT; /* GPS, optional */
90 s.devices[5].attempts = 3;
91 boot_report_build(&r, &s, battery_assess(true, 48853, false), 1000);
92 CHECK(r.verdict == BOOT_WARN && r.optional_failed == 1);
93 CHECK(r.result_bits == (0x00FF & ~(1U << SELF_TEST_DEVICE_GNSS)));
94 CHECK(strstr(r.text,
95 "GPS MAX-M10S TIMEOUT (3 tries) [optional]"));
96
97 s = all_pass();
98 boot_report_build(&r, &s, battery_assess(true, 42000, false), 1000);
99 CHECK(r.verdict == BOOT_WARN);
100 CHECK(strstr(r.text, "6.80 V LOW, charge before flight"));
101}
102
105 s.devices[2].reply.result = SELF_TEST_FAIL; /* baro, required */
106 s.devices[2].reply.diagnostic = 0x30000; /* PROM CRC */
107 boot_report_build(&r, &s, battery_assess(true, 48853, false), 1000);
108 CHECK(r.verdict == BOOT_FAIL && r.required_failed == 1);
109 CHECK(!strstr(r.text, " \n")); /* no trailing padding */
110 CHECK(strstr(r.text, "baro MS5611 FAIL diag 0x30000"));
111
112 s = all_pass();
113 boot_report_build(&r, &s, battery_assess(true, 40000, false), 1000);
114 CHECK(r.verdict == BOOT_FAIL); /* 6.48 V */
115 boot_report_build(&r, &s, battery_assess(false, 0, false), 1000);
116 CHECK(r.verdict == BOOT_FAIL);
117 CHECK(strstr(r.text, "battery ADC read failed"));
118 boot_report_build(&r, NULL, battery_assess(true, 48853, false), 1000);
119 CHECK(r.verdict == BOOT_FAIL && r.result_bits == 0);
120}
121
122static void test_gps_reports_its_baud(void) {
124 s.devices[5].reply.diagnostic = 9600; /* GNSS PASS: baud that worked */
125 boot_report_build(&r, &s, battery_assess(true, 48853, false), 1000);
126 CHECK(strstr(r.text,
127 "GPS MAX-M10S PASS 9600 baud [optional]\n"));
128}
129
130static void test_usb_is_not_judged(void) {
132 boot_report_build(&r, &s, battery_assess(true, 30840, true), 1000);
133 CHECK(r.verdict == BOOT_READY);
134 CHECK(strstr(r.text, "5.00 V on USB (battery not measured)"));
135}
136
uint16_t battery_counts_to_mv(uint32_t counts)
Definition battery.c:3
battery_t battery_assess(bool valid, uint32_t counts, bool on_usb)
Definition battery.c:12
@ BATTERY_USB
Definition battery.h:43
@ BATTERY_WARN
Definition battery.h:41
@ BATTERY_OK
Definition battery.h:40
@ BATTERY_INVALID
Definition battery.h:44
@ BATTERY_FAIL
Definition battery.h:42
void boot_report_build(boot_report_t *r, const self_test_status_t *s, battery_t battery, uint32_t now_ms)
Definition boot_report.c:81
@ BOOT_WARN
Definition boot_report.h:30
@ BOOT_READY
Definition boot_report.h:30
@ BOOT_FAIL
Definition boot_report.h:30
static ActuatorControllerState state
Definition main.cpp:57
#define NULL
Definition usbd_def.h:44
@ SELF_TEST_DEVICE_ETHERNET
@ SELF_TEST_DEVICE_IMU
@ SELF_TEST_DEVICE_GNSS
@ SELF_TEST_DEVICE_HIGH_G
@ SELF_TEST_DEVICE_NAND
@ SELF_TEST_DEVICE_RADIO
@ SELF_TEST_DEVICE_BAROMETER
@ SELF_TEST_DEVICE_EMMC
@ SELF_TEST_FAIL
@ SELF_TEST_PASS
@ SELF_TEST_TIMEOUT
battery_state_t state
Definition battery.h:48
uint16_t mv
Definition battery.h:49
self_test_reply_t reply
self_test_result_t result
self_test_device_status_t devices[SELF_TEST_MAX_DEVICES]
int main()
static void test_conversion(void)
static void test_thresholds(void)
static void test_optional_chip_or_low_battery_is_warn(void)
static void test_required_chip_or_bad_battery_is_fail(void)
static void test_gps_reports_its_baud(void)
#define CHECK(c)
static void test_usb_is_not_judged(void)
static boot_report_t r
static self_test_status_t all_pass(void)
static void test_all_pass_on_battery_is_ready(void)