|
1 | 1 | # encoder.py Asynchronous driver for incremental quadrature encoder.
|
2 | 2 |
|
3 |
| -# Copyright (c) 2021-2023 Peter Hinch |
| 3 | +# Copyright (c) 2021-2024 Peter Hinch |
4 | 4 | # Released under the MIT License (MIT) - see LICENSE file
|
5 | 5 |
|
6 | 6 | # For an explanation of the design please see
|
|
17 | 17 | # Raul Kompaß (@rkompass) for suggesting a bugfix here
|
18 | 18 | # https://forum.micropython.org/viewtopic.php?f=15&t=9929&p=66175#p66156
|
19 | 19 |
|
| 20 | +# Now uses ThreadSafeFlag.clear() |
| 21 | + |
20 | 22 | import asyncio
|
21 | 23 | from machine import Pin
|
22 |
| -from select import poll, POLLIN |
23 |
| - |
24 |
| - |
25 |
| -def ready(tsf, poller): |
26 |
| - r = (tsf, POLLIN) |
27 |
| - poller.register(*r) |
28 |
| - |
29 |
| - def is_rdy(): |
30 |
| - return r in poller.ipoll(0) |
31 |
| - |
32 |
| - return is_rdy |
33 | 24 |
|
34 | 25 |
|
35 | 26 | class Encoder:
|
@@ -58,7 +49,6 @@ def __init__(
|
58 | 49 | if ((vmin is not None) and v < vmin) or ((vmax is not None) and v > vmax):
|
59 | 50 | raise ValueError("Incompatible args: must have vmin <= v <= vmax")
|
60 | 51 | self._tsf = asyncio.ThreadSafeFlag()
|
61 |
| - self._tsf_ready = ready(self._tsf, poll()) # Create a ready function |
62 | 52 | trig = Pin.IRQ_RISING | Pin.IRQ_FALLING
|
63 | 53 | try:
|
64 | 54 | xirq = pin_x.irq(trigger=trig, handler=self._x_cb, hard=True)
|
@@ -90,10 +80,9 @@ async def _run(self, vmin, vmax, div, mod, cb, args):
|
90 | 80 | plcv = pcv # Previous value after limits applied
|
91 | 81 | delay = self.delay
|
92 | 82 | while True:
|
93 |
| - if delay > 0 and self._tsf_ready(): # Ensure ThreadSafeFlag is clear |
94 |
| - await self._tsf.wait() |
95 |
| - await self._tsf.wait() |
96 |
| - await asyncio.sleep_ms(delay) # Wait for motion to stop. |
| 83 | + self._tsf.clear() |
| 84 | + await self._tsf.wait() # Wait for an edge. A stopped encoder waits here. |
| 85 | + await asyncio.sleep_ms(delay) # Optional rate limit for callback/trig. |
97 | 86 | hv = self._v # Sample hardware (atomic read).
|
98 | 87 | if hv == pv: # A change happened but was negated before
|
99 | 88 | continue # this got scheduled. Nothing to do.
|
|
0 commit comments