update movement set

This commit is contained in:
superkor
2026-01-27 22:17:44 -05:00
parent 1576c73f3a
commit 497f022548
9 changed files with 278 additions and 92 deletions

View File

@@ -6,40 +6,72 @@
#ifdef MOVEMENTSETBUILDER
namespace Flatbuffers {
SerializedMessage MovementSetBuilder::build_movement_set(const std::vector<flatbuffers::Offset<Movement::MovementEntry>>& set){
SerializedMessage MovementSetBuilder::build_movement_set(const std::unordered_map<uint8_t, std::vector<MovementEntryInput>>& input){
builder_.Clear();
const auto set_vector = builder_.CreateVector(set);
std::vector<flatbuffers::Offset<Movement::MovementVector>> map_entries;
map_entries.reserve(input.size());
const auto message = Movement::CreateMovementSet(
builder_,
static_cast<uint8_t>(set.size()),
set_vector
// 1. Collect and sort keys (DO NOT sort offsets)
std::vector<uint8_t> keys;
keys.reserve(input.size());
for (const auto& [key, _] : input) {
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);
std::vector<flatbuffers::Offset<Movement::MovementEntry>> fb_entries;
fb_entries.reserve(entries.size());
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_,
key,
movements_vector
)
);
}
// 3. Build the map vector
auto map_vector = builder_.CreateVector(map_entries);
auto message = Movement::CreateMovementSet(
builder_,
map_vector
);
builder_.Finish(message);
return {builder_.GetBufferPointer(), builder_.GetSize()};
}
flatbuffers::Offset<Movement::MovementEntry> MovementSetBuilder::build_movement_entry(uint16_t board_id, uint8_t module_type, uint16_t value_action,
const Movement::ConditionBlob& condition, uint8_t ack, uint16_t ack_ttl_ms, uint16_t post_delay_ms){
return Movement::CreateMovementEntry(
builder_,
board_id,
module_type,
value_action,
&condition,
ack,
ack_ttl_ms,
post_delay_ms
);
return { builder_.GetBufferPointer(), builder_.GetSize() };
}
Movement::ConditionBlob MovementSetBuilder::build_condition_blob(uint16_t value, uint8_t cond, uint8_t module_type, uint8_t in_use){
return Movement::ConditionBlob(value, cond, module_type, in_use);
}
}
#endif //MOVEMENTSETBUILDER