feat(gateway): add KNX TP UART startup timeout configuration and enhance initialization logic
Signed-off-by: Tony <tonylu@tony-cloud.com>
This commit is contained in:
@@ -33,6 +33,7 @@ class TpuartUartInterface;
|
||||
constexpr uint16_t kGatewayKnxDefaultUdpPort = 3671;
|
||||
constexpr const char* kGatewayKnxDefaultMulticastAddress = "224.0.23.12";
|
||||
constexpr uint32_t kGatewayKnxDefaultTpBaudrate = 19200;
|
||||
constexpr uint32_t kGatewayKnxDefaultTpStartupTimeoutMs = 2000;
|
||||
|
||||
struct GatewayKnxTpUartConfig {
|
||||
int uart_port{1};
|
||||
@@ -41,6 +42,7 @@ struct GatewayKnxTpUartConfig {
|
||||
uint32_t baudrate{kGatewayKnxDefaultTpBaudrate};
|
||||
size_t rx_buffer_size{1024};
|
||||
size_t tx_buffer_size{1024};
|
||||
uint32_t startup_timeout_ms{kGatewayKnxDefaultTpStartupTimeoutMs};
|
||||
uint32_t read_timeout_ms{20};
|
||||
bool nine_bit_mode{true};
|
||||
};
|
||||
|
||||
@@ -804,6 +804,9 @@ std::optional<GatewayKnxConfig> GatewayKnxConfigFromValue(const DaliValue* value
|
||||
config.tp_uart.tx_buffer_size = static_cast<size_t>(std::max(
|
||||
128, ObjectIntAny(serial, {"txBufferSize", "tx_buffer_size"})
|
||||
.value_or(static_cast<int>(config.tp_uart.tx_buffer_size))));
|
||||
config.tp_uart.startup_timeout_ms = static_cast<uint32_t>(std::max(
|
||||
0, ObjectIntAny(serial, {"startupTimeoutMs", "startup_timeout_ms"})
|
||||
.value_or(static_cast<int>(config.tp_uart.startup_timeout_ms))));
|
||||
config.tp_uart.read_timeout_ms = static_cast<uint32_t>(std::max(
|
||||
1, ObjectIntAny(serial, {"readTimeoutMs", "read_timeout_ms"})
|
||||
.value_or(static_cast<int>(config.tp_uart.read_timeout_ms))));
|
||||
@@ -840,6 +843,7 @@ DaliValue GatewayKnxConfigToValue(const GatewayKnxConfig& config) {
|
||||
serial["baudrate"] = static_cast<int>(config.tp_uart.baudrate);
|
||||
serial["rxBufferSize"] = static_cast<int>(config.tp_uart.rx_buffer_size);
|
||||
serial["txBufferSize"] = static_cast<int>(config.tp_uart.tx_buffer_size);
|
||||
serial["startupTimeoutMs"] = static_cast<int>(config.tp_uart.startup_timeout_ms);
|
||||
serial["readTimeoutMs"] = static_cast<int>(config.tp_uart.read_timeout_ms);
|
||||
serial["nineBitMode"] = config.tp_uart.nine_bit_mode;
|
||||
out["tpUart"] = std::move(serial);
|
||||
@@ -2447,7 +2451,17 @@ bool GatewayKnxTpIpRouter::configureTpUart() {
|
||||
ESP_LOGE(kTag, "%s", last_error_.c_str());
|
||||
return false;
|
||||
}
|
||||
const TickType_t startup_timeout_ticks =
|
||||
pdMS_TO_TICKS(config_.tp_uart.startup_timeout_ms);
|
||||
const TickType_t retry_poll_ticks = std::max<TickType_t>(1, pdMS_TO_TICKS(20));
|
||||
const TickType_t startup_begin_tick = xTaskGetTickCount();
|
||||
tp_uart_online_ = ets_device_->enableTpUart(true);
|
||||
while (!tp_uart_online_ && startup_timeout_ticks > 0 &&
|
||||
(xTaskGetTickCount() - startup_begin_tick) < startup_timeout_ticks) {
|
||||
vTaskDelay(retry_poll_ticks);
|
||||
ets_device_->loop();
|
||||
tp_uart_online_ = ets_device_->tpUartOnline();
|
||||
}
|
||||
if (!tp_uart_online_) {
|
||||
last_error_ = "OpenKNX failed to initialize KNX TP-UART uart=" +
|
||||
std::to_string(config_.tp_uart.uart_port) + " tx=" +
|
||||
@@ -2465,6 +2479,11 @@ bool GatewayKnxTpIpRouter::configureTpUart() {
|
||||
ESP_LOGE(kTag, "%s", last_error_.c_str());
|
||||
return false;
|
||||
}
|
||||
const TickType_t startup_elapsed_ticks = xTaskGetTickCount() - startup_begin_tick;
|
||||
if (startup_elapsed_ticks > 0) {
|
||||
ESP_LOGI(kTag, "KNX TP-UART startup settled after %lu ms",
|
||||
static_cast<unsigned long>(pdTICKS_TO_MS(startup_elapsed_ticks)));
|
||||
}
|
||||
ESP_LOGI(kTag, "KNX TP-UART online uart=%d tx=%s rx=%s baud=%u nineBit=%d",
|
||||
config_.tp_uart.uart_port,
|
||||
UartPinDescription(config_.tp_uart.tx_pin, tp_uart_tx_pin_).c_str(),
|
||||
|
||||
Reference in New Issue
Block a user