|
15 | 15 | implementation. It should be possible to get that working though. |
16 | 16 | """ |
17 | 17 | import asyncio |
| 18 | +import os |
| 19 | + |
18 | 20 | import serial |
19 | | -import termios |
20 | 21 |
|
| 22 | +try: |
| 23 | + import termios |
| 24 | +except ImportError: |
| 25 | + termios = None |
21 | 26 |
|
22 | 27 | __version__ = '0.1' |
23 | 28 |
|
@@ -50,6 +55,7 @@ def __init__(self, loop, protocol, serial_instance): |
50 | 55 | self._set_write_buffer_limits() |
51 | 56 | self._has_reader = False |
52 | 57 | self._has_writer = False |
| 58 | + self._poll_wait_time = 0.0005 |
53 | 59 |
|
54 | 60 | # XXX how to support url handlers too |
55 | 61 |
|
@@ -259,25 +265,58 @@ def _write_ready(self): |
259 | 265 | self._maybe_resume_protocol() |
260 | 266 | assert self._has_writer |
261 | 267 |
|
262 | | - def _ensure_reader(self): |
263 | | - if (not self._has_reader) and (not self._closing): |
264 | | - self._loop.add_reader(self._serial.fd, self._read_ready) |
265 | | - self._has_reader = True |
266 | | - |
267 | | - def _remove_reader(self): |
268 | | - if self._has_reader: |
269 | | - self._loop.remove_reader(self._serial.fd) |
270 | | - self._has_reader = False |
271 | | - |
272 | | - def _ensure_writer(self): |
273 | | - if (not self._has_writer) and (not self._closing): |
274 | | - self._loop.add_writer(self._serial.fd, self._write_ready) |
275 | | - self._has_writer = True |
276 | | - |
277 | | - def _remove_writer(self): |
278 | | - if self._has_writer: |
279 | | - self._loop.remove_writer(self._serial.fd) |
280 | | - self._has_writer = False |
| 268 | + if os.name == "nt": |
| 269 | + def _poll_read(self): |
| 270 | + if self._has_reader: |
| 271 | + if self.serial.in_waiting: |
| 272 | + self._loop.call_soon(self._read_ready) |
| 273 | + self._loop.call_later(self._poll_wait_time, self._poll_read) |
| 274 | + |
| 275 | + def _ensure_reader(self): |
| 276 | + if (not self._has_reader) and (not self._closing): |
| 277 | + self._loop.call_later(self._poll_wait_time, self._poll_read) |
| 278 | + self._has_reader = True |
| 279 | + |
| 280 | + def _remove_reader(self): |
| 281 | + if self._has_reader: |
| 282 | + self._has_reader = False |
| 283 | + |
| 284 | + def _poll_write(self): |
| 285 | + if self._has_writer: |
| 286 | + if self.serial.out_waiting: |
| 287 | + self._loop.call_soon(self._write_ready) |
| 288 | + self._loop.call_later(self._poll_wait_time, self._poll_write) |
| 289 | + |
| 290 | + def _ensure_writer(self): |
| 291 | + if (not self._has_writer) and (not self._closing): |
| 292 | + self._loop.call_later(self._poll_wait_time, self._poll_write) |
| 293 | + self._has_writer = True |
| 294 | + |
| 295 | + def _remove_writer(self): |
| 296 | + if self._has_writer: |
| 297 | + self._loop.remove_writer(self._serial.fd) |
| 298 | + self._has_writer = False |
| 299 | + |
| 300 | + else: |
| 301 | + def _ensure_reader(self): |
| 302 | + if (not self._has_reader) and (not self._closing): |
| 303 | + self._loop.add_reader(self._serial.fd, self._read_ready) |
| 304 | + self._has_reader = True |
| 305 | + |
| 306 | + def _remove_reader(self): |
| 307 | + if self._has_reader: |
| 308 | + self._loop.remove_reader(self._serial.fd) |
| 309 | + self._has_reader = False |
| 310 | + |
| 311 | + def _ensure_writer(self): |
| 312 | + if (not self._has_writer) and (not self._closing): |
| 313 | + self._loop.add_writer(self._serial.fd, self._write_ready) |
| 314 | + self._has_writer = True |
| 315 | + |
| 316 | + def _remove_writer(self): |
| 317 | + if self._has_writer: |
| 318 | + self._loop.remove_writer(self._serial.fd) |
| 319 | + self._has_writer = False |
281 | 320 |
|
282 | 321 | def _set_write_buffer_limits(self, high=None, low=None): |
283 | 322 | """Ensure consistent write-buffer limits.""" |
@@ -346,12 +385,15 @@ def _call_connection_lost(self, exc): |
346 | 385 | assert self._closing |
347 | 386 | assert not self._has_writer |
348 | 387 | assert not self._has_reader |
349 | | - try: |
| 388 | + if os.name == "nt": |
350 | 389 | self._serial.flush() |
351 | | - except termios.error: |
352 | | - # ignore termios errors which may happen if the serial device was |
353 | | - # hot-unplugged. |
354 | | - pass |
| 390 | + else: |
| 391 | + try: |
| 392 | + self._serial.flush() |
| 393 | + except termios.error: |
| 394 | + # ignore termios errors which may happen if the serial device was |
| 395 | + # hot-unplugged. |
| 396 | + pass |
355 | 397 | try: |
356 | 398 | self._protocol.connection_lost(exc) |
357 | 399 | finally: |
|
0 commit comments