19static void Mem_exec(
UART_t *uart,
char *);
20static void Mem_help(
UART_t *uart);
22DEFINE_PROGRAM_HANDLE(
"mem", Mem_exec, Mem_help)
24static void Mem_help(
UART_t *uart) {
25 uart->println(uart,
"NAME:");
26 uart->println(uart,
"\tmem\n");
27 uart->println(uart,
"USAGE:");
28 uart->println(uart,
"\tmem erase");
29 uart->println(uart,
"\tmem read [all | apogee]\n");
30 uart->println(uart,
"DESCRIPTION:");
31 uart->println(uart,
"\terase");
32 uart->println(uart,
"\t Erase all data written to memory.\n");
33 uart->println(uart,
"\tread [all]");
34 uart->println(uart,
"\t Read binary data from memory.\n");
35 uart->println(uart,
"OPTIONS:");
36 uart->println(uart,
"\t-h, --help");
37 uart->println(uart,
"\t Print this help and exit");
51static void Mem_exec(
UART_t *uart,
char *flags) {
55 int argReadIdx = parser.addArg(
56 &parser,
"read", 0, ARG_TYPE_STRING,
false
58 int argEraseIdx = parser.addArg(
59 &parser,
"erase",
'r', ARG_TYPE_BOOL,
false
63 int mutexResetRepeatIdx = parser.addMutexGroup(
71 char *tokens[MAX_ARGS];
75 char *token = strtok(flags,
" ");
76 while (token != NULL && numTokens < MAX_ARGS) {
77 tokens[numTokens++] = token;
78 token = strtok(NULL,
" ");
82 parser.parseArgs(&parser, numTokens, tokens);
85 if (parser.error.status == PARSER_STATUS_ERROR) {
86 uart->println(uart, parser.error.msg);
90 if (parser.args[argReadIdx].provided) {
92 if (!strcmp(parser.args[argReadIdx].value,
"all")) {
94 volatile uint8_t pageData[256];
95 for (
long i = 0; i < flash->
pageCount; i++) {
96 flash->
readPage(flash, i * 0x100, pageData);
97 for (
int j = 0; j < flash->
pageSize; j++)
98 uart->send(uart, pageData[j]);
103 else if (!strcmp(parser.args[argReadIdx].value,
"apogee")) {
107 uint8_t flashData[259];
108 uint8_t header[] = {HEADER_EVENT_APOGEE, 0xB0, 0x0B};
110 uint8_t *packet = NULL;
113 flash->
readPage(flash, 0, &flashData[3]);
114 memset(flashData, 0, 3);
117 for (
long i = 0; i < flash->
pageCount; i++) {
118 snprintf(str, 50,
"\rChecking page %ld of %ld", i, flash->
pageCount);
119 uart->print(uart, str);
123 memcpy(&flashData[0], &flashData[256], 3);
128 for (
int j = 0; j < 256; j++) {
130 if (!memcmp((packet = &flashData[j]), header, 3)) {
131 float flightTime = *(uint16_t *)&flashData[j + 3] / 1000.0f;
132 snprintf(str, 50,
"\r\nApogee at %fs.", flightTime);
139 snprintf(str, 50,
"\r\nNo apogee event was found in memory.");
143 uart->println(uart, str);
148 uart->println(uart,
"Error: Requested value for read not recognised.");
152 else if (parser.args[argEraseIdx].provided) {
153 uart->print(uart,
"Clearing flash... ");
155 uart->println(uart,
"Done.");
Defines the API for Flash memory storage.
int pageSize
Number of bytes per page.
long pageCount
Total number of pages.
void(* readPage)(struct Flash *, uint32_t, volatile uint8_t *)
Read page method.
void(* erase)(struct Flash *)
Chip erase method.
DeviceHandle_t DeviceList_getDeviceHandle(DeviceKey)
Retrieve device handle from list by key.
Struct definition for UART interface.