[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()
|
printers = self.connected_usb_devices()
|
||||||
if len(printers) > 0:
|
if len(printers) > 0:
|
||||||
self.set_status('connected','Connected to '+printers[0]['name'])
|
print_dev = Usb(printers[0]['vendor'], printers[0]['product'])
|
||||||
return 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:
|
else:
|
||||||
self.set_status('disconnected','Printer Not Found')
|
self.set_status('disconnected','Printer Not Found')
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -13,7 +13,7 @@ from time import sleep
|
||||||
class Usb(Escpos):
|
class Usb(Escpos):
|
||||||
""" Define USB printer """
|
""" 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 idVendor : Vendor ID
|
||||||
@param idProduct : Product ID
|
@param idProduct : Product ID
|
||||||
|
@ -42,6 +42,23 @@ class Usb(Escpos):
|
||||||
self.device.detach_kernel_driver(self.interface)
|
self.device.detach_kernel_driver(self.interface)
|
||||||
self.device.set_configuration()
|
self.device.set_configuration()
|
||||||
usb.util.claim_interface(self.device, self.interface)
|
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:
|
except usb.core.USBError as e:
|
||||||
raise HandleDeviceError(e)
|
raise HandleDeviceError(e)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue