Compare commits
No commits in common. "69cf7e95117dae7bac257a74b82f44a83cb89b21" and "f6ee0a5122e14314f6fccf44bf764624589c868a" have entirely different histories.
69cf7e9511
...
f6ee0a5122
|
|
@ -0,0 +1,6 @@
|
||||||
|
cmake_minimum_required(VERSION 3.20)
|
||||||
|
|
||||||
|
project(fwu)
|
||||||
|
|
||||||
|
target_sources(fwu PRIVATE src/fwu.c)
|
||||||
|
target_include_directories(fwu PUBLIC include)
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
cmake_minimum_required(VERSION 3.20)
|
||||||
|
|
||||||
|
project(modbus_server)
|
||||||
|
|
||||||
|
target_sources(modbus_server PRIVATE src/modbus_server.c)
|
||||||
|
target_include_directories(modbus_server PUBLIC include)
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
cmake_minimum_required(VERSION 3.20)
|
||||||
|
|
||||||
|
project(valve)
|
||||||
|
|
||||||
|
target_sources(valve PRIVATE src/valve.c)
|
||||||
|
target_include_directories(valve PUBLIC include)
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/ {
|
/ {
|
||||||
vnd7050aj: vnd7050aj {
|
vnd7050aj {
|
||||||
compatible = "vnd7050aj-valve-controller";
|
compatible = "gpio-leds"; // Using generic GPIO compatible
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
// VND7050AJ GPIO pin definitions
|
// VND7050AJ GPIO pin definitions
|
||||||
|
|
|
||||||
|
|
@ -2,21 +2,8 @@
|
||||||
#define VALVE_H
|
#define VALVE_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <zephyr/drivers/gpio.h>
|
|
||||||
|
|
||||||
struct valve_gpios {
|
enum valve_state { VALVE_STATE_CLOSED, VALVE_STATE_OPEN };
|
||||||
const struct gpio_dt_spec in0;
|
|
||||||
const struct gpio_dt_spec in1;
|
|
||||||
const struct gpio_dt_spec rst;
|
|
||||||
const struct gpio_dt_spec sen;
|
|
||||||
const struct gpio_dt_spec s0;
|
|
||||||
const struct gpio_dt_spec s1;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum valve_state {
|
|
||||||
VALVE_STATE_CLOSED,
|
|
||||||
VALVE_STATE_OPEN,
|
|
||||||
};
|
|
||||||
enum valve_movement { VALVE_MOVEMENT_IDLE, VALVE_MOVEMENT_OPENING, VALVE_MOVEMENT_CLOSING, VALVE_MOVEMENT_ERROR };
|
enum valve_movement { VALVE_MOVEMENT_IDLE, VALVE_MOVEMENT_OPENING, VALVE_MOVEMENT_CLOSING, VALVE_MOVEMENT_ERROR };
|
||||||
|
|
||||||
void valve_init(void);
|
void valve_init(void);
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,10 @@
|
||||||
#include <zephyr/kernel.h>
|
#include <zephyr/kernel.h>
|
||||||
#include <zephyr/settings/settings.h>
|
#include <zephyr/settings/settings.h>
|
||||||
#include <zephyr/logging/log.h>
|
#include <zephyr/logging/log.h>
|
||||||
#include <zephyr/device.h>
|
|
||||||
#include <zephyr/drivers/gpio.h>
|
|
||||||
#include <lib/valve.h>
|
#include <lib/valve.h>
|
||||||
|
|
||||||
LOG_MODULE_REGISTER(valve, LOG_LEVEL_INF);
|
LOG_MODULE_REGISTER(valve, LOG_LEVEL_INF);
|
||||||
|
|
||||||
static const struct valve_gpios valve_gpios = {
|
|
||||||
.in0 = GPIO_DT_SPEC_GET(DT_NODELABEL(vnd7050aj), in0_gpios),
|
|
||||||
.in1 = GPIO_DT_SPEC_GET(DT_NODELABEL(vnd7050aj), in1_gpios),
|
|
||||||
.rst = GPIO_DT_SPEC_GET(DT_NODELABEL(vnd7050aj), rst_gpios),
|
|
||||||
.sen = GPIO_DT_SPEC_GET(DT_NODELABEL(vnd7050aj), sen_gpios),
|
|
||||||
.s0 = GPIO_DT_SPEC_GET(DT_NODELABEL(vnd7050aj), s0_gpios),
|
|
||||||
.s1 = GPIO_DT_SPEC_GET(DT_NODELABEL(vnd7050aj), s1_gpios),
|
|
||||||
};
|
|
||||||
|
|
||||||
static enum valve_state current_state = VALVE_STATE_CLOSED;
|
static enum valve_state current_state = VALVE_STATE_CLOSED;
|
||||||
static enum valve_movement current_movement = VALVE_MOVEMENT_IDLE;
|
static enum valve_movement current_movement = VALVE_MOVEMENT_IDLE;
|
||||||
static uint16_t max_opening_time_s = 60;
|
static uint16_t max_opening_time_s = 60;
|
||||||
|
|
@ -24,15 +13,11 @@ static struct k_work_delayable valve_work;
|
||||||
|
|
||||||
static void valve_work_handler(struct k_work *work)
|
static void valve_work_handler(struct k_work *work)
|
||||||
{
|
{
|
||||||
gpio_pin_set_dt(&valve_gpios.in0, 0);
|
|
||||||
gpio_pin_set_dt(&valve_gpios.in1, 0);
|
|
||||||
gpio_pin_set_dt(&valve_gpios.rst, 0);
|
|
||||||
|
|
||||||
if (current_movement == VALVE_MOVEMENT_OPENING) {
|
if (current_movement == VALVE_MOVEMENT_OPENING) {
|
||||||
LOG_INF("Valve finished opening");
|
LOG_INF("Virtual valve finished opening");
|
||||||
} else if (current_movement == VALVE_MOVEMENT_CLOSING) {
|
} else if (current_movement == VALVE_MOVEMENT_CLOSING) {
|
||||||
current_state = VALVE_STATE_CLOSED;
|
current_state = VALVE_STATE_CLOSED;
|
||||||
LOG_INF("Valve finished closing");
|
LOG_INF("Virtual valve finished closing");
|
||||||
}
|
}
|
||||||
current_movement = VALVE_MOVEMENT_IDLE;
|
current_movement = VALVE_MOVEMENT_IDLE;
|
||||||
}
|
}
|
||||||
|
|
@ -42,35 +27,22 @@ void valve_init(void)
|
||||||
k_work_init_delayable(&valve_work, valve_work_handler);
|
k_work_init_delayable(&valve_work, valve_work_handler);
|
||||||
settings_load_one("valve/max_open_time", &max_opening_time_s, sizeof(max_opening_time_s));
|
settings_load_one("valve/max_open_time", &max_opening_time_s, sizeof(max_opening_time_s));
|
||||||
settings_load_one("valve/max_close_time", &max_closing_time_s, sizeof(max_closing_time_s));
|
settings_load_one("valve/max_close_time", &max_closing_time_s, sizeof(max_closing_time_s));
|
||||||
|
|
||||||
gpio_pin_configure_dt(&valve_gpios.in0, GPIO_OUTPUT_INACTIVE);
|
|
||||||
gpio_pin_configure_dt(&valve_gpios.in1, GPIO_OUTPUT_INACTIVE);
|
|
||||||
gpio_pin_configure_dt(&valve_gpios.rst, GPIO_OUTPUT_INACTIVE);
|
|
||||||
gpio_pin_configure_dt(&valve_gpios.sen, GPIO_OUTPUT_INACTIVE);
|
|
||||||
gpio_pin_configure_dt(&valve_gpios.s0, GPIO_OUTPUT_INACTIVE);
|
|
||||||
gpio_pin_configure_dt(&valve_gpios.s1, GPIO_OUTPUT_INACTIVE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void valve_open(void)
|
void valve_open(void)
|
||||||
{
|
{
|
||||||
if (current_state == VALVE_STATE_CLOSED) {
|
if (current_state == VALVE_STATE_CLOSED) {
|
||||||
gpio_pin_set_dt(&valve_gpios.rst, 1);
|
|
||||||
gpio_pin_set_dt(&valve_gpios.in1, 0);
|
|
||||||
gpio_pin_set_dt(&valve_gpios.in0, 1);
|
|
||||||
current_state = VALVE_STATE_OPEN;
|
current_state = VALVE_STATE_OPEN;
|
||||||
current_movement = VALVE_MOVEMENT_OPENING;
|
current_movement = VALVE_MOVEMENT_OPENING;
|
||||||
k_work_schedule(&valve_work, K_MSEC(max_opening_time_s * 1000 * 0.9));
|
k_work_schedule(&valve_work, K_SECONDS(max_opening_time_s));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void valve_close(void)
|
void valve_close(void)
|
||||||
{
|
{
|
||||||
if (current_state == VALVE_STATE_OPEN) {
|
if (current_state == VALVE_STATE_OPEN) {
|
||||||
gpio_pin_set_dt(&valve_gpios.rst, 1);
|
|
||||||
gpio_pin_set_dt(&valve_gpios.in0, 0);
|
|
||||||
gpio_pin_set_dt(&valve_gpios.in1, 1);
|
|
||||||
current_movement = VALVE_MOVEMENT_CLOSING;
|
current_movement = VALVE_MOVEMENT_CLOSING;
|
||||||
k_work_schedule(&valve_work, K_MSEC(max_closing_time_s * 1000 * 0.9));
|
k_work_schedule(&valve_work, K_SECONDS(max_closing_time_s));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue