|
|
|
@ -20,9 +20,10 @@ if TYPE_CHECKING:
|
|
|
|
|
Callable,
|
|
|
|
|
Coroutine,
|
|
|
|
|
Generator,
|
|
|
|
|
Union,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
Task = Coroutine | Generator
|
|
|
|
|
Task = Union[Coroutine, Generator, "wait"]
|
|
|
|
|
AwaitableTask = Task | Awaitable
|
|
|
|
|
Finalizer = Callable[[Task, Any], None]
|
|
|
|
|
|
|
|
|
@ -205,6 +206,13 @@ class Syscall:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Timeout(Exception):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_TIMEOUT_ERROR = Timeout()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class sleep(Syscall):
|
|
|
|
|
"""Pause current task and resume it after given delay.
|
|
|
|
|
|
|
|
|
@ -236,11 +244,41 @@ class wait(Syscall):
|
|
|
|
|
>>> event, x, y = await loop.wait(io.TOUCH) # await touch event
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def __init__(self, msg_iface: int) -> None:
|
|
|
|
|
_DO_NOT_RESCHEDULE = Syscall()
|
|
|
|
|
|
|
|
|
|
def __init__(self, msg_iface: int, timeout_ms: int | None = None) -> None:
|
|
|
|
|
self.msg_iface = msg_iface
|
|
|
|
|
self.timeout_ms = timeout_ms
|
|
|
|
|
self.task: Task | None = None
|
|
|
|
|
|
|
|
|
|
def handle(self, task: Task) -> None:
|
|
|
|
|
pause(task, self.msg_iface)
|
|
|
|
|
self.task = task
|
|
|
|
|
pause(self, self.msg_iface)
|
|
|
|
|
if self.timeout_ms is not None:
|
|
|
|
|
deadline = utime.ticks_add(utime.ticks_ms(), self.timeout_ms)
|
|
|
|
|
schedule(self, _TIMEOUT_ERROR, deadline)
|
|
|
|
|
|
|
|
|
|
def send(self, __value: Any) -> Any:
|
|
|
|
|
assert self.task is not None
|
|
|
|
|
_paused[self.msg_iface].discard(self)
|
|
|
|
|
_queue.discard(self)
|
|
|
|
|
_step(self.task, __value)
|
|
|
|
|
return self._DO_NOT_RESCHEDULE
|
|
|
|
|
|
|
|
|
|
throw = send
|
|
|
|
|
|
|
|
|
|
def close(self) -> None:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def __iter__(self) -> Generator:
|
|
|
|
|
try:
|
|
|
|
|
return (yield self)
|
|
|
|
|
except BaseException:
|
|
|
|
|
# exception was raised on the waiting task externally with
|
|
|
|
|
# close() or throw(), kill the children tasks and re-raise
|
|
|
|
|
_queue.discard(self)
|
|
|
|
|
_paused[self.msg_iface].discard(self)
|
|
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_type_gen: type[Generator] = type((lambda: (yield))())
|
|
|
|
|