From cbf702c6d5bde54019eb1ce677c690ca1ddf4a18 Mon Sep 17 00:00:00 2001 From: AlexanderHD27 Date: Fri, 3 Jan 2025 02:24:34 +0100 Subject: [PATCH] Implemented PACKET_RX,PACKET_TX and Heartbeat of GobotRPC_CtrlInterface --- .../firmware/i2c-hub-firmware/CMakeLists.txt | 2 +- .../docs/.$NetworkStack.drawio.bkp | 201 +++++++++++++++++- .../i2c-hub-firmware/docs/NetworkStack.drawio | 136 +++++++++++- .../src/gobotrpc/cmake/CMakeLists.txt | 14 +- .../i2c-hub-firmware/src/gobotrpc/crc16.cpp | 37 ++++ .../src/gobotrpc/ctrl_interface/base.cpp | 59 +++++ .../ctrl_interface/ctrl_interface_base.cpp | 40 ---- .../ctrl_interface_hardware_rp2040.cpp | 113 ---------- .../ctrl_interface_registers.cpp | 22 -- .../ctrl_interface/ctrl_interface_rx.cpp | 73 ------- .../ctrl_interface/ctrl_interface_tx.cpp | 49 ----- .../gobotrpc/ctrl_interface/hardware_base.cpp | 2 + .../ctrl_interface/hardware_rp2040_uart.cpp | 107 ++++++++++ .../src/gobotrpc/error_msg.cpp | 43 ---- .../src/gobotrpc/include/crc16.hpp | 2 + .../src/gobotrpc/include/ctrl_interface.hpp | 69 ++---- .../include/ctrl_interface_hardware.hpp | 88 ++++---- .../src/gobotrpc/include/gobotrpc.hpp | 36 ---- .../gobotrpc/include/gobotrpc_datatypes.hpp | 35 --- .../src/gobotrpc/include/pinConfig.hpp | 6 + .../src/gobotrpc/include/protocol.hpp | 32 --- .../i2c-hub-firmware/src/gobotrpc/init.cpp | 22 -- .../src/gobotrpc/protocol.cpp | 64 ------ .../i2c-hub-firmware/src/gobotrpc/rx.cpp | 134 ------------ .../firmware/i2c-hub-firmware/src/main.cpp | 74 +++---- i2c-hub/uart-adapter/src/gobotrpc/__init__.py | 4 +- .../__pycache__/__init__.cpython-312.pyc | Bin 1903 -> 1907 bytes .../__pycache__/mapping.cpython-312.pyc | Bin 2247 -> 2255 bytes .../__pycache__/packages.cpython-312.pyc | Bin 6718 -> 7272 bytes .../__pycache__/rpc_packages.cpython-312.pyc | Bin 0 -> 8180 bytes .../gobotrpc/__pycache__/util.cpython-312.pyc | Bin 2010 -> 2732 bytes i2c-hub/uart-adapter/src/gobotrpc/mapping.py | 4 +- i2c-hub/uart-adapter/src/gobotrpc/packages.py | 3 - .../uart-adapter/src/gobotrpc/rpc_packages.py | 3 + i2c-hub/uart-adapter/src/gobotrpc/util.py | 4 +- i2c-hub/uart-adapter/src/main.py | 4 +- .../src/uart_interface/__init__.py | 4 +- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2583 bytes .../__pycache__/ci_packages.cpython-312.pyc | Bin 0 -> 4771 bytes .../__pycache__/package.cpython-312.pyc | Bin 0 -> 4767 bytes .../pares_packages.cpython-312.pyc | Bin 0 -> 1070 bytes .../__pycache__/serial.cpython-312.pyc | Bin 0 -> 3389 bytes .../src/uart_interface/ci_packages.py | 3 + .../src/uart_interface/pares_packages.py | 3 + .../uart-adapter/src/uart_interface/serial.py | 4 +- 45 files changed, 653 insertions(+), 843 deletions(-) create mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/crc16.cpp create mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/base.cpp delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_base.cpp delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_hardware_rp2040.cpp delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_registers.cpp delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_rx.cpp delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_tx.cpp create mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/hardware_base.cpp create mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/hardware_rp2040_uart.cpp delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/error_msg.cpp create mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/crc16.hpp delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/gobotrpc.hpp delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/gobotrpc_datatypes.hpp create mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/pinConfig.hpp delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/protocol.hpp delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/init.cpp delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/protocol.cpp delete mode 100644 i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/rx.cpp create mode 100644 i2c-hub/uart-adapter/src/gobotrpc/__pycache__/rpc_packages.cpython-312.pyc delete mode 100644 i2c-hub/uart-adapter/src/gobotrpc/packages.py create mode 100644 i2c-hub/uart-adapter/src/gobotrpc/rpc_packages.py create mode 100644 i2c-hub/uart-adapter/src/uart_interface/__pycache__/__init__.cpython-312.pyc create mode 100644 i2c-hub/uart-adapter/src/uart_interface/__pycache__/ci_packages.cpython-312.pyc create mode 100644 i2c-hub/uart-adapter/src/uart_interface/__pycache__/package.cpython-312.pyc create mode 100644 i2c-hub/uart-adapter/src/uart_interface/__pycache__/pares_packages.cpython-312.pyc create mode 100644 i2c-hub/uart-adapter/src/uart_interface/__pycache__/serial.cpython-312.pyc create mode 100644 i2c-hub/uart-adapter/src/uart_interface/ci_packages.py create mode 100644 i2c-hub/uart-adapter/src/uart_interface/pares_packages.py diff --git a/i2c-hub/firmware/i2c-hub-firmware/CMakeLists.txt b/i2c-hub/firmware/i2c-hub-firmware/CMakeLists.txt index cb95956..fabc90e 100644 --- a/i2c-hub/firmware/i2c-hub-firmware/CMakeLists.txt +++ b/i2c-hub/firmware/i2c-hub-firmware/CMakeLists.txt @@ -58,7 +58,7 @@ target_link_libraries(i2c-hub-firmware GobotRPC pico_stdlib ) - + # Add the standard include files to the build target_include_directories(i2c-hub-firmware PRIVATE ${CMAKE_CURRENT_LIST_DIR} 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 6768d38..fca7327 100644 --- a/i2c-hub/firmware/i2c-hub-firmware/docs/.$NetworkStack.drawio.bkp +++ b/i2c-hub/firmware/i2c-hub-firmware/docs/.$NetworkStack.drawio.bkp @@ -1,6 +1,6 @@ - + @@ -627,7 +627,7 @@ - + @@ -735,8 +735,8 @@ - - + + @@ -751,25 +751,204 @@ - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/i2c-hub/firmware/i2c-hub-firmware/docs/NetworkStack.drawio b/i2c-hub/firmware/i2c-hub-firmware/docs/NetworkStack.drawio index a3ca9d7..25e1878 100644 --- a/i2c-hub/firmware/i2c-hub-firmware/docs/NetworkStack.drawio +++ b/i2c-hub/firmware/i2c-hub-firmware/docs/NetworkStack.drawio @@ -1,6 +1,6 @@ - + @@ -535,10 +535,10 @@ - + - + @@ -627,7 +627,7 @@ - + @@ -822,6 +822,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 3666edb..df66bba 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,14 +1,8 @@ add_library(GobotRPC STATIC - ${CMAKE_CURRENT_LIST_DIR}/../rx.cpp - ${CMAKE_CURRENT_LIST_DIR}/../init.cpp - ${CMAKE_CURRENT_LIST_DIR}/../protocol.cpp - ${CMAKE_CURRENT_LIST_DIR}/../error_msg.cpp - - ${CMAKE_CURRENT_LIST_DIR}/../ctrl_interface/ctrl_interface_base.cpp - ${CMAKE_CURRENT_LIST_DIR}/../ctrl_interface/ctrl_interface_registers.cpp - ${CMAKE_CURRENT_LIST_DIR}/../ctrl_interface/ctrl_interface_rx.cpp - ${CMAKE_CURRENT_LIST_DIR}/../ctrl_interface/ctrl_interface_tx.cpp - ${CMAKE_CURRENT_LIST_DIR}/../ctrl_interface/ctrl_interface_hardware_rp2040.cpp + ${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}/../crc16.cpp ) target_include_directories(GobotRPC PUBLIC diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/crc16.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/crc16.cpp new file mode 100644 index 0000000..f3ff135 --- /dev/null +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/crc16.cpp @@ -0,0 +1,37 @@ +#define POLY 0x8408 +/* +// 16 12 5 +// this is the CCITT CRC 16 polynomial X + X + X + 1. +// This works out to be 0x1021, but the way the algorithm works +// lets us use 0x8408 (the reverse of the bit pattern). The high +// bit is always assumed to be set, thus we only use 16 bits to +// represent the 17 bit value. +*/ + +unsigned short crc16(char *data_p, unsigned short length) +{ + unsigned char i; + unsigned int data; + unsigned int crc = 0xffff; + + if (length == 0) + return (~crc); + + do + { + for (i=0, data=(unsigned int)0xff & *data_p++; + i < 8; + i++, data >>= 1) + { + if ((crc & 0x0001) ^ (data & 0x0001)) + crc = (crc >> 1) ^ POLY; + else crc >>= 1; + } + } while (--length); + + crc = ~crc; + data = crc; + crc = (crc << 8) | (data >> 8 & 0xff); + + return (crc); +} 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 new file mode 100644 index 0000000..3252a81 --- /dev/null +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/base.cpp @@ -0,0 +1,59 @@ +#include "ctrl_interface.hpp" +#include "pinConfig.hpp" + +#include "FreeRTOSConfig.h" +#include "FreeRTOS.h" +#include "task.h" + + +GobotRPC_CI::GobotRPC_CI(I_GobotRPC_CI_Hardware *hardware) { + this->hardware = hardware; + this->hardware->registerCB_RxData(GobotRPC_CI_rxData_cb, this); + + xTaskCreate(GobotRPC_CI_heartBeatTaskFn, "Heartbeat Task", 2048, this, 2, &this->heartBeatTaskHandle); +} + +// Rx Side +void GobotRPC_CI_rxData_cb(void * args, char *data, size_t len) { + GobotRPC_CI *gobotRPC = (GobotRPC_CI *)args; + gobotRPC->onRxData(data, 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); + } + break; + default: + break; + } +} + +void GobotRPC_CI::registerCB_TxPacket(callback_TxPacket cb, void *args) { + this->cb_TxPacket = cb; + this->cb_TxPacket_args = args; +} + +void GobotRPC_CI::send_RxPacket(char *data, size_t len) { + data[0] = RX_CI_PACKET; + + this->hardware->send(data, len+1); +} + +// Heartbeat Task + +void GobotRPC_CI_heartBeatTaskFn(void *args) { + GobotRPC_CI *gobotRPC = (GobotRPC_CI *)args; + gobotRPC->heartBeartTaskFn(); +} + +void GobotRPC_CI::heartBeartTaskFn() { + char heartBeatPacket[] = {0xff}; + while(1) { + this->hardware->send(heartBeatPacket, 1); + 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/ctrl_interface_base.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_base.cpp deleted file mode 100644 index 1fa2796..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_base.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "ctrl_interface.hpp" -#include -#include -#include - -GobotRPC_CtrlInterface::GobotRPC_CtrlInterface(I_GobotRPC_CtrlInterface_HardwareHandler *ctrlInterface) { - this->handler = ctrlInterface; - handler->registerCallback(externalCallback_RX, this); - handler->registerHeartBeatCallback(externalCallback_HeartBeat, this); - - packetCallback = nullptr; - performScanCallback = nullptr; - getInfoCallback = nullptr; - reqSlotUpdateCallback = nullptr; - - packetCallbackArgs = nullptr; - performScanCallbackArgs = nullptr; - getInfoCallbackArgs = nullptr; - reqSlotUpdateCallbackArgs = nullptr; -} - -void GobotRPC_CtrlInterface::printf(const char *fmt, ...) { - char buffer[256]; - va_list args; - va_start(args, fmt); - - vsnprintf(buffer, 256, fmt, args); - handler->send(buffer, strlen(buffer)); -} - -// Sending HeartBeat -void GobotRPC_CtrlInterface::onHeartBeat() { - char buffer = GOBOTRPC_CTRL_CMD_HEART_BEAT; - handler->send(&buffer, 1); -} - -void externalCallback_HeartBeat(void * args) { - GobotRPC_CtrlInterface *ctrlInterface = (GobotRPC_CtrlInterface *)args; - ctrlInterface->onHeartBeat(); -} \ No newline at end of file diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_hardware_rp2040.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_hardware_rp2040.cpp deleted file mode 100644 index 5ee5931..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_hardware_rp2040.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include "ctrl_interface.hpp" - -#ifdef GOBOTRPC_PLATFORM_RP2040 -#include "pico/stdlib.h" -#include "hardware/uart.h" -#include "hardware/irq.h" - -#include "FreeRTOS.h" -#include "semphr.h" -#include "task.h" - -#define STOP_BITS 1 -#define PARITY UART_PARITY_ODD - -GobotRPC_CtrlInterface_HardwareHandler_RP2040 * g_uart_hardware_handler; - -GobotRPC_CtrlInterface_HardwareHandler_RP2040::GobotRPC_CtrlInterface_HardwareHandler_RP2040( - uart_inst_t * uart_instance, uint baudrate, uint heartBeatDelay, - uint tx_pin, uint rx_pin) { - - callback_rx = nullptr; - callback_args = nullptr; - callback_heart_beat = nullptr; - callback_heart_beat_args = nullptr; - - this->heartBeatDelay = heartBeatDelay; - - this->rxSemphrHandle = xSemaphoreCreateCounting(16, 0); - g_uart_hardware_handler = this; - xTaskCreate(vTaskRxHandler, "gobotrpc_ctrl_interface_uart_rx", 1024, this, 3, &this->rxTaskHandle); - xTaskCreate(vTaskHeartBeat, "gobotrpc_ctrl_interface_heart_beat", 1024, this, 2, &this->heartBeatTaskHandle); - - gpio_set_function(tx_pin, UART_FUNCSEL_NUM(uart_instance, tx_pin)); - gpio_set_function(rx_pin, UART_FUNCSEL_NUM(uart_instance, rx_pin)); - - uart_init(uart_instance, baudrate); - this->uart_instance = uart_instance; - - uart_set_format(uart_instance, 8, STOP_BITS, PARITY); - - this->UART_IRQ = uart_instance == uart0 ? UART0_IRQ : UART1_IRQ; - irq_set_exclusive_handler(UART_IRQ, isrUartRX); - irq_set_enabled(UART_IRQ, true); - - uart_set_irq_enables(uart_instance, true, false); - uart_set_fifo_enabled(uart_instance, true); -} - -void GobotRPC_CtrlInterface_HardwareHandler_RP2040::send(char * data, size_t length) { - uart_write_blocking(uart_instance, (const uint8_t *)data, length); - uart_tx_wait_blocking(uart_instance); -} - -void GobotRPC_CtrlInterface_HardwareHandler_RP2040::registerCallback(GobotRPC_CtrlInterface_Callback_RX callback, void * args) { - this->callback_rx = callback; - this->callback_args = args; -} - -void GobotRPC_CtrlInterface_HardwareHandler_RP2040::rxTaskHandler() { - char inputBuffer[128]; - size_t length = 0; - - while (true) { - xSemaphoreTake(rxSemphrHandle, portMAX_DELAY); - - for(length = 0; length<128 && uart_is_readable(uart_instance); length++) { - inputBuffer[length] = uart_getc(uart_instance); - } - - if (length > 0 && this->callback_rx != nullptr) { - this->callback_rx(this->callback_args, inputBuffer, length); - } - } -} - -void GobotRPC_CtrlInterface_HardwareHandler_RP2040::heartBeatTaskHandler() { - while (true) { - if (this->callback_heart_beat != nullptr) { - this->callback_heart_beat(this->callback_heart_beat_args); - } - - vTaskDelay(this->heartBeatDelay / portTICK_PERIOD_MS); - } -} - -void GobotRPC_CtrlInterface_HardwareHandler_RP2040::registerHeartBeatCallback(GobotRPC_CtrlInterface_Callback_HeartBeat callback, void * args) { - this->callback_heart_beat = callback; - this->callback_heart_beat_args = args; -} - -void GobotRPC_CtrlInterface_HardwareHandler_RP2040::scheduleRXHandler(BaseType_t * higher_priority_task_woken) { - irq_clear(this->UART_IRQ); - if (this->callback_rx != nullptr) { - xSemaphoreGiveFromISR(rxSemphrHandle, higher_priority_task_woken); - } -} - -void vTaskRxHandler(void * pvParameters) { - g_uart_hardware_handler->rxTaskHandler(); -} - -void vTaskHeartBeat(void * pvParameters) { - g_uart_hardware_handler->heartBeatTaskHandler(); -} - -void isrUartRX() { - static BaseType_t higher_priority_task_woken = pdFALSE; - g_uart_hardware_handler->scheduleRXHandler(&higher_priority_task_woken); - portYIELD_FROM_ISR(higher_priority_task_woken); -} - - -#endif \ No newline at end of file diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_registers.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_registers.cpp deleted file mode 100644 index 0037ba2..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_registers.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "ctrl_interface.hpp" -#include - -void GobotRPC_CtrlInterface::registerCallback_Packet(GobotRPC_CtrlInterface_Callback_Packet callback, void *args) { - packetCallback = callback; - packetCallbackArgs = args; -} - -void GobotRPC_CtrlInterface::registerCallback_PerformScan(GobotRPC_CtrlInterface_Callback_PerformScan callback, void *args) { - performScanCallback = callback; - performScanCallbackArgs = args; -} - -void GobotRPC_CtrlInterface::registerCallback_ReqSlotUpdate(GobotRPC_CtrlInterface_Callback_ReqSlotUpdate callback, void *args) { - reqSlotUpdateCallback = callback; - reqSlotUpdateCallbackArgs = args; -} - -void GobotRPC_CtrlInterface::registerCallback_GetInfo(GobotRPC_CtrlInterface_Callback_GetInfo callback, void *args) { - getInfoCallback = callback; - getInfoCallbackArgs = args; -} \ No newline at end of file diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_rx.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_rx.cpp deleted file mode 100644 index a0e85c0..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_rx.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "ctrl_interface.hpp" -#include "gobotrpc.hpp" -#include - -void externalCallback_RX(void * args, char * data, size_t length) { - GobotRPC_CtrlInterface *interface = (GobotRPC_CtrlInterface *)args; - interface->onRX(data, length); -} - -void GobotRPC_CtrlInterface::onRX(char * data, size_t length) { - uint8_t cmd = data[0]; - switch (cmd) { - case GOBOTRPC_CTRL_CMD_PACKET: - onRX_Packet(data, length); - break; - - case GOBOTRPC_CTRL_CMD_PERFORM_SCAN: - onRX_PerformScan(data, length); - break; - - case GOBOTRPC_CTRL_CMD_REQ_SLOT_UPDATE: - onRX_ReqSlotUpdate(data, length); - break; - - case GOBOTRPC_CTRL_CMD_INFO: - onRX_GetInfo(data, length); - break; - - default: - break; - } -} - -void GobotRPC_CtrlInterface::onRX_Packet(char *data, size_t length) { - if(length < 7) - return; - - - if (packetCallback != nullptr) { - RPCPackage package; - package.length = data[1]; - package.type = RPCType(data[2] & 0b11); - package.rpcNum = RPCNumber(data[2] >> 4); - memcpy(&package.addr, &data[3], 4); - memcpy(package.buffer, &data[7], package.length); - - packetCallback(packetCallbackArgs, package); - } -} - -void GobotRPC_CtrlInterface::onRX_PerformScan(char *data, size_t length) { - if(length < 2) - return; - - if (performScanCallback != nullptr) - performScanCallback(performScanCallbackArgs, data[1] == 1); -} - -void GobotRPC_CtrlInterface::onRX_ReqSlotUpdate(char *data, size_t length) { - if (length < 2) - return; - - if (reqSlotUpdateCallback != nullptr) - reqSlotUpdateCallback(reqSlotUpdateCallbackArgs, data[1] == 1); -} - -void GobotRPC_CtrlInterface::onRX_GetInfo(char *data, size_t length) { - if (length < 1) - return; - - if (getInfoCallback != nullptr) - getInfoCallback(getInfoCallbackArgs); -} \ No newline at end of file diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_tx.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_tx.cpp deleted file mode 100644 index d374c73..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/ctrl_interface_tx.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "ctrl_interface.hpp" -#include - -// This function should be called when a package is sent -void GobotRPC_CtrlInterface::pushPacket(RPCPackage package) { - char buffer[MAX_PAGE_SIZES + 7]; - - buffer[0] = GOBOTRPC_CTRL_CMD_PACKET; - buffer[1] = package.length - 7; - buffer[2] = package.type | (package.rpcNum << 4); - memcpy(&buffer[3], &package.addr, 4); - memcpy(&buffer[7], package.buffer, package.length); - - handler->send(buffer, package.length + 2); -} - -void GobotRPC_CtrlInterface::pushScanResulst(uint32_t addr, bool running) { - char buffer[7]; - - buffer[0] = GOBOTRPC_CTRL_CMD_SCAN_RESULT; - buffer[1] = running ? 1 : 0; - memcpy(&buffer[2], &addr, 4); - buffer[6] = 0; // This is where the type would go - - handler->send(buffer, 7); -} - -void GobotRPC_CtrlInterface::pushPackageSlotUpdate(bool complete, bool inUse, uint32_t slot, uint32_t addr, uint32_t timestamp, uint32_t bits) { - char buffer[16]; - - buffer[0] = GOBOTRPC_CTRL_CMD_SLOT_UPDATE; - buffer[1] = complete ? 1 : 0; - buffer[2] = inUse ? 1 : 0; - buffer[3] = slot; - memcpy(&buffer[4], &addr, 4); - memcpy(&buffer[8], ×tamp, 4); - memcpy(&buffer[12], &bits, 4); - - handler->send(buffer, 14); -} - -void GobotRPC_CtrlInterface::pushInfo(uint8_t slotNumbers) { - char buffer[2]; - - buffer[0] = GOBOTRPC_CTRL_CMD_INFO; - buffer[1] = slotNumbers; - - handler->send(buffer, 2); -} \ 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 new file mode 100644 index 0000000..0251667 --- /dev/null +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/hardware_base.cpp @@ -0,0 +1,2 @@ +#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 new file mode 100644 index 0000000..e5c1a6b --- /dev/null +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/ctrl_interface/hardware_rp2040_uart.cpp @@ -0,0 +1,107 @@ +#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/error_msg.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/error_msg.cpp deleted file mode 100644 index 4773219..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/error_msg.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include "gobotrpc.hpp" -#include - -const char * TEST_MSG_RPC_RESULT_GOOD = "Good"; -const char * TEST_MSG_RPC_RESULT_PACKAGE_READY = "Package Ready"; -const char * TEST_MSG_RPC_RESULT_ERROR_INVALID_FRAMESUBMITIONRESULT = "Invalid FrameSubmitionResult"; -const char * TEST_MSG_RPC_RESULT_ERROR_INVALID_RPC_TYPE = "Invalid RPC Type (0b10)"; -const char * TEST_MSG_RPC_RESULT_ERROR_INVALID_RPC_NUMBER = "Invalid RPC Number"; -const char * TEST_MSG_RPC_RESULT_ERROR_NO_EMPTY_OR_FITTING_SLOT = "No empty or fitting slot for submitted frame"; - -char * mapFrameSubmitionResult2String(FrameSubmitionResult res) { - - switch (res) { - case PENDING: return (char *)(TEST_MSG_RPC_RESULT_GOOD); - case COMPLEATE: return (char *) TEST_MSG_RPC_RESULT_PACKAGE_READY; - - case ERROR_INVALID_RPC_TYPE: return (char *) TEST_MSG_RPC_RESULT_ERROR_INVALID_RPC_TYPE; - case ERROR_INVALID_RPC_NUMBER: return (char *) TEST_MSG_RPC_RESULT_ERROR_INVALID_RPC_NUMBER; - case ERROR_NO_EMPTY_OR_FITTING_SLOT: return (char *) TEST_MSG_RPC_RESULT_ERROR_INVALID_FRAMESUBMITIONRESULT; - } - return (char *) TEST_MSG_RPC_RESULT_ERROR_INVALID_FRAMESUBMITIONRESULT; -} - -void GobotRPCParser::print_out_slots() { - for(int i = 0; i < NUM_SLOTS; i++) { - printf("[%d] %d%d (%x-%d) %d T%08x S=%02d ", i, - buffer[i].is_complete, buffer[i].is_in_use, buffer[i].sender_address, - buffer[i].rpcNum, buffer[i].type, buffer[i].timestamp, buffer[i].length - ); - - for(int j = 0; j < MAX_PAGE_SIZES; j++) { - printf("%02x", buffer[i].buffer[j]); - } - - printf(" "); - - for(int j = 0; j < 32; j++) { - printf("%d", (buffer[i].used_bit_masked >> (31-j)) & 1); - } - - printf("\n"); - } -} diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/crc16.hpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/crc16.hpp new file mode 100644 index 0000000..f3caa33 --- /dev/null +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/crc16.hpp @@ -0,0 +1,2 @@ +#pragma once +unsigned short crc16(char *data_p, unsigned short length); \ 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 6d8dfac..4ab5416 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 @@ -1,63 +1,34 @@ #pragma once -#include -#include "gobotrpc_datatypes.hpp" #include "ctrl_interface_hardware.hpp" +#include -struct HubInfo { - uint8_t slotNumbers; +enum GobotRPC_CI_CMD { + TX_CI_PACKET = 0x01, + RX_CI_PACKET = 0x02, + PERFORM_SCAN_CI_PACKET = 0x03, + SCAN_RESULT_CI_PACKET = 0x04, }; -typedef void (*GobotRPC_CtrlInterface_Callback_Packet)(void * args, RPCPackage package); -typedef void (*GobotRPC_CtrlInterface_Callback_PerformScan)(void * args, bool enable); -typedef void (*GobotRPC_CtrlInterface_Callback_ReqSlotUpdate)(void * args, bool enable); -typedef HubInfo (*GobotRPC_CtrlInterface_Callback_GetInfo)(void * args); +typedef void (*callback_TxPacket)(void * args, char *data, size_t len); +void GobotRPC_CI_rxData_cb(void * args, char *data, size_t len); +void GobotRPC_CI_heartBeatTaskFn(void *args); -void externalCallback_RX(void * args, char * data, size_t length); -void externalCallback_HeartBeat(void * args); - -class GobotRPC_CtrlInterface { +class GobotRPC_CI { private: - GobotRPC_CtrlInterface_Callback_Packet packetCallback; - GobotRPC_CtrlInterface_Callback_PerformScan performScanCallback; - GobotRPC_CtrlInterface_Callback_ReqSlotUpdate reqSlotUpdateCallback; - GobotRPC_CtrlInterface_Callback_GetInfo getInfoCallback; - void * packetCallbackArgs; - void * performScanCallbackArgs; - void * reqSlotUpdateCallbackArgs; - void * getInfoCallbackArgs; + I_GobotRPC_CI_Hardware *hardware; - I_GobotRPC_CtrlInterface_HardwareHandler * handler; -protected: - void onRX_Packet(char * data, size_t length); - void onRX_PerformScan(char * data, size_t length); - void onRX_ReqSlotUpdate(char * data, size_t length); - void onRX_GetInfo(char * data, size_t length); + callback_TxPacket cb_TxPacket; + void * cb_TxPacket_args; + + TaskHandle_t heartBeatTaskHandle; public: - GobotRPC_CtrlInterface(I_GobotRPC_CtrlInterface_HardwareHandler * handler); - void printf(const char *fmt, ...); + GobotRPC_CI(I_GobotRPC_CI_Hardware *hardware); - void onRX(char * data, size_t length); - void onHeartBeat(); + void registerCB_TxPacket(callback_TxPacket cb, void *args); + void send_RxPacket(char *data, size_t len); - void pushPacket(RPCPackage package); - void pushScanResulst(uint32_t addr, bool running); - void pushPackageSlotUpdate(bool complete, bool inUse, uint32_t slot, uint32_t addr, uint32_t timestamp, uint32_t bits); - void pushInfo(uint8_t slotNumbers); + void onRxData(char *data, size_t len); - void registerCallback_Packet(GobotRPC_CtrlInterface_Callback_Packet callback, void * args); - void registerCallback_PerformScan(GobotRPC_CtrlInterface_Callback_PerformScan callback, void * args); - void registerCallback_ReqSlotUpdate(GobotRPC_CtrlInterface_Callback_ReqSlotUpdate callback, void * args); - void registerCallback_GetInfo(GobotRPC_CtrlInterface_Callback_GetInfo callback, void * args); -}; - - -enum UART_CTRL_Command_ID { - GOBOTRPC_CTRL_CMD_PACKET = 0x81, // Host <-> Hub - GOBOTRPC_CTRL_CMD_PERFORM_SCAN = 0x82, // Host -> Hub - GOBOTRPC_CTRL_CMD_SCAN_RESULT = 0x83, // Hub -> Host - GOBOTRPC_CTRL_CMD_SLOT_UPDATE = 0x84, // Hub -> Host - GOBOTRPC_CTRL_CMD_REQ_SLOT_UPDATE = 0x85, // Host -> Hub - GOBOTRPC_CTRL_CMD_HEART_BEAT = 0xfe, // Host <- Hub - GOBOTRPC_CTRL_CMD_INFO = 0xff, // Host -> Hub, Hub -> Host + void heartBeartTaskFn(); }; \ No newline at end of file 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 9500306..372007a 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 @@ -1,58 +1,56 @@ #pragma once -#include +#include -typedef void (*GobotRPC_CtrlInterface_Callback_RX)(void * args, char * data, size_t length); -typedef void (*GobotRPC_CtrlInterface_Callback_HeartBeat)(void * args); - - -class I_GobotRPC_CtrlInterface_HardwareHandler { -public: - virtual void send(char * data, size_t length) = 0; - virtual void registerCallback(GobotRPC_CtrlInterface_Callback_RX, void * args) = 0; - virtual void registerHeartBeatCallback(GobotRPC_CtrlInterface_Callback_HeartBeat, void * args) = 0; -}; - - -#define GOBOTRPC_PLATFORM_RP2040 -#ifdef GOBOTRPC_PLATFORM_RP2040 +#include "FreeRTOSConfig.h" #include "FreeRTOS.h" #include "task.h" #include "semphr.h" -#include "hardware/uart.h" +#include "queue.h" -class GobotRPC_CtrlInterface_HardwareHandler_RP2040 : public I_GobotRPC_CtrlInterface_HardwareHandler { -private: - uart_inst_t * uart_instance; - int UART_IRQ; - - GobotRPC_CtrlInterface_Callback_RX callback_rx; - void * callback_args; - - GobotRPC_CtrlInterface_Callback_HeartBeat callback_heart_beat; - void * callback_heart_beat_args; - - xSemaphoreHandle rxSemphrHandle; - TaskHandle_t rxTaskHandle; - TaskHandle_t heartBeatTaskHandle; - - uint heartBeatDelay; +typedef void (*callback_rxData)(void * args, char *data, size_t len); +class I_GobotRPC_CI_Hardware { public: - GobotRPC_CtrlInterface_HardwareHandler_RP2040(uart_inst_t * uart_instance, uint baudrate, uint heartBeatDelay, uint tx_pin, uint rx_pin); - void send(char * data, size_t length) override; - void registerCallback(GobotRPC_CtrlInterface_Callback_RX, void * args) override; - void registerHeartBeatCallback(GobotRPC_CtrlInterface_Callback_HeartBeat, void * args); - - void rxTaskHandler(); - void heartBeatTaskHandler(); - void scheduleRXHandler(BaseType_t * higher_priority_task_woken); + virtual void send(char *data, size_t len) = 0; + virtual void registerCB_RxData(callback_rxData cb, void *args) = 0; }; -extern GobotRPC_CtrlInterface_HardwareHandler_RP2040 * g_uart_hardware_handler; -void isrUartRX(); +#include "hardware/uart.h" -void vTaskRxHandler(void * pvParameters); -void vTaskHeartBeat(void * pvParameters); +void GobotRPC_CI_Hardware_RP2040_UART_isr(); +void GobotRPC_CI_Hardware_RP2040_UART_RXTaskFn(void *args); + +#define NUM_INPUT_BUFFERS 16 + +struct inputBuffers_t { + char data[256]; + size_t len; +}; + +class GobotRPC_CI_Hardware_RP2040_UART : public I_GobotRPC_CI_Hardware { +private: + uart_inst_t *uart; + + inputBuffers_t inputBufferPool[NUM_INPUT_BUFFERS]; + + TaskHandle_t rxTaskHandle; + SemaphoreHandle_t txMutex; + + QueueHandle_t emptyInputBuffersQueue; + QueueHandle_t filledInputBuffersQueue; + + callback_rxData cb_rxData; + void * cb_rxData_args; + +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(); +}; + +extern GobotRPC_CI_Hardware_RP2040_UART * g_GobotRPC_CI_Hardware_RP2040_UART; -#endif \ No newline at end of file diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/gobotrpc.hpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/gobotrpc.hpp deleted file mode 100644 index 686e274..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/gobotrpc.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once -#include -#include - -#include "gobotrpc_datatypes.hpp" -#include "ctrl_interface.hpp" -#include "ctrl_interface_hardware.hpp" - -class GobotRPC_CtrlInterface; -class GobotRPCParser { -private: - RPC_RX_PackageSlot buffer[NUM_SLOTS]; - uint32_t masked [NUM_SLOTS]; - uint32_t address_mask; - - size_t finishedScanIndex; - - GobotRPC_CtrlInterface * ctrlInterface; - - void find_fitting_slot(RPCHeader header, uint32_t addr, int * fitting_slot, int * empty_slot); - static void insertFrameInPackageSlot(RPC_RX_PackageSlot * package, char * data, size_t segment, size_t length); - void freePackageSlot(size_t index); - -public: - GobotRPCParser(GobotRPC_CtrlInterface * ctrlInterface); - - void print_out_slots(); - enum FrameSubmitionResult submit_frame(char * data, size_t length, uint32_t addr, uint32_t timestamp); - - int getFinishedIndexPackages(); - void retrivePackage(RPCPackage * dest, int index); -}; - -char * mapFrameSubmitionResult2String(FrameSubmitionResult res); - -FrameSubmitionResult getPackageStatus(RPC_RX_PackageSlot * package); diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/gobotrpc_datatypes.hpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/gobotrpc_datatypes.hpp deleted file mode 100644 index 0d67ddb..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/gobotrpc_datatypes.hpp +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once -#include "protocol.hpp" - -#define MAX_PAGE_SIZES 4*7 -#define NUM_SLOTS 8 - -enum FrameSubmitionResult { - PENDING, - COMPLEATE, - ERROR_INVALID_RPC_TYPE, - ERROR_INVALID_RPC_NUMBER, - ERROR_NO_EMPTY_OR_FITTING_SLOT, -}; - -struct RPC_RX_PackageSlot { - char buffer[MAX_PAGE_SIZES]; - - bool is_complete; - bool is_in_use; - - uint32_t sender_address; - enum RPCNumber rpcNum; - enum RPCType type; - uint32_t used_bit_masked; - uint32_t timestamp; - size_t length; -}; - -struct RPCPackage { - char buffer[MAX_PAGE_SIZES]; - size_t length; - uint32_t addr; - RPCNumber rpcNum; - RPCType type; -}; \ No newline at end of file diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/pinConfig.hpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/pinConfig.hpp new file mode 100644 index 0000000..78f20c6 --- /dev/null +++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/pinConfig.hpp @@ -0,0 +1,6 @@ +#pragma once + +#define GOBOTRPC_CI_UART_RX 0 +#define GOBOTRPC_CI_UART_TX 1 + +#define GOBOTRPC_HEARTBEAT_INTERVAL 3000 \ No newline at end of file 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 deleted file mode 100644 index 27945d3..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/protocol.hpp +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once -#include -#include - -enum RPCNumber { - Get_Info = 0x0, - Home = 0x01, - Move_Step = 0x2, - Move_XY = 0x3, - Set_Padding = 0x4, - Release_Motors = 0x5, - Drop_Stone = 0x6, - Get_Stone_Status = 0x7, - Move_Z_Axis = 0x8, - Set_Vacum = 0x9, - Invalid = 0xf -}; - -const uint32_t RPC_NUMBER_MAX = 0x9; - -enum RPCType { - REQUEST = 0b00, - RESPONSE_RPC = 0b01, - INVALID = 0b10, - ERROR = 0b11 -}; - -struct RPCHeader { - RPCNumber rpcNum : 4; - RPCType type : 2; - unsigned char segment: 2; -}; diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/init.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/init.cpp deleted file mode 100644 index a6c7591..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/init.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "gobotrpc.hpp" -#include - -GobotRPCParser::GobotRPCParser(GobotRPC_CtrlInterface * ctrlInterface) { - this->ctrlInterface = ctrlInterface; - - for(int i = 0; i < NUM_SLOTS; i++) { - buffer[i].timestamp = 0; - buffer[i].is_complete = false; - buffer[i].is_in_use = false; - buffer[i].used_bit_masked = 0; - buffer[i].sender_address = 0; - buffer[i].rpcNum = Invalid; - buffer[i].type = INVALID; - buffer[i].length = 0; - - memset(buffer[i].buffer, 0, MAX_PAGE_SIZES); - } - - finishedScanIndex = 0; - address_mask = 0xFFFFFFFF; -} diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/protocol.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/protocol.cpp deleted file mode 100644 index 65510f6..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/protocol.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include "protocol.hpp" -#include "gobotrpc.hpp" -#include - -uint32_t getRpcRequestCompleteMask(RPCNumber rpcNum) { - switch (rpcNum) { - case Get_Info: return 0b00000000000000000000000000000000; - case Home: return 0b00000000000000000000000000000011; - case Move_Step: return 0b00000000000000000000000000111111; - case Move_XY: return 0b00000000000000000000000000111111; - case Set_Padding: return 0b00000000000000001101111110111111; - case Release_Motors: return 0b00000000000000000000000001111111; - case Drop_Stone: return 0b00000000000000000000000000000000; - case Get_Stone_Status: return 0b00000000000000000000000000000000; - case Move_Z_Axis: return 0b00000000000000000000000000000001; - case Set_Vacum: return 0b00000000000000000000000000000001; - default: return 0b00000000000000000000000000000000; - } -} - -uint32_t getRpcResponseCompleteMask(RPCNumber rpcNum) { - switch (rpcNum) { - case Get_Info: return 0b00001111111111111111111111111111; - case Home: return 0b00000000000000000000000000111111; - case Move_Step: return 0b00000000000000000000000000000000; - case Move_XY: return 0b00000000000000000000000000000000; - case Set_Padding: return 0b00000000000000000000000000000000; - case Release_Motors: return 0b00000000000000000000000000000000; - case Drop_Stone: return 0b00000000000000000000000000000000; - case Get_Stone_Status: return 0b00000000000000000000000000000000; - case Move_Z_Axis: return 0b00000000000000000000000000000000; - case Set_Vacum: return 0b00000000000000000000000000000000; - default: return 0b00000000000000000000000000000000; - } -} - -uint32_t ERROR_MASK = 0b00000000000000000000000000000000; - -FrameSubmitionResult getPackageStatus(RPC_RX_PackageSlot * package) { - - uint32_t mask; - - switch (package->type) { - case REQUEST: - mask = getRpcRequestCompleteMask(package->rpcNum); - break; - case RESPONSE_RPC: - mask = getRpcResponseCompleteMask(package->rpcNum); - break; - case ERROR: - mask = ERROR_MASK; - break; - default: - return ERROR_INVALID_RPC_TYPE; - }; - - uint32_t masked_bits = package->used_bit_masked & mask; - - if(masked_bits == mask) { - return COMPLEATE; - } - - return PENDING; -} \ No newline at end of file diff --git a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/rx.cpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/rx.cpp deleted file mode 100644 index 042623f..0000000 --- a/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/rx.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include "gobotrpc.hpp" -#include "protocol.hpp" -#include - -RPCHeader parseRPCHeader(char data) -{ - RPCHeader header; - header.rpcNum = (RPCNumber)(data & 0b00001111); - header.type = (RPCType)((data & 0b00110000) >> 4); - header.segment = (data & 0b11000000) >> 6; - - return header; -} - -FrameSubmitionResult GobotRPCParser::submit_frame(char *data, size_t length, uint32_t addr, uint32_t timestamp) -{ - RPCHeader header = parseRPCHeader(data[0]); - - if (header.type == INVALID) { - return ERROR_INVALID_RPC_TYPE; - } - - if (header.rpcNum > RPC_NUMBER_MAX) { - return ERROR_INVALID_RPC_NUMBER; - } - - int fitting_slot; - int empty_slot; - find_fitting_slot(header, addr, &fitting_slot, &empty_slot); - - int slotNum; - - // Check if packageSlot is complete - - if (fitting_slot != -1) { - slotNum = fitting_slot; - } - else if (empty_slot != -1) { - slotNum = empty_slot; - - this->buffer[slotNum].is_in_use = true; - this->buffer[slotNum].is_complete = false; - this->buffer[slotNum].sender_address = addr; - this->buffer[slotNum].rpcNum = header.rpcNum; - this->buffer[slotNum].type = header.type; - } - else { - return ERROR_NO_EMPTY_OR_FITTING_SLOT; - } - - insertFrameInPackageSlot(&this->buffer[slotNum], data, header.segment, length); - this->buffer[slotNum].timestamp = timestamp; - this->buffer[slotNum].length = MAX(this->buffer[slotNum].length, header.segment*7 + (length - 1)); - volatile FrameSubmitionResult res = getPackageStatus(&(this->buffer[slotNum])); - - // Push the update to the control interface - ctrlInterface->pushPackageSlotUpdate(res == COMPLEATE, this->buffer[slotNum].is_in_use, slotNum, addr, timestamp, this->buffer[slotNum].used_bit_masked); - -y if (res == COMPLEATE) { - this->buffer[slotNum].is_complete = true; - } - - return res; -} - -void GobotRPCParser::insertFrameInPackageSlot(RPC_RX_PackageSlot *packageSlot, char *data, size_t segment, size_t length) -{ - size_t offset = segment * 7; - - for (int i = 0; i < length - 1; i++) { - packageSlot->buffer[offset + i] = data[i + 1]; - packageSlot->used_bit_masked |= 1 << (offset + i); - } -} - -void GobotRPCParser::find_fitting_slot(RPCHeader header, uint32_t addr, int *fitting_slot, int *empty_slot) -{ - uint32_t masked_addr = addr & this->address_mask; - - *fitting_slot = -1; - *empty_slot = -1; - - for (int i = 0; i < NUM_SLOTS; i++) { - if (this->buffer[i].is_complete) { - continue; - } - - uint32_t masked_slot_addr = this->buffer[i].sender_address & this->address_mask; - - if (masked_slot_addr == masked_addr && header.rpcNum == this->buffer[i].rpcNum) { - *fitting_slot = i; - return; - } - - if (*empty_slot == -1 && !buffer[i].is_in_use) { - *empty_slot = i; - } - } -} - -int GobotRPCParser::getFinishedIndexPackages() { - - for (int i = 0; i < NUM_SLOTS; i++) { - size_t index = (i + this->finishedScanIndex) % NUM_SLOTS; - if (this->buffer[i].is_complete) { - this->finishedScanIndex = (index + 1) % NUM_SLOTS; - return index; - } - } - - return -1; -} - -void GobotRPCParser::retrivePackage(RPCPackage *dest, int index) { - memcpy(dest->buffer, buffer[index].buffer, MAX_PAGE_SIZES); - dest->addr = buffer[index].sender_address; - dest->rpcNum = buffer[index].rpcNum; - dest->type = buffer[index].type; - dest->length = buffer[index].length; - - this->ctrlInterface->pushPacket(*dest); - freePackageSlot(index); -} - -void GobotRPCParser::freePackageSlot(size_t index) { - this->buffer[index].timestamp = 0; - this->buffer[index].is_complete = false; - this->buffer[index].is_in_use = false; - this->buffer[index].used_bit_masked = 0; - this->buffer[index].sender_address = 0; - this->buffer[index].rpcNum = Invalid; - this->buffer[index].type = INVALID; - this->buffer[index].length = 0; -} \ 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 8e5333a..da2f908 100644 --- a/i2c-hub/firmware/i2c-hub-firmware/src/main.cpp +++ b/i2c-hub/firmware/i2c-hub-firmware/src/main.cpp @@ -1,65 +1,49 @@ #include #include "pico/stdlib.h" +#include "ctrl_interface.hpp" +#include "ctrl_interface_hardware.hpp" + #include "FreeRTOSConfig.h" #include "FreeRTOS.h" #include "task.h" +#include "crc16.hpp" + #define LED_PIN 25 - -#include "gobotrpc/include/gobotrpc.hpp" -#include "ctrl_interface_hardware.hpp" - -void vTaskMain(void * args) { - GobotRPC_CtrlInterface_HardwareHandler_RP2040 uartHandler(uart0, 9600, 1500, 0, 1); - GobotRPC_CtrlInterface ctrlInterface(&uartHandler); - GobotRPCParser rpcRXParser(&ctrlInterface); - - ctrlInterface.printf("Hello World!\n"); - - char data0[] = "\x04\x01\x02\x03\x04\x05\x06"; - char data1[] = "\x44\x11\x12\x13\x14\x15\x16"; - char data3[] = "\x11\xaa\xbb\xcc\xdd\xee\xff"; - char data2[] = "\x84\xaa\xbb"; - - rpcRXParser.submit_frame(data2, 3, 0x42, xTaskGetTickCount()); - rpcRXParser.submit_frame(data3, 7, 0x43, xTaskGetTickCount()); - rpcRXParser.submit_frame(data1, 7, 0x42, xTaskGetTickCount()); - - - ctrlInterface.printf("This is Random Text\n"); - - vTaskDelay(10 / portTICK_PERIOD_MS); - - rpcRXParser.submit_frame(data3, 7, 0x43, xTaskGetTickCount()); - rpcRXParser.submit_frame(data0, 7, 0x42, xTaskGetTickCount()); - - size_t index = rpcRXParser.getFinishedIndexPackages(); - - RPCPackage package; - rpcRXParser.retrivePackage(&package, index); - - while (true) { - gpio_put(LED_PIN, false); - vTaskDelay(500 / portTICK_PERIOD_MS); - gpio_put(LED_PIN, true); - vTaskDelay(500 / portTICK_PERIOD_MS); +void vTaskMain(void * pvParameters) { + while(1) { + gpio_put(LED_PIN, 1); + vTaskDelay(pdMS_TO_TICKS(500)); + gpio_put(LED_PIN, 0); + vTaskDelay(pdMS_TO_TICKS(500)); } - +} + +void onTxPacket(void * args, char *data, size_t len) { + GobotRPC_CI * gobotRPC_ci = (GobotRPC_CI *)args; + + char buffer[] = {0x00, 0x74, 0x04, 0x00, 0x00}; + unsigned short crc = crc16(buffer + 1, 2); + + buffer[4] = crc & 0xff; + buffer[3] = (crc >> 8) & 0xff; + + gobotRPC_ci->send_RxPacket(buffer, 4); } int main() { - stdio_init_all(); - printf("============================================\n"); - printf(" Gobot RPC Hub \n"); - printf("============================================\n"); - gpio_init(LED_PIN); gpio_set_dir(LED_PIN, true); + GobotRPC_CI_Hardware_RP2040_UART gobotrpc_ci_hardware(uart0, 115200); + GobotRPC_CI gobotRPC_ci(&gobotrpc_ci_hardware); + + gobotRPC_ci.registerCB_TxPacket(onTxPacket, &gobotRPC_ci); + TaskHandle_t taskHandle; - xTaskCreate(vTaskMain, "Main Task", 2048, NULL, 1, &taskHandle); + xTaskCreate(vTaskMain, "Main Task", 2048, &gobotRPC_ci, 1, &taskHandle); vTaskStartScheduler(); while(1) {} diff --git a/i2c-hub/uart-adapter/src/gobotrpc/__init__.py b/i2c-hub/uart-adapter/src/gobotrpc/__init__.py index cbed664..452d96d 100644 --- a/i2c-hub/uart-adapter/src/gobotrpc/__init__.py +++ b/i2c-hub/uart-adapter/src/gobotrpc/__init__.py @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5c7cf9ffe35204723406003792543d90145246bd02bc517b210085ebc6b82a35 -size 873 +oid sha256:7f45183f4cf8d60047dafa83c65b5dfa953a10bd4017b5a5be89bde0a94153df +size 877 diff --git a/i2c-hub/uart-adapter/src/gobotrpc/__pycache__/__init__.cpython-312.pyc b/i2c-hub/uart-adapter/src/gobotrpc/__pycache__/__init__.cpython-312.pyc index 750d60d01f75755192d5491fcb83496ada336c33..5dbe92ac195278b572ec96c34c7285da9e79435d 100644 GIT binary patch delta 51 zcmaFQ_nD9PG%qg~0}$M`C{NGb$oqqhPc%J0DZiwsAXyKH<0td8hjaQ~VDK#x0;&Q4 Ds;duU delta 47 zcmey&_nwdUG%qg~0}x1XmZxWKucwUhAG%qg~0}z;+m!~Ih_CnOX9zCg(BAPc~-K1BxUusWY==iB5K46q&q$iJOBZm_d`p?Iqb&hsfm9XG0TK-icZ8*{3mab)Hs0W} zLuiNM29L|awv9dw&K)8hg`2Hdsu+32K#G}wgn~km_~e7E;f#`#_p>Y(E|La{X|fh^ z0I4Dw5FtDHJevZqJdlY{|A!5tUUG6SyShAB3saFGNHxe@O~xW&ka9*K0Wy6vyCKl@ wr|ilGAZJ2M-On0KyVbxc~qF delta 350 zcmX>vcwCV8G%qg~0}yC(mZzs|deepqLUpMMTA!~f=pmwU}UIa4rb6~@q5WQc`MU(X_g{ppy(~; zqJrdGEG3l%sX%6GaWM-}aPn&A98GZ`1EivO7LaIQxFaBOUBKX?fWZcl4M`gcH%MF- zuxj*daPAPqnS7m1 zfmaU5L?~xrhbWhvT*|I457xp|BnVOsGFFqZNEoCXD^i{8z|qYDk^um4SV=(u diff --git a/i2c-hub/uart-adapter/src/gobotrpc/__pycache__/packages.cpython-312.pyc b/i2c-hub/uart-adapter/src/gobotrpc/__pycache__/packages.cpython-312.pyc index 3982e02a84df45a7b9be2c75c9c43bc7c9569885..c338c947488277e4875834c034c0e7c067406d4f 100644 GIT binary patch delta 2932 zcmb_eU2IfE6u!TEclYl9Pwj5EWuX+@3Z>93w4l%+e}w`{n<$IPLbD&FMqnF zn2=CF!_PcWL`9>~Ha-Xv4ZLWH4<>4)r7@5d6CQXFAF!k)!9ID;Y`5K3z{EI7zkBAK zGc#w-ne%PGiT+;W_|a~+axnf}y1!L(o_2iM{VB|ja%VZ6i}4y46Er?1YIaS~r52%w zYvDEVh&?82l5T1dH2H`WQ#2Ek6_CxKw}9RZvK90wTR>JpwzUQEr0E0fRFJg!_mB)rO(xWJMzC7avy-3Gyx8KpUyY}a>n^ozt#$HdkEYWoFZ zgAYOXlmHM869+Y<3SOljOXqnfT_ta=Er;tz6q{~lFd1YUbA?KVlzFRoYX+qX`U2zD8LU(#Y z^r*?b1Xg#6T~e1|U=G+w^O_U@>2nMKMw*M`Ic%gScA0sEoSuG!lok!s8DEHgruZNp z#XA*^DJ^0&Q)Y-rN=t@`CX|rS=A(zafjoC5EoI$v=EX{Q$3ZS)-ZE~l@7TAiJ)wnD zi8u7{xHYUF=!7!qTKFC&=^n;E?p~MB+b3N1lVnG0nD{_Xo&kuc8L?gO$ViR#v9+WW z)w5~XT*@nSjk#jJJXKS8EpSG*R9LhW-Y1L$3UtO?**zbXe*qlkZmW(S<3w$*bis1Y zazmYc+Y{>T>TBv-cd`6R)3@8NZojf=uz16;r+&~@e>XViW^nmXaQT(!fH2^`QZpP} zbIjQz_B5S}-Yp3BMnB}wEu(vSq_@>Os`FIzZ0+gV8)^u)9Gq2o(Ra~wv2DQjec+lc zFrW?=Hw=3=585_UyX8O;dn*$ags?bn@~w>1U9M6ZEKupsmhJFl22K9cJIyx3!Q24a z-1L&gYsDSdNYhTmPxn|$R$%94#O6e6#7btP>}}OM;;qT%q(M4&$6wcXX*wa*U?EEp zmLb$2ETPw|-XeVVBm$6o+&HfTV9i&kHXk(f6#A!P^y`8JRkv)ell8~yM-|Cs9W!%w z*U5%s4exn-n=b4)w_`XE>08{V58I*-ERw5wgp(}Q#7XZLG|jQV77>w!m={C-!Ss&0 zfL}%Jwqoeb+!APMyj9)>rY-r%R?e@cKd~iso&Xi?o7~T$|1__-y_{c5kK0Qun7|0X zF5;t?>}6Y*pl1{TJ1rw=31E~moR{NVW_KqmP*I1#B4G(!jZ>D?bs%NLltIWw8g}>> z*kR66Sx2yX1Yacs2@U%I9v$IsskXyw9!T^x$K0S(j`6*FM>+hC%#r2l-m*~+J|hnL zu456T;s-}b=mS_clinGv3rEbS?;I6v89zPg_6wwfVj8}3&M#*P7YP1Nucw2 z`0#KxLY2N#P&6+`vYRkWjQkO_joE%o88R3CVh$3_9C6Y0u7_I~J2K8>ZHvv95x40n z*1(K5Ng;aU4+kkmV2><}(p-Q^HbzAmJ?@^%Z=qkfPng&l^WX*xD_%hxo&jOw0j$sa zr`HwLSSWa@C*1{RBN=Z?B|GBus;B5FyzKaoylk7~=AB8oa*lE* z?K#eU5=BpNZq9sN@$M!IFa-+{DiA6Wrl{0H7Ndf_@+_0$vLd;dwE*jP{!ZuFDKlIO}sj<6O`vTeH(TxVRH z>_8n$Pd;6svJQHp)MS8|T8^~m&8I!2HEWjE=CdR6X^rhUbGy~pVnEDB+&I{&zlkTj zh`@L*jC+u^2s76qxny6r2NwgOA40eF2u@m6xUy*bnlk!OnLZA;q695p67q%oWF6i#-!Ce|3Yug&7!KIqN*_tXJZ?L<$QVXhMS@2 MP$>G4g9%I3-?aOC2><{9 delta 2538 zcmbVNTWnNC7(R0@dq3N5_msA~+ji+iJhc>Rw^F4p0&)|qKr51hu5Hh0Xz4BahF}f5X zWOk<-$^irnoFH5e6XvoA0A~3?sUs2gyP`vug^n`uG-0id(x^dRSq6b#TLM2m4Dk%c zz&Ju|givT5Y`cX8y6fLC_-a?O--ss7!9IJ} zEj&66qQw(6_w9jtn?{r_0EO;JOW;JS&?Cw&x~hqT{pM z>K>EEI<74UjmJ)sW6Rj?G5KvTyYJrT@I$H|!ic7k8|*^KXyX~Y4h-9unFV10zh>UB z)vRKeU2qn&A#a7c7*uJgyT4C&!@W*=%UT}=4Q)b*AvAM`{y{tKvQvrf{kCcGCqf?v zL-v87V=DkYU4PaM6It!7(pO(Utw@EQ8Hb=2zPIVxUrPc_OHVftJTSf`zdgk{r2f?ZHcT(feVeeADrW7&1GRu8i8{k4Z0F&O(bEgSvN znKii9ajj&k1g(*&O3pRnsN<(wg`N`ZMAxFECK5f#F3ajMlgUH^`VYS(FYi+nKO4pN z;DB$-+ABB(;g1pFw#W_?)P%fBCmA1_7I2;l$x8Eh?X&>Xl#iVVKg511a6^%97E~Pi z5Q1|#igObgadk?DXv)2!A&tnLiXn4Z0oeh1C+Hm@yFib!6J$5Yo&ju)ya9F>*nQj{ z$}_gW8XVl<;0K2SkUbz5jtTonXP{lsz3Jk0sqU1$b@S?NT|Gm)x0=?T)SzWD;t#Rw zh1GTZVTcrogco0*Wj$Ul?1JdwOuam8aiE&4Vp{?wykBSm8w}iO<4jkC(Ln_4*0cn> z@Gj>RNK4Rwaj> z+z?JW$F&pxcy?50Uk9tmHg-K2o+a6l|3tD%2?@>7=}xEw67Dck=`GLFJQ@W(5TiV6 z%TVZp30L71ik?|JQ0R+5p^i3+)IsYJcqtoD;#}#XOHi&th$1XSnD0sC6)5_ecKR4d zIb?}$%h)>$YFl@r;WWViU`(XQaE2lwL3Uu<;E!bbU1ZFaS;lM^D1TCp%t@aBkGzx8 z7f_eS60{YbSD1ZU>T>J?v(eWsnT_wO+Wak~`= zoY%sbgRVr#Kf@|`GGVqNkV9jobTeuZ@JiMI0MOWs$aaOx zL!Mb0!+EMyRy-LR^KcqlqT*qBs19F?T@63-GEc@Y%WX)McU`T!Q^ruzjMJB3iNACU y-`|u(2)Qa0{47+?$jix-<1JUhO_#$>GXgAT4v-kB8()7V61yCU-4S5HOY;}gss)h% 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 new file mode 100644 index 0000000000000000000000000000000000000000..f704140759b8fb5fbdfb03cd879d4453bc3840d9 GIT binary patch literal 8180 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 JXYh^6^-phIN_YSO literal 0 HcmV?d00001 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 f94f5da3b5601301046e5acb1dc13f3793034f61..f79dc47d9c93cbeadd9a7e15499f238c192961b9 100644 GIT binary patch delta 1247 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 literal 0 HcmV?d00001 diff --git a/i2c-hub/uart-adapter/src/uart_interface/__pycache__/package.cpython-312.pyc b/i2c-hub/uart-adapter/src/uart_interface/__pycache__/package.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2d19e2ebc79a7b97f2b567cc95208ddea449c2e GIT binary patch literal 4767 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 literal 0 HcmV?d00001 diff --git a/i2c-hub/uart-adapter/src/uart_interface/ci_packages.py b/i2c-hub/uart-adapter/src/uart_interface/ci_packages.py new file mode 100644 index 0000000..155e6e0 --- /dev/null +++ b/i2c-hub/uart-adapter/src/uart_interface/ci_packages.py @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05f5ad9f0af15d0134a52d785b8ed5f3d66ebb88a1896982e3179a61c483c17f +size 2047 diff --git a/i2c-hub/uart-adapter/src/uart_interface/pares_packages.py b/i2c-hub/uart-adapter/src/uart_interface/pares_packages.py new file mode 100644 index 0000000..f5073fe --- /dev/null +++ b/i2c-hub/uart-adapter/src/uart_interface/pares_packages.py @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d761d7d2aebd255e82220088b72630e5e05f805fd72b50fba9d482af758779d +size 611 diff --git a/i2c-hub/uart-adapter/src/uart_interface/serial.py b/i2c-hub/uart-adapter/src/uart_interface/serial.py index 2b1dfc2..0167038 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:e3c86dfb86541d77b49e2471d1b7042ea9f7bc1559429f282636fae4b369af1e -size 1413 +oid sha256:c3a0046b2cde7b7d3029bacb87a8702ee0444919b8ac159b12791c4685ee0319 +size 1485