STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
boot_report.c
Go to the documentation of this file.
1#include "boot_report.h"
2
3#include <stdarg.h>
4#include <stdio.h>
5#include <string.h>
6
7#include "self_test_devices.h"
8
9static const char* device_name(uint16_t id) {
10 switch (id) {
12 return "IMU ISM330DHCX";
14 return "high-g H3LIS100DL";
16 return "baro MS5611";
18 return "ethernet W5500";
20 return "radio SX1262";
22 return "GPS MAX-M10S";
24 return "SD NAND";
26 return "eMMC";
27 default:
28 return "device ?";
29 }
30}
31
32static const char* result_name(self_test_result_t r) {
33 switch (r) {
34 case SELF_TEST_PASS:
35 return "PASS";
36 case SELF_TEST_FAIL:
37 return "FAIL";
39 return "TIMEOUT";
41 return "NOT CONFIGURED";
43 return "NOT IMPLEMENTED";
44 default:
45 return "PENDING";
46 }
47}
48
50 switch (v) {
51 case BOOT_READY:
52 return "READY";
53 case BOOT_WARN:
54 return "WARN";
55 default:
56 return "FAIL";
57 }
58}
59
60typedef struct {
61 char* buf;
62 size_t cap, len;
63} text_t;
64
65static void put(text_t* t, const char* fmt, ...) {
66 if (t->len + 1 >= t->cap) {
67 return;
68 }
69 va_list ap;
70 va_start(ap, fmt);
71 int n = vsnprintf(t->buf + t->len, t->cap - t->len, fmt, ap);
72 va_end(ap);
73 if (n > 0) {
74 t->len += (size_t)n;
75 if (t->len >= t->cap) {
76 t->len = t->cap - 1; /* truncated */
77 }
78 }
79}
80
82 battery_t battery, uint32_t now_ms) {
83 memset(r, 0, sizeof(*r));
84 r->battery = battery;
85 text_t t = {r->text, sizeof(r->text), 0};
86 put(&t, "STAR flight computer self-test, t = %lu.%lu s\n",
87 (unsigned long)(now_ms / 1000U),
88 (unsigned long)(now_ms % 1000U / 100U));
89
90 if (!s) {
91 r->required_failed = 1;
92 put(&t, " self-test did not run (bad config)\n");
93 } else {
94 for (uint8_t i = 0; i < s->device_count && i < SELF_TEST_MAX_DEVICES;
95 ++i) {
96 const self_test_device_status_t* d = &s->devices[i];
97 bool pass = d->reply.result == SELF_TEST_PASS;
98 if (pass && d->device_id < 16U) {
99 r->result_bits =
100 (uint16_t)(r->result_bits | (1U << d->device_id));
101 } else if (!pass && d->required) {
102 r->required_failed++;
103 } else if (!pass) {
104 r->optional_failed++;
105 }
106 put(&t, " %-18s %-15s", device_name(d->device_id),
108 if (d->device_id == SELF_TEST_DEVICE_GNSS && pass) {
109 /* board_bringup.h: a GNSS PASS carries the baud it heard */
110 put(&t, " %ld baud", (long)d->reply.diagnostic);
111 } else if (d->reply.diagnostic != 0) {
112 put(&t, " diag 0x%lx",
113 (unsigned long)(uint32_t)d->reply.diagnostic);
114 }
115 if (d->attempts > 1U) {
116 put(&t, " (%u tries)", (unsigned)d->attempts);
117 }
118 put(&t, "%s", d->required ? "" : " [optional]");
119 while (t.len > 0 && t.buf[t.len - 1] == ' ') {
120 t.buf[--t.len] = '\0'; /* no trailing padding */
121 }
122 put(&t, "\n");
123 }
124 }
125
126 if (battery.state == BATTERY_INVALID || battery.state == BATTERY_UNKNOWN) {
127 put(&t, " %-18s %s\n", "battery", battery_state_name(battery.state));
128 } else {
129 put(&t, " %-18s %u.%02u V %s\n", "battery", battery.mv / 1000U,
130 (battery.mv % 1000U) / 10U, battery_state_name(battery.state));
131 }
132
133 bool battery_bad = battery.state == BATTERY_FAIL ||
134 battery.state == BATTERY_INVALID ||
135 battery.state == BATTERY_UNKNOWN;
136 if (r->required_failed || battery_bad) {
137 r->verdict = BOOT_FAIL;
138 } else if (r->optional_failed || battery.state == BATTERY_WARN) {
139 r->verdict = BOOT_WARN;
140 } else {
141 r->verdict = BOOT_READY;
142 }
143 put(&t, " %-18s %s (%u required, %u optional failed)\n", "verdict",
144 boot_verdict_name(r->verdict), (unsigned)r->required_failed,
145 (unsigned)r->optional_failed);
146}
const char * battery_state_name(battery_state_t state)
Definition battery.c:31
@ BATTERY_WARN
Definition battery.h:41
@ BATTERY_INVALID
Definition battery.h:44
@ BATTERY_UNKNOWN
Definition battery.h:39
@ BATTERY_FAIL
Definition battery.h:42
static const char * result_name(self_test_result_t r)
Definition boot_report.c:32
const char * boot_verdict_name(boot_verdict_t v)
Definition boot_report.c:49
static const char * device_name(uint16_t id)
Definition boot_report.c:9
static void put(text_t *t, const char *fmt,...)
Definition boot_report.c:65
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_verdict_t
Definition boot_report.h:30
@ BOOT_WARN
Definition boot_report.h:30
@ BOOT_READY
Definition boot_report.h:30
@ BOOT_FAIL
Definition boot_report.h:30
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:24474
@ 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
#define SELF_TEST_MAX_DEVICES
self_test_result_t
@ SELF_TEST_FAIL
@ SELF_TEST_NOT_CONFIGURED
@ SELF_TEST_NOT_IMPLEMENTED
@ SELF_TEST_PASS
@ SELF_TEST_TIMEOUT
self_test_reply_t reply
self_test_result_t result
self_test_device_status_t devices[SELF_TEST_MAX_DEVICES]
size_t len
Definition boot_report.c:62
char * buf
Definition boot_report.c:61
size_t cap
Definition boot_report.c:62
static boot_report_t r
static self_test_battery_t battery(void *context, uint32_t now_ms, uint32_t budget_ms)