feat(gateway): enhance DALI and KNX integration with tunnel confirmation handling and improved message routing

Signed-off-by: Tony <tonylu@tony-cloud.com>
This commit is contained in:
Tony
2026-05-16 09:34:14 +08:00
parent 82142dd46c
commit 77fe8c1b02
5 changed files with 246 additions and 47 deletions
@@ -321,6 +321,9 @@ std::optional<GatewayKnxDaliTarget> DecodeKnxDaliTarget(uint8_t raw_addr) {
return GatewayKnxDaliTarget{GatewayKnxDaliTargetKind::kGroup,
static_cast<int>((raw_addr - kDaliGroupRawMin) >> 1)};
}
if (raw_addr == 0xFE || raw_addr == 0xFF) {
return GatewayKnxDaliTarget{GatewayKnxDaliTargetKind::kBroadcast, 127};
}
return std::nullopt;
}
@@ -4085,7 +4088,36 @@ void GatewayBridgeService::handleDaliRawFrame(const DaliRawFrame& frame) {
if (!owner->knx_started || owner->knx_router == nullptr) {
return;
}
owner->knx_router->publishDaliStatus(update->target, update->actual_level);
auto publish_target = [&](GatewayKnxDaliTargetKind kind, int address) {
owner->knx_router->publishDaliStatus(GatewayKnxDaliTarget{kind, address},
update->actual_level);
};
publish_target(update->target.kind, update->target.address);
if (update->target.kind == GatewayKnxDaliTargetKind::kGroup &&
update->target.address >= 0 && update->target.address < 16) {
const uint16_t group_bit = static_cast<uint16_t>(1U << update->target.address);
for (int short_address = 0; short_address <= kMaxDaliShortAddress; ++short_address) {
const auto state = owner->cache.daliAddressState(frame.gateway_id,
static_cast<uint8_t>(short_address));
if (!state.group_mask_known || (state.group_mask & group_bit) == 0) {
continue;
}
publish_target(GatewayKnxDaliTargetKind::kShortAddress, short_address);
}
return;
}
if (update->target.kind == GatewayKnxDaliTargetKind::kBroadcast) {
for (int group = 0; group < 16; ++group) {
publish_target(GatewayKnxDaliTargetKind::kGroup, group);
}
for (int short_address = 0; short_address <= kMaxDaliShortAddress; ++short_address) {
publish_target(GatewayKnxDaliTargetKind::kShortAddress, short_address);
}
}
}
void GatewayBridgeService::collectUsedRuntimeResources(