feat: add KNX gateway snapshot and command transaction handling

Signed-off-by: Tony <tonylu@tony-cloud.com>
This commit is contained in:
Tony
2026-06-13 01:47:36 +08:00
parent 40a0e8e303
commit be9ff9c2c9
8 changed files with 527 additions and 6 deletions
+40
View File
@@ -1148,6 +1148,46 @@ extern "C" void app_main(void) {
bridge_config.gateway_device_name_provider = []() {
return s_runtime == nullptr ? std::string() : s_runtime->deviceName();
};
bridge_config.knx_gateway_snapshot_provider = []() {
gateway::GatewayKnxGatewaySnapshot out;
if (s_controller == nullptr) {
return out;
}
const auto snapshot = s_controller->snapshot();
out.channels.reserve(snapshot.channels.size());
for (const auto& channel : snapshot.channels) {
out.channels.push_back(
gateway::GatewayKnxGatewayChannelSnapshot{channel.gateway_id});
}
return out;
};
bridge_config.knx_gateway_command_transactor =
[](const std::vector<uint8_t>& frame, uint32_t timeout_ms) {
gateway::GatewayKnxGatewayTransactionResult out;
if (s_controller == nullptr) {
return out;
}
const auto result = s_controller->transactCommandFrame(frame, timeout_ms);
switch (result.status) {
case gateway::GatewayCommandTransactionStatus::kOk:
out.status = gateway::GatewayKnxGatewayTransactionStatus::kOk;
break;
case gateway::GatewayCommandTransactionStatus::kInvalidFrame:
out.status = gateway::GatewayKnxGatewayTransactionStatus::kInvalidFrame;
break;
case gateway::GatewayCommandTransactionStatus::kQueueRejected:
out.status = gateway::GatewayKnxGatewayTransactionStatus::kQueueRejected;
break;
case gateway::GatewayCommandTransactionStatus::kTimeout:
out.status = gateway::GatewayKnxGatewayTransactionStatus::kTimeout;
break;
case gateway::GatewayCommandTransactionStatus::kNoResponse:
out.status = gateway::GatewayKnxGatewayTransactionStatus::kNoResponse;
break;
}
out.frames = result.frames;
return out;
};
s_bridge = std::make_unique<gateway::GatewayBridgeService>(*s_dali_domain, *s_cache,
bridge_config);
s_controller->setBridgeService(s_bridge.get());