|
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