diff --git a/i2c-hub/firmware/i2c-hub-firmware/.vscode/settings.json b/i2c-hub/firmware/i2c-hub-firmware/.vscode/settings.json
index b448cd8..4ee63c0 100644
--- a/i2c-hub/firmware/i2c-hub-firmware/.vscode/settings.json
+++ b/i2c-hub/firmware/i2c-hub-firmware/.vscode/settings.json
@@ -38,6 +38,50 @@
"raspberry-pi-pico.ninjaPath": "${HOME}/.pico-sdk/ninja/v1.12.1/ninja",
"files.associations": {
"uart.h": "c",
- "freertos.h": "c"
+ "freertos.h": "c",
+ "array": "cpp",
+ "atomic": "cpp",
+ "bit": "cpp",
+ "*.tcc": "cpp",
+ "cctype": "cpp",
+ "clocale": "cpp",
+ "cmath": "cpp",
+ "compare": "cpp",
+ "concepts": "cpp",
+ "cstdarg": "cpp",
+ "cstddef": "cpp",
+ "cstdint": "cpp",
+ "cstdio": "cpp",
+ "cstdlib": "cpp",
+ "cwchar": "cpp",
+ "cwctype": "cpp",
+ "deque": "cpp",
+ "map": "cpp",
+ "string": "cpp",
+ "unordered_map": "cpp",
+ "vector": "cpp",
+ "exception": "cpp",
+ "algorithm": "cpp",
+ "functional": "cpp",
+ "iterator": "cpp",
+ "memory": "cpp",
+ "memory_resource": "cpp",
+ "numeric": "cpp",
+ "optional": "cpp",
+ "random": "cpp",
+ "string_view": "cpp",
+ "system_error": "cpp",
+ "tuple": "cpp",
+ "type_traits": "cpp",
+ "utility": "cpp",
+ "initializer_list": "cpp",
+ "iosfwd": "cpp",
+ "limits": "cpp",
+ "new": "cpp",
+ "numbers": "cpp",
+ "ostream": "cpp",
+ "stdexcept": "cpp",
+ "streambuf": "cpp",
+ "typeinfo": "cpp"
}
}
diff --git a/i2c-hub/firmware/i2c-hub-firmware/.vscode/tasks.json b/i2c-hub/firmware/i2c-hub-firmware/.vscode/tasks.json
index 862f6ac..8fb5999 100644
--- a/i2c-hub/firmware/i2c-hub-firmware/.vscode/tasks.json
+++ b/i2c-hub/firmware/i2c-hub-firmware/.vscode/tasks.json
@@ -68,6 +68,7 @@
"showReuseMessage": true,
"clear": true
},
+ "dependsOn": ["Compile Project"],
"problemMatcher": [],
"windows": {
"command": "${env:USERPROFILE}/.pico-sdk/openocd/0.12.0+dev/openocd.exe",
diff --git a/i2c-hub/firmware/i2c-hub-firmware/CMakeLists.txt b/i2c-hub/firmware/i2c-hub-firmware/CMakeLists.txt
index 01280fb..cb95956 100644
--- a/i2c-hub/firmware/i2c-hub-firmware/CMakeLists.txt
+++ b/i2c-hub/firmware/i2c-hub-firmware/CMakeLists.txt
@@ -31,7 +31,7 @@ include(pico_sdk_import.cmake)
# Adding FreeRTOS
set(FREERTOS_KERNEL_PATH ../lib/FreeRTOS-Kernel)
include(cmake/FreeRTOS_Kernel_import.cmake)
-#include(cmake/freeRTOS.cmake)
+include(src/gobotrpc/cmake/CMakeLists.txt)
project(i2c-hub-firmware C CXX ASM)
@@ -55,7 +55,7 @@ pico_enable_stdio_usb(i2c-hub-firmware 0)
# Add the standard library to the build
target_link_libraries(i2c-hub-firmware
FreeRTOS-Kernel-Heap4
- #FreeRTOS
+ GobotRPC
pico_stdlib
)
diff --git a/i2c-hub/firmware/i2c-hub-firmware/cmake/freeRTOS.cmake b/i2c-hub/firmware/i2c-hub-firmware/cmake/freeRTOS.cmake
deleted file mode 100644
index e654935..0000000
--- a/i2c-hub/firmware/i2c-hub-firmware/cmake/freeRTOS.cmake
+++ /dev/null
@@ -1,14 +0,0 @@
-SET(FreeRTOS_DIR ${CMAKE_CURRENT_LIST_DIR}/../lib/FreeRTOS-Kernel)
-FILE(GLOB FreeRTOS_src ${FreeRTOS_DIR}/*.c)
-
-add_library(FreeRTOS STATIC
- ${FreeRTOS_src}
- ${FreeRTOS_DIR}/portable/GCC/ARM_CM0/port.c
- ${FreeRTOS_DIR}/portable/MemMang/heap_4.c
-)
-
-target_include_directories(FreeRTOS PUBLIC
- ${FreeRTOS_DIR}/portable/GCC/ARM_CM0/
- ${FreeRTOS_DIR}/include/
- ${CMAKE_CURRENT_LIST_DIR}/..
-)
\ No newline at end of file
diff --git a/i2c-hub/firmware/i2c-hub-firmware/docs/.$NetworkStack.drawio.dtmp b/i2c-hub/firmware/i2c-hub-firmware/docs/.$NetworkStack.drawio.dtmp
new file mode 100644
index 0000000..3197b4c
--- /dev/null
+++ b/i2c-hub/firmware/i2c-hub-firmware/docs/.$NetworkStack.drawio.dtmp
@@ -0,0 +1,700 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
new file mode 100644
index 0000000..16ef9f0
--- /dev/null
+++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/cmake/CMakeLists.txt
@@ -0,0 +1,15 @@
+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
+)
+
+target_include_directories(GobotRPC PUBLIC
+ ${CMAKE_CURRENT_LIST_DIR}/../include
+ ${CMAKE_CURRENT_LIST_DIR}/../../..
+)
+
+target_link_libraries(GobotRPC
+ FreeRTOS-Kernel-Heap4
+)
\ No newline at end of file
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
new file mode 100644
index 0000000..7b52875
--- /dev/null
+++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/error_msg.cpp
@@ -0,0 +1,43 @@
+#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 ", i,
+ buffer[i].is_complete, buffer[i].is_in_use, buffer[i].sender_address,
+ buffer[i].rpcNum, buffer[i].type, buffer[i].timestamp
+ );
+
+ 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/gobotrpc.hpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/gobotrpc.hpp
new file mode 100644
index 0000000..ca45337
--- /dev/null
+++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/gobotrpc.hpp
@@ -0,0 +1,64 @@
+#pragma once
+#include
+#include
+
+#include "protocol.hpp"
+
+#define MAX_PAGE_SIZES 4*7
+
+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;
+};
+
+struct RPCPackage {
+ char buffer[MAX_PAGE_SIZES];
+ size_t length;
+ uint32_t addr;
+ RPCNumber rpcNum;
+ RPCType type;
+};
+
+#define NUM_SLOTS 8
+
+class GobotRPCParser {
+private:
+ RPC_RX_PackageSlot buffer[NUM_SLOTS];
+ uint32_t masked [NUM_SLOTS];
+ uint32_t address_mask;
+
+ size_t finishedScanIndex;
+
+ 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();
+
+ 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/protocol.hpp b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/protocol.hpp
new file mode 100644
index 0000000..27945d3
--- /dev/null
+++ b/i2c-hub/firmware/i2c-hub-firmware/src/gobotrpc/include/protocol.hpp
@@ -0,0 +1,32 @@
+#pragma once
+#include