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:
@@ -97,6 +97,13 @@ typedef void (*relay_chn_state_listener_t)(uint8_t chn_id, relay_chn_state_t old
|
|||||||
*/
|
*/
|
||||||
esp_err_t relay_chn_create(const gpio_num_t* gpio_map, uint8_t gpio_count);
|
esp_err_t relay_chn_create(const gpio_num_t* gpio_map, uint8_t gpio_count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destroy the relay channels and free resources.
|
||||||
|
*
|
||||||
|
* This function cleans up the relay channels and releases any resources allocated during their creation.
|
||||||
|
*/
|
||||||
|
void relay_chn_destroy(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Register a channel state change listener.
|
* @brief Register a channel state change listener.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -370,6 +370,38 @@ esp_err_t relay_chn_create(const gpio_num_t* gpio_map, uint8_t gpio_count)
|
|||||||
return ret;
|
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)
|
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++) {
|
for (int i = 0; i < relay_chn_state_listener_manager.listener_count; i++) {
|
||||||
|
|||||||
@@ -27,9 +27,10 @@ void setUp(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void tearDown(void) {
|
void tearDown(void) {
|
||||||
|
relay_chn_destroy(); // Clean up after each test
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// --- Basic Functionality Tests ---
|
// --- Basic Functionality Tests ---
|
||||||
|
|
||||||
// TEST_CASE 1: Test that relay channels initialize correctly to RELAY_CHN_STATE_FREE
|
// TEST_CASE 1: Test that relay channels initialize correctly to RELAY_CHN_STATE_FREE
|
||||||
|
|||||||
Reference in New Issue
Block a user