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); }