This commit introduces configurable obstacle detection thresholds for the valve, allowing them to be set and persisted via the Zephyr settings subsystem and controlled through the shell and Modbus tool.
- `software/lib/valve/Kconfig`: Added new Kconfig options `VALVE_OBSTACLE_THRESHOLD_OPEN_MA` and `VALVE_OBSTACLE_THRESHOLD_CLOSE_MA` for compile-time configuration and default values.
- `software/include/lib/valve.h`: Removed hardcoded defines and added API functions for setting and getting obstacle thresholds.
- `software/lib/valve/valve.c`:
- Updated `valve_work_handler` to use the new configurable obstacle thresholds.
- Integrated loading and saving of obstacle thresholds via the settings subsystem in `valve_init`.
- Implemented the new setter and getter functions for obstacle thresholds.
- Updated the `LOG_INF` message in `valve_init` to display the new obstacle threshold values.
- `software/apps/slave_node/prj.conf`: Added default values for the new Kconfig options.
- `software/lib/shell_valve/shell_valve.c`: Added new shell commands `valve set_obstacle_open` and `valve set_obstacle_close` to modify the obstacle thresholds, and updated `valve show` to display them.
- `software/tools/modbus_tool/modbus_tool.py`:
- Defined new Modbus holding registers (`REG_HOLDING_OBSTACLE_THRESHOLD_OPEN_MA`, `REG_HOLDING_OBSTACLE_THRESHOLD_CLOSE_MA`).
- Updated `poll_status` to read these new registers.
- Modified the `main_menu` to include "Set Obstacle Open" and "Set Obstacle Close" options in the settings menu, allowing users to view and modify these parameters.
- `software/lib/modbus_server/modbus_server.c`:
- Updated `holding_reg_rd` to read the new obstacle threshold registers.
- Updated `holding_reg_wr` to write to the new obstacle threshold registers.
- Removed incorrect `REG_HOLDING_END_CURRENT_THRESHOLD_OPEN_MA` and `REG_HOLDING_END_CURRENT_THRESHOLD_CLOSE_MA` cases from `input_reg_rd`.
- `software/include/lib/modbus_registers.h`: Created a new header file to centralize Modbus register definitions, which were previously hardcoded in `modbus_tool.py`.
Signed-off-by: Eduard Iten <eduard@iten.pro>
137 lines
4.0 KiB
C
137 lines
4.0 KiB
C
#include <zephyr/kernel.h>
|
|
#include <zephyr/shell/shell.h>
|
|
#include <lib/valve.h>
|
|
#include <stdlib.h>
|
|
|
|
static int cmd_valve_set_open_t(const struct shell *sh, size_t argc, char **argv)
|
|
{
|
|
if (argc != 2) {
|
|
shell_print(sh, "Usage: valve set_open_t <seconds>");
|
|
return -EINVAL;
|
|
}
|
|
|
|
uint16_t seconds = (uint16_t)atoi(argv[1]);
|
|
valve_set_max_open_time(seconds);
|
|
shell_print(sh, "Max open time set to %u seconds.", seconds);
|
|
return 0;
|
|
}
|
|
|
|
static int cmd_valve_set_close_t(const struct shell *sh, size_t argc, char **argv)
|
|
{
|
|
if (argc != 2) {
|
|
shell_print(sh, "Usage: valve set_close_t <seconds>");
|
|
return -EINVAL;
|
|
}
|
|
|
|
uint16_t seconds = (uint16_t)atoi(argv[1]);
|
|
valve_set_max_close_time(seconds);
|
|
shell_print(sh, "Max close time set to %u seconds.", seconds);
|
|
return 0;
|
|
}
|
|
|
|
static int cmd_valve_set_end_curr_open(const struct shell *sh, size_t argc, char **argv)
|
|
{
|
|
if (argc != 2) {
|
|
shell_print(sh, "Usage: valve set_end_curr_open <milliamps>");
|
|
return -EINVAL;
|
|
}
|
|
|
|
uint16_t current_ma = (uint16_t)atoi(argv[1]);
|
|
valve_set_end_current_threshold_open(current_ma);
|
|
shell_print(sh, "End current threshold (open) set to %u mA.", current_ma);
|
|
return 0;
|
|
}
|
|
|
|
static int cmd_valve_set_end_curr_close(const struct shell *sh, size_t argc, char **argv)
|
|
{
|
|
if (argc != 2) {
|
|
shell_print(sh, "Usage: valve set_end_curr_close <milliamps>");
|
|
return -EINVAL;
|
|
}
|
|
|
|
uint16_t current_ma = (uint16_t)atoi(argv[1]);
|
|
valve_set_end_current_threshold_close(current_ma);
|
|
shell_print(sh, "End current threshold (close) set to %u mA.", current_ma);
|
|
return 0;
|
|
}
|
|
|
|
static int cmd_valve_set_obstacle_open(const struct shell *sh, size_t argc, char **argv)
|
|
{
|
|
if (argc != 2) {
|
|
shell_print(sh, "Usage: valve set_obstacle_open <milliamps>");
|
|
return -EINVAL;
|
|
}
|
|
|
|
uint16_t current_ma = (uint16_t)atoi(argv[1]);
|
|
valve_set_obstacle_threshold_open(current_ma);
|
|
shell_print(sh, "Obstacle threshold (open) set to %u mA.", current_ma);
|
|
return 0;
|
|
}
|
|
|
|
static int cmd_valve_set_obstacle_close(const struct shell *sh, size_t argc, char **argv)
|
|
{
|
|
if (argc != 2) {
|
|
shell_print(sh, "Usage: valve set_obstacle_close <milliamps>");
|
|
return -EINVAL;
|
|
}
|
|
|
|
uint16_t current_ma = (uint16_t)atoi(argv[1]);
|
|
valve_set_obstacle_threshold_close(current_ma);
|
|
shell_print(sh, "Obstacle threshold (close) set to %u mA.", current_ma);
|
|
return 0;
|
|
}
|
|
|
|
static int cmd_valve_show(const struct shell *sh, size_t argc, char **argv)
|
|
{
|
|
const int label_width = 30;
|
|
|
|
shell_print(sh, "Valve Settings:");
|
|
shell_print(sh, "%*s %u s", label_width, "Max Open Time:", valve_get_max_open_time());
|
|
shell_print(sh, "%*s %u s", label_width, "Max Close Time:", valve_get_max_close_time());
|
|
shell_print(sh,
|
|
"%*s %u mA",
|
|
label_width,
|
|
"End Current Threshold (Open):",
|
|
valve_get_end_current_threshold_open());
|
|
shell_print(sh,
|
|
"%*s %u mA",
|
|
label_width,
|
|
"End Current Threshold (Close):",
|
|
valve_get_end_current_threshold_close());
|
|
shell_print(sh,
|
|
"%*s %u mA",
|
|
label_width,
|
|
"Obstacle Threshold (Open):",
|
|
valve_get_obstacle_threshold_open());
|
|
shell_print(sh,
|
|
"%*s %u mA",
|
|
label_width,
|
|
"Obstacle Threshold (Close):",
|
|
valve_get_obstacle_threshold_close());
|
|
return 0;
|
|
}
|
|
|
|
SHELL_STATIC_SUBCMD_SET_CREATE(sub_valve_settings,
|
|
SHELL_CMD(set_open_t, NULL, "Set max open time (seconds)", cmd_valve_set_open_t),
|
|
SHELL_CMD(set_close_t, NULL, "Set max close time (seconds)", cmd_valve_set_close_t),
|
|
SHELL_CMD(set_end_curr_open,
|
|
NULL,
|
|
"Set end current threshold for opening (mA)",
|
|
cmd_valve_set_end_curr_open),
|
|
SHELL_CMD(set_end_curr_close,
|
|
NULL,
|
|
"Set end current threshold for closing (mA)",
|
|
cmd_valve_set_end_curr_close),
|
|
SHELL_CMD(set_obstacle_open,
|
|
NULL,
|
|
"Set obstacle threshold for opening (mA)",
|
|
cmd_valve_set_obstacle_open),
|
|
SHELL_CMD(set_obstacle_close,
|
|
NULL,
|
|
"Set obstacle threshold for closing (mA)",
|
|
cmd_valve_set_obstacle_close),
|
|
SHELL_CMD(show, NULL, "Show valve configuration", cmd_valve_show),
|
|
SHELL_SUBCMD_SET_END);
|
|
|
|
SHELL_CMD_REGISTER(valve, &sub_valve_settings, "Valve commands", NULL);
|