8000 Issue #5012 - Moved globals to PulseIn object to fix multiple instances · domdfcoding/circuitpython@588a19a · GitHub
[go: up one dir, main page]

Skip to content

Commit 588a19a

Browse files
committed
Issue adafruit#5012 - Moved globals to PulseIn object to fix multiple instances
1 parent 9fdecac commit 588a19a

File tree

2 files changed

+30
-22
lines changed

2 files changed

+30
-22
lines changed

ports/raspberrypi/common-hal/pulseio/PulseIn.c

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,7 @@
3939
#define NO_PIN 0xff
4040
#define MAX_PULSE 65535
4141
#define MIN_PULSE 10
42-
volatile bool last_level;
43-
volatile uint32_t level_count = 0;
4442
volatile uint32_t result = 0;
45-
volatile uint16_t buf_index = 0;
4643

4744
uint16_t pulsein_program[] = {
4845
0x4001, // 1: in pins, 1
@@ -77,12 +74,16 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self,
7774
true, 32, true, // RX auto-push every 32 bits
7875
false); // claim pins
7976

77+
if (!ok) {
78+
mp_raise_RuntimeError(translate("All state machines in use"));
79+
}
80+
8081
pio_sm_set_enabled(self->state_machine.pio,self->state_machine.state_machine, false);
8182
pio_sm_clear_fifos(self->state_machine.pio,self->state_machine.state_machine);
82-
last_level = self->idle_state;
83-
level_count = 0;
83+
self->last_level = self->idle_state;
84+
self->level_count = 0;
8485
result = 0;
85-
buf_index = 0;
86+
self->buf_index = 0;
8687

8788
pio_sm_set_in_pins(self->state_machine.pio,self->state_machine.state_machine,pin->number);
8889
common_hal_rp2pio_statemachine_set_interrupt_handler(&(self->state_machine),&common_hal_pulseio_pulsein_interrupt,self,PIO_IRQ0_INTE_SM0_RXNEMPTY_BITS);
@@ -116,47 +117,51 @@ void common_hal_pulseio_pulsein_deinit(pulseio_pulsein_obj_t *self) {
116117
void common_hal_pulseio_pulsein_pause(pulseio_pulsein_obj_t *self) {
117118
pio_sm_restart(self->state_machine.pio, self->state_machine.state_machine);
118119
pio_sm_set_enabled(self->state_machine.pio, self->state_machine.state_machine, false);
119-
last_level = self->idle_state;
120-
level_count = 0;
120+
self->last_level = self->idle_state;
121+
self->level_count = 0;
121122
result = 0;
122-
buf_index = 0;
123+
self->buf_index = 0;
123124
}
124125
void common_hal_pulseio_pulsein_interrupt(pulseio_pulsein_obj_t *self) {
125126

126127
uint32_t rxfifo = 0;
127128

128129
rxfifo = pio_sm_get_blocking(self->state_machine.pio, self->state_machine.state_machine);
129130
// translate from fifo to buffer
131+
if ((rxfifo == 0 && self->last_level == false) || (rxfifo == 0xffffffff && self->last_level == true)) {
132+
self->level_count = self->level_count + 32;
133+
} else {
130134
for (uint i = 0; i < 32; i++) {
131135
bool level = (rxfifo & (1 << i)) >> i;
132-
if (level == last_level) {
133-
level_count++;
136+
if (level == self->last_level) {
137+
self->level_count++;
134138
} else {
135-
result = level_count;
136-
last_level = level;
137-
level_count = 0;
139+
result = self->level_count;
140+
self->last_level = level;
141+
self->level_count = 0;
138142
// Pulses that are longer than MAX_PULSE will return MAX_PULSE
139143
if (result > MAX_PULSE) {
140144
result = MAX_PULSE;
141145
}
142146
// return pulses that are not too short
143147
if (result > MIN_PULSE) {
144-
self->buffer[buf_index] = (uint16_t)result;
148+
self->buffer[self->buf_index] = (uint16_t)result;
145149
if (self->len < self->maxlen) {
146150
self->len++;
147151
}
148-
if (buf_index < self->maxlen) {
149-
buf_index++;
152+
if (self->buf_index < self->maxlen) {
153+
self->buf_index++;
150154
} else {
151155
self->start = 0;
152-
buf_index = 0;
156+
self->buf_index = 0;
153157
}
154158
}
155159
}
156160
}
161+
}
157162

158163
// check for a pulse thats too long (MAX_PULSE us) or maxlen reached, and reset
159-
if ((level_count > MAX_PULSE) || (buf_index >= self->maxlen)) {
164+
if ((self->level_count > MAX_PULSE) || (self->buf_index >= self->maxlen)) {
160165
pio_sm_set_enabled(self->state_machine.pio, self->state_machine.state_machine, false);
161166
pio_sm_init(self->state_machine.pio, self->state_machine.state_machine, self->state_machine.offset, &self->state_machine.sm_config);
162167
pio_sm_restart(self->state_machine.pio,self->state_machine.state_machine);
@@ -189,7 +194,7 @@ void common_hal_pulseio_pulsein_resume(pulseio_pulsein_obj_t *self,
189194
void common_hal_pulseio_pulsein_clear(pulseio_pulsein_obj_t *self) {
190195
self->start = 0;
191196
self->len = 0;
192-
buf_index = 0;
197+
self->buf_index = 0;
193198
}
194199

195200
uint16_t common_hal_pulseio_pulsein_popleft(pulseio_pulsein_obj_t *self) {
@@ -202,8 +207,8 @@ uint16_t common_hal_pulseio_pulsein_popleft(pulseio_pulsein_obj_t *self) {
202207
// if we are empty reset buffer pointer and counters
203208
if (self->len == 0) {
204209
self->start = 0;
205-
buf_index = 0;
206-
level_count = 0;
210+
self->buf_index = 0;
211+
self->level_count = 0;
207212
}
208213
return value;
209214
}

ports/raspberrypi/common-hal/pulseio/PulseIn.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ typedef struct {
3939
uint16_t *buffer;
4040
uint16_t maxlen;
4141
bool idle_state;
42+
bool last_level;
43+
uint32_t level_count;
44+
volatile uint16_t buf_index;
4245
volatile uint16_t start;
4346
volatile uint16_t len;
4447
rp2pio_statemachine_obj_t state_machine;

0 commit comments

Comments
 (0)
0