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:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user