"""Timeouts, die unter CPython und MicroPython gleich funktionieren. CPython rechnet mit time.monotonic() in Sekunden. MicroPython hat das nicht, sondern time.ticks_ms(); dessen Zaehler laeuft nach etwa 12 Tagen ueber. Ein blosses "jetzt + timeout" laege danach fuer Tage in der Zukunft und wuerde eine Warteschleife entsprechend lange haengen lassen -- fuer ein Geraet, das in der Sternwarte monatelang durchlaeuft, ein echter Stolperstein. Deshalb dort die Differenz immer ueber ticks_diff bilden, das den Ueberlauf richtig behandelt. end = deadline(1.5) while not expired(end): ... Beide Varianten sind immer definiert, ausgewaehlt wird beim Import. So laesst sich die MicroPython-Variante auch auf dem Mac testen (test_esp32.py haengt dafuer ein Ersatz-time an dieses Modul). """ import time # -- CPython --------------------------------------------------------------- def monotonic_deadline(seconds): return time.monotonic() + seconds def monotonic_expired(end): return time.monotonic() >= end # -- MicroPython ----------------------------------------------------------- def ticks_deadline(seconds): return time.ticks_add(time.ticks_ms(), int(seconds * 1000)) def ticks_expired(end): return time.ticks_diff(end, time.ticks_ms()) <= 0 if hasattr(time, "monotonic"): deadline = monotonic_deadline expired = monotonic_expired else: deadline = ticks_deadline expired = ticks_expired