39
39
#define NO_PIN 0xff
40
40
#define MAX_PULSE 65535
41
41
#define MIN_PULSE 10
42
- volatile bool last_level ;
43
- volatile uint32_t level_count = 0 ;
44
42
volatile uint32_t result = 0 ;
45
- volatile uint16_t buf_index = 0 ;
46
43
47
44
uint16_t pulsein_program [] = {
48
45
0x4001 , // 1: in pins, 1
@@ -77,12 +74,16 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self,
77
74
true, 32 , true, // RX auto-push every 32 bits
78
75
false); // claim pins
79
76
77
+ if (!ok ) {
78
+ mp_raise_RuntimeError (translate ("All state machines in use" ));
79
+ }
80
+
80
81
pio_sm_set_enabled (self -> state_machine .pio ,self -> state_machine .state_machine , false);
81
82
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 ;
84
85
result = 0 ;
85
- buf_index = 0 ;
86
+ self -> buf_index = 0 ;
86
87
87
88
pio_sm_set_in_pins (self -> state_machine .pio ,self -> state_machine .state_machine ,pin -> number );
88
89
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) {
116
117
void common_hal_pulseio_pulsein_pause (pulseio_pulsein_obj_t * self ) {
117
118
pio_sm_restart (self -> state_machine .pio , self -> state_machine .state_machine );
118
119
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 ;
121
122
result = 0 ;
122
- buf_index = 0 ;
123
+ self -> buf_index = 0 ;
123
124
}
124
125
void common_hal_pulseio_pulsein_interrupt (pulseio_pulsein_obj_t * self ) {
125
126
126
127
uint32_t rxfifo = 0 ;
127
128
128
129
rxfifo = pio_sm_get_blocking (self -> state_machine .pio , self -> state_machine .state_machine );
129
130
// 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 {
130
134
for (uint i = 0 ; i < 32 ; i ++ ) {
131
135
bool level = (rxfifo & (1 << i )) >> i ;
132
- if (level == last_level ) {
133
- level_count ++ ;
136
+ if (level == self -> last_level ) {
137
+ self -> level_count ++ ;
134
138
} 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 ;
138
142
// Pulses that are longer than MAX_PULSE will return MAX_PULSE
139
143
if (result > MAX_PULSE ) {
140
144
result = MAX_PULSE ;
141
145
}
142
146
// return pulses that are not too short
143
147
if (result > MIN_PULSE ) {
144
- self -> buffer [buf_index ] = (uint16_t )result ;
148
+ self -> buffer [self -> buf_index ] = (uint16_t )result ;
145
149
if (self -> len < self -> maxlen ) {
146
150
self -> len ++ ;
147
151
}
148
- if (buf_index < self -> maxlen ) {
149
- buf_index ++ ;
152
+ if (self -> buf_index < self -> maxlen ) {
153
+ self -> buf_index ++ ;
150
154
} else {
151
155
self -> start = 0 ;
152
- buf_index = 0 ;
156
+ self -> buf_index = 0 ;
153
157
}
154
158
}
155
159
}
156
160
}
161
+ }
157
162
158
163
// 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 )) {
160
165
pio_sm_set_enabled (self -> state_machine .pio , self -> state_machine .state_machine , false);
161
166
pio_sm_init (self -> state_machine .pio , self -> state_machine .state_machine , self -> state_machine .offset , & self -> state_machine .sm_config );
162
167
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,
189
194
void common_hal_pulseio_pulsein_clear (pulseio_pulsein_obj_t * self ) {
190
195
self -> start = 0 ;
191
196
self -> len = 0 ;
192
- buf_index = 0 ;
197
+ self -> buf_index = 0 ;
193
198
}
194
199
195
200
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) {
202
207
// if we are empty reset buffer pointer and counters
203
208
if (self -> len == 0 ) {
204
209
self -> start = 0 ;
205
- buf_index = 0 ;
206
- level_count = 0 ;
210
+ self -> buf_index = 0 ;
211
+ self -> level_count = 0 ;
207
212
}
208
213
return value ;
209
214
}
0 commit comments