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.
This commit is contained in:
parent
9f96384aa5
commit
bb25134b6c
|
|
@ -158,6 +158,17 @@ static struct modbus_user_callbacks mbs_cbs = {
|
||||||
int modbus_server_init(void)
|
int modbus_server_init(void)
|
||||||
{
|
{
|
||||||
k_timer_init(&watchdog_timer, watchdog_timer_handler, NULL);
|
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)};
|
const char iface_name[] = {DEVICE_DT_NAME(MODBUS_NODE)};
|
||||||
#if DT_NODE_HAS_COMPAT(DT_PARENT(MODBUS_NODE), zephyr_cdc_acm_uart)
|
#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));
|
const struct device *const dev = DEVICE_DT_GET(DT_PARENT(MODBUS_NODE));
|
||||||
|
|
@ -182,20 +193,37 @@ int modbus_server_init(void)
|
||||||
return modbus_iface;
|
return modbus_iface;
|
||||||
}
|
}
|
||||||
server_param.server.user_cb = &mbs_cbs;
|
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);
|
return modbus_init_server(modbus_iface, server_param);
|
||||||
}
|
}
|
||||||
|
|
||||||
int modbus_reconfigure(uint32_t baudrate, uint8_t unit_id)
|
int modbus_reconfigure(uint32_t baudrate, uint8_t unit_id)
|
||||||
{
|
{
|
||||||
|
// Update parameters
|
||||||
server_param.serial.baud = baudrate;
|
server_param.serial.baud = baudrate;
|
||||||
server_param.server.unit_id = unit_id;
|
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);
|
int ret = modbus_init_server(modbus_iface, server_param);
|
||||||
|
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
settings_save_one("modbus/baudrate", &baudrate, sizeof(baudrate));
|
settings_save_one("modbus/baudrate", &baudrate, sizeof(baudrate));
|
||||||
settings_save_one("modbus/unit_id", &unit_id, sizeof(unit_id));
|
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;
|
return ret;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue