]>
vault307.fbx.one Git - ir_remote.git/blob - primitives/delay_ms.py
1 # delay_ms.py Now uses ThreadSafeFlag and has extra .wait() API
3 # from primitives import Delay_ms
5 # Copyright (c) 2018-2022 Peter Hinch
6 # Released under the MIT License (MIT) - see LICENSE file
8 import uasyncio
as asyncio
9 from utime
import ticks_add
, ticks_diff
, ticks_ms
14 class DummyTimer
: # Stand-in for the timer class. Can be cancelled.
19 def __init__(self
, func
=None, args
=(), duration
=1000):
22 self
._durn
= duration
# Default duration
23 self
._retn
= None # Return value of launched callable
24 self
._tend
= None # Stop time (absolute ms).
26 self
._trig
= asyncio
.ThreadSafeFlag()
27 self
._tout
= asyncio
.Event() # Timeout event
28 self
.wait
= self
._tout
.wait
# Allow: await wait_ms.wait()
29 self
.clear
= self
._tout
.clear
30 self
.set = self
._tout
.set
31 self
._ttask
= self
._fake
# Timer task
32 self
._mtask
= asyncio
.create_task(self
._run
()) #Main task
36 await self
._trig
.wait() # Await a trigger
37 self
._ttask
.cancel() # Cancel and replace
38 await asyncio
.sleep_ms(0)
39 dt
= max(ticks_diff(self
._tend
, ticks_ms()), 0) # Beware already elapsed.
40 self
._ttask
= asyncio
.create_task(self
._timer
(dt
))
42 async def _timer(self
, dt
):
43 await asyncio
.sleep_ms(dt
)
44 self
._tout
.set() # Only gets here if not cancelled.
46 if self
._func
is not None:
47 self
._retn
= launch(self
._func
, self
._args
)
50 # trigger may be called from hard ISR.
51 def trigger(self
, duration
=0): # Update absolute end time, 0-> ctor default
52 if self
._mtask
is None:
53 raise RuntimeError("Delay_ms.deinit() has run.")
54 self
._tend
= ticks_add(ticks_ms(), duration
if duration
> 0 else self
._durn
)
55 self
._retn
= None # Default in case cancelled.
61 self
._ttask
= self
._fake
65 def __call__(self
): # Current running status
73 def callback(self
, func
=None, args
=()):