Skip to content

Commit d3630d6

Browse files
authored
Merge pull request #41 from MrClock8163/feature-timeout-override
Add timeout_override
2 parents 8d66b09 + 8c52b36 commit d3630d6

File tree

1 file changed

+51
-1
lines changed

1 file changed

+51
-1
lines changed

src/geocompy/communication.py

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222

2323
import logging
2424
from types import TracebackType
25-
from typing import Literal
25+
from typing import Literal, Generator
26+
from contextlib import contextmanager
2627

2728
from serial import (
2829
Serial,
@@ -412,3 +413,52 @@ def exchange(self, cmd: str) -> str:
412413
"""
413414
self.send(cmd)
414415
return self.receive()
416+
417+
@contextmanager
418+
def timeout_override(
419+
self,
420+
timeout: int | None
421+
) -> Generator[None, None, None]:
422+
"""
423+
Context manager that temporarily overrides connection parameters.
424+
425+
Parameters
426+
----------
427+
timeout : int | None
428+
Temporary timeout in seconds. Set to None to wait indefinitely.
429+
430+
Returns
431+
-------
432+
Generator
433+
Context manager generator object.
434+
435+
Warning
436+
-------
437+
An indefinite timeout might leave the connection in a perpetual
438+
waiting state, if the instrument became unresponsive in the
439+
mean time (e.g. it powered off due to low battery charge).
440+
441+
Example
442+
-------
443+
444+
>>> from serial import Serial
445+
>>> from geocompy.communication import SerialConnection
446+
>>>
447+
>>> port = Serial("COM1", timeout=5)
448+
>>> with SerialConnection(port) as com:
449+
... # normal operation
450+
...
451+
... # potentially long operation
452+
... with com.timeout_override(20):
453+
... answer = com.exchange("message")
454+
...
455+
... # continue normal operation
456+
...
457+
"""
458+
saved_timeout = self._port.timeout
459+
460+
try:
461+
self._port.timeout = timeout
462+
yield
463+
finally:
464+
self._port.timeout = saved_timeout

0 commit comments

Comments
 (0)