From 60b94b16508e08d3329a5041afd939a707404f49 Mon Sep 17 00:00:00 2001 From: superkor Date: Sat, 24 Jan 2026 22:17:27 -0500 Subject: [PATCH] able to write and read from nvs; completed topology test main --- components/flatbuffers/TopologyBuilder.cpp | 47 +++++++-- .../flatbuffers/include/TopologyBuilder.h | 6 +- components/movements/TopologyManager.cpp | 96 +++++++++++++++--- .../movements/include/MovementManager.h | 1 + .../movements/include/TopologyManager.h | 8 +- main/README.md | 4 + main/images/sample_topology.png | Bin 0 -> 66709 bytes main/main_preprogrammed_test.cpp | 50 ++++++++- 8 files changed, 181 insertions(+), 31 deletions(-) create mode 100644 main/images/sample_topology.png diff --git a/components/flatbuffers/TopologyBuilder.cpp b/components/flatbuffers/TopologyBuilder.cpp index d87daba..8ea5319 100644 --- a/components/flatbuffers/TopologyBuilder.cpp +++ b/components/flatbuffers/TopologyBuilder.cpp @@ -1,23 +1,48 @@ #include "TopologyBuilder.h" #ifdef TOPOLOGYBUILDER namespace Flatbuffers{ - SerializedMessage TopologyBuilder::build_topology(const std::vector>& topology){ + SerializedMessage TopologyBuilder::build_topology(const std::unordered_map>& topology_map) { builder_.Clear(); - - auto neighbours_vec = builder_.CreateVector(topology); - auto topology_offset = Topology::CreateTopologyInfo(builder_, static_cast(topology.size()), neighbours_vec); + + std::vector> neighbours; + neighbours.reserve(topology_map.size()); + + for (const auto& [board_id, connections] : topology_map) { + auto conn_vec = builder_.CreateVectorOfStructs(connections); + auto blob = Topology::CreateNeighbourBlob( + builder_, + board_id, + static_cast(connections.size()), + conn_vec + ); + + neighbours.push_back(blob); + } + + auto neighbours_vec = builder_.CreateVector(neighbours); + auto topology_offset = Topology::CreateTopologyInfo( + builder_, + static_cast(neighbours.size()), + neighbours_vec + ); builder_.Finish(topology_offset); - return { - builder_.GetBufferPointer(), - builder_.GetSize() - }; + return { builder_.GetBufferPointer(), builder_.GetSize() }; } - flatbuffers::Offset TopologyBuilder::build_neighbour_info(uint16_t board_id, const std::vector& connections){ - auto conn = builder_.CreateVectorOfStructs(connections); - return Topology::CreateNeighbourBlob(builder_, board_id, static_cast(connections.size()), conn); + flatbuffers::Offset TopologyBuilder::build_neighbour_info( + uint16_t board_id, + const std::vector& connections + ) { + auto conn_vec = builder_.CreateVectorOfStructs(connections); + + return Topology::CreateNeighbourBlob( + builder_, + board_id, + static_cast(connections.size()), + conn_vec + ); } Topology::ChannelBoardConn TopologyBuilder::build_connections(uint8_t channel, uint16_t board_id){ diff --git a/components/flatbuffers/include/TopologyBuilder.h b/components/flatbuffers/include/TopologyBuilder.h index 14c98e6..f996818 100644 --- a/components/flatbuffers/include/TopologyBuilder.h +++ b/components/flatbuffers/include/TopologyBuilder.h @@ -14,11 +14,11 @@ namespace Flatbuffers { public: TopologyBuilder() : builder_(RIP_MAX_ROUTES*(sizeof(Topology::NeighbourBlob) + sizeof(Topology::ChannelBoardConn)*MAX_CHANNELS)) {} - SerializedMessage build_topology(const std::vector>& topology); - flatbuffers::Offset build_neighbour_info(uint16_t board_id, const std::vector& connections); + SerializedMessage build_topology(const std::unordered_map>& topology_map); Topology::ChannelBoardConn build_connections(uint8_t channel, uint16_t board_id); - + private: + flatbuffers::Offset build_neighbour_info(uint16_t board_id, const std::vector& connections); flatbuffers::FlatBufferBuilder builder_; }; } diff --git a/components/movements/TopologyManager.cpp b/components/movements/TopologyManager.cpp index 7199263..3031258 100644 --- a/components/movements/TopologyManager.cpp +++ b/components/movements/TopologyManager.cpp @@ -204,18 +204,90 @@ esp_err_t TopologyManager::get_curr_topology(std::unordered_map(m.size)); + + res = nvs_commit(handle); + if (res != ESP_OK) { + ESP_LOGE(TOPOLOGY_DEBUG_TAG, "Failed to commit data size"); + return res; + } + + res = nvs_set_blob(handle, MOVEMENTS_NVS_TOPOLOGY_KEY, m.data, m.size); + + if (res != ESP_OK){ + ESP_LOGE(TOPOLOGY_DEBUG_TAG, "Failed to write to nvs"); + return res; + } + + res = nvs_commit(handle); + if (res != ESP_OK) { + ESP_LOGE(TOPOLOGY_DEBUG_TAG, "Failed to commit topology"); + return res; + } + + return ESP_OK; +} + +esp_err_t TopologyManager::get_nvs_topology(std::unordered_map>>& topology){ + if (!ready) { + return ESP_ERR_INVALID_STATE; + } + + size_t size = 0; + esp_err_t res = nvs_get_u32(handle,MOVEMENTS_NVS_TOPOLOGY_DATA_SIZE_KEY, reinterpret_cast(&size)); + + if (res != ESP_OK) { + ESP_LOGE(TOPOLOGY_DEBUG_TAG, "Failed to read data size"); + return res; + } + + std::vector buffer(size); + + res = nvs_get_blob(handle, MOVEMENTS_NVS_TOPOLOGY_KEY, buffer.data(), &size); + + if (res != ESP_OK) { + ESP_LOGE(TOPOLOGY_DEBUG_TAG, "Failed to read blob"); + return res; + } + + // Verify the FlatBuffer + flatbuffers::Verifier verifier(buffer.data(), buffer.size()); + if (!Topology::VerifyTopologyInfoBuffer(verifier)) { + ESP_LOGE(TOPOLOGY_DEBUG_TAG, "FlatBuffer verification failed"); + return ESP_ERR_INVALID_ARG; + } + + // Parse root + const Topology::TopologyInfo* topo = Topology::GetTopologyInfo(buffer.data()); + + topology.clear(); + + // Replace neighbours() with your actual accessor name + auto neighbours = topo->boards(); + + for (const auto* nb : *neighbours) { + uint16_t board_id = nb->curr_board_id(); + + std::vector> connections; + connections.reserve(nb->neighbour_connections()->size()); + + for (const auto* conn : *nb->neighbour_connections()) { + connections.emplace_back(conn->channel(), conn->board_id()); + } + + topology.emplace(board_id, std::move(connections)); + } + + return ESP_OK; +} #endif //MOVEMENTS \ No newline at end of file diff --git a/components/movements/include/MovementManager.h b/components/movements/include/MovementManager.h index f7ed809..dbc071c 100644 --- a/components/movements/include/MovementManager.h +++ b/components/movements/include/MovementManager.h @@ -6,6 +6,7 @@ #define MOVEMENTS_NVS_NAMESPACE "movements" #define MOVEMENTS_NVS_KEY "key" #define MOVEMENTS_NVS_TOPOLOGY_KEY "topology" +#define MOVEMENTS_NVS_TOPOLOGY_DATA_SIZE_KEY "data_size" #define MOVEMENTS_DEBUG_TAG "movements" class MovementManager { diff --git a/components/movements/include/TopologyManager.h b/components/movements/include/TopologyManager.h index a87c1bb..94ebf6d 100644 --- a/components/movements/include/TopologyManager.h +++ b/components/movements/include/TopologyManager.h @@ -5,9 +5,9 @@ #include #include -// move these to constants header file? -#include "RMTManager.h" -#include "DataLinkManager.h" +#include "constants/rmt.h" +#include "constants/datalink.h" + #include "Frames.h" #include "TopologyBuilder.h" #include @@ -26,7 +26,7 @@ class TopologyManager { esp_err_t verify_topology(); esp_err_t get_curr_topology(std::unordered_map>>& topology); esp_err_t write_nvs_topology(); - esp_err_t get_nvs_topology(std::unordered_map>& topology); + esp_err_t get_nvs_topology(std::unordered_map>>& topology); private: std::unordered_map> topology; diff --git a/main/README.md b/main/README.md index 215a013..0e1298e 100644 --- a/main/README.md +++ b/main/README.md @@ -42,6 +42,10 @@ To run the sample code, add the compiler variable `PP_MOVE=1` when compiling. You can use the `SRC_BOARD` compiler variable to set a custom board id. +The sample topology used to test: + +![Sample Topology Used for Testing](images/sample_topology.png) + # cat ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⡷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ diff --git a/main/images/sample_topology.png b/main/images/sample_topology.png new file mode 100644 index 0000000000000000000000000000000000000000..54504a6073df253fbb7e4ad23ff2cded686bf57d GIT binary patch literal 66709 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 literal 0 HcmV?d00001 diff --git a/main/main_preprogrammed_test.cpp b/main/main_preprogrammed_test.cpp index 2b36d7c..0d73426 100644 --- a/main/main_preprogrammed_test.cpp +++ b/main/main_preprogrammed_test.cpp @@ -44,7 +44,6 @@ extern "C" [[noreturn]] void app_main(void) { } ESP_ERROR_CHECK(ret); - esp_netif_init(); esp_event_loop_create_default(); printf("finished esp init\n"); @@ -140,10 +139,59 @@ extern "C" [[noreturn]] void app_main(void) { if (res != ESP_OK){ ESP_LOGE(MOVEMENT_DEBUG_TAG, "Topology verification incorrectly failed"); + restart(); } else { ESP_LOGI(MOVEMENT_DEBUG_TAG, "Topology verification passed"); } + res = obj.write_nvs_topology(); + + if (res == ESP_OK){ + ESP_LOGI(MOVEMENT_DEBUG_TAG, "Topology NVS write success"); + } else { + ESP_LOGE(MOVEMENT_DEBUG_TAG, "Topology NVS write failed"); + restart(); + } + + std::unordered_map>> nvs_topology; + + res = obj.get_nvs_topology(nvs_topology); + if (res == ESP_OK){ + ESP_LOGI(MOVEMENT_DEBUG_TAG, "Topology NVS read success"); + } else { + ESP_LOGE(MOVEMENT_DEBUG_TAG, "Topology NVS read failed"); + restart(); + } + + if (nvs_topology.size() != test_connections.size()){ + ESP_LOGE(MOVEMENT_DEBUG_TAG, "Topology NVS size is different"); + restart(); + } + + for (const auto& connections : test_connections){ + const auto& test = connections.first; + + if (nvs_topology.find(connections.second) == nvs_topology.end()){ + ESP_LOGE(MOVEMENT_DEBUG_TAG, "Failed to find board %d in topology", connections.second); + restart(); + } + + if (test.size() != nvs_topology[connections.second].size()){ + ESP_LOGE(MOVEMENT_DEBUG_TAG, "Board %d connections are different in topology", connections.second); + restart(); + } + } + + ESP_LOGI(MOVEMENT_DEBUG_TAG, "Topology NVS R/W success! Got back the same topology"); + + ESP_LOGI(MOVEMENT_DEBUG_TAG, "Topology NVS got:"); + + for (const auto& [key, connections] : nvs_topology){ + for (const auto& c : connections){ + ESP_LOGI(MOVEMENT_DEBUG_TAG, "Board %d -> board %d on channel %d", key, c.second, c.first); + } + } + //test removing a board from topology uint16_t board_id_to_remove = 2;