movement set read write to nvs working

This commit is contained in:
superkor
2026-01-28 00:47:22 -05:00
parent 4c2fabcd11
commit 255840abf1
10 changed files with 288 additions and 58 deletions

View File

@@ -3,6 +3,7 @@ idf_component_register(SRCS "MPIMessageBuilder.cpp"
"TopologyMessageBuilder.cpp"
"SensorMessageBuilder.cpp"
"TopologyBuilder.cpp"
"MovementSetBuilder.cpp"
REQUIRES "constants"
INCLUDE_DIRS "include"
)

View File

@@ -6,7 +6,7 @@
#ifdef MOVEMENTSETBUILDER
namespace Flatbuffers {
SerializedMessage MovementSetBuilder::build_movement_set(const std::unordered_map<uint8_t, std::vector<MovementEntryInput>>& input){
SerializedMessage MovementSetBuilder::build_movement_set(const std::unordered_map<uint8_t, std::vector<MovementEntryData>>& input){
builder_.Clear();
std::vector<flatbuffers::Offset<Movement::MovementVector>> map_entries;
@@ -17,50 +17,50 @@ namespace Flatbuffers {
keys.reserve(input.size());
for (const auto& [key, _] : input) {
keys.push_back(key);
keys.push_back(key);
}
std::sort(keys.begin(), keys.end());
// 2. Build MovementVector entries in key order
for (uint8_t key : keys) {
const auto& entries = input.at(key);
const auto& entries = input.at(key);
std::vector<flatbuffers::Offset<Movement::MovementEntry>> fb_entries;
fb_entries.reserve(entries.size());
std::vector<flatbuffers::Offset<Movement::MovementEntry>> fb_entries;
fb_entries.reserve(entries.size());
for (const auto& e : entries) {
fb_entries.push_back(
Movement::CreateMovementEntry(
for (const auto& e : entries) {
fb_entries.push_back(
Movement::CreateMovementEntry(
builder_,
e.board_id,
e.module_type,
e.value_action,
&e.condition,
e.ack,
e.ack_ttl_ms,
e.post_delay_ms
)
);
}
auto movements_vector = builder_.CreateVector(fb_entries);
map_entries.push_back(
Movement::CreateMovementVector(
builder_,
e.board_id,
e.module_type,
e.value_action,
&e.condition,
e.ack,
e.ack_ttl_ms,
e.post_delay_ms
key,
movements_vector
)
);
}
auto movements_vector = builder_.CreateVector(fb_entries);
map_entries.push_back(
Movement::CreateMovementVector(
builder_,
key,
movements_vector
)
);
}
// 3. Build the map vector
auto map_vector = builder_.CreateVector(map_entries);
auto message = Movement::CreateMovementSet(
builder_,
map_vector
builder_,
map_vector
);
builder_.Finish(message);

View File

@@ -11,22 +11,36 @@
#include "flatbuffers_generated/Movement_generated.h"
#include "flatbuffers/flatbuffers.h"
struct MovementEntryInput {
struct MovementEntryData {
uint16_t board_id;
uint8_t module_type;
uint16_t value_action;
Movement::ConditionBlob condition;
Movement::ConditionBlob condition; // struct is fine to reuse
uint8_t ack;
uint16_t ack_ttl_ms;
uint16_t post_delay_ms;
bool operator==(const MovementEntryData& other) const {
return board_id == other.board_id &&
module_type == other.module_type &&
value_action == other.value_action &&
condition.value() == other.condition.value() &&
condition.cond() == other.condition.cond() &&
condition.module_type() == other.condition.module_type() &&
condition.in_use() == other.condition.in_use() &&
ack == other.ack &&
ack_ttl_ms == other.ack_ttl_ms &&
post_delay_ms == other.post_delay_ms;
}
};
namespace Flatbuffers {
class MovementSetBuilder {
public:
MovementSetBuilder() : builder_(MAX_MOVEMENTS_IN_SET*sizeof(Movement::MovementEntry)) {}
SerializedMessage build_movement_set(const std::unordered_map<uint8_t, std::vector<MovementEntryInput>>& input);
SerializedMessage build_movement_set(const std::unordered_map<uint8_t, std::vector<MovementEntryData>>& input);
Movement::ConditionBlob build_condition_blob(uint16_t value, uint8_t cond, uint8_t module_type, uint8_t in_use);
private: