From dc2dcfec7dcf6d376e348aefb7024b2fc38e865c Mon Sep 17 00:00:00 2001 From: ismail Date: Wed, 12 Feb 2025 16:50:00 +0300 Subject: [PATCH] Add support for addressing all relay channels. --- .vscode/settings.json | 5 +++++ include/relay_chn.h | 2 ++ src/relay_chn.c | 31 +++++++++++++++++++++++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c2ebba1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "relay_chn.h": "c" + } +} \ No newline at end of file diff --git a/include/relay_chn.h b/include/relay_chn.h index c7087c5..9b30de2 100644 --- a/include/relay_chn.h +++ b/include/relay_chn.h @@ -28,6 +28,8 @@ extern "C" { #endif +#define RELAY_CHN_ID_ALL CONFIG_RELAY_CHN_COUNT ///< Special ID to address all channels + /** * @brief Enumeration for relay channel direction. */ diff --git a/src/relay_chn.c b/src/relay_chn.c index cb89241..7cb383c 100644 --- a/src/relay_chn.c +++ b/src/relay_chn.c @@ -28,7 +28,7 @@ #define RELAY_CHN_OPPOSITE_INERTIA_MS CONFIG_RELAY_CHN_OPPOSITE_INERTIA_MS #define RELAY_CHN_COUNT CONFIG_RELAY_CHN_COUNT -const char* TAG = "relay_chn"; +static const char *TAG = "relay_chn"; ESP_EVENT_DEFINE_BASE(RELAY_CHN_CMD_EVENT); @@ -260,7 +260,7 @@ esp_err_t relay_chn_create(const gpio_num_t* gpio_map, uint8_t gpio_count) */ static bool relay_chn_is_channel_id_valid(uint8_t chn_id) { - bool valid = chn_id >= 0 && chn_id < RELAY_CHN_COUNT; + bool valid = (chn_id >= 0 && chn_id < RELAY_CHN_COUNT) || chn_id == RELAY_CHN_ID_ALL; if (!valid) { ESP_LOGE(TAG, "Invalid channel ID: %d", chn_id); } @@ -424,10 +424,22 @@ char *relay_chn_get_state_str(uint8_t chn_id) } } +static void relay_chn_issue_cmd_on_all_channels(relay_chn_cmd_t cmd) +{ + for (int i = 0; i < RELAY_CHN_COUNT; i++) { + relay_chn_issue_cmd(&relay_channels[i], cmd); + } +} + void relay_chn_run_forward(uint8_t chn_id) { if (!relay_chn_is_channel_id_valid(chn_id)) return; + if (chn_id == RELAY_CHN_ID_ALL) { + relay_chn_issue_cmd_on_all_channels(RELAY_CHN_CMD_FORWARD); + return; + } + relay_chn_t* relay_chn = &relay_channels[chn_id]; relay_chn_issue_cmd(relay_chn, RELAY_CHN_CMD_FORWARD); } @@ -436,6 +448,11 @@ void relay_chn_run_reverse(uint8_t chn_id) { if (!relay_chn_is_channel_id_valid(chn_id)) return; + if (chn_id == RELAY_CHN_ID_ALL) { + relay_chn_issue_cmd_on_all_channels(RELAY_CHN_CMD_REVERSE); + return; + } + relay_chn_t* relay_chn = &relay_channels[chn_id]; relay_chn_issue_cmd(relay_chn, RELAY_CHN_CMD_REVERSE); } @@ -444,6 +461,11 @@ void relay_chn_stop(uint8_t chn_id) { if (!relay_chn_is_channel_id_valid(chn_id)) return; + if (chn_id == RELAY_CHN_ID_ALL) { + relay_chn_issue_cmd_on_all_channels(RELAY_CHN_CMD_STOP); + return; + } + relay_chn_t* relay_chn = &relay_channels[chn_id]; relay_chn_issue_cmd(relay_chn, RELAY_CHN_CMD_STOP); } @@ -452,6 +474,11 @@ void relay_chn_flip_direction(uint8_t chn_id) { if (!relay_chn_is_channel_id_valid(chn_id)) return; + if (chn_id == RELAY_CHN_ID_ALL) { + relay_chn_issue_cmd_on_all_channels(RELAY_CHN_CMD_FLIP); + return; + } + relay_chn_t* relay_chn = &relay_channels[chn_id]; relay_chn_issue_cmd(relay_chn, RELAY_CHN_CMD_FLIP); }