From 7745c8ede7e1531e44cdeb70b89ffb59d69a048c Mon Sep 17 00:00:00 2001 From: hhvrc Date: Wed, 9 Oct 2024 12:53:26 +0200 Subject: [PATCH 1/7] Initial commit --- include/serial/Serial.h | 6 +++++ src/main.cpp | 9 ++++--- src/serial/Serial.cpp | 54 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 include/serial/Serial.h create mode 100644 src/serial/Serial.cpp diff --git a/include/serial/Serial.h b/include/serial/Serial.h new file mode 100644 index 00000000..d1920f1b --- /dev/null +++ b/include/serial/Serial.h @@ -0,0 +1,6 @@ +#pragma once + +namespace OpenShock::Serial { + // Initializes the SerialInputHandler, which listens for incoming serial commands. + bool Init(); +} // namespace OpenShock::Serial diff --git a/src/main.cpp b/src/main.cpp index ec3f792d..b4b25e75 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,14 +11,13 @@ const char* const TAG = "main"; #include "GatewayConnectionManager.h" #include "Logging.h" #include "OtaUpdateManager.h" +#include "serial/Serial.h" #include "serial/SerialInputHandler.h" #include "util/TaskUtils.h" #include "VisualStateManager.h" #include "wifi/WiFiManager.h" #include "wifi/WiFiScanManager.h" -#include - #include // Internal setup function, returns true if setup succeeded, false otherwise. @@ -83,7 +82,11 @@ void appSetup() { // Arduino setup function void setup() { - ::Serial.begin(115'200); + // esp_log_level_set(ESP_LOG_VERBOSE); + + Serial::Init(); + + // esp_log_level_set(ESP_LOG_VERBOSE); OpenShock::Config::Init(); OpenShock::OtaUpdateManager::Init(); diff --git a/src/serial/Serial.cpp b/src/serial/Serial.cpp new file mode 100644 index 00000000..3334789f --- /dev/null +++ b/src/serial/Serial.cpp @@ -0,0 +1,54 @@ +#include + +#include "serial/Serial.h" + +#include +#include + +#define TAG "serial::Serial" + +#define UART_NUM UART_NUM_0 +#define UART_TXP 1 +#define UART_RXP 3 +#define UART_BUFFER_SIZE 1024 +#define UART_QUEUE_SIZE 10 +#define UART_BAUD_RATE 115200 + +using namespace OpenShock; + +bool Serial::Init() { + if (uart_is_driver_installed(UART_NUM)) { + return true; + } + + // Configure the UART + uart_config_t uart_config = { + .baud_rate = UART_BAUD_RATE, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, + .source_clk = UART_SCLK_DEFAULT, + }; // default values + + esp_err_t err; + + err = uart_driver_install(UART_NUM, UART_BUFFER_SIZE, UART_BUFFER_SIZE, UART_QUEUE_SIZE, nullptr, 0); + if (err != ESP_OK) { + return false; + } + + err = uart_param_config(UART_NUM, &uart_config); + if (err != ESP_OK) { + return false; + } + + err = uart_set_pin(UART_NUM, UART_TXP, UART_RXP, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); + if (err != ESP_OK) { + return false; + } + + uart_ + + return true; +} From 48f17b478661cf610b43b9634d125a9d30085bf5 Mon Sep 17 00:00:00 2001 From: hhvrc Date: Thu, 21 Nov 2024 13:06:40 +0100 Subject: [PATCH 2/7] Some fixes and add jtag support --- src/main.cpp | 2 +- src/serial/Serial.cpp | 49 ++++++++++++++++++++++++++++++------------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 0e245b1f..1cfde321 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -93,7 +93,7 @@ void setup() { // esp_log_level_set(ESP_LOG_VERBOSE); - Serial::Init(); + OpenShock::Serial::Init(); // esp_log_level_set(ESP_LOG_VERBOSE); diff --git a/src/serial/Serial.cpp b/src/serial/Serial.cpp index 3334789f..4d0ee02f 100644 --- a/src/serial/Serial.cpp +++ b/src/serial/Serial.cpp @@ -3,20 +3,38 @@ #include "serial/Serial.h" #include +#include #include +#include #define TAG "serial::Serial" -#define UART_NUM UART_NUM_0 -#define UART_TXP 1 -#define UART_RXP 3 -#define UART_BUFFER_SIZE 1024 +#define USE_USB_JTAG false + +#define UART_NUM UART_NUM_2 // Only for ESP32 and ESP32S3 +#define UART_TXP 4 +#define UART_RXP 5 #define UART_QUEUE_SIZE 10 -#define UART_BAUD_RATE 115200 +#define UART_BAUD_RATE 115'200 + +#define BUFFER_SIZE 1024 using namespace OpenShock; -bool Serial::Init() { +bool Serial::Init() +{ + esp_err_t err; +#if USE_USB_JTAG + usb_serial_jtag_driver_config_t usb_serial_jtag_config = { + .tx_buffer_size = BUFFER_SIZE, + .rx_buffer_size = BUFFER_SIZE, + }; + + err = usb_serial_jtag_driver_install(&usb_serial_jtag_config); + if (err != ESP_OK) { + return false; + } +#else if (uart_is_driver_installed(UART_NUM)) { return true; } @@ -25,15 +43,19 @@ bool Serial::Init() { uart_config_t uart_config = { .baud_rate = UART_BAUD_RATE, .data_bits = UART_DATA_8_BITS, - .parity = UART_PARITY_DISABLE, + .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, - .source_clk = UART_SCLK_DEFAULT, - }; // default values +#ifdef UART_SCLK_DEFAULT + .source_clk = UART_SCLK_REF_TICK, +#elif SOC_UART_SUPPORT_REF_TICK + .source_clk = UART_SCLK_REF_TICK, +#else + .source_clk = UART_SCLK_APB, +#endif + }; // default values - esp_err_t err; - - err = uart_driver_install(UART_NUM, UART_BUFFER_SIZE, UART_BUFFER_SIZE, UART_QUEUE_SIZE, nullptr, 0); + err = uart_driver_install(UART_NUM, BUFFER_SIZE, BUFFER_SIZE, UART_QUEUE_SIZE, nullptr, 0); if (err != ESP_OK) { return false; } @@ -47,8 +69,7 @@ bool Serial::Init() { if (err != ESP_OK) { return false; } - - uart_ +#endif return true; } From bfff974cf9a4b0d1ad954ef876f9dac8c3d5c60b Mon Sep 17 00:00:00 2001 From: hhvrc Date: Tue, 4 Feb 2025 13:24:41 +0100 Subject: [PATCH 3/7] Replace all printf and println --- include/Logging.h | 14 ++-- include/serial/Serial.h | 6 -- include/serial/command_handlers/common.h | 4 +- src/main.cpp | 5 -- src/serial/Serial.cpp | 75 -------------------- src/serial/SerialInputHandler.cpp | 9 +-- src/serial/command_handlers/factoryreset.cpp | 6 +- src/serial/command_handlers/restart.cpp | 2 +- src/serial/command_handlers/version.cpp | 4 +- 9 files changed, 21 insertions(+), 104 deletions(-) delete mode 100644 include/serial/Serial.h delete mode 100644 src/serial/Serial.cpp diff --git a/include/Logging.h b/include/Logging.h index 3439449d..441d6980 100644 --- a/include/Logging.h +++ b/include/Logging.h @@ -8,8 +8,6 @@ #include #include -extern "C" int log_printf(const char* fmt, ...); - template constexpr const char* openshockPathToFileName(const char (&path)[N]) { std::size_t pos = 0; @@ -32,37 +30,37 @@ constexpr const char* openshockPathToFileName(const char (&path)[N]) { #define OPENSHOCK_LOG_FORMAT(letter, format) "[%lli][" #letter "][%s:%u] %s(): " format "\r\n", OpenShock::millis(), openshockPathToFileName(__FILE__), __LINE__, __FUNCTION__ #if OPENSHOCK_LOG_LEVEL >= OPENSHOCK_LOG_LEVEL_VERBOSE -#define OS_LOGV(TAG, format, ...) log_printf(OPENSHOCK_LOG_FORMAT(V, "[%s] " format), TAG, ##__VA_ARGS__) +#define OS_LOGV(TAG, format, ...) esp_log_write(ESP_LOG_VERBOSE, TAG, OPENSHOCK_LOG_FORMAT(V, "[%s] " format), TAG, ##__VA_ARGS__) #else #define OS_LOGV(TAG, format, ...) do {} while(0) #endif #if OPENSHOCK_LOG_LEVEL >= OPENSHOCK_LOG_LEVEL_DEBUG -#define OS_LOGD(TAG, format, ...) log_printf(OPENSHOCK_LOG_FORMAT(D, "[%s] " format), TAG, ##__VA_ARGS__) +#define OS_LOGD(TAG, format, ...) esp_log_write(ESP_LOG_DEBUG, TAG, OPENSHOCK_LOG_FORMAT(D, "[%s] " format), TAG, ##__VA_ARGS__) #else #define OS_LOGD(TAG, format, ...) do {} while(0) #endif #if OPENSHOCK_LOG_LEVEL >= OPENSHOCK_LOG_LEVEL_INFO -#define OS_LOGI(TAG, format, ...) log_printf(OPENSHOCK_LOG_FORMAT(I, "[%s] " format), TAG, ##__VA_ARGS__) +#define OS_LOGI(TAG, format, ...) esp_log_write(ESP_LOG_INFO, TAG, OPENSHOCK_LOG_FORMAT(I, "[%s] " format), TAG, ##__VA_ARGS__) #else #define OS_LOGI(TAG, format, ...) do {} while(0) #endif #if OPENSHOCK_LOG_LEVEL >= OPENSHOCK_LOG_LEVEL_WARN -#define OS_LOGW(TAG, format, ...) log_printf(OPENSHOCK_LOG_FORMAT(W, "[%s] " format), TAG, ##__VA_ARGS__) +#define OS_LOGW(TAG, format, ...) esp_log_write(ESP_LOG_WARN, TAG, OPENSHOCK_LOG_FORMAT(W, "[%s] " format), TAG, ##__VA_ARGS__) #else #define OS_LOGW(TAG, format, ...) do {} while(0) #endif #if OPENSHOCK_LOG_LEVEL >= OPENSHOCK_LOG_LEVEL_ERROR -#define OS_LOGE(TAG, format, ...) log_printf(OPENSHOCK_LOG_FORMAT(E, "[%s] " format), TAG, ##__VA_ARGS__) +#define OS_LOGE(TAG, format, ...) esp_log_write(ESP_LOG_ERROR, TAG, OPENSHOCK_LOG_FORMAT(E, "[%s] " format), TAG, ##__VA_ARGS__) #else #define OS_LOGE(TAG, format, ...) do {} while(0) #endif #if OPENSHOCK_LOG_LEVEL >= OPENSHOCK_LOG_LEVEL_NONE -#define OS_LOGN(TAG, format, ...) log_printf(OPENSHOCK_LOG_FORMAT(E, "[%s] " format), TAG, ##__VA_ARGS__) +#define OS_LOGN(TAG, format, ...) esp_log_write(ESP_LOG_NONE, TAG, OPENSHOCK_LOG_FORMAT(E, "[%s] " format), TAG, ##__VA_ARGS__) #else #define OS_LOGN(TAG, format, ...) do {} while(0) #endif diff --git a/include/serial/Serial.h b/include/serial/Serial.h deleted file mode 100644 index d1920f1b..00000000 --- a/include/serial/Serial.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -namespace OpenShock::Serial { - // Initializes the SerialInputHandler, which listens for incoming serial commands. - bool Init(); -} // namespace OpenShock::Serial diff --git a/include/serial/command_handlers/common.h b/include/serial/command_handlers/common.h index 1d0937e0..03af0bf7 100644 --- a/include/serial/command_handlers/common.h +++ b/include/serial/command_handlers/common.h @@ -4,9 +4,9 @@ #include "Logging.h" -#include +#include -#define SERPR_SYS(format, ...) ::Serial.printf("$SYS$|" format "\n", ##__VA_ARGS__) +#define SERPR_SYS(format, ...) printf("$SYS$|" format "\n", ##__VA_ARGS__) #define SERPR_RESPONSE(format, ...) SERPR_SYS("Response|" format, ##__VA_ARGS__) #define SERPR_SUCCESS(format, ...) SERPR_SYS("Success|" format, ##__VA_ARGS__) #define SERPR_ERROR(format, ...) SERPR_SYS("Error|" format, ##__VA_ARGS__) diff --git a/src/main.cpp b/src/main.cpp index 702bc74a..cb7432d4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,7 +11,6 @@ const char* const TAG = "main"; #include "GatewayConnectionManager.h" #include "Logging.h" #include "OtaUpdateManager.h" -#include "serial/Serial.h" #include "serial/SerialInputHandler.h" #include "util/TaskUtils.h" #include "VisualStateManager.h" @@ -93,10 +92,6 @@ void setup() { // esp_log_level_set(ESP_LOG_VERBOSE); - OpenShock::Serial::Init(); - - // esp_log_level_set(ESP_LOG_VERBOSE); - OpenShock::Config::Init(); if (!OpenShock::Events::Init()) { diff --git a/src/serial/Serial.cpp b/src/serial/Serial.cpp deleted file mode 100644 index 4d0ee02f..00000000 --- a/src/serial/Serial.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include - -#include "serial/Serial.h" - -#include -#include -#include -#include - -#define TAG "serial::Serial" - -#define USE_USB_JTAG false - -#define UART_NUM UART_NUM_2 // Only for ESP32 and ESP32S3 -#define UART_TXP 4 -#define UART_RXP 5 -#define UART_QUEUE_SIZE 10 -#define UART_BAUD_RATE 115'200 - -#define BUFFER_SIZE 1024 - -using namespace OpenShock; - -bool Serial::Init() -{ - esp_err_t err; -#if USE_USB_JTAG - usb_serial_jtag_driver_config_t usb_serial_jtag_config = { - .tx_buffer_size = BUFFER_SIZE, - .rx_buffer_size = BUFFER_SIZE, - }; - - err = usb_serial_jtag_driver_install(&usb_serial_jtag_config); - if (err != ESP_OK) { - return false; - } -#else - if (uart_is_driver_installed(UART_NUM)) { - return true; - } - - // Configure the UART - uart_config_t uart_config = { - .baud_rate = UART_BAUD_RATE, - .data_bits = UART_DATA_8_BITS, - .parity = UART_PARITY_DISABLE, - .stop_bits = UART_STOP_BITS_1, - .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, -#ifdef UART_SCLK_DEFAULT - .source_clk = UART_SCLK_REF_TICK, -#elif SOC_UART_SUPPORT_REF_TICK - .source_clk = UART_SCLK_REF_TICK, -#else - .source_clk = UART_SCLK_APB, -#endif - }; // default values - - err = uart_driver_install(UART_NUM, BUFFER_SIZE, BUFFER_SIZE, UART_QUEUE_SIZE, nullptr, 0); - if (err != ESP_OK) { - return false; - } - - err = uart_param_config(UART_NUM, &uart_config); - if (err != ESP_OK) { - return false; - } - - err = uart_set_pin(UART_NUM, UART_TXP, UART_RXP, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); - if (err != ESP_OK) { - return false; - } -#endif - - return true; -} diff --git a/src/serial/SerialInputHandler.cpp b/src/serial/SerialInputHandler.cpp index 2e1a370f..a1d1cd50 100644 --- a/src/serial/SerialInputHandler.cpp +++ b/src/serial/SerialInputHandler.cpp @@ -27,6 +27,7 @@ const char* const TAG = "SerialInputHandler"; #include #include +#include #include #include #include @@ -420,7 +421,7 @@ void _skipSerialWhitespaces(SerialBuffer& buffer) void _echoBuffer(std::string_view buffer) { - ::Serial.printf(CLEAR_LINE "> %.*s", buffer.size(), buffer.data()); + printf(CLEAR_LINE "> %.*s", buffer.size(), buffer.data()); } void _echoHandleSerialInput(std::string_view buffer, bool hasData) @@ -467,7 +468,7 @@ void _processSerialLine(std::string_view line) line = line.substr(1); } else if (s_echoEnabled) { _echoBuffer(line); - ::Serial.println(); + putchar('\n'); } auto parts = OpenShock::StringSplit(line, ' ', 1); @@ -558,7 +559,7 @@ void _serialRxTask(void*) _skipSerialWhitespaces(buffer); break; case SerialReadResult::AutoCompleteRequest: - ::Serial.printf(CLEAR_LINE "> %.*s [AutoComplete is not implemented]", buffer.size(), buffer.data()); + printf(CLEAR_LINE "> %.*s [AutoComplete is not implemented]", buffer.size(), buffer.data()); break; case SerialReadResult::Data: _echoHandleSerialInput(buffer, true); @@ -590,7 +591,7 @@ bool SerialInputHandler::Init() SerialInputHandler::PrintWelcomeHeader(); SerialInputHandler::PrintVersionInfo(); - ::Serial.println(); + putchar('\n'); if (!Config::GetSerialInputConfigEchoEnabled(s_echoEnabled)) { OS_LOGE(TAG, "Failed to get serial echo status from config"); diff --git a/src/serial/command_handlers/factoryreset.cpp b/src/serial/command_handlers/factoryreset.cpp index bf973821..c397627c 100644 --- a/src/serial/command_handlers/factoryreset.cpp +++ b/src/serial/command_handlers/factoryreset.cpp @@ -4,13 +4,15 @@ #include +#include + void _handleFactoryResetCommand(std::string_view arg, bool isAutomated) { (void)arg; - ::Serial.println("Resetting to factory defaults..."); + printf("Resetting to factory defaults...\n"); OpenShock::Config::FactoryReset(); - ::Serial.println("Restarting..."); + printf("Restarting...\n"); esp_restart(); } diff --git a/src/serial/command_handlers/restart.cpp b/src/serial/command_handlers/restart.cpp index 9ea94df7..6b4e9efb 100644 --- a/src/serial/command_handlers/restart.cpp +++ b/src/serial/command_handlers/restart.cpp @@ -5,7 +5,7 @@ void _handleRestartCommand(std::string_view arg, bool isAutomated) { (void)arg; - ::Serial.println("Restarting ESP..."); + printf("Restarting ESP...\n"); esp_restart(); } diff --git a/src/serial/command_handlers/version.cpp b/src/serial/command_handlers/version.cpp index 3b3c5508..22a3ba16 100644 --- a/src/serial/command_handlers/version.cpp +++ b/src/serial/command_handlers/version.cpp @@ -2,12 +2,14 @@ #include "serial/SerialInputHandler.h" +#include #include void _handleVersionCommand(std::string_view arg, bool isAutomated) { (void)arg; - ::Serial.print("\n"); + putchar('\n'); + OpenShock::SerialInputHandler::PrintVersionInfo(); } From 42715c0476aa1489080d0a6dacace723b286578e Mon Sep 17 00:00:00 2001 From: HeavenVR Date: Mon, 8 Dec 2025 12:03:50 +0100 Subject: [PATCH 4/7] Fix log formatting --- src/CaptivePortalInstance.cpp | 2 +- src/GatewayConnectionManager.cpp | 2 +- src/OtaUpdateManager.cpp | 4 ++-- src/message_handlers/websocket/gateway/_InvalidMessage.cpp | 2 +- src/message_handlers/websocket/local/_InvalidMessage.cpp | 2 +- src/radio/RFTransmitter.cpp | 4 ++-- src/radio/rmt/Sequence.cpp | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/CaptivePortalInstance.cpp b/src/CaptivePortalInstance.cpp index 6a5d536c..64901458 100644 --- a/src/CaptivePortalInstance.cpp +++ b/src/CaptivePortalInstance.cpp @@ -198,7 +198,7 @@ void CaptivePortalInstance::handleWebSocketEvent(uint8_t socketId, WebSocketMess break; default: m_socketDeFragger.clear(); - OS_LOGE(TAG, "Unknown WebSocket event type: %u", type); + OS_LOGE(TAG, "Unknown WebSocket event type: %hhu", static_cast(type)); break; } } diff --git a/src/GatewayConnectionManager.cpp b/src/GatewayConnectionManager.cpp index 3204373c..b843730d 100644 --- a/src/GatewayConnectionManager.cpp +++ b/src/GatewayConnectionManager.cpp @@ -202,7 +202,7 @@ bool FetchHubInfo(std::string authToken) OS_LOGI(TAG, "Hub Name: %s", response.data.hubName.c_str()); OS_LOGI(TAG, "Shockers:"); for (auto& shocker : response.data.shockers) { - OS_LOGI(TAG, " [%s] rf=%u model=%u", shocker.id.c_str(), shocker.rfId, shocker.model); + OS_LOGI(TAG, " [%s] rf=%hu model=%hhu", shocker.id.c_str(), shocker.rfId, static_cast(shocker.model)); } s_flags |= FLAG_LINKED; diff --git a/src/OtaUpdateManager.cpp b/src/OtaUpdateManager.cpp index 77c5ed40..f5492209 100644 --- a/src/OtaUpdateManager.cpp +++ b/src/OtaUpdateManager.cpp @@ -537,11 +537,11 @@ bool OtaUpdateManager::TryGetFirmwareVersion(OtaUpdateChannel channel, OpenShock channelIndexUrl = OPENSHOCK_FW_CDN_DEVELOP_URL ""sv; break; default: - OS_LOGE(TAG, "Unknown channel: %u", channel); + OS_LOGE(TAG, "Unknown channel: %hhu", static_cast(channel)); return false; } - OS_LOGD(TAG, "Fetching firmware version from %s", channelIndexUrl); + OS_LOGD(TAG, "Fetching firmware version from %s", channelIndexUrl.data()); auto response = OpenShock::HTTP::GetString( channelIndexUrl, diff --git a/src/message_handlers/websocket/gateway/_InvalidMessage.cpp b/src/message_handlers/websocket/gateway/_InvalidMessage.cpp index 15ae23aa..753e9b8c 100644 --- a/src/message_handlers/websocket/gateway/_InvalidMessage.cpp +++ b/src/message_handlers/websocket/gateway/_InvalidMessage.cpp @@ -13,5 +13,5 @@ void _Private::HandleInvalidMessage(const OpenShock::Serialization::Gateway::Gat return; } - OS_LOGE(TAG, "Invalid message type: %u", root->payload_type()); + OS_LOGE(TAG, "Invalid message type: %hhu", static_cast(root->payload_type())); } diff --git a/src/message_handlers/websocket/local/_InvalidMessage.cpp b/src/message_handlers/websocket/local/_InvalidMessage.cpp index 8afe35fa..57fd6dab 100644 --- a/src/message_handlers/websocket/local/_InvalidMessage.cpp +++ b/src/message_handlers/websocket/local/_InvalidMessage.cpp @@ -15,5 +15,5 @@ void _Private::HandleInvalidMessage(uint8_t socketId, const OpenShock::Serializa return; } - OS_LOGE(TAG, "Invalid message type: %d", root->payload_type()); + OS_LOGE(TAG, "Invalid message type: %hhu", static_cast(root->payload_type())); } diff --git a/src/radio/RFTransmitter.cpp b/src/radio/RFTransmitter.cpp index f08112b9..d21ac2a9 100644 --- a/src/radio/RFTransmitter.cpp +++ b/src/radio/RFTransmitter.cpp @@ -89,7 +89,7 @@ bool RFTransmitter::SendCommand(ShockerModelType model, uint16_t shockerId, Shoc durationMs = 300; overwriteExisting = true; } else { - OS_LOGD(TAG, "Command received: %u %u %u %u", model, shockerId, type, intensity); + OS_LOGD(TAG, "Command received: %hhu %hu %hhu %hhu", static_cast(model), shockerId, static_cast(type), intensity); } Command cmd = Command {.transmitEnd = OpenShock::millis() + durationMs, .modelType = model, .type = type, .shockerId = shockerId, .intensity = intensity, .flags = overwriteExisting ? kFlagOverwrite : (uint8_t)0}; @@ -222,7 +222,7 @@ void RFTransmitter::TransmitTask() } if (!addSequence(sequences, cmd.modelType, cmd.shockerId, cmd.type, cmd.intensity, cmd.transmitEnd)) { - OS_LOGD(TAG, "[pin-%hhi] Failed to add sequence"); + OS_LOGD(TAG, "[pin-%hhi] Failed to add sequence", m_txPin); } } diff --git a/src/radio/rmt/Sequence.cpp b/src/radio/rmt/Sequence.cpp index ce64d6d2..310058ca 100644 --- a/src/radio/rmt/Sequence.cpp +++ b/src/radio/rmt/Sequence.cpp @@ -34,7 +34,7 @@ inline static bool fillSequenceImpl(rmt_data_t* data, ShockerModelType modelType case ShockerModelType::Petrainer998DR: return Rmt::Petrainer998DREncoder::FillBuffer(data, shockerId, commandType, intensity); default: - OS_LOGE(TAG, "Unknown shocker model: %u", modelType); + OS_LOGE(TAG, "Unknown shocker model: %hhu", static_cast(modelType)); return false; } } From 3dff1fafb27e80b1ba8f5b3f69f379ee8cf6ed14 Mon Sep 17 00:00:00 2001 From: HeavenVR Date: Mon, 8 Dec 2025 14:03:57 +0100 Subject: [PATCH 5/7] Replace more Serial.print calls --- src/serial/SerialInputHandler.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/serial/SerialInputHandler.cpp b/src/serial/SerialInputHandler.cpp index ea3505b8..4466eba1 100644 --- a/src/serial/SerialInputHandler.cpp +++ b/src/serial/SerialInputHandler.cpp @@ -22,10 +22,7 @@ const char* const TAG = "SerialInputHandler"; #include "util/TaskUtils.h" #include "wifi/WiFiManager.h" -#include - #include -#include #include #include @@ -124,7 +121,7 @@ void _printCompleteHelp() } SerialInputHandler::PrintWelcomeHeader(); - ::Serial.print(buffer.data()); + write(STDOUT_FILENO, buffer.data(), buffer.size()); } void _printCommandHelp(Serial::CommandGroup& group) @@ -257,7 +254,7 @@ void _printCommandHelp(Serial::CommandGroup& group) buffer.push_back('\r'); buffer.push_back('\n'); - ::Serial.print(buffer.data()); + write(STDOUT_FILENO, buffer.data(), buffer.size()); } void _handleHelpCommand(std::string_view arg, bool isAutomated) @@ -626,22 +623,27 @@ void SerialInputHandler::SetSerialEchoEnabled(bool enabled) void SerialInputHandler::PrintWelcomeHeader() { - ::Serial.println("\ + auto string = "\ ============== OPENSHOCK ==============\r\n\ Contribute @ github.com/OpenShock\r\n\ Discuss @ discord.gg/OpenShock\r\n\ Type 'help' for available commands\r\n\ =======================================\r\n\ -"); +\r\n\ +"sv; + + write(STDOUT_FILENO, string.data(), string.size()); } void SerialInputHandler::PrintVersionInfo() { - ::Serial.print("\ + auto string = "\ Version: " OPENSHOCK_FW_VERSION "\r\n\ Build: " OPENSHOCK_FW_MODE "\r\n\ Commit: " OPENSHOCK_FW_GIT_COMMIT "\r\n\ Board: " OPENSHOCK_FW_BOARD "\r\n\ Chip: " OPENSHOCK_FW_CHIP "\r\n\ -"); +"sv; + + write(STDOUT_FILENO, string.data(), string.size()); } From a936399c5494e1ee697721cad728309ba9a2d49a Mon Sep 17 00:00:00 2001 From: HeavenVR Date: Wed, 10 Dec 2025 02:23:21 +0100 Subject: [PATCH 6/7] use fwrite instead of write --- src/serial/SerialInputHandler.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/serial/SerialInputHandler.cpp b/src/serial/SerialInputHandler.cpp index 4466eba1..8330b5ed 100644 --- a/src/serial/SerialInputHandler.cpp +++ b/src/serial/SerialInputHandler.cpp @@ -121,7 +121,7 @@ void _printCompleteHelp() } SerialInputHandler::PrintWelcomeHeader(); - write(STDOUT_FILENO, buffer.data(), buffer.size()); + fwrite(buffer.data(), 1, buffer.size(), stdout); } void _printCommandHelp(Serial::CommandGroup& group) @@ -254,7 +254,7 @@ void _printCommandHelp(Serial::CommandGroup& group) buffer.push_back('\r'); buffer.push_back('\n'); - write(STDOUT_FILENO, buffer.data(), buffer.size()); + fwrite(buffer.data(), 1, buffer.size(), stdout); } void _handleHelpCommand(std::string_view arg, bool isAutomated) @@ -632,7 +632,7 @@ void SerialInputHandler::PrintWelcomeHeader() \r\n\ "sv; - write(STDOUT_FILENO, string.data(), string.size()); + fwrite(string.data(), 1, string.size(), stdout); } void SerialInputHandler::PrintVersionInfo() @@ -645,5 +645,5 @@ void SerialInputHandler::PrintVersionInfo() Chip: " OPENSHOCK_FW_CHIP "\r\n\ "sv; - write(STDOUT_FILENO, string.data(), string.size()); + fwrite(string.data(), 1, string.size(), stdout); } From 3a58c8df9a0853cf72648b667ef093dc4080b781 Mon Sep 17 00:00:00 2001 From: HeavenVR Date: Wed, 10 Dec 2025 02:36:18 +0100 Subject: [PATCH 7/7] AI Slop fix --- include/serial/SerialCompat.h | 50 +++++++++++++++++++++++++++++++ src/main.cpp | 4 ++- src/serial/SerialInputHandler.cpp | 23 ++++++++++---- 3 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 include/serial/SerialCompat.h diff --git a/include/serial/SerialCompat.h b/include/serial/SerialCompat.h new file mode 100644 index 00000000..9a297c8b --- /dev/null +++ b/include/serial/SerialCompat.h @@ -0,0 +1,50 @@ +#pragma once + +#include + +// Use the same UART that your console / printf uses +// On most boards this is UART_NUM_0 +#define OPENSHOCK_UART = UART_NUM_0; + +namespace OpenShock { + // Call this once during startup (instead of Serial.begin) + inline void SerialInit() + { + // If you already use esp_console, you might already have + // the driver installed. Then you can skip the install part. + uart_config_t uart_config = { + .baud_rate = 115200, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, + .source_clk = UART_SCLK_DEFAULT, + }; + ESP_ERROR_CHECK(uart_param_config(OPENSHOCK_UART, &uart_config)); + + // RX buffer only; TX is handled by vfs/printf + ESP_ERROR_CHECK(uart_driver_install(OPENSHOCK_UART, 2048, 0, 0, nullptr, 0)); + + // Route stdin/stdout to this UART so printf/scanf work + esp_vfs_dev_uart_use_driver(OPENSHOCK_UART); + } + + // Arduino-like helpers + inline int SerialAvailable() + { + size_t len = 0; + uart_get_buffered_data_len(OPENSHOCK_UART, &len); + return static_cast(len); + } + + inline int SerialRead() + { + std::uint8_t c; + // timeout = 0 ticks → non-blocking + int n = uart_read_bytes(OPENSHOCK_UART, &c, 1, 0); + if (n == 1) { + return static_cast(c); + } + return -1; // no data + } +} // namespace OpenShock \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index cb7432d4..0ad78ed6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,6 +11,7 @@ const char* const TAG = "main"; #include "GatewayConnectionManager.h" #include "Logging.h" #include "OtaUpdateManager.h" +#include "serial/SerialCompat.h" #include "serial/SerialInputHandler.h" #include "util/TaskUtils.h" #include "VisualStateManager.h" @@ -90,7 +91,8 @@ void appSetup() // Arduino setup function void setup() { - // esp_log_level_set(ESP_LOG_VERBOSE); + OpenShock::SerialInit(); + esp_log_level_set(ESP_LOG_VERBOSE); OpenShock::Config::Init(); diff --git a/src/serial/SerialInputHandler.cpp b/src/serial/SerialInputHandler.cpp index 8330b5ed..7582df41 100644 --- a/src/serial/SerialInputHandler.cpp +++ b/src/serial/SerialInputHandler.cpp @@ -12,6 +12,7 @@ const char* const TAG = "SerialInputHandler"; #include "FormatHelpers.h" #include "http/HTTPRequestManager.h" #include "Logging.h" +#include "serial/SerialCompat.h" #include "serial/command_handlers/CommandEntry.h" #include "serial/command_handlers/common.h" #include "serial/command_handlers/index.h" @@ -367,7 +368,7 @@ enum class SerialReadResult { SerialReadResult _tryReadSerialLine(SerialBuffer& buffer) { // Check if there's any data available - int available = ::Serial.available(); + int available = OpenShockSerialAvailable(); if (available <= 0) { return SerialReadResult::NoData; } @@ -377,11 +378,18 @@ SerialReadResult _tryReadSerialLine(SerialBuffer& buffer) // Read the data into the buffer while (available-- > 0) { - char c = ::Serial.read(); + int r = OpenShockSerialRead(); + if (r < 0) { + break; // no more data even though the previous length said otherwise + } + + char c = static_cast(r); // Handle backspace if (c == '\b') { - buffer.pop_back(); // Remove the last character from the buffer if it exists + if (!buffer.empty()) { + buffer.pop_back(); // Remove the last character from the buffer if it exists + } continue; } @@ -413,10 +421,15 @@ SerialReadResult _tryReadSerialLine(SerialBuffer& buffer) void _skipSerialWhitespaces(SerialBuffer& buffer) { - int available = ::Serial.available(); + int available = OpenShockSerialAvailable(); while (available-- > 0) { - char c = ::Serial.read(); + int r = OpenShockSerialRead(); + if (r < 0) { + break; + } + + char c = static_cast(r); if (c != ' ' && c != '\r' && c != '\n') { buffer.push_back(c);