2009-04-22 20:04:28 +02:00

126 lines
3.1 KiB
Python

#!/usr/bin/env python
"""
Provides an interface to USB Printer Class devices.
"""
import usb
import types
PRINTER_CLASS = 0x07
PRINTER_SUBCLASS = 0x01
UNIDIRECTIONAL_PROTOCOL = 0x01
BIDIRECTIONAL_PROTOCOL = 0x02
IEEE1284_4_PROTOCOL = 0x03
VENDOR_PROTOCOL = 0xff
class Printer:
def __init__(self, device, configuration, interface):
"""
__init__(device, configuration, interface) -> None
Initialize the device.
device: printer usb.Device object.
configuration: printer usb.Configuration object of the Device or configuration number.
interface: printer usb.Interface object representing the
interface and altenate setting.
"""
if PRINTER_CLASS != interface.interfaceClass:
raise TypeError, "Wrong interface class"
self.__devhandle = device.open()
self.__devhandle.setConfiguration(configuration)
self.__devhandle.claimInterface(interface)
self.__devhandle.setAltInterface(interface)
self.__intf = interface.interfaceNumber
self.__alt = interface.alternateSetting
self.__conf = (type(configuration) == types.IntType \
or type(configuration) == types.LongType) and \
configuration or \
configuration.value
# initialize members
# TODO: automatic endpoints detection
self.__bulkout = 1
self.__bulkin = 0x82
def __del__(self):
try:
self.__devhandle.releaseInterface(self.__intf)
del self.__devhandle
except:
pass
def getDeviceID(self, maxlen, timeout = 100):
"""
getDeviceID(maxlen, timeout = 100) -> device_id
Get the device capabilities information.
maxlen: maxlength of the buffer.
timeout: operation timeout.
"""
return self.__devhandle.controlMsg(requestType = 0xa1,
request = 0,
value = self.__conf - 1,
index = self.__alt + (self.__intf << 8),
buffer = maxlen,
timeout = timeout)
def getPortStatus(self, timeout = 100):
"""
getPortStatus(timeout = 100) -> status
Get the port status.
timeout: operation timeout.
"""
return self.__devhandle.controlMsg(requestType = 0xa1,
request = 1,
value = 0,
index = self.__intf,
buffer = 1,
timeout = timeout)[0]
def softReset(self, timeout = 100):
"""
softReset(timeout = 100) -> None
Request flushes all buffers and resets the Bulk OUT
and Bulk IN pipes to their default states.
timeout: the operation timeout.
"""
self.__devhandle.controlMsg(requestType = 0x21,
request = 2,
value = 0,
index = self.__intf,
buffer = 0)
def write(self, buffer, timeout = 100):
"""
write(buffer, timeout = 100) -> written
Write data to printer.
buffer: data buffer.
timeout: operation timeout.
"""
return self.__devhandle.bulkWrite(self.__bulkout,
buffer,
timeout)
def read(self, numbytes, timeout = 100):
"""
read(numbytes, timeout = 100) -> data
Read data from printer.
numbytes: number of bytes to read.
timeout: operation timeout.
"""
return self.__devhandle.bulkRead(self.__bulkin,
numbytes,
timeout)