diff --git a/components/SerialManager/CMakeLists.txt b/components/SerialManager/CMakeLists.txt new file mode 100644 index 0000000..0cd7215 --- /dev/null +++ b/components/SerialManager/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "SerialManager/SerialManager.cpp" + INCLUDE_DIRS "SerialManager" + REQUIRES esp_driver_uart CommandManager +) \ No newline at end of file diff --git a/components/SerialManager/SerialManager/SerialManager.cpp b/components/SerialManager/SerialManager/SerialManager.cpp new file mode 100644 index 0000000..fad837a --- /dev/null +++ b/components/SerialManager/SerialManager/SerialManager.cpp @@ -0,0 +1,49 @@ +#include "SerialManager.hpp" + +#define ECHO_TEST_TXD (4) +#define ECHO_TEST_RXD (5) +#define ECHO_TEST_RTS (UART_PIN_NO_CHANGE) +#define ECHO_TEST_CTS (UART_PIN_NO_CHANGE) + +#define ECHO_UART_PORT_NUM (1) +#define ECHO_UART_BAUD_RATE (115200) +#define ECHO_TASK_STACK_SIZE (3072) + +static const char *TAG = "UART TEST"; + +#define BUF_SIZE (1024) +uint8_t *data; + +SerialManager::SerialManager(std::shared_ptr commandManager) : commandManager(commandManager) {} + +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); + // Configure a temporary buffer for the incoming data + data = (uint8_t *)malloc(BUF_SIZE); +} + +// rewrite this to serial events or something +void SerialManager::try_receive() +{ + int len = usb_serial_jtag_read_bytes(data, (BUF_SIZE - 1), 20 / portTICK_PERIOD_MS); + if (len) + { + auto result = this->commandManager->executeFromJson(std::string_view((const char *)data)); + auto resultMessage = result.getResult(); + usb_serial_jtag_write_bytes(resultMessage.c_str(), resultMessage.length(), 20 / portTICK_PERIOD_MS); + } +} + +void HandleSerialManagerTask(void *pvParameters) +{ + auto serialManager = static_cast(pvParameters); + + while (1) + { + serialManager->try_receive(); + } +} \ No newline at end of file diff --git a/components/SerialManager/SerialManager/SerialManager.hpp b/components/SerialManager/SerialManager/SerialManager.hpp new file mode 100644 index 0000000..3990439 --- /dev/null +++ b/components/SerialManager/SerialManager/SerialManager.hpp @@ -0,0 +1,32 @@ +#pragma once +#ifndef SERIALMANAGER_HPP +#define SERIALMANAGER_HPP + +#include +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "driver/uart.h" +#include "esp_log.h" +#include "driver/gpio.h" +#include "driver/usb_serial_jtag.h" +#include "esp_vfs_usb_serial_jtag.h" +#include "esp_vfs_dev.h" + +class SerialManager +{ +public: + SerialManager(std::shared_ptr commandManager); + void setup(); + void try_receive(); + +private: + QueueHandle_t serialQueue; + std::shared_ptr commandManager; +}; + +void HandleSerialManagerTask(void *pvParameters); +#endif \ No newline at end of file diff --git a/main/openiris_main.cpp b/main/openiris_main.cpp index 1d88953..fd8ac30 100644 --- a/main/openiris_main.cpp +++ b/main/openiris_main.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -58,6 +59,8 @@ UVCStreamManager uvcStream; LEDManager *ledManager = new LEDManager(BLINK_GPIO, CONFIG_LED_C_PIN_GPIO, ledStateQueue); +SerialManager *serialManager = new SerialManager(commandManager); + static void initNVSStorage() { esp_err_t ret = nvs_flash_init(); @@ -117,8 +120,9 @@ extern "C" void app_main(void) // rethink state management - DONE - // port serial manager - // add support of commands to UVC + // port serial manager - DONE - needs rewrite + // instead of the UVCCDC thing - give the board 30s for serial commands and then determine if we should reboot into UVC + // add endpoint to check firmware version // add firmware version somewhere // setup CI and building for other boards @@ -148,6 +152,16 @@ extern "C" void app_main(void) NULL); deviceConfig->load(); + serialManager->setup(); + + xTaskCreate( + HandleSerialManagerTask, + "HandleSerialManagerTask", + 1024 * 6, + serialManager, + 3, + NULL); + wifiManager.Begin(); mdnsManager.start(); restAPI->begin();