Add missing destroy function.

The component allocates resources (timers, event loop) in relay_chn_create but never frees them. This is a resource leak.
Hence, a destroy function added to free the resources gracefully.

Fixes #1048.
This commit is contained in:
2025-07-14 11:37:14 +03:00
parent a90649a4d3
commit f1cb928341
3 changed files with 41 additions and 1 deletions

View File

@@ -370,6 +370,38 @@ esp_err_t relay_chn_create(const gpio_num_t* gpio_map, uint8_t gpio_count)
return ret;
}
void relay_chn_destroy(void)
{
// Destroy the event loop
esp_event_loop_delete(relay_chn_event_loop);
relay_chn_event_loop = NULL;
// Free the listeners
if (relay_chn_state_listener_manager.listeners != NULL) {
free(relay_chn_state_listener_manager.listeners);
relay_chn_state_listener_manager.listeners = NULL;
}
// Destroy the timers and reset GPIOs
for (int i = 0; i < RELAY_CHN_COUNT; i++) {
relay_chn_t* relay_chn = &relay_channels[i];
if (relay_chn->inertia_timer != NULL) {
esp_timer_delete(relay_chn->inertia_timer);
relay_chn->inertia_timer = NULL;
}
#if RELAY_CHN_ENABLE_TILTING == 1
if (relay_chn->tilt_control.tilt_timer != NULL) {
esp_timer_delete(relay_chn->tilt_control.tilt_timer);
relay_chn->tilt_control.tilt_timer = NULL;
}
#endif // RELAY_CHN_ENABLE_TILTING
gpio_reset_pin(relay_chn->output.forward_pin);
gpio_reset_pin(relay_chn->output.reverse_pin);
}
}
static int relay_chn_listener_index(relay_chn_state_listener_t listener)
{
for (int i = 0; i < relay_chn_state_listener_manager.listener_count; i++) {