Loading...
Searching...
No Matches
debug_accelerometer.c
1/***********************************************************************************
2 * @file debug_accelerometer.c *
3 * @author Matt Ricci *
4 * @addtogroup Shell *
5 * *
6 * @{ *
7 ***********************************************************************************/
8
9#include "string.h"
10#include "stdio.h"
11
12#include "shell.h"
13#include "parser.h"
14#include "state.h"
15#include "devicelist.h"
16#include "accelerometer.h"
17
18static void Accel_exec(UART_t *uart, char *);
19
20DEFINE_PROGRAM_HANDLE("accel", Accel_exec, NULL)
21
22/* =============================================================================== */
29static void Accel_exec(UART_t *uart, char *flags) {
30
31 ArgParser parser = ArgParser_init();
32 int argPrintIdx = parser.addArg(
33 &parser, "print", 0, ARG_TYPE_BOOL, false
34 );
35 int argRepeatIdx = parser.addArg(
36 &parser, "--repeat", 'r', ARG_TYPE_BOOL, false
37 );
38 int argVerboseIdx = parser.addArg(
39 &parser, "--verbose", 'v', ARG_TYPE_BOOL, false
40 );
41
42 char *tokens[MAX_ARGS];
43 int numTokens = 0;
44
45 // Tokenize the input string
46 char *token = strtok(flags, " ");
47 while (token != NULL && numTokens < MAX_ARGS) {
48 tokens[numTokens++] = token;
49 token = strtok(NULL, " ");
50 }
51
52 // Parse input tokens
53 parser.parseArgs(&parser, numTokens, tokens);
54
55 // Early exit with error message
56 if (parser.error.status == PARSER_STATUS_ERROR) {
57 uart->println(uart, parser.error.msg);
58 return;
59 }
60
61 // Print requested state variable value
62 if (parser.args[argPrintIdx].provided) {
63 Accel_t *accel = DeviceList_getDeviceHandle(DEVICE_ACCEL).device;
64 State *state = State_getState();
65
66 char *terminal = (parser.args[argRepeatIdx].provided) ? "\r\n" : "\r\n";
67 char str[80];
68
69 REPEAT:
70 taskENTER_CRITICAL();
71 accel->update(accel);
72 taskEXIT_CRITICAL();
73
74 if (parser.args[argVerboseIdx].provided) {
75 // Print timestamp
76 char timestamp[20];
77 snprintf(
78 timestamp, sizeof(timestamp), "[t=%fs] ",
79 state->flightTimeMs / 1000.0f
80 );
81 uart->print(uart, timestamp);
82 }
83
84 // Construct debug string
85 snprintf(
86 str, 80, "X [%d]: %f Y [%d]: %f Z[%d]: %f%s",
87 accel->axes[0],
88 accel->accelData[0],
89 accel->axes[1],
90 accel->accelData[1],
91 accel->axes[2],
92 accel->accelData[2],
93 terminal
94 );
95
96 // Print resulting output
97 uart->print(uart, str);
98
99 // Continue until interrupted if specified
100 if (parser.args[argRepeatIdx].provided)
101 goto REPEAT;
102
103 } else {
104 uart->println(uart, parser.error.msg);
105 }
106}
107
Defines the API for the Accelerometer sensor.
void(* update)(struct Accel *accel)
Pointer to update method.
float * accelData
Pointer to driver defined data array.
uint8_t * axes
Pointer to driver defined axes.
DeviceHandle_t DeviceList_getDeviceHandle(DeviceKey)
Retrieve device handle from list by key.
Definition devicelist.c:36
State * State_getState()
Definition state.c:69
State variable struct.
Definition state.h:36
Struct definition for UART interface.
Definition uart.h:132