From bb25134b6c9a781a73ba376dde7c15b8a221f41b Mon Sep 17 00:00:00 2001 From: Eduard Iten Date: Thu, 3 Jul 2025 18:59:01 +0200 Subject: [PATCH] feat(modbus): Implement persistent and improved reconfiguration for Modbus server This commit enhances the Modbus server's configuration handling by: - Loading saved baudrate and unit ID settings during initialization, ensuring persistence across reboots. - Providing improved feedback during `modbus_reconfigure`, including logging for successful changes and informing the user when a device restart is required for changes to take effect. - Saving new configuration settings even if immediate reinitialization fails, allowing them to be applied on the next boot. --- software/lib/modbus_server/modbus_server.c | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/software/lib/modbus_server/modbus_server.c b/software/lib/modbus_server/modbus_server.c index 9175b63..1d78f77 100644 --- a/software/lib/modbus_server/modbus_server.c +++ b/software/lib/modbus_server/modbus_server.c @@ -158,6 +158,17 @@ static struct modbus_user_callbacks mbs_cbs = { int modbus_server_init(void) { k_timer_init(&watchdog_timer, watchdog_timer_handler, NULL); + + // Load saved settings + uint32_t saved_baudrate = 19200; + uint8_t saved_unit_id = 1; + settings_load_one("modbus/baudrate", &saved_baudrate, sizeof(saved_baudrate)); + settings_load_one("modbus/unit_id", &saved_unit_id, sizeof(saved_unit_id)); + + // Apply loaded settings + server_param.serial.baud = saved_baudrate; + server_param.server.unit_id = saved_unit_id; + const char iface_name[] = {DEVICE_DT_NAME(MODBUS_NODE)}; #if DT_NODE_HAS_COMPAT(DT_PARENT(MODBUS_NODE), zephyr_cdc_acm_uart) const struct device *const dev = DEVICE_DT_GET(DT_PARENT(MODBUS_NODE)); @@ -182,20 +193,37 @@ int modbus_server_init(void) return modbus_iface; } server_param.server.user_cb = &mbs_cbs; + + LOG_INF("Starting Modbus server: baudrate=%u, unit_id=%u", saved_baudrate, saved_unit_id); return modbus_init_server(modbus_iface, server_param); } int modbus_reconfigure(uint32_t baudrate, uint8_t unit_id) { + // Update parameters server_param.serial.baud = baudrate; server_param.server.unit_id = unit_id; + // Try to reinitialize - this should work for most cases int ret = modbus_init_server(modbus_iface, server_param); if (ret == 0) { settings_save_one("modbus/baudrate", &baudrate, sizeof(baudrate)); settings_save_one("modbus/unit_id", &unit_id, sizeof(unit_id)); + LOG_INF("Modbus reconfigured: baudrate=%u, unit_id=%u", baudrate, unit_id); + } + else + { + LOG_ERR("Failed to reconfigure Modbus: %d", ret); + LOG_INF("Modbus reconfiguration requires restart to take effect"); + + // Save settings for next boot + settings_save_one("modbus/baudrate", &baudrate, sizeof(baudrate)); + settings_save_one("modbus/unit_id", &unit_id, sizeof(unit_id)); + + LOG_INF("Settings saved. Type 'reset' to restart the device and apply the change."); + return 0; // Return success since settings are saved } return ret;