Skip to content

Commit 0c75003

Browse files
js_gpio: stop pwm on exit
1 parent 5b911f5 commit 0c75003

File tree

1 file changed

+20
-13
lines changed

1 file changed

+20
-13
lines changed

applications/system/js_app/modules/js_gpio.c

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ typedef struct {
2323
} JsGpioPinInst;
2424

2525
ARRAY_DEF(ManagedPinsArray, JsGpioPinInst*, M_PTR_OPLIST); //-V575
26+
#define M_OPL_ManagedPinsArray_t() ARRAY_OPLIST(ManagedPinsArray)
2627

2728
/**
2829
* Per-module instance control structure
@@ -444,20 +445,26 @@ static void js_gpio_destroy(void* inst) {
444445
JsGpioInst* module = (JsGpioInst*)inst;
445446

446447
// reset pins
447-
ManagedPinsArray_it_t iterator;
448-
for(ManagedPinsArray_it(iterator, module->managed_pins); !ManagedPinsArray_end_p(iterator);
449-
ManagedPinsArray_next(iterator)) {
450-
JsGpioPinInst* manager_data = *ManagedPinsArray_cref(iterator);
451-
if(manager_data->had_interrupt) {
452-
furi_hal_gpio_disable_int_callback(manager_data->pin);
453-
furi_hal_gpio_remove_int_callback(manager_data->pin);
448+
for
449+
M_EACH(item, module->managed_pins, ManagedPinsArray_t) {
450+
JsGpioPinInst* manager_data = *item;
451+
452+
if(manager_data->had_interrupt) {
453+
furi_hal_gpio_disable_int_callback(manager_data->pin);
454+
furi_hal_gpio_remove_int_callback(manager_data->pin);
455+
}
456+
if(manager_data->pwm_output != FuriHalPwmOutputIdNone) {
457+
if(furi_hal_pwm_is_running(manager_data->pwm_output))
458+
furi_hal_pwm_stop(manager_data->pwm_output);
459+
}
460+
furi_hal_gpio_init(manager_data->pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
461+
462+
furi_event_loop_maybe_unsubscribe(module->loop, manager_data->interrupt_semaphore);
463+
furi_semaphore_free(manager_data->interrupt_semaphore);
464+
465+
free(manager_data->interrupt_contract);
466+
free(manager_data);
454467
}
455-
furi_hal_gpio_init(manager_data->pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
456-
furi_event_loop_maybe_unsubscribe(module->loop, manager_data->interrupt_semaphore);
457-
furi_semaphore_free(manager_data->interrupt_semaphore);
458-
free(manager_data->interrupt_contract);
459-
free(manager_data);
460-
}
461468

462469
// free buffers
463470
furi_hal_adc_release(module->adc_handle);

0 commit comments

Comments
 (0)