1
mirror of https://github.com/DarkFlippers/unleashed-firmware.git synced 2025-12-12 12:42:30 +04:00

js_gpio: stop pwm on exit (#4206)

Co-authored-by: hedger <hedger@users.noreply.github.com>
This commit is contained in:
Anna Antonenko
2025-09-24 14:34:28 +04:00
committed by GitHub
parent 7f0e8f39d3
commit 6a49131ae9

View File

@@ -23,6 +23,7 @@ typedef struct {
} JsGpioPinInst; } JsGpioPinInst;
ARRAY_DEF(ManagedPinsArray, JsGpioPinInst*, M_PTR_OPLIST); //-V575 ARRAY_DEF(ManagedPinsArray, JsGpioPinInst*, M_PTR_OPLIST); //-V575
#define M_OPL_ManagedPinsArray_t() ARRAY_OPLIST(ManagedPinsArray)
/** /**
* Per-module instance control structure * Per-module instance control structure
@@ -444,17 +445,23 @@ static void js_gpio_destroy(void* inst) {
JsGpioInst* module = (JsGpioInst*)inst; JsGpioInst* module = (JsGpioInst*)inst;
// reset pins // reset pins
ManagedPinsArray_it_t iterator; for
for(ManagedPinsArray_it(iterator, module->managed_pins); !ManagedPinsArray_end_p(iterator); M_EACH(item, module->managed_pins, ManagedPinsArray_t) {
ManagedPinsArray_next(iterator)) { JsGpioPinInst* manager_data = *item;
JsGpioPinInst* manager_data = *ManagedPinsArray_cref(iterator);
if(manager_data->had_interrupt) { if(manager_data->had_interrupt) {
furi_hal_gpio_disable_int_callback(manager_data->pin); furi_hal_gpio_disable_int_callback(manager_data->pin);
furi_hal_gpio_remove_int_callback(manager_data->pin); furi_hal_gpio_remove_int_callback(manager_data->pin);
} }
if(manager_data->pwm_output != FuriHalPwmOutputIdNone) {
if(furi_hal_pwm_is_running(manager_data->pwm_output))
furi_hal_pwm_stop(manager_data->pwm_output);
}
furi_hal_gpio_init(manager_data->pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow); furi_hal_gpio_init(manager_data->pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
furi_event_loop_maybe_unsubscribe(module->loop, manager_data->interrupt_semaphore); furi_event_loop_maybe_unsubscribe(module->loop, manager_data->interrupt_semaphore);
furi_semaphore_free(manager_data->interrupt_semaphore); furi_semaphore_free(manager_data->interrupt_semaphore);
free(manager_data->interrupt_contract); free(manager_data->interrupt_contract);
free(manager_data); free(manager_data);
} }