Skip to content

Commit ffc42b9

Browse files
authored
Merge pull request #10634 from dhalbert/rotaryio-proper-deinit
rotaryio.IncrementalEncoder deinit fix and improvements
2 parents ed58ade + 989a857 commit ffc42b9

File tree

8 files changed

+56
-7
lines changed

8 files changed

+56
-7
lines changed

ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717

1818
void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencoder_obj_t *self,
1919
const mcu_pin_obj_t *pin_a, const mcu_pin_obj_t *pin_b) {
20+
21+
// Ensure object starts in its deinit state.
22+
common_hal_rotaryio_incrementalencoder_mark_deinit(self);
23+
2024
if (!pin_a->has_extint) {
2125
raise_ValueError_invalid_pin_name(MP_QSTR_pin_a);
2226
}
@@ -83,10 +87,13 @@ void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_o
8387
turn_off_eic_channel(self->eic_channel_b);
8488

8589
reset_pin_number(self->pin_a);
86-
self->pin_a = NO_PIN;
87-
8890
reset_pin_number(self->pin_b);
89-
self->pin_b = NO_PIN;
91+
92+
common_hal_rotaryio_incrementalencoder_mark_deinit(self);
93+
}
94+
95+
void common_hal_rotaryio_incrementalencoder_mark_deinit(rotaryio_incrementalencoder_obj_t *self) {
96+
self->pin_a = NO_PIN;
9097
}
9198

9299
void incrementalencoder_interrupt_handler(uint8_t channel) {

ports/espressif/common-hal/rotaryio/IncrementalEncoder.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencode
2121
//
2222
// These routines also implicitly configure the weak internal pull-ups, as expected
2323
// in CircuitPython.
24+
25+
// Ensure object starts in its deinit state.
26+
common_hal_rotaryio_incrementalencoder_mark_deinit(self);
27+
2428
pcnt_unit_config_t unit_config = {
2529
// Set counter limit
2630
.low_limit = INT16_MIN,
@@ -87,6 +91,10 @@ void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_o
8791
pcnt_del_channel(self->channel_a);
8892
pcnt_del_channel(self->channel_b);
8993
pcnt_del_unit(self->unit);
94+
common_hal_rotaryio_incrementalencoder_mark_deinit(self);
95+
}
96+
97+
void common_hal_rotaryio_incrementalencoder_mark_deinit(rotaryio_incrementalencoder_obj_t *self) {
9098
self->unit = NULL;
9199
}
92100

ports/mimxrt10xx/common-hal/rotaryio/IncrementalEncoder.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ static void encoder_change(void *self_in) {
2626
void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencoder_obj_t *self,
2727
const mcu_pin_obj_t *pin_a, const mcu_pin_obj_t *pin_b) {
2828

29+
// Ensure object starts in its deinit state.
30+
common_hal_rotaryio_incrementalencoder_mark_deinit(self);
31+
2932
self->pin_a = pin_a;
3033
self->pin_b = pin_b;
3134

@@ -49,7 +52,7 @@ void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencode
4952
}
5053

5154
bool common_hal_rotaryio_incrementalencoder_deinited(rotaryio_incrementalencoder_obj_t *self) {
52-
return !self->pin_a;
55+
return self->pin_a == NULL;
5356
}
5457

5558
void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_obj_t *self) {
@@ -62,6 +65,9 @@ void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_o
6265
common_hal_reset_pin(self->pin_a);
6366
common_hal_reset_pin(self->pin_b);
6467

68+
common_hal_rotaryio_incrementalencoder_mark_deinit(self);
69+
}
70+
71+
void common_hal_rotaryio_incrementalencoder_mark_deinit(rotaryio_incrementalencoder_obj_t *self) {
6572
self->pin_a = NULL;
66-
self->pin_b = NULL;
6773
}

ports/nordic/common-hal/rotaryio/IncrementalEncoder.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ static void _intr_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) {
3232
void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencoder_obj_t *self,
3333
const mcu_pin_obj_t *pin_a, const mcu_pin_obj_t *pin_b) {
3434

35+
// Ensure object starts in its deinit state.
36+
common_hal_rotaryio_incrementalencoder_mark_deinit(self);
37+
3538
self->pin_a = pin_a->number;
3639
self->pin_b = pin_b->number;
3740

@@ -78,6 +81,10 @@ void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_o
7881
nrfx_gpiote_in_uninit(self->pin_b);
7982
reset_pin_number(self->pin_a);
8083
reset_pin_number(self->pin_b);
84+
85+
common_hal_rotaryio_incrementalencoder_mark_deinit(self);
86+
}
87+
88+
void common_hal_rotaryio_incrementalencoder_mark_deinit(rotaryio_incrementalencoder_obj_t *self) {
8189
self->pin_a = NO_PIN;
82-
self->pin_b = NO_PIN;
8390
}

ports/raspberrypi/bindings/rp2pio/StateMachine.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
4242

4343
void common_hal_rp2pio_statemachine_deinit(rp2pio_statemachine_obj_t *self);
4444
bool common_hal_rp2pio_statemachine_deinited(rp2pio_statemachine_obj_t *self);
45+
void common_hal_rp2pio_statemachine_mark_deinit(rp2pio_statemachine_obj_t *self);
4546

4647
void common_hal_rp2pio_statemachine_never_reset(rp2pio_statemachine_obj_t *self);
4748

ports/raspberrypi/common-hal/rotaryio/IncrementalEncoder.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencode
4343
const mcu_pin_obj_t *pin_a, const mcu_pin_obj_t *pin_b) {
4444
const mcu_pin_obj_t *pins[] = { pin_a, pin_b };
4545

46+
// Ensure object starts in its deinit state.
47+
common_hal_rotaryio_incrementalencoder_mark_deinit(self);
48+
4649
// Start out with swapped to match behavior with other ports.
4750
self->swapped = true;
4851
if (!common_hal_rp2pio_pins_are_sequential(2, pins)) {
@@ -89,6 +92,7 @@ void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencode
8992
}
9093

9194
bool common_hal_rotaryio_incrementalencoder_deinited(rotaryio_incrementalencoder_obj_t *self) {
95+
// Use the deinit state of the PIO state machine.
9296
return common_hal_rp2pio_statemachine_deinited(&self->state_machine);
9397
}
9498

@@ -100,6 +104,11 @@ void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_o
100104
common_hal_rp2pio_statemachine_deinit(&self->state_machine);
101105
}
102106

107+
void common_hal_rotaryio_incrementalencoder_mark_deinit(rotaryio_incrementalencoder_obj_t *self) {
108+
// Use the deinit state of the PIO state machine.
109+
common_hal_rp2pio_statemachine_mark_deinit(&self->state_machine);
110+
}
111+
103112
static void incrementalencoder_interrupt_handler(void *self_in) {
104113
rotaryio_incrementalencoder_obj_t *self = self_in;
105114

ports/raspberrypi/common-hal/rp2pio/StateMachine.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,9 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
628628
int mov_status_type,
629629
int mov_status_n) {
630630

631+
// Ensure object starts in its deinit state.
632+
common_hal_rp2pio_statemachine_mark_deinit(self);
633+
631634
// First, check that all pins are free OR already in use by any PIO if exclusive_pin_use is false.
632635
pio_pinmask_t pins_we_use = wait_gpio_mask;
633636
PIO_PINMASK_MERGE(pins_we_use, _check_pins_free(first_out_pin, out_pin_count, exclusive_pin_use));
@@ -744,7 +747,7 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
744747
mov_status_type, mov_status_n);
745748
if (!ok) {
746749
// indicate state machine never inited
747-
self->state_machine = NUM_PIO_STATE_MACHINES;
750+
common_hal_rp2pio_statemachine_mark_deinit(self);
748751
mp_raise_RuntimeError(MP_ERROR_TEXT("All state machines in use"));
749752
}
750753
}
@@ -827,6 +830,10 @@ void common_hal_rp2pio_statemachine_deinit(rp2pio_statemachine_obj_t *self) {
827830
rp2pio_statemachine_deinit(self, false);
828831
}
829832

833+
void common_hal_rp2pio_statemachine_mark_deinit(rp2pio_statemachine_obj_t *self) {
834+
self->state_machine = NUM_PIO_STATE_MACHINES;
835+
}
836+
830837
void common_hal_rp2pio_statemachine_never_reset(rp2pio_statemachine_obj_t *self) {
831838
rp2pio_statemachine_never_reset(self->pio, self->state_machine);
832839
// TODO: never reset all the pins

shared-bindings/rotaryio/IncrementalEncoder.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,15 @@ extern const mp_obj_type_t rotaryio_incrementalencoder_type;
1313

1414
extern void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencoder_obj_t *self,
1515
const mcu_pin_obj_t *pin_a, const mcu_pin_obj_t *pin_b);
16+
1617
extern void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_obj_t *self);
1718
extern bool common_hal_rotaryio_incrementalencoder_deinited(rotaryio_incrementalencoder_obj_t *self);
19+
extern void common_hal_rotaryio_incrementalencoder_mark_deinit(rotaryio_incrementalencoder_obj_t *self);
20+
1821
extern mp_int_t common_hal_rotaryio_incrementalencoder_get_position(rotaryio_incrementalencoder_obj_t *self);
1922
extern void common_hal_rotaryio_incrementalencoder_set_position(rotaryio_incrementalencoder_obj_t *self,
2023
mp_int_t new_position);
24+
2125
extern mp_int_t common_hal_rotaryio_incrementalencoder_get_divisor(rotaryio_incrementalencoder_obj_t *self);
2226
extern void common_hal_rotaryio_incrementalencoder_set_divisor(rotaryio_incrementalencoder_obj_t *self,
2327
mp_int_t new_divisor);

0 commit comments

Comments
 (0)