diff --git a/CMakeLists.txt b/CMakeLists.txt index 3076219..9e835e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.16) set(EXTRA_COMPONENT_DIRS ${CMAKE_CURRENT_LIST_DIR}/components) -if(IDF_TARGET STREQUAL "esp32s3" or IDF_TARGET STREQUAL "esp32s2") +if(IDF_TARGET STREQUAL "esp32s3") list(APPEND EXTRA_COMPONENT_DIRS ${CMAKE_CURRENT_LIST_DIR}/extra_components) endif() diff --git a/boards/esp32AIThinker/esp32AIThinker b/boards/esp32AIThinker/esp32AIThinker index 5ba6731..044294d 100644 --- a/boards/esp32AIThinker/esp32AIThinker +++ b/boards/esp32AIThinker/esp32AIThinker @@ -2,7 +2,7 @@ CONFIG_IDF_TARGET="esp32" # CONFIG_IDF_TARGET_ESP32S3 is not set # CONFIG_WIRED_MODE is not set -CONFIG_BLINK_GPIO=33 +CONFIG_LED_DEBUG_GPIO=33 # CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set # CONFIG_ESP32S3_SPIRAM_SUPPORT is not set # CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set @@ -55,5 +55,8 @@ CONFIG_SPIRAM_SPEED_80M=y # # OpenIris: Serial Communication Settings # -CONFIG_UART_PORT_NUMER=1 +CONFIG_UART_PORT_NUMBER=0 +CONFIG_UART_RX_PIN=-1 +CONFIG_UART_TX_PIN=-1 + # end of OpenIris: Serial Communication Settings diff --git a/boards/esp32Cam/esp32Cam b/boards/esp32Cam/esp32Cam index 8abfc8f..67543c3 100644 --- a/boards/esp32Cam/esp32Cam +++ b/boards/esp32Cam/esp32Cam @@ -2,7 +2,7 @@ CONFIG_IDF_TARGET="esp32" # CONFIG_IDF_TARGET_ESP32S3 is not set # CONFIG_WIRED_MODE is not set -CONFIG_BLINK_GPIO=33 # todo check this pin +CONFIG_LED_DEBUG_GPIO=33 # todo check this pin # CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set # CONFIG_ESP32S3_SPIRAM_SUPPORT is not set # CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set @@ -55,5 +55,8 @@ CONFIG_SPIRAM_SPEED_80M=y # # OpenIris: Serial Communication Settings # -CONFIG_UART_PORT_NUMER=1 +CONFIG_UART_PORT_NUMBER=0 +CONFIG_UART_RX_PIN=-1 +CONFIG_UART_TX_PIN=-1 + # end of OpenIris: Serial Communication Settings diff --git a/boards/esp32M5Stack/esp32M5Stack b/boards/esp32M5Stack/esp32M5Stack index 06ef1ad..fb4f73a 100644 --- a/boards/esp32M5Stack/esp32M5Stack +++ b/boards/esp32M5Stack/esp32M5Stack @@ -2,7 +2,7 @@ CONFIG_IDF_TARGET="esp32" # CONFIG_IDF_TARGET_ESP32S3 is not set # CONFIG_WIRED_MODE is not set -CONFIG_BLINK_GPIO=33 # todo check this pin +CONFIG_LED_DEBUG_GPIO=33 # todo check this pin # CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set # CONFIG_ESP32S3_SPIRAM_SUPPORT is not set # CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set @@ -55,5 +55,8 @@ CONFIG_SPIRAM_SPEED_80M=y # # OpenIris: Serial Communication Settings # -CONFIG_UART_PORT_NUMER=1 +CONFIG_UART_PORT_NUMBER=0 +CONFIG_UART_RX_PIN=-1 +CONFIG_UART_TX_PIN=-1 + # end of OpenIris: Serial Communication Settings diff --git a/boards/facefocusvr/eye_L b/boards/facefocusvr/eye_L index 908da5f..2655bfc 100644 --- a/boards/facefocusvr/eye_L +++ b/boards/facefocusvr/eye_L @@ -68,10 +68,4 @@ CONFIG_GENERAL_BOARD="facefocusvr_eye_l" # CONFIG_GENERAL_ENABLE_WIRELESS is not set # CONFIG_LED_DEBUG_ENABLE is not set CONFIG_LED_EXTERNAL_AS_DEBUG=y -CONFIG_GENERAL_ADVERTISED_NAME="FFVR Eye L" - -# -# OpenIris: Serial Communication Settings -# -CONFIG_UART_PORT_NUMER=1 -# end of OpenIris: Serial Communication Settings +CONFIG_GENERAL_ADVERTISED_NAME="FFVR Eye L" \ No newline at end of file diff --git a/boards/facefocusvr/eye_R b/boards/facefocusvr/eye_R index f47a473..9d3af2c 100644 --- a/boards/facefocusvr/eye_R +++ b/boards/facefocusvr/eye_R @@ -68,9 +68,4 @@ CONFIG_GENERAL_BOARD="facefocusvr_eye_r" # CONFIG_GENERAL_ENABLE_WIRELESS is not set # CONFIG_LED_DEBUG_ENABLE is not set CONFIG_LED_EXTERNAL_AS_DEBUG=y -CONFIG_GENERAL_ADVERTISED_NAME="FFVR Eye R" -# -# OpenIris: Serial Communication Settings -# -CONFIG_UART_PORT_NUMER=1 -# end of OpenIris: Serial Communication Settings +CONFIG_GENERAL_ADVERTISED_NAME="FFVR Eye R" \ No newline at end of file diff --git a/boards/facefocusvr/face b/boards/facefocusvr/face index bb5616a..aca01d7 100644 --- a/boards/facefocusvr/face +++ b/boards/facefocusvr/face @@ -69,8 +69,3 @@ CONFIG_GENERAL_BOARD="facefocusvr_face" # CONFIG_LED_DEBUG_ENABLE is not set CONFIG_LED_EXTERNAL_AS_DEBUG=y CONFIG_GENERAL_ADVERTISED_NAME="FFVR Face" -# -# OpenIris: Serial Communication Settings -# -CONFIG_UART_PORT_NUMER=1 -# end of OpenIris: Serial Communication Settings diff --git a/boards/project_babble/project_babble b/boards/project_babble/project_babble index 25418e5..db3e3a8 100644 --- a/boards/project_babble/project_babble +++ b/boards/project_babble/project_babble @@ -57,9 +57,4 @@ CONFIG_GENERAL_INCLUDE_UVC_MODE=y # CONFIG_START_IN_UVC_MODE is not set # CONFIG_MONITORING_LED_CURRENT is not set CONFIG_GENERAL_BOARD="project_babble" -CONFIG_GENERAL_ENABLE_WIRELESS=y -# -# OpenIris: Serial Communication Settings -# -CONFIG_UART_PORT_NUMER=1 -# end of OpenIris: Serial Communication Settings +CONFIG_GENERAL_ENABLE_WIRELESS=y \ No newline at end of file diff --git a/boards/sdkconfig.base_defaults b/boards/sdkconfig.base_defaults index edc960e..a624d2a 100644 --- a/boards/sdkconfig.base_defaults +++ b/boards/sdkconfig.base_defaults @@ -2566,9 +2566,4 @@ CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y CONFIG_SUPPORT_TERMIOS=y CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 -# End of deprecated options -# -# OpenIris: Serial Communication Settings -# -CONFIG_UART_PORT_NUMER=1 -# end of OpenIris: Serial Communication Settings \ No newline at end of file +# End of deprecated options \ No newline at end of file diff --git a/boards/seed_studio/xiao_esp32s3 b/boards/seed_studio/xiao_esp32s3 index 6cb2b7c..c3a29cb 100644 --- a/boards/seed_studio/xiao_esp32s3 +++ b/boards/seed_studio/xiao_esp32s3 @@ -62,8 +62,3 @@ CONFIG_GENERAL_INCLUDE_UVC_MODE=y # CONFIG_MONITORING_LED_CURRENT is not set CONFIG_GENERAL_BOARD="xiao_esp32s3" CONFIG_GENERAL_ENABLE_WIRELESS=y -# -# OpenIris: Serial Communication Settings -# -CONFIG_UART_PORT_NUMER=1 -# end of OpenIris: Serial Communication Settings diff --git a/boards/wrooms3/wrooms3 b/boards/wrooms3/wrooms3 index fdcae6e..375e480 100644 --- a/boards/wrooms3/wrooms3 +++ b/boards/wrooms3/wrooms3 @@ -48,10 +48,4 @@ CONFIG_SPIRAM_CS_IO=26 # CONFIG_SPIRAM_FETCH_INSTRUCTIONS is not set # CONFIG_SPIRAM_RODATA is not set # CONFIG_SPIRAM_SPEED_120M is not set -CONFIG_SPIRAM_SPEED_80M=y -# CONFIG_SUPPORTS_EXTERNAL_LED_CONTROL is not set -# -# OpenIris: Serial Communication Settings -# -CONFIG_UART_PORT_NUMER=1 -# end of OpenIris: Serial Communication Settings \ No newline at end of file +CONFIG_SPIRAM_SPEED_80M=y \ No newline at end of file diff --git a/boards/wrooms3QIO/wrooms3QIO b/boards/wrooms3QIO/wrooms3QIO index 8ec862f..6e29d37 100644 --- a/boards/wrooms3QIO/wrooms3QIO +++ b/boards/wrooms3QIO/wrooms3QIO @@ -49,9 +49,4 @@ CONFIG_SPIRAM_CS_IO=26 # CONFIG_SPIRAM_RODATA is not set # CONFIG_SPIRAM_SPEED_120M is not set CONFIG_SPIRAM_SPEED_80M=y -# CONFIG_SUPPORTS_EXTERNAL_LED_CONTROL is not set -# -# OpenIris: Serial Communication Settings -# -CONFIG_UART_PORT_NUMER=1 -# end of OpenIris: Serial Communication Settings \ No newline at end of file +# CONFIG_SUPPORTS_EXTERNAL_LED_CONTROL is not set \ No newline at end of file diff --git a/boards/wrover/wrover b/boards/wrover/wrover index 4b0ffcf..dfd2e0b 100644 --- a/boards/wrover/wrover +++ b/boards/wrover/wrover @@ -49,9 +49,4 @@ CONFIG_SPIRAM_CS_IO=26 # CONFIG_SPIRAM_RODATA is not set # CONFIG_SPIRAM_SPEED_120M is not set CONFIG_SPIRAM_SPEED_80M=y -# CONFIG_SUPPORTS_EXTERNAL_LED_CONTROL is not set -# -# OpenIris: Serial Communication Settings -# -CONFIG_UART_PORT_NUMER=1 -# end of OpenIris: Serial Communication Settings \ No newline at end of file +# CONFIG_SUPPORTS_EXTERNAL_LED_CONTROL is not set \ No newline at end of file diff --git a/components/SerialManager/CMakeLists.txt b/components/SerialManager/CMakeLists.txt index 539c961..cf72e7e 100644 --- a/components/SerialManager/CMakeLists.txt +++ b/components/SerialManager/CMakeLists.txt @@ -5,7 +5,7 @@ set ( ProjectConfig ) -if ("$ENV{IDF_ETARGET}" STREQUAL "esp32s3") +if ("$ENV{IDF_TARGET}" STREQUAL "esp32s3") list(APPEND requires tinyusb ) @@ -16,7 +16,7 @@ set ( "SerialManager/SerialManager.cpp" ) -if ("$ENV{IDF_ETARGET}" STREQUAL "esp32s3" OR "$ENV{IDF_ETARGET}" STREQUAL "esp32s2" ) +if ("$ENV{IDF_TARGET}" STREQUAL "esp32s3" ) list(APPEND source_files "SerialManager/SerialManager_esp32s3.cpp" ) diff --git a/components/SerialManager/SerialManager/SerialManager.hpp b/components/SerialManager/SerialManager/SerialManager.hpp index 87ab770..f48e6b8 100644 --- a/components/SerialManager/SerialManager/SerialManager.hpp +++ b/components/SerialManager/SerialManager/SerialManager.hpp @@ -10,6 +10,7 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" +#include "sdkconfig.h" #include "esp_log.h" #include "driver/gpio.h" #include "esp_vfs_dev.h" diff --git a/components/SerialManager/SerialManager/SerialManager_esp32.cpp b/components/SerialManager/SerialManager/SerialManager_esp32.cpp index f2e01de..0052310 100644 --- a/components/SerialManager/SerialManager/SerialManager_esp32.cpp +++ b/components/SerialManager/SerialManager/SerialManager_esp32.cpp @@ -5,27 +5,87 @@ void SerialManager::setup() { - // usb_serial_jtag_driver_config_t usb_serial_jtag_config; - // usb_serial_jtag_config.rx_buffer_size = BUF_SIZE; - // usb_serial_jtag_config.tx_buffer_size = BUF_SIZE; - // usb_serial_jtag_driver_install(&usb_serial_jtag_config); + 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, + }; + + const auto uart_num = static_cast(CONFIG_UART_PORT_NUMBER); + + uart_driver_install(uart_num, BUF_SIZE, BUF_SIZE, 0, NULL, 0); + uart_param_config(uart_num, &uart_config); + + uart_set_pin(uart_num, + CONFIG_UART_TX_PIN, + CONFIG_UART_RX_PIN, + UART_PIN_NO_CHANGE, + UART_PIN_NO_CHANGE); +} + +void uart_write_bytes_chunked(uart_port_t uart_num, const void *src, size_t size) +{ + while (size > 0) + { + auto to_write = size > BUF_SIZE ? BUF_SIZE : size; + auto written = uart_write_bytes(uart_num, src, to_write); + src += written; + size -= written; + } } void SerialManager::try_receive() { + static auto current_position = 0; + const auto uart_num = static_cast(CONFIG_UART_PORT_NUMBER); + int len = uart_read_bytes(uart_num, this->temp_data, BUF_SIZE, 1000 / 20); + + // If driver is uninstalled or an error occurs, abort read gracefully + if (len <= 0) + { + return; + } + + if (len > 0) + { + notify_startup_command_received(); + } + + // since we've got something on the serial port + // we gotta keep reading until we've got the whole message + // we will submit the command once we get a newline, a return or the buffer is full + for (auto i = 0; i < len; i++) + { + this->data[current_position++] = this->temp_data[i]; + // if we're at the end of the buffer, try to process the command anyway + // if we've got a new line, we've finished sending the commands, process them + if (current_position >= BUF_SIZE || this->data[current_position - 1] == '\n' || this->data[current_position - 1] == '\r') + { + data[current_position] = '\0'; + current_position = 0; + + const nlohmann::json result = this->commandManager->executeFromJson(std::string_view(reinterpret_cast(this->data))); + const auto resultMessage = result.dump(); + // todo check if this works + // uart_write_bytes_chunked(uart_num, resultMessage.c_str(), resultMessage.length())s + uart_write_bytes(uart_num, resultMessage.c_str(), resultMessage.length()); + } + } } void SerialManager::shutdown() { - // Stop heartbeats; timer will be deleted by main if needed. - // Uninstall the USB Serial JTAG driver to free the internal USB for TinyUSB. - // esp_err_t err = usb_serial_jtag_driver_uninstall(); - // if (err == ESP_OK) - // { - // ESP_LOGI("[SERIAL]", "usb_serial_jtag driver uninstalled"); - // } - // else if (err != ESP_ERR_INVALID_STATE) - // { - // ESP_LOGW("[SERIAL]", "usb_serial_jtag_driver_uninstall returned %s", esp_err_to_name(err)); - // } + // Uninstall the UART driver to free the internal to keep compatibility with JTAG implementation. + const auto uart_num = static_cast(CONFIG_UART_PORT_NUMBER); + esp_err_t err = uart_driver_delete(uart_num); + if (err == ESP_OK) + { + ESP_LOGI("[SERIAL]", "usb_serial_jtag driver uninstalled"); + } + else if (err != ESP_ERR_INVALID_STATE) + { + ESP_LOGW("[SERIAL]", "usb_serial_jtag_driver_uninstall returned %s", esp_err_to_name(err)); + } } diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 6f300b6..be12760 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -108,13 +108,25 @@ menu "OpenIris: WiFi Configuration" endmenu menu "OpenIris: Serial Communication Settings" - config UART_PORT_NUMER + config UART_PORT_NUMBER int "UART Port number" - default 1 - range 1 4 + default 0 + range 0 4 help The UART port to use for communication + config UART_RX_PIN + int "UART RX PIN number" + default -1 + help + The UART RX pin to use for communication. If set to -1 we won't override it. It will be treated as NO_CHANGE + + config UART_TX_PIN + int "UART TX PIN number" + default -1 + help + The UART TX pin to use for communication. If set to -1 we won't override it. It will be treated as NO_CHANGE + endmenu menu "OpenIris: LED Configuration" diff --git a/sdkconfig b/sdkconfig index 12e8c19..f5343b4 100644 --- a/sdkconfig +++ b/sdkconfig @@ -447,20 +447,18 @@ CONFIG_WIFI_AP_PASSWORD="12345678" # # OpenIris: Serial Communication Settings # -CONFIG_USE_UART_FOR_COMMUNICATION=y -CONFIG_UART_PORT_NUMER=1 +CONFIG_UART_PORT_NUMBER=0 +CONFIG_UART_RX_PIN=-1 +CONFIG_UART_TX_PIN=-1 # end of OpenIris: Serial Communication Settings # # OpenIris: LED Configuration # CONFIG_LED_DEBUG_ENABLE=y -CONFIG_LED_DEBUG_GPIO=8 +CONFIG_LED_DEBUG_GPIO=33 CONFIG_LED_EXTERNAL_GPIO=1 -CONFIG_LED_EXTERNAL_CONTROL=y -# CONFIG_LED_EXTERNAL_AS_DEBUG is not set -CONFIG_LED_EXTERNAL_PWM_FREQ=5000 -CONFIG_LED_EXTERNAL_PWM_DUTY_CYCLE=100 +# CONFIG_LED_EXTERNAL_CONTROL is not set # end of OpenIris: LED Configuration # diff --git a/sdkconfig.old b/sdkconfig.old index 61476e1..50e5dcf 100644 --- a/sdkconfig.old +++ b/sdkconfig.old @@ -447,30 +447,24 @@ CONFIG_WIFI_AP_PASSWORD="12345678" # # OpenIris: Serial Communication Settings # -CONFIG_UART_PORT_NUMER=1 +CONFIG_UART_PORT_NUMBER=1 +CONFIG_UART_RX_PIN=-1 +CONFIG_UART_TX_PIN=-1 # end of OpenIris: Serial Communication Settings # # OpenIris: LED Configuration # CONFIG_LED_DEBUG_ENABLE=y -CONFIG_LED_DEBUG_GPIO=8 +CONFIG_LED_DEBUG_GPIO=33 CONFIG_LED_EXTERNAL_GPIO=1 -CONFIG_LED_EXTERNAL_CONTROL=y -# CONFIG_LED_EXTERNAL_AS_DEBUG is not set -CONFIG_LED_EXTERNAL_PWM_FREQ=5000 -CONFIG_LED_EXTERNAL_PWM_DUTY_CYCLE=100 +# CONFIG_LED_EXTERNAL_CONTROL is not set # end of OpenIris: LED Configuration # # OpenIris: Monitoring # -CONFIG_MONITORING_LED_CURRENT=y -CONFIG_MONITORING_LED_ADC_GPIO=3 -CONFIG_MONITORING_LED_GAIN=11 -CONFIG_MONITORING_LED_SHUNT_MILLIOHM=22000 -CONFIG_MONITORING_LED_SAMPLES=10 -CONFIG_MONITORING_LED_INTERVAL_MS=500 +# CONFIG_MONITORING_LED_CURRENT is not set # end of OpenIris: Monitoring # diff --git a/tools/setup_openiris.py b/tools/setup_openiris.py index d94f0dc..35f3fb6 100644 --- a/tools/setup_openiris.py +++ b/tools/setup_openiris.py @@ -101,6 +101,8 @@ class OpenIrisDevice: self.connection = serial.Serial( port=self.port, baudrate=115200, timeout=1, write_timeout=1 ) + self.connection.dtr = False + self.connection.rts = False print(f"✅ Connected to the device on {self.port}") return True except Exception as e: