Resolve merge conflict in modbus_server.c and add hardcoded firmware version.

This commit is contained in:
Eduard Iten 2025-07-03 13:34:59 +02:00
parent e429a0874d
commit 1b0519aadf
1 changed files with 97 additions and 38 deletions

View File

@ -1,19 +1,14 @@
#include <zephyr/kernel.h>
#include "modbus_server.h"
#include <zephyr/modbus/modbus.h>
#include <zephyr/logging/log.h>
#include <zephyr/settings/settings.h>
#include <zephyr/sys/reboot.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;
@ -27,7 +22,8 @@ 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);
} }
} }
@ -35,11 +31,20 @@ 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_CLOSING_TIME_S: *reg = valve_get_max_close_time(); break; case REG_HOLDING_MAX_OPENING_TIME_S:
case REG_HOLDING_WATCHDOG_TIMEOUT_S: *reg = watchdog_timeout_s; break; *reg = valve_get_max_open_time();
default: *reg = 0; break; 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;
} }
@ -47,11 +52,21 @@ 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) { valve_open(); } if (reg == 1)
else if (reg == 2) { valve_close(); } {
else if (reg == 0) { valve_stop(); } valve_open();
}
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);
@ -61,23 +76,27 @@ 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;
} }
@ -86,13 +105,32 @@ 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_MOTOR_CURRENT_MA: *reg = valve_get_motor_current(); break; case REG_INPUT_VALVE_STATE_MOVEMENT:
case REG_INPUT_UPTIME_SECONDS_LOW: *reg = (uint16_t)(uptime_s & 0xFFFF); break; *reg = (valve_get_movement() << 8) | (valve_get_state() & 0xFF);
case REG_INPUT_UPTIME_SECONDS_HIGH: *reg = (uint16_t)(uptime_s >> 16); break; break;
case REG_INPUT_FWU_LAST_CHUNK_CRC: *reg = fwu_get_last_chunk_crc(); break; case REG_INPUT_MOTOR_CURRENT_MA:
default: *reg = 0; break; *reg = valve_get_motor_current();
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;
case REG_INPUT_FIRMWARE_VERSION_MAJOR_MINOR:
*reg = (0 << 8) | 0;
break;
case REG_INPUT_FIRMWARE_VERSION_PATCH:
*reg = 1;
break;
default:
*reg = 0;
break;
} }
return 0; return 0;
} }
@ -109,8 +147,28 @@ 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) { return modbus_iface; } if (modbus_iface < 0)
{
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);
} }
@ -122,12 +180,13 @@ 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/unit_id", &unit_id, sizeof(unit_id)); settings_save_one("modbus/baudrate", &baudrate, sizeof(baudrate));
} 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; }