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 f704140..103a400 100644 Binary files a/i2c-hub/uart-adapter/src/gobotrpc/__pycache__/rpc_packages.cpython-312.pyc and b/i2c-hub/uart-adapter/src/gobotrpc/__pycache__/rpc_packages.cpython-312.pyc differ 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 f79dc47..5cd9d46 100644 Binary files a/i2c-hub/uart-adapter/src/gobotrpc/__pycache__/util.cpython-312.pyc and b/i2c-hub/uart-adapter/src/gobotrpc/__pycache__/util.cpython-312.pyc differ 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 ac10889..8b430a7 100644 Binary files a/i2c-hub/uart-adapter/src/uart_interface/__pycache__/ci_packages.cpython-312.pyc and b/i2c-hub/uart-adapter/src/uart_interface/__pycache__/ci_packages.cpython-312.pyc differ 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 34b7188..3111c1e 100644 Binary files a/i2c-hub/uart-adapter/src/uart_interface/__pycache__/serial.cpython-312.pyc and b/i2c-hub/uart-adapter/src/uart_interface/__pycache__/serial.cpython-312.pyc differ 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