From 1fd8737fe4e6621d96ea858f6249e24eb05867e4 Mon Sep 17 00:00:00 2001 From: AlexanderHD27 Date: Fri, 3 Jan 2025 12:33:51 +0100 Subject: [PATCH] Fixed major UART Issue, I hate it --- .../docs/.$NetworkStack.drawio.bkp | 231 ++++++++++++++---- .../i2c-hub-firmware/docs/NetworkStack.drawio | 230 +++++++++++++---- .../src/gobotrpc/cmake/CMakeLists.txt | 5 +- .../src/gobotrpc/ctrl_interface/base.cpp | 18 +- .../gobotrpc/ctrl_interface/hardware_base.cpp | 2 - .../ctrl_interface/hardware_rp2040_uart.cpp | 107 -------- .../uart_rp2040/hardware_rp2040_uart.cpp | 53 ++++ .../ctrl_interface/uart_rp2040/rx.cpp | 120 +++++++++ .../src/gobotrpc/include/ctrl_interface.hpp | 10 +- .../include/ctrl_interface_hardware.hpp | 26 +- .../src/gobotrpc/include/protocol.hpp | 28 +++ .../src/gobotrpc/protocol_base.cpp | 25 ++ .../firmware/i2c-hub-firmware/src/main.cpp | 14 +- .../__pycache__/rpc_packages.cpython-312.pyc | Bin 8180 -> 8104 bytes .../gobotrpc/__pycache__/util.cpython-312.pyc | Bin 2732 -> 2732 bytes .../uart-adapter/src/gobotrpc/rpc_packages.py | 4 +- i2c-hub/uart-adapter/src/gobotrpc/util.py | 2 +- i2c-hub/uart-adapter/src/main.py | 4 +- .../__pycache__/ci_packages.cpython-312.pyc | Bin 4771 -> 6279 bytes .../__pycache__/serial.cpython-312.pyc | Bin 3389 -> 3562 bytes .../src/uart_interface/ci_packages.py | 4 +- .../uart-adapter/src/uart_interface/serial.py | 4 +- 22 files changed, 665 insertions(+), 222 deletions(-) delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/hardware_base.cpp delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/hardware_rp2040_uart.cpp create mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/uart_rp2040/hardware_rp2040_uart.cpp create mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/uart_rp2040/rx.cpp create mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/protocol.hpp create mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/protocol_base.cpp diff --git a/i2c-hub/firmware/i2c-hub-firmware/docs/.$NetworkStack.drawio.bkp b/i2c-hub/firmware/i2c-hub-firmware/docs/.$NetworkStack.drawio.bkp index fca7327..9067b56 100644 --- a/i2c-hub/firmware/i2c-hub-firmware/docs/.$NetworkStack.drawio.bkp +++ b/i2c-hub/firmware/i2c-hub-firmware/docs/.$NetworkStack.drawio.bkp @@ -1,9 +1,15 @@ - + + + + + + + @@ -484,10 +490,10 @@ - + - + @@ -535,10 +541,10 @@ - + - + @@ -736,73 +742,73 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + @@ -811,16 +817,16 @@ - + - + - + - + @@ -912,13 +918,13 @@ - + - + - + @@ -927,16 +933,16 @@ - + - + - + - + @@ -950,6 +956,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/i2c-hub/firmware/i2c-hub-firmware/docs/NetworkStack.drawio b/i2c-hub/firmware/i2c-hub-firmware/docs/NetworkStack.drawio index 25e1878..d2ca0c3 100644 --- a/i2c-hub/firmware/i2c-hub-firmware/docs/NetworkStack.drawio +++ b/i2c-hub/firmware/i2c-hub-firmware/docs/NetworkStack.drawio @@ -1,9 +1,15 @@ - + + + + + + + @@ -484,10 +490,10 @@ - + - + @@ -736,91 +742,88 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + @@ -912,13 +915,13 @@ - + - + - + @@ -927,16 +930,16 @@ - + - + - + - + @@ -950,6 +953,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/cmake/CMakeLists.txt b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/cmake/CMakeLists.txt index df66bba..d57b443 100644 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/cmake/CMakeLists.txt +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/cmake/CMakeLists.txt @@ -1,8 +1,9 @@ add_library(GobotRPC STATIC ${CMAKE_CURRENT_LIST_DIR}/../ctrl_interface/base.cpp - ${CMAKE_CURRENT_LIST_DIR}/../ctrl_interface/hardware_rp2040_uart.cpp - ${CMAKE_CURRENT_LIST_DIR}/../ctrl_interface/hardware_base.cpp + ${CMAKE_CURRENT_LIST_DIR}/../ctrl_interface/uart_rp2040/hardware_rp2040_uart.cpp + ${CMAKE_CURRENT_LIST_DIR}/../ctrl_interface/uart_rp2040/rx.cpp ${CMAKE_CURRENT_LIST_DIR}/../crc16.cpp + ${CMAKE_CURRENT_LIST_DIR}/../protocol_base.cpp ) target_include_directories(GobotRPC PUBLIC diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/base.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/base.cpp index 3252a81..fe751f8 100644 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/base.cpp +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/base.cpp @@ -21,10 +21,12 @@ void GobotRPC_CI_rxData_cb(void * args, char *data, size_t len) { void GobotRPC_CI::onRxData(char *data, size_t len) { GobotRPC_CI_CMD cmd = (GobotRPC_CI_CMD)data[0]; + switch (cmd) { case TX_CI_PACKET: if(this->cb_TxPacket != NULL) { - this->cb_TxPacket(this->cb_TxPacket_args, data+1, len-1); + uint32_t addr = (data[2] << 24) | (data[3] << 16) | (data[4] << 8) | data[5]; + this->cb_TxPacket(this->cb_TxPacket_args, data+6, len-6, addr); } break; default: @@ -37,10 +39,16 @@ void GobotRPC_CI::registerCB_TxPacket(callback_TxPacket cb, void *args) { this->cb_TxPacket_args = args; } -void GobotRPC_CI::send_RxPacket(char *data, size_t len) { +void GobotRPC_CI::send_RxPacket(char *data, size_t len, uint32_t addr) { data[0] = RX_CI_PACKET; + data[1] = len + CI_RX_PACKAGE_DATA_OFFSET; - this->hardware->send(data, len+1); + data[2] = (addr >> 24) & 0xff; + data[3] = (addr >> 16) & 0xff; + data[4] = (addr >> 8) & 0xff; + data[5] = addr & 0xff; + + this->hardware->send(data, len+6); } // Heartbeat Task @@ -51,9 +59,9 @@ void GobotRPC_CI_heartBeatTaskFn(void *args) { } void GobotRPC_CI::heartBeartTaskFn() { - char heartBeatPacket[] = {0xff}; + char heartBeatPacket[] = {0xff, 0x02}; while(1) { - this->hardware->send(heartBeatPacket, 1); + this->hardware->send(heartBeatPacket, 2); vTaskDelay(GOBOTRPC_HEARTBEAT_INTERVAL / portTICK_PERIOD_MS); } } \ No newline at end of file diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/hardware_base.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/hardware_base.cpp deleted file mode 100644 index 0251667..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/hardware_base.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "ctrl_interface_hardware.hpp" - diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/hardware_rp2040_uart.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/hardware_rp2040_uart.cpp deleted file mode 100644 index e5c1a6b..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/hardware_rp2040_uart.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include "ctrl_interface_hardware.hpp" -#include "pinConfig.hpp" - -#include "pico/stdlib.h" -#include "hardware/uart.h" - -#include "FreeRTOS.h" -#include "task.h" -#include "queue.h" -#include - -// Initialize stuff -GobotRPC_CI_Hardware_RP2040_UART * g_GobotRPC_CI_Hardware_RP2040_UART; - -GobotRPC_CI_Hardware_RP2040_UART::GobotRPC_CI_Hardware_RP2040_UART(uart_inst_t *uart, uint baudrate) { - g_GobotRPC_CI_Hardware_RP2040_UART = this; - - emptyInputBuffersQueue = xQueueCreate(NUM_INPUT_BUFFERS, sizeof(inputBuffers_t *)); - filledInputBuffersQueue = xQueueCreate(NUM_INPUT_BUFFERS, sizeof(inputBuffers_t *)); - - for(int i = 0; i < NUM_INPUT_BUFFERS; i++) { - inputBuffers_t * p = &inputBufferPool[i]; - memset(p->data, 0xff, 256); - p->len = 0; - xQueueSend(emptyInputBuffersQueue, &p, portMAX_DELAY); - } - - txMutex = xSemaphoreCreateMutex(); - - this->uart = uart; - uart_init(this->uart, baudrate); - - gpio_set_function(GOBOTRPC_CI_UART_RX, UART_FUNCSEL_NUM(uart, GOBOTRPC_CI_UART_RX)); - gpio_set_function(GOBOTRPC_CI_UART_TX, UART_FUNCSEL_NUM(uart, GOBOTRPC_CI_UART_TX)); - - uart_set_hw_flow(uart, false, false); - uart_set_format(uart, 8, 1, UART_PARITY_NONE); - uart_set_baudrate(uart, baudrate); - uart_set_fifo_enabled(uart, true); - - int UART_IRQ = uart == uart0 ? UART0_IRQ : UART1_IRQ; - - irq_set_exclusive_handler(UART_IRQ, GobotRPC_CI_Hardware_RP2040_UART_isr); - irq_set_enabled(UART_IRQ, true); - - uart_set_irq_enables(uart, true, false); - - - xTaskCreate(GobotRPC_CI_Hardware_RP2040_UART_RXTaskFn, "UART RX Task", 2048, this, 4, &this->rxTaskHandle); -} - -void GobotRPC_CI_Hardware_RP2040_UART::registerCB_RxData(callback_rxData cb, void *args) { - this->cb_rxData = cb; - this->cb_rxData_args = args; -} - - -// Sending data -void GobotRPC_CI_Hardware_RP2040_UART::send(char *data, size_t len) { - xSemaphoreTake(txMutex, portMAX_DELAY); - uart_write_blocking(this->uart, (uint8_t *)(data), len); - xSemaphoreGive(txMutex); -} - -// Rx ISR -void GobotRPC_CI_Hardware_RP2040_UART_isr() { - GobotRPC_CI_Hardware_RP2040_UART *uart = (GobotRPC_CI_Hardware_RP2040_UART *)g_GobotRPC_CI_Hardware_RP2040_UART; - uart->rxISR(); -}; - -void GobotRPC_CI_Hardware_RP2040_UART::rxISR() { - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - - inputBuffers_t * inputBuffer; - - xQueueReceiveFromISR(emptyInputBuffersQueue, &inputBuffer, &xHigherPriorityTaskWoken); - - int i; - for(i = 0; uart_is_readable(this->uart) && i < 256; i++) { - volatile uint8_t c = uart_getc(this->uart); - inputBuffer->data[i] = c; - } - inputBuffer->len = i; - - xQueueSendFromISR(filledInputBuffersQueue, &inputBuffer, &xHigherPriorityTaskWoken); - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); -} - -// Rx Task -void GobotRPC_CI_Hardware_RP2040_UART_RXTaskFn(void *args) { - GobotRPC_CI_Hardware_RP2040_UART *uart = (GobotRPC_CI_Hardware_RP2040_UART *)args; - uart->rxTask(); -}; - -void GobotRPC_CI_Hardware_RP2040_UART::rxTask() { - inputBuffers_t * inputBuffer; - - while (1) { - xQueueReceive(filledInputBuffersQueue, &inputBuffer, portMAX_DELAY); - - if(inputBuffer->len > 0) { - cb_rxData(cb_rxData_args, inputBuffer->data, inputBuffer->len); - } - - xQueueSend(emptyInputBuffersQueue, &inputBuffer, portMAX_DELAY); - } -} diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/uart_rp2040/hardware_rp2040_uart.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/uart_rp2040/hardware_rp2040_uart.cpp new file mode 100644 index 0000000..cad8b18 --- /dev/null +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/uart_rp2040/hardware_rp2040_uart.cpp @@ -0,0 +1,53 @@ +#include "ctrl_interface_hardware.hpp" +#include "pinConfig.hpp" + +#include "pico/stdlib.h" +#include "hardware/uart.h" + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include + +// Initialize stuff +GobotRPC_CI_Hardware_RP2040_UART * g_GobotRPC_CI_Hardware_RP2040_UART; + +GobotRPC_CI_Hardware_RP2040_UART::GobotRPC_CI_Hardware_RP2040_UART(uart_inst_t *uart, uint baudrate) { + g_GobotRPC_CI_Hardware_RP2040_UART = this; + + initRxTaskAndQueues(); + + txMutex = xSemaphoreCreateMutex(); + + this->uart = uart; + uart_init(this->uart, baudrate); + + gpio_set_function(GOBOTRPC_CI_UART_RX, UART_FUNCSEL_NUM(uart, GOBOTRPC_CI_UART_RX)); + gpio_set_function(GOBOTRPC_CI_UART_TX, UART_FUNCSEL_NUM(uart, GOBOTRPC_CI_UART_TX)); + + uart_set_hw_flow(uart, false, false); + uart_set_format(uart, 8, 1, UART_PARITY_NONE); + uart_set_baudrate(uart, baudrate); + uart_set_fifo_enabled(uart, true); + + int UART_IRQ = uart == uart0 ? UART0_IRQ : UART1_IRQ; + + irq_set_exclusive_handler(UART_IRQ, GobotRPC_CI_Hardware_RP2040_UART_isr); + irq_set_enabled(UART_IRQ, true); + + uart_set_irq_enables(uart, true, false); +} + +void GobotRPC_CI_Hardware_RP2040_UART::registerCB_RxData(callback_rxData cb, void *args) { + this->cb_rxData = cb; + this->cb_rxData_args = args; +} + + +// Sending data +void GobotRPC_CI_Hardware_RP2040_UART::send(char *data, size_t len) { + xSemaphoreTake(txMutex, portMAX_DELAY); + uart_write_blocking(this->uart, (uint8_t *)(data), len); + uart_tx_wait_blocking(this->uart); + xSemaphoreGive(txMutex); +} diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/uart_rp2040/rx.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/uart_rp2040/rx.cpp new file mode 100644 index 0000000..2983b2c --- /dev/null +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/uart_rp2040/rx.cpp @@ -0,0 +1,120 @@ +#include "ctrl_interface_hardware.hpp" +#include "pico/stdlib.h" + +#include + +#include "FreeRTOS.h" +#include "FreeRTOSConfig.h" + +// External Functions +void GobotRPC_CI_Hardware_RP2040_UART_isr() { + GobotRPC_CI_Hardware_RP2040_UART *uart = (GobotRPC_CI_Hardware_RP2040_UART *)g_GobotRPC_CI_Hardware_RP2040_UART; + uart->onRx_ISR(); +}; + +void GobotRPC_CI_Hardware_RP2040_UART_Task_RXProcessing(void *args) { + GobotRPC_CI_Hardware_RP2040_UART *uart = (GobotRPC_CI_Hardware_RP2040_UART *)args; + uart->rxProcessingTaskFn(); +} + +// Init + +void GobotRPC_CI_Hardware_RP2040_UART::initRxTaskAndQueues() { + emptyInputBuffersQueue = xQueueCreate(NUM_INPUT_BUFFERS, sizeof(inputBuffers_t *)); + filledInputBuffersQueue = xQueueCreate(NUM_INPUT_BUFFERS, sizeof(inputBuffers_t *)); + + for(int i = 0; i < NUM_INPUT_BUFFERS; i++) { + inputBuffers_t * p = &inputBufferPool[i]; + memset(p->data, 0xff, 256); + p->len = 0; + p->state = NEW; + p->expected_length = 0; + xQueueSend(emptyInputBuffersQueue, &p, portMAX_DELAY); + } + + rxSignalSemaphore = xSemaphoreCreateBinary(); + xTaskCreate(GobotRPC_CI_Hardware_RP2040_UART_Task_RXProcessing, "UART RX Processing", 1024, this, 3, &this->rxProcessingTaskHandle); +} + +inputBufferRXState_t fillBuffer(inputBuffers_t * buffer, char data) { + switch(buffer->state) { + case NEW: + buffer->data[0] = data; + buffer->len = 1; + buffer->state = READ_SIZE; + break; + + case READ_SIZE: + buffer->data[1] = data; + buffer->expected_length = data; + buffer->len += 1; + + if(buffer->len == buffer->expected_length) { + buffer->state = FULL; + } else { + buffer->state = READ_DATA; + } + break; + + case READ_DATA: + buffer->data[buffer->len] = data; + buffer->len += 1; + + if(buffer->len == buffer->expected_length) { + buffer->state = FULL; + } else { + buffer->state = READ_DATA; + } + break; + + case FULL: + break; + } + return buffer->state; +} + +// real Task Fns +void GobotRPC_CI_Hardware_RP2040_UART::onRx_ISR() { + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + static inputBuffers_t * inputBuffer = NULL; + + while (uart_is_readable(this->uart)) { + + if(inputBuffer == NULL) { + xQueueReceiveFromISR(emptyInputBuffersQueue, &inputBuffer, &xHigherPriorityTaskWoken); + + if(inputBuffer == NULL) { + return; // No more buffers -> device overload + } + + inputBuffer->state = NEW; + inputBuffer->len = 0; + inputBuffer->expected_length = 0; + } + + inputBufferRXState_t state = fillBuffer(inputBuffer, uart_getc(this->uart)); + + if (state == FULL) { + xQueueSendFromISR(filledInputBuffersQueue, &inputBuffer, &xHigherPriorityTaskWoken); + inputBuffer = NULL; + } + } + + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); +} + + +void GobotRPC_CI_Hardware_RP2040_UART::rxProcessingTaskFn() { + inputBuffers_t * inputBuffer = NULL; + + while(1) { + xQueueReceive(filledInputBuffersQueue, &inputBuffer, portMAX_DELAY); + + if(this->cb_rxData != NULL) { + this->cb_rxData(this->cb_rxData_args, inputBuffer->data, inputBuffer->len); + } + + vTaskDelay(1000); + } +} \ No newline at end of file diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/ctrl_interface.hpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/ctrl_interface.hpp index 4ab5416..b4c815a 100644 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/ctrl_interface.hpp +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/ctrl_interface.hpp @@ -9,7 +9,13 @@ enum GobotRPC_CI_CMD { SCAN_RESULT_CI_PACKET = 0x04, }; -typedef void (*callback_TxPacket)(void * args, char *data, size_t len); +#define CI_TX_PACKAGE_DATA_OFFSET 6 +#define CI_TX_PACKAGE_SIZE(data_len) (data_len + CI_TX_PACKAGE_SIZE) + +#define CI_RX_PACKAGE_DATA_OFFSET 6 +#define CI_RX_PACKAGE_SIZE(data_len) (data_len + CI_RX_PACKAGE_DATA_OFFSET) + +typedef void (*callback_TxPacket)(void * args, char *data, size_t len, uint32_t addr); void GobotRPC_CI_rxData_cb(void * args, char *data, size_t len); void GobotRPC_CI_heartBeatTaskFn(void *args); @@ -26,7 +32,7 @@ public: GobotRPC_CI(I_GobotRPC_CI_Hardware *hardware); void registerCB_TxPacket(callback_TxPacket cb, void *args); - void send_RxPacket(char *data, size_t len); + void send_RxPacket(char *data, size_t len, uint32_t addr); void onRxData(char *data, size_t len); diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/ctrl_interface_hardware.hpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/ctrl_interface_hardware.hpp index 372007a..317d6e6 100644 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/ctrl_interface_hardware.hpp +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/ctrl_interface_hardware.hpp @@ -19,13 +19,23 @@ public: #include "hardware/uart.h" void GobotRPC_CI_Hardware_RP2040_UART_isr(); -void GobotRPC_CI_Hardware_RP2040_UART_RXTaskFn(void *args); +void GobotRPC_CI_Hardware_RP2040_UART_Task_RXBuffering(void *args); +void GobotRPC_CI_Hardware_RP2040_UART_Task_RXProcessing(void *args); #define NUM_INPUT_BUFFERS 16 +enum inputBufferRXState_t { + NEW, + READ_SIZE, + READ_DATA, + FULL +}; + struct inputBuffers_t { char data[256]; + size_t expected_length; size_t len; + inputBufferRXState_t state; }; class GobotRPC_CI_Hardware_RP2040_UART : public I_GobotRPC_CI_Hardware { @@ -34,22 +44,28 @@ private: inputBuffers_t inputBufferPool[NUM_INPUT_BUFFERS]; - TaskHandle_t rxTaskHandle; - SemaphoreHandle_t txMutex; + TaskHandle_t rxProcessingTaskHandle; + + SemaphoreHandle_t rxSignalSemaphore; QueueHandle_t emptyInputBuffersQueue; QueueHandle_t filledInputBuffersQueue; callback_rxData cb_rxData; void * cb_rxData_args; + SemaphoreHandle_t txMutex; + public: GobotRPC_CI_Hardware_RP2040_UART(uart_inst_t *uart, uint baudrate); void send(char *data, size_t len) override; void registerCB_RxData(callback_rxData cb, void *args); - void rxISR(); - void rxTask(); + void initRxTaskAndQueues(); + void onRx_ISR(); + void rxBufferingTaskFn(); + void rxProcessingTaskFn(); + }; extern GobotRPC_CI_Hardware_RP2040_UART * g_GobotRPC_CI_Hardware_RP2040_UART; diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/protocol.hpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/protocol.hpp new file mode 100644 index 0000000..3173946 --- /dev/null +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/protocol.hpp @@ -0,0 +1,28 @@ +#pragma once +#include +#include + +enum GobotRPCNumber { + VACUM = 0x8 +}; + +enum GobotRPCTypes { + REQUEST = 0b00, + RESPONSE = 0b01, + ERROR = 0b10 +}; + +#define GobotRPC_Package_DATA_OFFSET 2 +#define CALC_SIZE_GobotRPC_PACKAGE(data_len) (data_len + GobotRPC_Package_DATA_OFFSET + 2) + +struct GobotRPCHeaderInfo { +public: + GobotRPCNumber number; + GobotRPCTypes type; + size_t len; +}; + +void assembleGobotRPCHeader(char * buffer, GobotRPCNumber number, GobotRPCTypes data_size, size_t); +void assembleCRC(char * buffer, size_t data_len); + +GobotRPCHeaderInfo extractGobotRPCHeader(char * buffer); \ No newline at end of file diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/protocol_base.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/protocol_base.cpp new file mode 100644 index 0000000..71e5eda --- /dev/null +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/protocol_base.cpp @@ -0,0 +1,25 @@ +#include "protocol.hpp" +#include + +#include "pico/stdlib.h" + +#include "crc16.hpp" + +void assembleGobotRPCHeader(char * buffer, GobotRPCNumber number, GobotRPCTypes type, size_t len) { + buffer[0] = ((number & 0b1111) << 4) | ((type & 0b11) << 2); + buffer[1] = (len + 4) & 0xff; +} + +GobotRPCHeaderInfo extractGobotRPCHeader(char * buffer) { + GobotRPCHeaderInfo info; + info.number = (GobotRPCNumber)((buffer[0] >> 4) & 0b1111); + info.type = (GobotRPCTypes)((buffer[0] >> 2) & 0b11); + info.len = buffer[1]; + return info; +} + +void assembleCRC(char * buffer, size_t data_len) { + unsigned short crc = crc16(buffer, data_len + GobotRPC_Package_DATA_OFFSET); + buffer[GobotRPC_Package_DATA_OFFSET + data_len + 1] = crc & 0xff; + buffer[GobotRPC_Package_DATA_OFFSET + data_len + 0] = (crc >> 8) & 0xff; +} \ No newline at end of file diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/main.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/main.cpp index da2f908..e8ab063 100644 --- a/i2c-hub/firmware/i2c-hub-firmware/src/main.cpp +++ b/i2c-hub/firmware/i2c-hub-firmware/src/main.cpp @@ -8,7 +8,7 @@ #include "FreeRTOS.h" #include "task.h" -#include "crc16.hpp" +#include "protocol.hpp" #define LED_PIN 25 @@ -21,16 +21,16 @@ void vTaskMain(void * pvParameters) { } } -void onTxPacket(void * args, char *data, size_t len) { +void onTxPacket(void * args, char *data, size_t len, uint32_t addr) { GobotRPC_CI * gobotRPC_ci = (GobotRPC_CI *)args; - char buffer[] = {0x00, 0x74, 0x04, 0x00, 0x00}; - unsigned short crc = crc16(buffer + 1, 2); + char bufferPackage[CI_RX_PACKAGE_SIZE(CALC_SIZE_GobotRPC_PACKAGE(0))]; + char * gorpcPackageOffset = bufferPackage + CI_RX_PACKAGE_DATA_OFFSET; - buffer[4] = crc & 0xff; - buffer[3] = (crc >> 8) & 0xff; + assembleGobotRPCHeader(gorpcPackageOffset, GobotRPCNumber::VACUM, GobotRPCTypes::RESPONSE, 0); + assembleCRC(gorpcPackageOffset, 0); - gobotRPC_ci->send_RxPacket(buffer, 4); + gobotRPC_ci->send_RxPacket(bufferPackage, CALC_SIZE_GobotRPC_PACKAGE(0), addr); } int main() { diff --git a/i2c-hub/uart-adapter/src/gobotrpc/__pycache__/rpc_packages.cpython-312.pyc b/i2c-hub/uart-adapter/src/gobotrpc/__pycache__/rpc_packages.cpython-312.pyc index f704140759b8fb5fbdfb03cd879d4453bc3840d9..103a4001836fdd95d7b6e6a858c827b6c9321cb5 100644 GIT binary patch delta 213 zcmexjzrvpPG%qg~0}z~WE>EAlk$0;oSy|m}({m@`+AXU>9U!shQl!X2Qrd z`5}+UWFB!rZXS>h5Xj;Oi`j_FGO|vN5?7x5mYs`R03rt>CpSpT0F7Xsyq<$cma~R= zHbV+i2^&m43tgojJ0DXG%j7rguBWNfH)}Jd>|W)Ulf|GB7kSJlUKj aS~^Ic~<~~hcaXU delta 348 zcmZ2s|HYp7G%qg~0}v!wm8Z|y$h%cE;2aYJ!*qrcMvy27)G%f-Ls-br84wf1e z9ZV(MljGPGC*Kw0o7~H;FqvCihLLl!hPW~#*W`EX=E4Z8IBS?eR+WIn4JIpy@v+pf z06A40$cngXSfGlkIKYY~CrDWE^4(%BD9X$$xy783S}}R1M4hM;(4!3ucQ|-EQu;GG kGrF^`a7fYQ>i_@% diff --git a/i2c-hub/uart-adapter/src/gobotrpc/__pycache__/util.cpython-312.pyc b/i2c-hub/uart-adapter/src/gobotrpc/__pycache__/util.cpython-312.pyc index f79dc47d9c93cbeadd9a7e15499f238c192961b9..5cd9d46cb046baa996be556a4932323ff2290b2f 100644 GIT binary patch delta 52 zcmZ1@x<-`iG%qg~0}z}#xsmHL6C=mwe@s(ZnTjMQPvr<>wBP)OgNu>Te)4xtSw`2% HqFmDfpG*&# delta 52 zcmZ1@x<-`iG%qg~0}ymsZshvR#K^w+AJbG;rk5O(r*ecbI&6N!!NthvF!?*DETh|G HQLgC#iZu^0 diff --git a/i2c-hub/uart-adapter/src/gobotrpc/rpc_packages.py b/i2c-hub/uart-adapter/src/gobotrpc/rpc_packages.py index 197e9dd..a3ee150 100644 --- a/i2c-hub/uart-adapter/src/gobotrpc/rpc_packages.py +++ b/i2c-hub/uart-adapter/src/gobotrpc/rpc_packages.py @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:94a2f416ae25bc6bec4b97285346eb5557c1025f821da274cb063442d4aaaaa3 -size 4491 +oid sha256:827884e6e9509b4d94f8d80f6363d11bee093d82090e65e684208895c8fe0c38 +size 4499 diff --git a/i2c-hub/uart-adapter/src/gobotrpc/util.py b/i2c-hub/uart-adapter/src/gobotrpc/util.py index d7248e3..ca06d44 100644 --- a/i2c-hub/uart-adapter/src/gobotrpc/util.py +++ b/i2c-hub/uart-adapter/src/gobotrpc/util.py @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e6c50a0d555b1c8e86908fd7004c1ea3015ded95c0dc01b40cc75331becbafd7 +oid sha256:12d6e83d9b2d6cb5865a64e3bf9a6ae672abf8fca663e3e85eeb9da87387c800 size 1624 diff --git a/i2c-hub/uart-adapter/src/main.py b/i2c-hub/uart-adapter/src/main.py index a0567fb..f83f68e 100644 --- a/i2c-hub/uart-adapter/src/main.py +++ b/i2c-hub/uart-adapter/src/main.py @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f3d9810f5770ec45007e8eccd750759b2849dc5ce54aeaef8de390d30b84a6fd -size 884 +oid sha256:120cba198feb749ecca11be7855635deec8014897fb0ce89b7eef1ffc4783cfc +size 901 diff --git a/i2c-hub/uart-adapter/src/uart_interface/__pycache__/ci_packages.cpython-312.pyc b/i2c-hub/uart-adapter/src/uart_interface/__pycache__/ci_packages.cpython-312.pyc index ac10889a73e6c89e32bc544b95e4be75c2c88515..8b430a79679c5e2b8312c620ef76e7704c12cd0f 100644 GIT binary patch literal 6279 zcmeHLU2GKB6~1?8W_NZyX2CfA0sjmw6fY1Pr=&3iNQ|N20t>+qf?r1Kov~wQ?KOAC z4YnMDBC2Ak5umoRBNEk*SX8PXjZ`U4pOE^p%eFF_5DBS$;mv4?8u_W`+?m;(U6xd7 zn?|jAr9JoTnS0OuJNJC&+&@-VM+lThpS?TuvnoRVf`7asxlDcxm|3C|ou){?Q`3G5 z{{yMOsL(G`lnKB~{SqYsa+K)eRiaCVbVqP>^ar^#2-1*G8sbtJq+y>_o}{tJW9%4@ zQM>hMdLV6`Io+f6SS+RWj#&m9Oe77hCp|iv7}KFiq^DOqok+fu7&4O1cn&RDz|Ua` z2El3f2lR+e4Piv~H+FbEU`T`FH8Mzb;c9h%P#2BRU_h6yiv6-4o4YNA?mNzjwH15pM78AP8lJ3UvQIW@A{veQF(^+D1F_IZ! zntTZBxZ_GFnWoc33wRBt1Msh)YmzL`_=0Fl=ES(cY+2KW$A&FUVz0? zQDTQREtyJ~rly%9v`|&`%G$Y(x6`9WM!$7z-xF_MNM49BZ!LoIO1;& zU$Bhea?8p)ufRrauuvZ_dcf0li+mEe1KP2CKtU?-5yFmyz?j}wuA|wfL$oTix&;@+ z(*n9hulEPk;#U&&j^Kus73dSxLz{>$-*MLj7EqY4wZUsXQsZ&O8v2HGvWa+OLC?Zi zlOz_7GgLX%+B^2sL~2-9-7BUJrkRSS+}(4$`{)t%F>b?Jwb#lVo-)+6h-zFK2NN-L z^)YIB90Xzu1H(gb7sQ^Ehx_bEQHL$T2or`Kc@wK6jHQ_^q>M3J0OPSEgDgF&4NO{w z$*tCwx!JMtq}?!{V5Z?&mF8=Rd$15-QK;BPASTX2RT=IG+X7^&q15t>enXTJ-ziQ{hnx;(a!6j?C`|i6-!JgepuhSQs0%W?^>!|N-Pa5HRS3Kfw?OT&(IDs!;>T1CM0-eALF`XGWUSCY^7a0Q}O#|Bmh73zfj_Ok{l-@B{jJuh~TL!*8y7Bt^Gw)~Q zmS-o1fXyd{KnM{BKwTxf2GJL*M1r=19b z;g}ptZOQSGI6gxQbk3*)I9q^OvmYT>?E-w#NToCl4sSh3`4V4uoFiU!h6I1+X&_%+ zB~Jo^)HpA%s9jmL3k*qWTsFVNYBeHDJ#=m&Pq1FCm88bGZFvIK>N+a5&ei4#RI5QM z#p&F}zrmk4b8G=Xm`Hskk*L6l7xI<-Qy1jaf4x!kAukn`oUi} z=vBF2fY%NYUM>W9xsc$c19^Pu@LoNFz{?;HgB)KyBK&ou3W6)yu7x=7*pcotXAd3e zKI=Vll$@gg!{RTGK}^}J1_XAcuNsquC=;VZ9^630$#Xd#t#F@r#fOy5mBudsCO-rO zS>I#ApXE*e2qOOgJ^tHY4L3T9ji`W%OyScoIbr zIt-g?>OlO-_1Mj^mAW0-x*hkccJSo-z>>b)d3R{(LZuI5-qIrdGH>s5g$>T`e& z16yv3H~0zr-i1(FR(#1T_A4uu(qVtv`t`bX!Qa+NQDdS%Ma75#jzWdX7t-S$c8;Um zNAbk7@@?=y<~VdV(cfYAfE7 z8=oOp7Yo}$Vj$_{lk4!+w)jZP@CrEL3~n6H(l}u8p6m?D5Tv>DU6c1asp>&?4rFKy vCc@sTKq>v4L_R0cFUX-U$hN2AW*VnAe)5!H{d8aHzZ%*$x9>{=6<7Ut>S~ca literal 4771 zcmds5O>7%Q6rR~1d*j$OO-m9=e#}oHZfM;gAO=!O8lp7(gwlorzAPK>CL}m^7;k_? zQK?WRngaqPAVGlWk*Ei9bWd>SViQo%0w=g|3vv;t7kF=GcfEFvK!5kbFqwS%2sGvf~zQ*FkA-t5bzrCEx?C?j{x5ayas&qJb963Vy8$l;>19s z$tOLfobZCHofJ3`O@n{c!$97mYsB^^SEUv5DwzMGE1_hCt`Ob-dWme%i4ECNi;D{u zb2MF_&ClAp&cKBPGR5~(JD+3M==fC$oh8#5e6W)&;?-Dzy>D0 z4!D|~=7OtX2A?_4>te|1vx9`N-8O2$A5-%7dY8N}U8F+#GPPUW1!Rt=g*Os!_(nF# zKH{whkA%DxOC+gGFjQx`cRc^Rk()IWZh$7H3oL=bFg)_m@YrbLdps@~c9fAv9ysMh zYBP=s-z{2B_wK(y5!vNIH@5jHBH6MZBmmJG&X!#$@oe*bQ^l0U(eI@wV4iR#)D8;Dblsd33vL zpwcz4Ik0JM#fM7v$19gswvSF$j!teJJza^PE^DW`UF+r{cfvE4t!L-W#n8jRKFBFm90G`T^!mDyFQ0;bta*Be!J#polBIS|ylZ~ajDD7q27aAxzd za(u9?4RW2iIW~47faZ;POV^!! zB+@?;80=_@IzrbMs|4RWQK~*c*Y{TmzIQ@Y?OorCgI?s*>wA6zJ}oYb`)1+Kf4ubi zck1IwzdmyJ)*-(iKYyk+a<4K3a25mN)jeTlze?4P_p8+P_z7mGuoq%!omT&&dW5%k z>k$XLWS9r76RAxIe8YmvW1n&BAl$JoAi*NTF!FhI2^h6jU3&4G9wb;67!K<&%s1;HMr z-wG8>bM`{PJU%*na`M>d@TAxJ*EzP%q75BCRLJ^{f5|V_*q!l01BIJ6dAxGqWfErt zpw`{&d>`A;az*?)(1CxU?fX5Xn}#p`iOw7PXK1_dPRl*b`e)y;iKHTss>K%tfT}q% z^)|Ik4WMpE+uQ*p*#73<$ZxkFsI(vWtn~nIe~*;RPX;c{l%6Vgk8QObFGr8>$RyhT zd!Y6->|58EVH7kxf34AlwvNM-+6YghaEvfcW7;8vEjJGs51{UXB}K&QV3#`a&ct@t z;Y!!x%^Nl!--_Q`*6#g#@r$e6s4d5@uBJ|OVeD>Hw$_%OSv^zMy06v@R*AM$0cMTB z{~09Fc>1yAl5(5Z^l*Rfj}hIE1ZWk7x^fkna<1 zVV?+H+$`DR$i`GwG`YL*hkxyNKEr?&^$yJ@`cyoatHH2Q6&vC2%`4iF=%4Rn55o{k vSrKovBU4JhB9X61{2OxY8?yhh(niy-KX{qI>vCU^kJG;OdwwMF;@kcTKdN(K diff --git a/i2c-hub/uart-adapter/src/uart_interface/__pycache__/serial.cpython-312.pyc b/i2c-hub/uart-adapter/src/uart_interface/__pycache__/serial.cpython-312.pyc index 34b7188b442c8aac5a8e159f869c066c2591fff9..3111c1ef778e2d9fcbd8ccf878392cc448eaeb0c 100644 GIT binary patch delta 683 zcmdlh^-7xWG%qg~0}$MEE>D+Z+sL<+g_{k?Wd`EUX^fNOIi)7wU@2u3nY@EZZE^{# zrLaXUa|tg<2MDAv*Dz-BPcCGa5?jp#5n^O05rnW97_x*wQbvpnkqjvewaj(QJ*yye zIb%6P1#=`rIin_v-%AEY28JS#_9|AF#F9iSO`ge&Y--%B1x1;8CAXL}QY$8_v2`-` zPTs&~TF=TWc}Lc0gUMxCiwRsGco=vE`+Ylouk*-WZ)^B{MNh4q>0c24WYfPX5I1$EZEok)w%GYw{6} zXh!|X3Y^LYst|=h5(-#>G&nr-fQ;!3B|zUoKnf!;^q4_Gq=X2)8ip(um;wZy#Xfl= zyYS>bPF_7tCci3<;MBa7%)E3fO_m}BpsFH85Wx*3Zn2gZWtOCBG8KV519aqePHSl+ zAhTEnNHj3q;o$AanxQgZW2VMztt%X=lmBv_6Epi%B37ZGEyJ{WY;eao80`A(wtPgBG1VWcsxY48D$peT~~6w NsO0*U0muO>1pv3TpUnUO delta 554 zcmaDQy;q9wG%qg~0}vP(m8YL&-N?6;g_{M)Wd`EUMvRjma!5_S!BQ$J08)brvVbyH zW@vIvwqaA7oX6I|SUdSUn`u1@ujCzBqYWmPWi2Lfec)o?73}xz^u5j_dyz+WM%EP` z%@5KH{KEY?y*WR=2r-Dreqvw(>JX5;E}(o-K>3P*>Ky@z-yc|kg1?HzffnrIcGPD$ zsL$yn#(dC1#7U6(kRU6NU8Dk(O9r_B20*@KW|+L2y@L%TSEM}Ilf#cuYw`?^CPt0P z(wxzZdXvjJm8F$|l2|kXgUD*~0}lPk5?p*TMH)awnoLF9KAhTEmNHj1^Ud44zOdrGth6#g0kpz$|G6ND-ijxIdWZ05(@{3bVCU4-LAg&FP zG5`{{Sd%JCQj3eUz-lLl^H{R-v1)x#nmm<9g@=(_IY8AOd9TFAkgB{FKt1RJ$Vg$-TTDqMD2{3-qolxn5Lq L{mKC3fRzFO`u2VL diff --git a/i2c-hub/uart-adapter/src/uart_interface/ci_packages.py b/i2c-hub/uart-adapter/src/uart_interface/ci_packages.py index 155e6e0..b396f58 100644 --- a/i2c-hub/uart-adapter/src/uart_interface/ci_packages.py +++ b/i2c-hub/uart-adapter/src/uart_interface/ci_packages.py @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:05f5ad9f0af15d0134a52d785b8ed5f3d66ebb88a1896982e3179a61c483c17f -size 2047 +oid sha256:2713d957d8574b3e116a495d0331c97a622b2f5af70f6fd96ba5a21b2a29ce81 +size 2949 diff --git a/i2c-hub/uart-adapter/src/uart_interface/serial.py b/i2c-hub/uart-adapter/src/uart_interface/serial.py index 0167038..3129425 100644 --- a/i2c-hub/uart-adapter/src/uart_interface/serial.py +++ b/i2c-hub/uart-adapter/src/uart_interface/serial.py @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c3a0046b2cde7b7d3029bacb87a8702ee0444919b8ac159b12791c4685ee0319 -size 1485 +oid sha256:03090dfe27e6ae777e63dd99984950813e7d39e8f142aa22cb2b4d04562fce43 +size 1566