Solaar/lib/cli/hidconsole.py

69 lines
1.7 KiB
Python

#!/usr/bin/env python
# Python 2 only for now.
from binascii import hexlify, unhexlify
def read_next(handle, timeout=1000, ignore_nodata=False):
reply = hidapi.read(handle, 128, timeout)
if reply is None:
print "!! Read failed, aborting"
raise Exception()
if reply:
hexs = hexlify(reply)
print ">> [%s %s %s %s] %s" % (hexs[0:2], hexs[2:4], hexs[4:8], hexs[8:], repr(reply))
return True
if not ignore_nodata:
print ">> []"
return False
def console_cycle(handle):
while True:
if read_next(handle, timeout=100, ignore_nodata=True):
continue
line = raw_input('!! Enter packet to send (hex bytes) or ^C to abort: ')
line = line.strip().replace(' ', '').replace('-', '')
if not line:
continue
if len(line) % 2 == 1:
line += '0'
try:
data = unhexlify(line)
except:
print "!! Invalid input."
continue
hexs = hexlify(data)
print "<< [%s %s %s %s] %s" % (hexs[0:2], hexs[2:4], hexs[4:8], hexs[8:], repr(data))
hidapi.write(handle, data)
read_next(handle)
if __name__ == '__main__':
import argparse
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument('device', default=None,
help='linux device to connect to')
args = arg_parser.parse_args()
import hidapi
print "!! Opening device ", args.device
handle = hidapi.open_path(args.device)
if handle:
print "!! Opened %x" % handle
print "!! vendor %s product %s serial %s" % (
repr(hidapi.get_manufacturer(handle)),
repr(hidapi.get_product(handle)),
repr(hidapi.get_serial(handle)))
try:
console_cycle(handle)
except:
print "!! Closing handle %x" % handle
hidapi.close(handle)
else:
print "!! Failed to open %s, aborting" % args.device