14#include "devicelist.h"
17extern uint32_t __shell_vector_start;
18extern uint32_t __shell_vector_end;
20static TaskHandle_t taskHandle;
21static TaskHandle_t vShellProcessHandle;
28char *prompt =
"(CORE ACTIVE) Australis >: ";
41void vShellExec(
void *argument) {
45 uart->print(uart, prompt);
70 vShellProcessHandle = xTaskGetCurrentTaskHandle();
76 bool suspended =
false;
80 xTaskNotifyWait(0, 0, &rxData, portMAX_DELAY);
83 rxMsg.data[rxMsg.length++] = rxData;
84 rxMsg.length %= UART_MSG_LENGTH;
87 display = (
char[]){rxData,
'\0'};
90 if (rxData == SIGINT) {
96 if (rxData == BACKSPACE || rxData == DEL) {
100 rxMsg.length -= (rxMsg.length > 1) ? 2 : 1;
104 if (rxData == SUBSTITUTE && !suspended) {
111 uart->println(uart,
"\r\nAustralis core paused.");
112 prompt =
"(CORE PAUSED) Australis >: ";
113 if (taskHandle == NULL)
114 uart->print(uart, prompt);
119 else if (rxData == SUBSTITUTE && suspended) {
126 uart->println(uart,
"\r\nAustralis core resumed.");
127 prompt =
"(CORE ACTIVE) Australis >: ";
128 if (taskHandle == NULL)
129 uart->print(uart, prompt);
135 uart->print(uart, display);
139 if (rxData == CARRIAGE_RETURN) {
140 char *termination = (
char *)&rxMsg.data[rxMsg.length - 1];
143 uart->print(uart,
"\n");
147 vShellExec,
"ShellProgram", 512,
148 rxMsg.data, configMAX_PRIORITIES - 6,
173 char *token = strtok((
char *)programName,
" ");
174 char *flags = strchr(token,
'\0') + 1;
182 for (uint32_t *i = (uint32_t *)&__shell_vector_start; i < (uint32_t *)&__shell_vector_end; i++) {
186 if (!strcmp(handle->
name, programName)) {
187 handle->
exec(uart, flags);
193 uart->print(uart, (
char *)programName);
194 uart->println(uart,
": command not recognized. Run `help` for a list of available commands");
213 if (taskHandle != NULL) {
214 vTaskDelete(taskHandle);
218 uart->print(uart,
"\r\n");
219 uart->print(uart, prompt);
230void pubShellRxInterrupt() {
231 BaseType_t xHigherPriorityTaskWoken = pdFALSE;
237 if (uart->interface->SR & USART_SR_RXNE) {
238 uint8_t data = uart->interface->DR;
239 xTaskNotifyFromISR(vShellProcessHandle, data, eSetValueWithOverwrite, &xHigherPriorityTaskWoken);
240 portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
DeviceHandle_t DeviceList_getDeviceHandle(DeviceKey)
Retrieve device handle from list by key.
char name[SHELL_PROGRAM_NAME_LENGTH]
Program name as referenced by the shell.
void(* exec)(UART_t *, char *)
Program entry point function pointer.
void vShellProcess(void *argument)
bool Shell_run(char *programName)
Executes a shell program by name.
bool Shell_sigint()
Exit any running task and clear to new line.
Struct definition for shell program handle.
TaskHandle_t TaskList_getTaskByName(char *)
Retrieve task handle from list by name string.
Struct definition for UART interface.
#define CREATE_MESSAGE(name, length_)
Macro to define, on the stack, a named message struct.