class glitch_resistant_edge(): def __init__(self, ctx, signal, polarity): self._ctx = ctx self._signal = signal self._sample = [] self._debounce_time = 0.999e-8 self._polarity = polarity async def await_me(self): while True: print(".") delay_expired, signal_value = await self._ctx.delay(self._debounce_time).changed(self._signal) if delay_expired and (signal_value == (self._polarity ^ 1)): break print("!!") values = await self._ctx.edge(self._signal, self._polarity).sample(*self._sample) while True: delay_expired, signal_value = await self._ctx.delay(self._debounce_time).changed(self._signal) if delay_expired and (signal_value == self._polarity): break return values def __await__(self): return self.await_me().__await__() def sample(self, *args): self._sample.extend(args) return self