diff --git a/device/src/shell/shell_commands.c b/device/src/shell/shell_commands.c index 0a2d79270..7a209a4bc 100644 --- a/device/src/shell/shell_commands.c +++ b/device/src/shell/shell_commands.c @@ -384,6 +384,16 @@ static int cmd_uhk_useShellSinks(const struct shell *shell, size_t argc, char *a return 0; } +static int cmd_uhk_stripVt100(const struct shell *shell, size_t argc, char *argv[]) +{ + if (argc == 1) { + shell_fprintf(shell, SHELL_NORMAL, "%i\n", ShellConfig_StripVt100 ? 1 : 0); + } else { + ShellConfig_StripVt100 = argv[1][0] == '1'; + } + return 0; +} + static int cmd_uhk_logStatus(const struct shell *shell, size_t argc, char *argv[]) { uint16_t usbBufferFill, usbBufferSize; @@ -393,6 +403,7 @@ static int cmd_uhk_logStatus(const struct shell *shell, size_t argc, char *argv[ printk("Has log: %d\n", UsbLogBuffer_HasLog); printk("Usb log buffer fill: %d / %d\n", usbBufferFill, usbBufferSize); printk("UseShellSinks: %d\n", ShellConfig_UseShellSinks ? 1 : 0); + printk("StripVt100: %d\n", ShellConfig_StripVt100 ? 1 : 0); return 0; } @@ -431,6 +442,7 @@ void InitShellCommands(void) SHELL_CMD_ARG(snapshot, NULL, "Snap log buffer to status buffer", cmd_uhk_snaplog, 1, 0), SHELL_CMD_ARG(status, NULL, "print log status overview", cmd_uhk_logStatus, 1, 0), SHELL_CMD_ARG(useShellSinks, NULL, "get/set shell sinks mode", cmd_uhk_useShellSinks, 1, 1), + SHELL_CMD_ARG(stripVt100, NULL, "get/set vt100 stripping for USB log buffer", cmd_uhk_stripVt100, 1, 1), SHELL_SUBCMD_SET_END); #if DEVICE_IS_UHK80_RIGHT diff --git a/device/src/shell/shell_log_backend.c b/device/src/shell/shell_log_backend.c index 49dcfe278..39557b792 100644 --- a/device/src/shell/shell_log_backend.c +++ b/device/src/shell/shell_log_backend.c @@ -134,7 +134,7 @@ static void process(const struct log_backend *const backend, union log_msg_gener if (sinks.toStatusBuffer || sinks.toUsbBuffer || sinks.toOled) { log_output_ctx_set(&sinkLogOutput, &sinks); - uint8_t flags = LOG_OUTPUT_FLAG_CRLF_LFONLY; + uint8_t flags = ShellConfig_StripVt100 ? LOG_OUTPUT_FLAG_CRLF_LFONLY : 0; log_output_msg_process(&sinkLogOutput, &msg->log, flags); } } diff --git a/device/src/shell/shell_transport_uhk.c b/device/src/shell/shell_transport_uhk.c index e34899669..b354217c9 100644 --- a/device/src/shell/shell_transport_uhk.c +++ b/device/src/shell/shell_transport_uhk.c @@ -150,22 +150,32 @@ static void outputToSinks(const shell_sinks_t *sinks, struct uart_transport_data return; } - uint8_t stripped[48]; - size_t strippedLen = stripVt100(td, data, length, stripped, sizeof(stripped)); + bool stripForUsb = ShellConfig_StripVt100; - if (strippedLen == 0) { - return; + // OLED and status buffer always need stripping; USB buffer is optionally raw. + bool needStripped = sinks->toOled || sinks->toStatusBuffer || (sinks->toUsbBuffer && stripForUsb); + + uint8_t stripped[48]; + size_t strippedLen = 0; + if (needStripped) { + strippedLen = stripVt100(td, data, length, stripped, sizeof(stripped)); } if (sinks->toUsbBuffer) { - UsbLogBuffer_Print(stripped, strippedLen); + if (stripForUsb) { + if (strippedLen > 0) { + UsbLogBuffer_Print(stripped, strippedLen); + } + } else { + UsbLogBuffer_Print((uint8_t *)data, length); + } } - if (sinks->toOled) { + if (sinks->toOled && strippedLen > 0) { LogO("%.*s", (int)strippedLen, stripped); } - if (sinks->toStatusBuffer) { + if (sinks->toStatusBuffer && strippedLen > 0) { Macros_SanitizedPut((const char *)stripped, (const char *)stripped + strippedLen); } } @@ -393,8 +403,12 @@ void ShellUartTransport_InjectInput(const char *cmd) } memcpy(data->injectBuf, cmd, len); - data->injectBuf[len] = '\n'; - data->injectLen = len + 1; + if (ShellConfig_StripVt100) { + data->injectBuf[len] = '\n'; + data->injectLen = len + 1; + } else { + data->injectLen = len; + } data->injectPos = 0; data->handler(SHELL_TRANSPORT_EVT_RX_RDY, data->context); diff --git a/device/src/shell/sinks.c b/device/src/shell/sinks.c index 3f2e895cd..0ff6d7319 100644 --- a/device/src/shell/sinks.c +++ b/device/src/shell/sinks.c @@ -8,6 +8,8 @@ bool ShellConfig_IsInPanicMode = false; bool ShellConfig_UseShellSinks = true; +bool ShellConfig_StripVt100 = false; + static shell_sinks_t emptyConfig() { return (shell_sinks_t){ .toUsbBuffer = false, diff --git a/device/src/shell/sinks.h b/device/src/shell/sinks.h index 66bba23df..1600bc489 100644 --- a/device/src/shell/sinks.h +++ b/device/src/shell/sinks.h @@ -17,6 +17,7 @@ extern bool ShellConfig_IsInPanicMode; extern bool ShellConfig_UseShellSinks; + extern bool ShellConfig_StripVt100; // Functions: diff --git a/right/src/usb_log_buffer.c b/right/src/usb_log_buffer.c index e94870800..1b110df14 100644 --- a/right/src/usb_log_buffer.c +++ b/right/src/usb_log_buffer.c @@ -3,6 +3,12 @@ #include "wormhole.h" #include "macros/status_buffer.h" +#ifdef __ZEPHYR__ +#include "shell/sinks.h" +#else +#define ShellConfig_StripVt100 false +#endif + static char buffer[USB_LOG_BUFFER_SIZE]; static uint16_t bufferPosition = 0; static uint16_t bufferLength = 0; @@ -16,7 +22,7 @@ static void updateNonemptyFlag() { } static void addChar(char c) { - if (CHAR_IS_VALID(c)) { + if (CHAR_IS_VALID(c) || !ShellConfig_StripVt100) { if (bufferLength < USB_LOG_BUFFER_SIZE) { buffer[POS(bufferLength)] = c; bufferLength++;