9#include "AustralisConfig.h"
12#include "event_groups.h"
22static void State_exec(
UART_t *uart,
char *flags);
23static void State_help(
UART_t *uart);
25DEFINE_PROGRAM_HANDLE(
"state", State_exec, State_help)
27extern EventGroupHandle_t xTaskEnableGroup;
29static void State_help(
UART_t *uart) {
30 uart->println(uart,
"NAME:");
31 uart->println(uart,
"\tstate\n");
32 uart->println(uart,
"USAGE:");
33 uart->println(uart,
"\tstate print <state_variable> [--repeat]");
34 uart->println(uart,
"\tstate reset\n");
35 uart->println(uart,
"DESCRIPTION:");
36 uart->println(uart,
"\tprint");
37 uart->println(uart,
"\t Print the value of a state variable to the shell output.\n");
38 uart->println(uart,
"\treset");
39 uart->println(uart,
"\t Reset the global state to default and clear event groups.\n");
40 uart->println(uart,
"OPTIONS:");
41 uart->println(uart,
"\t-r, --repeat");
42 uart->println(uart,
"\t Continue to print variable until interrupted. Can only be used with `print`");
43 uart->println(uart,
"\t-h, --help");
44 uart->println(uart,
"\t Print this help and exit");
54static void State_exec(
UART_t *uart,
char *flags) {
57 int argResetIdx = parser.addArg(
58 &parser,
"reset", 0, ARG_TYPE_BOOL,
false
60 int argPrintIdx = parser.addArg(
61 &parser,
"print", 0, ARG_TYPE_STRING,
false
63 int argRepeatIdx = parser.addArg(
64 &parser,
"--repeat",
'r', ARG_TYPE_BOOL,
false
66 int argVerboseIdx = parser.addArg(
67 &parser,
"--verbose",
'v', ARG_TYPE_BOOL,
false
71 int mutexResetPrintIdx = parser.addMutexGroup(
77 int mutexResetRepeatIdx = parser.addMutexGroup(
85 char *tokens[MAX_ARGS];
89 char *token = strtok(flags,
" ");
90 while (token != NULL && numTokens < MAX_ARGS) {
91 tokens[numTokens++] = token;
92 token = strtok(NULL,
" ");
96 parser.parseArgs(&parser, numTokens, tokens);
99 if (parser.error.status == PARSER_STATUS_ERROR) {
100 uart->println(uart, parser.error.msg);
105 if (parser.args[argResetIdx].provided) {
106 xEventGroupClearBits(xTaskEnableGroup, 0xFF);
107 uart->println(uart,
"Reset state parameters.");
112 if (parser.args[argPrintIdx].provided) {
113 char *value = parser.args[argPrintIdx].value;
116 char *terminal = (parser.args[argRepeatIdx].provided) ?
"\r" :
"\r\n";
121 if (!strcmp(value,
"flightState")) {
122 switch (state->flightState) {
124 snprintf(str,
sizeof(str),
"State: PRELAUNCH%s", terminal);
127 snprintf(str,
sizeof(str),
"State: LAUNCH%s", terminal);
130 snprintf(str,
sizeof(str),
"State: COAST%s", terminal);
133 snprintf(str,
sizeof(str),
"State: APOGEE%s", terminal);
136 snprintf(str,
sizeof(str),
"State: DESCENT%s", terminal);
142 else if (!strcmp(value,
"altitude")) {
144 str,
sizeof(str),
"Altitude: %fm%s",
151 else if (!strcmp(value,
"velocity")) {
153 str,
sizeof(str),
"Velocity: %fm/(s^2)%s",
160 else if (!strcmp(value,
"tilt")) {
162 str,
sizeof(str),
"Tilt: %f degrees%s",
169 else if (!strcmp(value,
"flightTimeMs")) {
171 str,
sizeof(str),
"Flight time: %ums / %fs%s",
173 state->flightTimeMs / 1000.0f,
180 snprintf(str,
sizeof(str),
"Error: `%s` is not a state variable\n", value);
184 if (parser.args[argVerboseIdx].provided) {
188 timestamp,
sizeof(timestamp),
"[t=%fs] ",
189 state->flightTimeMs / 1000.0f
191 uart->print(uart, timestamp);
195 uart->print(uart, str);
198 if (parser.args[argRepeatIdx].provided)
@ APOGEE
At least 2: velocity negative, pressure increasing, tilt > 90 degrees.
@ PRELAUNCH
Initial boot condition.
@ LAUNCH
Body reference Z-axis acceleration above threshold.
@ COAST
Global reference Z-axis velocity decreasing.
@ DESCENT
Altitude below main threshold.
Struct definition for UART interface.