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. */
22
static
void
test_conversion
(
void
) {
23
CHECK
(
battery_counts_to_mv
(0) == 0);
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
32
static
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. */
50
static
self_test_status_t
all_pass
(
void
) {
51
static
const
struct
{
52
uint16_t id;
53
bool
required;
54
} inv[8] = {
55
{
SELF_TEST_DEVICE_IMU
,
true
}, {
SELF_TEST_DEVICE_HIGH_G
,
true
},
56
{
SELF_TEST_DEVICE_BAROMETER
,
true
}, {
SELF_TEST_DEVICE_RADIO
,
true
},
57
{
SELF_TEST_DEVICE_EMMC
,
true
}, {
SELF_TEST_DEVICE_GNSS
,
false
},
58
{
SELF_TEST_DEVICE_ETHERNET
,
false
}, {
SELF_TEST_DEVICE_NAND
,
false
},
59
};
60
self_test_status_t
s;
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;
68
s.
devices
[i].
reply
.
result
=
SELF_TEST_PASS
;
69
}
70
return
s;
71
}
72
73
static
boot_report_t
r
;
74
75
static
void
test_all_pass_on_battery_is_ready
(
void
) {
76
self_test_status_t
s =
all_pass
();
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
87
static
void
test_optional_chip_or_low_battery_is_warn
(
void
) {
88
self_test_status_t
s =
all_pass
();
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
103
static
void
test_required_chip_or_bad_battery_is_fail
(
void
) {
104
self_test_status_t
s =
all_pass
();
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
122
static
void
test_gps_reports_its_baud
(
void
) {
123
self_test_status_t
s =
all_pass
();
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
130
static
void
test_usb_is_not_judged
(
void
) {
131
self_test_status_t
s =
all_pass
();
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
137
int
main
(
void
) {
138
test_conversion
();
139
test_thresholds
();
140
test_all_pass_on_battery_is_ready
();
141
test_optional_chip_or_low_battery_is_warn
();
142
test_required_chip_or_bad_battery_is_fail
();
143
test_gps_reports_its_baud
();
144
test_usb_is_not_judged
();
145
puts(
"boot_report: all tests passed"
);
146
return
0;
147
}
battery_counts_to_mv
uint16_t battery_counts_to_mv(uint32_t counts)
Definition
battery.c:3
battery_assess
battery_t battery_assess(bool valid, uint32_t counts, bool on_usb)
Definition
battery.c:12
battery.h
BATTERY_USB
@ BATTERY_USB
Definition
battery.h:43
BATTERY_WARN
@ BATTERY_WARN
Definition
battery.h:41
BATTERY_OK
@ BATTERY_OK
Definition
battery.h:40
BATTERY_INVALID
@ BATTERY_INVALID
Definition
battery.h:44
BATTERY_FAIL
@ BATTERY_FAIL
Definition
battery.h:42
boot_report_build
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_report.h
BOOT_WARN
@ BOOT_WARN
Definition
boot_report.h:30
BOOT_READY
@ BOOT_READY
Definition
boot_report.h:30
BOOT_FAIL
@ BOOT_FAIL
Definition
boot_report.h:30
state
static ActuatorControllerState state
Definition
main.cpp:57
NULL
#define NULL
Definition
usbd_def.h:44
self_test_devices.h
SELF_TEST_DEVICE_ETHERNET
@ SELF_TEST_DEVICE_ETHERNET
Definition
self_test_devices.h:14
SELF_TEST_DEVICE_IMU
@ SELF_TEST_DEVICE_IMU
Definition
self_test_devices.h:11
SELF_TEST_DEVICE_GNSS
@ SELF_TEST_DEVICE_GNSS
Definition
self_test_devices.h:16
SELF_TEST_DEVICE_HIGH_G
@ SELF_TEST_DEVICE_HIGH_G
Definition
self_test_devices.h:12
SELF_TEST_DEVICE_NAND
@ SELF_TEST_DEVICE_NAND
Definition
self_test_devices.h:17
SELF_TEST_DEVICE_RADIO
@ SELF_TEST_DEVICE_RADIO
Definition
self_test_devices.h:15
SELF_TEST_DEVICE_BAROMETER
@ SELF_TEST_DEVICE_BAROMETER
Definition
self_test_devices.h:13
SELF_TEST_DEVICE_EMMC
@ SELF_TEST_DEVICE_EMMC
Definition
self_test_devices.h:18
SELF_TEST_FAIL
@ SELF_TEST_FAIL
Definition
self_test_port.h:16
SELF_TEST_PASS
@ SELF_TEST_PASS
Definition
self_test_port.h:15
SELF_TEST_TIMEOUT
@ SELF_TEST_TIMEOUT
Definition
self_test_port.h:17
battery_t
Definition
battery.h:47
battery_t::state
battery_state_t state
Definition
battery.h:48
battery_t::mv
uint16_t mv
Definition
battery.h:49
boot_report_t
Definition
boot_report.h:34
self_test_device_status_t::device_id
uint16_t device_id
Definition
self_test_port.h:33
self_test_device_status_t::reply
self_test_reply_t reply
Definition
self_test_port.h:37
self_test_device_status_t::required
bool required
Definition
self_test_port.h:34
self_test_device_status_t::complete
bool complete
Definition
self_test_port.h:35
self_test_device_status_t::attempts
uint8_t attempts
Definition
self_test_port.h:36
self_test_reply_t::result
self_test_result_t result
Definition
self_test_port.h:23
self_test_reply_t::diagnostic
int32_t diagnostic
Definition
self_test_port.h:24
self_test_status_t
Definition
self_test_port.h:47
self_test_status_t::device_count
uint8_t device_count
Definition
self_test_port.h:49
self_test_status_t::devices
self_test_device_status_t devices[SELF_TEST_MAX_DEVICES]
Definition
self_test_port.h:50
main
int main()
Definition
test_abort_ordering.cpp:67
test_conversion
static void test_conversion(void)
Definition
test_boot_report.c:22
test_thresholds
static void test_thresholds(void)
Definition
test_boot_report.c:32
test_optional_chip_or_low_battery_is_warn
static void test_optional_chip_or_low_battery_is_warn(void)
Definition
test_boot_report.c:87
test_required_chip_or_bad_battery_is_fail
static void test_required_chip_or_bad_battery_is_fail(void)
Definition
test_boot_report.c:103
test_gps_reports_its_baud
static void test_gps_reports_its_baud(void)
Definition
test_boot_report.c:122
CHECK
#define CHECK(c)
Definition
test_boot_report.c:10
test_usb_is_not_judged
static void test_usb_is_not_judged(void)
Definition
test_boot_report.c:130
r
static boot_report_t r
Definition
test_boot_report.c:73
all_pass
static self_test_status_t all_pass(void)
Definition
test_boot_report.c:50
test_all_pass_on_battery_is_ready
static void test_all_pass_on_battery_is_ready(void)
Definition
test_boot_report.c:75
firmware
Flight_Computer
tests
app
test_boot_report.c
Generated by
1.15.0