diff --git a/include/relay_chn.h b/include/relay_chn.h index 6f31edc..5d7f8a0 100644 --- a/include/relay_chn.h +++ b/include/relay_chn.h @@ -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); +/** + * @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. * diff --git a/src/relay_chn.c b/src/relay_chn.c index 02ce94b..cbeab97 100644 --- a/src/relay_chn.c +++ b/src/relay_chn.c @@ -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++) { diff --git a/test_apps/main/test_relay_chn.c b/test_apps/main/test_relay_chn.c index 4986a48..5360cc8 100644 --- a/test_apps/main/test_relay_chn.c +++ b/test_apps/main/test_relay_chn.c @@ -27,9 +27,10 @@ void setUp(void) { } void tearDown(void) { - + relay_chn_destroy(); // Clean up after each test } + // --- Basic Functionality Tests --- // TEST_CASE 1: Test that relay channels initialize correctly to RELAY_CHN_STATE_FREE