[FIX] hw_escpos: auto-detect endpoint address
Instead of hardcoding the IN & OUT endpoint addresses for the ESC/POS printers, we now attempt to auto-detect them. This should increase compatibility with many compatible thermal printers that are simply using a different address, such as the - STMicroelectronics POS58 Printer USB - HU HAI SUNCSW Receipt Printer Co.,Ltd. Gprinter USB Printer Fixes #12890
This commit is contained in:
parent
1de37862d6
commit
8e8b7925d2
|
@ -104,8 +104,12 @@ class EscposDriver(Thread):
|
|||
|
||||
printers = self.connected_usb_devices()
|
||||
if len(printers) > 0:
|
||||
self.set_status('connected','Connected to '+printers[0]['name'])
|
||||
return Usb(printers[0]['vendor'], printers[0]['product'])
|
||||
print_dev = Usb(printers[0]['vendor'], printers[0]['product'])
|
||||
self.set_status(
|
||||
'connected',
|
||||
"Connected to %s (in=0x%02x,out=0x%02x)" % (printers[0]['name'], print_dev.in_ep, print_dev.out_ep)
|
||||
)
|
||||
return print_dev
|
||||
else:
|
||||
self.set_status('disconnected','Printer Not Found')
|
||||
return None
|
||||
|
|
|
@ -13,7 +13,7 @@ from time import sleep
|
|||
class Usb(Escpos):
|
||||
""" Define USB printer """
|
||||
|
||||
def __init__(self, idVendor, idProduct, interface=0, in_ep=0x82, out_ep=0x01):
|
||||
def __init__(self, idVendor, idProduct, interface=0, in_ep=None, out_ep=None):
|
||||
"""
|
||||
@param idVendor : Vendor ID
|
||||
@param idProduct : Product ID
|
||||
|
@ -42,6 +42,23 @@ class Usb(Escpos):
|
|||
self.device.detach_kernel_driver(self.interface)
|
||||
self.device.set_configuration()
|
||||
usb.util.claim_interface(self.device, self.interface)
|
||||
|
||||
cfg = self.device.get_active_configuration()
|
||||
intf = cfg[(0,0)] # first interface
|
||||
if self.in_ep is None:
|
||||
# Attempt to detect IN/OUT endpoint addresses
|
||||
try:
|
||||
is_IN = lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_IN
|
||||
is_OUT = lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_OUT
|
||||
endpoint_in = usb.util.find_descriptor(intf, custom_match=is_IN)
|
||||
endpoint_out = usb.util.find_descriptor(intf, custom_match=is_OUT)
|
||||
self.in_ep = endpoint_in.bEndpointAddress
|
||||
self.out_ep = endpoint_out.bEndpointAddress
|
||||
except usb.core.USBError:
|
||||
# default values for officially supported printers
|
||||
self.in_ep = 0x82
|
||||
self.out_ep = 0x01
|
||||
|
||||
except usb.core.USBError as e:
|
||||
raise HandleDeviceError(e)
|
||||
|
||||
|
|
Loading…
Reference in New Issue