de-hardcode interface numbers; make script smart enough to find the secret sauce interface
This commit is contained in:
parent
a472f6f10c
commit
107ee5384e
|
|
@ -37,10 +37,20 @@ class USB(object):
|
||||||
def __init__(self, vendor_id, product_id):
|
def __init__(self, vendor_id, product_id):
|
||||||
self.vendor_id = vendor_id
|
self.vendor_id = vendor_id
|
||||||
self.product_id = product_id
|
self.product_id = product_id
|
||||||
self.device = usb.core.find(idVendor=self.vendor_id,
|
self.device = usb.core.find(idVendor=self.vendor_id, idProduct=self.product_id)
|
||||||
idProduct=self.product_id)
|
|
||||||
if self.device is None: sys.exit('No device found: %s, %s' % \
|
if self.device is None: sys.exit('No device found: %s, %s' % \
|
||||||
(self.vendor_id, self.product_id))
|
(self.vendor_id, self.product_id))
|
||||||
|
self.interface = None
|
||||||
|
for config in self.device:
|
||||||
|
for interface in config:
|
||||||
|
# bInterfaceProtocol 1 is keyboard, per USB spec
|
||||||
|
# 2 is mouse, per USB spec
|
||||||
|
# 0 is logitech's special sauce (?)
|
||||||
|
if interface.bInterfaceProtocol == 0:
|
||||||
|
self.interface = interface
|
||||||
|
if self.interface is None:
|
||||||
|
sys.exit("Couldn't find special sauce interface.")
|
||||||
|
|
||||||
def detach(self, n):
|
def detach(self, n):
|
||||||
#print "detaching.... ",
|
#print "detaching.... ",
|
||||||
|
|
@ -67,8 +77,8 @@ class USB(object):
|
||||||
def open(self, device_index=0, interface_indices=(0,0,), endpoint_index=0):
|
def open(self, device_index=0, interface_indices=(0,0,), endpoint_index=0):
|
||||||
self.configuration = self.device[device_index]
|
self.configuration = self.device[device_index]
|
||||||
if self.configuration is None: sys.exit("Bad configuration.")
|
if self.configuration is None: sys.exit("Bad configuration.")
|
||||||
self.interface = self.configuration[interface_indices]
|
#self.interface = self.configuration[interface_indices]
|
||||||
if self.interface is None: sys.exit("Bad interface.")
|
#if self.interface is None: sys.exit("Bad interface.")
|
||||||
self.endpoint = self.interface[endpoint_index]
|
self.endpoint = self.interface[endpoint_index]
|
||||||
if self.endpoint is None: sys.exit("Bad endpoint.")
|
if self.endpoint is None: sys.exit("Bad endpoint.")
|
||||||
|
|
||||||
|
|
@ -76,17 +86,20 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
# find
|
# find
|
||||||
kb = USB( vendor_id=0x046d, product_id=0xc52b)
|
kb = USB( vendor_id=0x046d, product_id=0xc52b)
|
||||||
kb.open( device_index=0, interface_indices=(2,0,), endpoint_index=0 )
|
#kb.open( device_index=0, interface_indices=(2,0,), endpoint_index=0 )
|
||||||
|
kb.open( device_index=0,
|
||||||
|
interface_indices=(kb.interface.bInterfaceNumber,0,),
|
||||||
|
endpoint_index=0 )
|
||||||
|
|
||||||
kb.detach(2)
|
kb.detach(kb.interface.bInterfaceNumber)
|
||||||
kb.claim(2)
|
kb.claim(kb.interface.bInterfaceNumber)
|
||||||
|
|
||||||
# fuzz (ymmv here -- I used wireshark, and there is a lot of
|
# fuzz (ymmv here -- I used wireshark, and there is a lot of
|
||||||
# other noise traffic that I am not including because I don't
|
# other noise traffic that I am not including because I don't
|
||||||
# think it's required to make this work)
|
# think it's required to make this work)
|
||||||
#kb.device.ctrl_transfer(0x21, 0x09, 0x0210, 2,"\x10\xff\x81\x00\x00\x00\x00"),
|
#kb.device.ctrl_transfer(0x21, 0x09, 0x0210, 2,"\x10\xff\x81\x00\x00\x00\x00"),
|
||||||
#kb.device.ctrl_transfer(0x21, 0x09, 0x0210, 2,"\x10\xff\x83\xb5\x31\x00\x00"),
|
#kb.device.ctrl_transfer(0x21, 0x09, 0x0210, 2,"\x10\xff\x83\xb5\x31\x00\x00"),
|
||||||
kb.device.ctrl_transfer(0x21, 0x09, 0x0210, 2, "\x10\x02\x09\x03\x78\x01\x00"),
|
kb.device.ctrl_transfer(0x21, 0x09, 0x0210, kb.interface.bInterfaceNumber, "\x10\x02\x09\x03\x78\x01\x00"),
|
||||||
#kb.device.ctrl_transfer(0x21, 0x09, 0x0210, 2,"\x10\x02\x02\x02\x00\x00\x00"),
|
#kb.device.ctrl_transfer(0x21, 0x09, 0x0210, 2,"\x10\x02\x02\x02\x00\x00\x00"),
|
||||||
|
|
||||||
# profit
|
# profit
|
||||||
|
|
@ -100,13 +113,13 @@ if __name__ == '__main__':
|
||||||
charge = data[4]
|
charge = data[4]
|
||||||
lux = int(round(((255*data[5])+data[6])/538.0, 2)*100)
|
lux = int(round(((255*data[5])+data[6])/538.0, 2)*100)
|
||||||
print "%s,%s" % (charge, lux)
|
print "%s,%s" % (charge, lux)
|
||||||
#"Charge: %s Lux: %s (%s | %s)" % \
|
# "Charge: %s Lux: %s (%s | %s)" % \
|
||||||
#(data[4],
|
# (data[4],
|
||||||
#data[5],
|
# data[5],
|
||||||
#data[6])
|
# data[6])
|
||||||
|
|
||||||
kb.release(2)
|
kb.release(kb.interface.bInterfaceNumber)
|
||||||
kb.attach(2)
|
kb.attach(kb.interface.bInterfaceNumber)
|
||||||
time.sleep(1)
|
#time.sleep(1)
|
||||||
|
|
||||||
# Python™ ftw!
|
# Python™ ftw!
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue