From a2ea9e5bbe66db5e531e7e5217e37991949bc3ce Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 16 Jun 2026 06:17:15 +0800 Subject: [PATCH] fix: enhance command frame validation and add DALI bus configuration options Signed-off-by: Tony --- apps/gateway/main/app_main.cpp | 28 +++++++++++++++++++ apps/gateway/sdkconfig | 2 ++ .../gateway_knx/src/gateway_knx_bridge.cpp | 2 +- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/apps/gateway/main/app_main.cpp b/apps/gateway/main/app_main.cpp index ed41098..33228a2 100644 --- a/apps/gateway/main/app_main.cpp +++ b/apps/gateway/main/app_main.cpp @@ -1171,6 +1171,34 @@ extern "C" void app_main(void) { if (s_controller == nullptr) { return out; } + if (!gateway::GatewayRuntime::isGatewayCommandFrame(frame) || + !gateway::GatewayRuntime::hasValidChecksum(frame) || + frame.size() < 5) { + out.status = gateway::GatewayKnxGatewayTransactionStatus::kInvalidFrame; + return out; + } + const auto is_write_only_dali_frame = + [](const std::vector& command) { + if (command.size() < 5) { + return false; + } + switch (command[3]) { + case 0x12: + case 0x13: + return command.size() >= 7; + case 0x60: + case 0x61: + return command.size() >= 8; + default: + return false; + } + }; + if (is_write_only_dali_frame(frame)) { + out.status = s_controller->enqueueCommandFrame(frame) + ? gateway::GatewayKnxGatewayTransactionStatus::kOk + : gateway::GatewayKnxGatewayTransactionStatus::kQueueRejected; + return out; + } const auto result = s_controller->transactCommandFrame(frame, timeout_ms); switch (result.status) { case gateway::GatewayCommandTransactionStatus::kOk: diff --git a/apps/gateway/sdkconfig b/apps/gateway/sdkconfig index ec94005..df9797c 100644 --- a/apps/gateway/sdkconfig +++ b/apps/gateway/sdkconfig @@ -2925,7 +2925,9 @@ CONFIG_DALI_FORWARD_AFTER_BACKWARD_WAIT_MS=10 CONFIG_DALI_FORWARD_MAX_WAIT_MS=50 CONFIG_DALI_BACKWARD_IDLE_TIMEOUT_MS=10 CONFIG_DALI_BUS_POWER_CHECK_INTERVAL_MS=500 +CONFIG_DALI_BUS_FAIL_EVENT_DELAY_MS=45 CONFIG_DALI_BUS_ABNORMAL_REPORT_INTERVAL_MS=3000 +CONFIG_DALI_BUS_RESET_PULSE_MS=10 # CONFIG_DALI_LOG_LEVEL_NONE is not set # CONFIG_DALI_LOG_LEVEL_ERROR is not set # CONFIG_DALI_LOG_LEVEL_WARN is not set diff --git a/components/gateway_knx/src/gateway_knx_bridge.cpp b/components/gateway_knx/src/gateway_knx_bridge.cpp index 0b104d8..4067947 100644 --- a/components/gateway_knx/src/gateway_knx_bridge.cpp +++ b/components/gateway_knx/src/gateway_knx_bridge.cpp @@ -696,7 +696,7 @@ bool GatewayKnxBridge::handleDalimasterDiscoveryState(const uint8_t*, size_t, response->push_back('G'); response->push_back(0x01); response->push_back(kDalimasterTransferChunkBytes); - uint16_t feature_flags = 0x0100 | 0x0080; + uint16_t feature_flags = 0x0100 | 0x0080 | 0x0200; if (config_.tunnel_enabled) { feature_flags |= 0x0001; }