Add support for addressing all relay channels.

This commit is contained in:
2025-02-12 16:50:00 +03:00
parent 8517993358
commit dc2dcfec7d
3 changed files with 36 additions and 2 deletions

5
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,5 @@
{
"files.associations": {
"relay_chn.h": "c"
}
}

View File

@@ -28,6 +28,8 @@
extern "C" { extern "C" {
#endif #endif
#define RELAY_CHN_ID_ALL CONFIG_RELAY_CHN_COUNT ///< Special ID to address all channels
/** /**
* @brief Enumeration for relay channel direction. * @brief Enumeration for relay channel direction.
*/ */

View File

@@ -28,7 +28,7 @@
#define RELAY_CHN_OPPOSITE_INERTIA_MS CONFIG_RELAY_CHN_OPPOSITE_INERTIA_MS #define RELAY_CHN_OPPOSITE_INERTIA_MS CONFIG_RELAY_CHN_OPPOSITE_INERTIA_MS
#define RELAY_CHN_COUNT CONFIG_RELAY_CHN_COUNT #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); 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) 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) { if (!valid) {
ESP_LOGE(TAG, "Invalid channel ID: %d", chn_id); 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) void relay_chn_run_forward(uint8_t chn_id)
{ {
if (!relay_chn_is_channel_id_valid(chn_id)) return; 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_t* relay_chn = &relay_channels[chn_id];
relay_chn_issue_cmd(relay_chn, RELAY_CHN_CMD_FORWARD); 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 (!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_t* relay_chn = &relay_channels[chn_id];
relay_chn_issue_cmd(relay_chn, RELAY_CHN_CMD_REVERSE); 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 (!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_t* relay_chn = &relay_channels[chn_id];
relay_chn_issue_cmd(relay_chn, RELAY_CHN_CMD_STOP); 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 (!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_t* relay_chn = &relay_channels[chn_id];
relay_chn_issue_cmd(relay_chn, RELAY_CHN_CMD_FLIP); relay_chn_issue_cmd(relay_chn, RELAY_CHN_CMD_FLIP);
} }