kmk_firmware/kmk/kmktime.py

35 lines
876 B
Python
Raw Permalink Normal View History

2021-09-17 17:40:20 +02:00
from micropython import const
from supervisor import ticks_ms
2018-10-17 07:43:47 +02:00
2021-09-13 17:18:01 +02:00
_TICKS_PERIOD = const(1 << 29)
_TICKS_MAX = const(_TICKS_PERIOD - 1)
_TICKS_HALFPERIOD = const(_TICKS_PERIOD // 2)
2022-10-02 20:49:23 +02:00
def ticks_diff(new: int, start: int) -> int:
2021-09-13 17:18:01 +02:00
diff = (new - start) & _TICKS_MAX
diff = ((diff + _TICKS_HALFPERIOD) & _TICKS_MAX) - _TICKS_HALFPERIOD
return diff
2022-10-02 20:49:23 +02:00
def ticks_add(ticks: int, delta: int) -> int:
return (ticks + delta) % _TICKS_PERIOD
2022-10-02 20:49:23 +02:00
def check_deadline(new: int, start: int, ms: int) -> int:
2021-09-13 17:18:01 +02:00
return ticks_diff(new, start) < ms
class PeriodicTimer:
2022-10-02 20:49:23 +02:00
def __init__(self, period: int):
self.period = period
self.last_tick = ticks_ms()
2022-10-02 20:49:23 +02:00
def tick(self) -> bool:
now = ticks_ms()
if ticks_diff(now, self.last_tick) >= self.period:
self.last_tick = now
return True
else:
return False