Add sleep in sending fragments (#624)

* Add sleep in sending fragments

Adding sleep prevents "USBTimeoutError: [Errno 110] Operation timed out".

* change sorting

* make sleep configurable

* add spelling

---------

Co-authored-by: Patrick Kanzler <4189642+patkan@users.noreply.github.com>
Co-authored-by: Patrick Kanzler <dev@pkanzler.de>
This commit is contained in:
aerialist 2024-08-25 07:50:27 +09:00 committed by GitHub
parent 22982fbd12
commit f42410603d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 30 additions and 0 deletions

View File

@ -91,6 +91,7 @@ docstrings
ean ean
Ean Ean
encodable encodable
Errno
fff fff
fullimage fullimage
io io
@ -124,6 +125,7 @@ Todo
traceback traceback
udev udev
usb usb
USBTimeoutError
usec usec
virtualenvs virtualenvs
whitespaces whitespaces

View File

@ -213,6 +213,14 @@ If something is wrong, an ``CharCodeError`` will be raised.
After you have manually set the codepage the printer won't change it anymore. After you have manually set the codepage the printer won't change it anymore.
You can revert to normal behavior by setting charcode to ``AUTO``. You can revert to normal behavior by setting charcode to ``AUTO``.
Resolving bus timeout issues during printing images
---------------------------------------------------
If an error message such as "USBTimeoutError: [Errno 110] Operation timed out" occurs,
setting a sleep time between printing fragments can help.
This can be done with the :meth:`.set_sleep_in_fragment()` method.
Advanced Usage: Print from binary blob Advanced Usage: Print from binary blob
-------------------------------------- --------------------------------------

View File

@ -12,6 +12,7 @@ This module contains the abstract base class :py:class:`Escpos`.
from __future__ import annotations from __future__ import annotations
import textwrap import textwrap
import time
import warnings import warnings
from abc import ABCMeta, abstractmethod # abstract base class support from abc import ABCMeta, abstractmethod # abstract base class support
from re import match as re_match from re import match as re_match
@ -123,6 +124,9 @@ class Escpos(object, metaclass=ABCMeta):
# object -> The connection object (Usb(), Serial(), Network(), etc.) # object -> The connection object (Usb(), Serial(), Network(), etc.)
_device: Union[Literal[False], Literal[None], object] = False _device: Union[Literal[False], Literal[None], object] = False
# sleep time in fragments:
_sleep_in_fragment_ms: int = 0
def __init__(self, profile=None, magic_encode_args=None, **kwargs) -> None: def __init__(self, profile=None, magic_encode_args=None, **kwargs) -> None:
"""Initialize ESCPOS Printer. """Initialize ESCPOS Printer.
@ -178,6 +182,21 @@ class Escpos(object, metaclass=ABCMeta):
""" """
raise NotImplementedError() raise NotImplementedError()
def set_sleep_in_fragment(self, sleep_time_ms: int) -> None:
"""Configures the currently active sleep time after sending a fragment.
If during printing an image an issue like "USBTimeoutError: [Errno 110]
Operation timed out" occurs, setting this value to roughly 300
milliseconds can help resolve the issue.
:param sleep_time_ms: sleep time in milliseconds
"""
self._sleep_in_fragment_ms = sleep_time_ms
def _sleep_in_fragment(self) -> None:
"""Sleeps the preconfigured time after sending a fragment."""
time.sleep(self._sleep_in_fragment_ms / 1000)
def image( def image(
self, self,
img_source, img_source,
@ -246,6 +265,7 @@ class Escpos(object, metaclass=ABCMeta):
impl=impl, impl=impl,
fragment_height=fragment_height, fragment_height=fragment_height,
) )
self._sleep_in_fragment()
return return
if impl == "bitImageRaster": if impl == "bitImageRaster":