Revert "feat(slave_node): Refine Modbus UART and add CDC-ACM support"

This reverts commit 3a05c80b25.
This commit is contained in:
Eduard Iten 2025-07-03 13:34:01 +02:00
parent 3a05c80b25
commit e429a0874d
3 changed files with 44 additions and 110 deletions

View File

@ -12,7 +12,6 @@
label = "RTT"; label = "RTT";
status = "okay"; status = "okay";
}; };
}; };
&flash0 { &flash0 {
@ -35,13 +34,10 @@
}; };
}; };
&usart1: { &usart1 {
pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>; modbus0 {
pinctrl-names = "default"; compatible = "zephyr,modbus-serial";
status = "okay";
modbus0 { };
compatible = "zephyr,modbus-serial"; status = "okay";
status = "okay"; };
};
status = "okay";
};

View File

@ -1,10 +1,9 @@
&usart1 { &usart1 {
modbus0 {
compatible = "zephyr,modbus-serial";
status = "okay";
};
status = "okay";
pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>; pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>;
pinctrl-names = "default"; pinctrl-names = "default";
};
modbus0 {
compatible = "zephyr,modbus-serial";
status = "okay";
};
status = "okay";
};

View File

@ -7,16 +7,13 @@
#include "valve.h" #include "valve.h"
#include "fwu.h" #include "fwu.h"
#include <zephyr/usb/usb_device.h>
LOG_MODULE_REGISTER(modbus_server, LOG_LEVEL_INF); LOG_MODULE_REGISTER(modbus_server, LOG_LEVEL_INF);
static int modbus_iface; static int modbus_iface;
static struct modbus_iface_param server_param = { static struct modbus_iface_param server_param = {
.mode = MODBUS_MODE_RTU, .mode = MODBUS_MODE_RTU,
.server = {.user_cb = NULL, .unit_id = 1}, .server = { .user_cb = NULL, .unit_id = 1 },
.serial = {.baud = 19200, .parity = UART_CFG_PARITY_NONE}, .serial = { .baud = 19200, .parity = UART_CFG_PARITY_NONE },
}; };
static uint16_t watchdog_timeout_s = 0; static uint16_t watchdog_timeout_s = 0;
@ -30,8 +27,7 @@ static void watchdog_timer_handler(struct k_timer *timer_id)
static inline void reset_watchdog(void) static inline void reset_watchdog(void)
{ {
if (watchdog_timeout_s > 0) if (watchdog_timeout_s > 0) {
{
k_timer_start(&watchdog_timer, K_SECONDS(watchdog_timeout_s), K_NO_WAIT); k_timer_start(&watchdog_timer, K_SECONDS(watchdog_timeout_s), K_NO_WAIT);
} }
} }
@ -39,20 +35,11 @@ static inline void reset_watchdog(void)
static int holding_reg_rd(uint16_t addr, uint16_t *reg) static int holding_reg_rd(uint16_t addr, uint16_t *reg)
{ {
reset_watchdog(); reset_watchdog();
switch (addr) switch (addr) {
{ case REG_HOLDING_MAX_OPENING_TIME_S: *reg = valve_get_max_open_time(); break;
case REG_HOLDING_MAX_OPENING_TIME_S: case REG_HOLDING_MAX_CLOSING_TIME_S: *reg = valve_get_max_close_time(); break;
*reg = valve_get_max_open_time(); case REG_HOLDING_WATCHDOG_TIMEOUT_S: *reg = watchdog_timeout_s; break;
break; default: *reg = 0; break;
case REG_HOLDING_MAX_CLOSING_TIME_S:
*reg = valve_get_max_close_time();
break;
case REG_HOLDING_WATCHDOG_TIMEOUT_S:
*reg = watchdog_timeout_s;
break;
default:
*reg = 0;
break;
} }
return 0; return 0;
} }
@ -60,21 +47,11 @@ static int holding_reg_rd(uint16_t addr, uint16_t *reg)
static int holding_reg_wr(uint16_t addr, uint16_t reg) static int holding_reg_wr(uint16_t addr, uint16_t reg)
{ {
reset_watchdog(); reset_watchdog();
switch (addr) switch (addr) {
{
case REG_HOLDING_VALVE_COMMAND: case REG_HOLDING_VALVE_COMMAND:
if (reg == 1) if (reg == 1) { valve_open(); }
{ else if (reg == 2) { valve_close(); }
valve_open(); else if (reg == 0) { valve_stop(); }
}
else if (reg == 2)
{
valve_close();
}
else if (reg == 0)
{
valve_stop();
}
break; break;
case REG_HOLDING_MAX_OPENING_TIME_S: case REG_HOLDING_MAX_OPENING_TIME_S:
valve_set_max_open_time(reg); valve_set_max_open_time(reg);
@ -84,27 +61,23 @@ static int holding_reg_wr(uint16_t addr, uint16_t reg)
break; break;
case REG_HOLDING_WATCHDOG_TIMEOUT_S: case REG_HOLDING_WATCHDOG_TIMEOUT_S:
watchdog_timeout_s = reg; watchdog_timeout_s = reg;
if (watchdog_timeout_s > 0) if (watchdog_timeout_s > 0) {
{
LOG_INF("Watchdog enabled with %u s timeout.", watchdog_timeout_s); LOG_INF("Watchdog enabled with %u s timeout.", watchdog_timeout_s);
reset_watchdog(); reset_watchdog();
} } else {
else
{
LOG_INF("Watchdog disabled."); LOG_INF("Watchdog disabled.");
k_timer_stop(&watchdog_timer); k_timer_stop(&watchdog_timer);
} }
break; break;
case REG_HOLDING_DEVICE_RESET: case REG_HOLDING_DEVICE_RESET:
if (reg == 1) if (reg == 1) {
{
LOG_WRN("Modbus reset command received. Rebooting..."); LOG_WRN("Modbus reset command received. Rebooting...");
sys_reboot(SYS_REBOOT_WARM); sys_reboot(SYS_REBOOT_WARM);
} }
break; break;
default: default:
fwu_handler(addr, reg); fwu_handler(addr, reg);
break; break;
} }
return 0; return 0;
} }
@ -113,26 +86,13 @@ static int input_reg_rd(uint16_t addr, uint16_t *reg)
{ {
reset_watchdog(); reset_watchdog();
uint32_t uptime_s = k_uptime_get_32() / 1000; uint32_t uptime_s = k_uptime_get_32() / 1000;
switch (addr) switch (addr) {
{ case REG_INPUT_VALVE_STATE_MOVEMENT: *reg = (valve_get_movement() << 8) | (valve_get_state() & 0xFF); break;
case REG_INPUT_VALVE_STATE_MOVEMENT: case REG_INPUT_MOTOR_CURRENT_MA: *reg = valve_get_motor_current(); break;
*reg = (valve_get_movement() << 8) | (valve_get_state() & 0xFF); case REG_INPUT_UPTIME_SECONDS_LOW: *reg = (uint16_t)(uptime_s & 0xFFFF); break;
break; case REG_INPUT_UPTIME_SECONDS_HIGH: *reg = (uint16_t)(uptime_s >> 16); break;
case REG_INPUT_MOTOR_CURRENT_MA: case REG_INPUT_FWU_LAST_CHUNK_CRC: *reg = fwu_get_last_chunk_crc(); break;
*reg = valve_get_motor_current(); default: *reg = 0; break;
break;
case REG_INPUT_UPTIME_SECONDS_LOW:
*reg = (uint16_t)(uptime_s & 0xFFFF);
break;
case REG_INPUT_UPTIME_SECONDS_HIGH:
*reg = (uint16_t)(uptime_s >> 16);
break;
case REG_INPUT_FWU_LAST_CHUNK_CRC:
*reg = fwu_get_last_chunk_crc();
break;
default:
*reg = 0;
break;
} }
return 0; return 0;
} }
@ -149,28 +109,8 @@ int modbus_server_init(void)
{ {
k_timer_init(&watchdog_timer, watchdog_timer_handler, NULL); k_timer_init(&watchdog_timer, watchdog_timer_handler, NULL);
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)
const struct device *const dev = DEVICE_DT_GET(DT_PARENT(MODBUS_NODE));
uint32_t dtr = 0;
if (!device_is_ready(dev) || usb_enable(NULL))
{
return 0;
}
while (!dtr)
{
uart_line_ctrl_get(dev, UART_LINE_CTRL_DTR, &dtr);
k_sleep(K_MSEC(100));
}
LOG_INF("Client connected to server on %s", dev->name);
#endif
modbus_iface = modbus_iface_get_by_name(iface_name); modbus_iface = modbus_iface_get_by_name(iface_name);
if (modbus_iface < 0) if (modbus_iface < 0) { return modbus_iface; }
{
return modbus_iface;
}
server_param.server.user_cb = &mbs_cbs; server_param.server.user_cb = &mbs_cbs;
return modbus_init_server(modbus_iface, server_param); return modbus_init_server(modbus_iface, server_param);
} }
@ -182,13 +122,12 @@ int modbus_reconfigure(uint32_t baudrate, uint8_t unit_id)
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)); }
}
return ret; return ret;
} }
uint32_t modbus_get_baudrate(void) { return server_param.serial.baud; } uint32_t modbus_get_baudrate(void) { return server_param.serial.baud; }