made hidconsole read events properly
This commit is contained in:
parent
058d81a767
commit
882332256b
|
@ -2,74 +2,42 @@
|
||||||
|
|
||||||
# Python 2 only for now.
|
# Python 2 only for now.
|
||||||
|
|
||||||
|
import sys
|
||||||
import time
|
import time
|
||||||
|
import readline
|
||||||
|
import threading
|
||||||
from binascii import hexlify, unhexlify
|
from binascii import hexlify, unhexlify
|
||||||
|
|
||||||
|
|
||||||
def read_next(handle, timeout=1000, ignore_nodata=False):
|
start_time = 0
|
||||||
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):
|
def _print(marker, data, scroll=False):
|
||||||
last_data = None
|
hexs = hexlify(data)
|
||||||
|
t = time.time() - start_time
|
||||||
|
s = '%s (% 8.3f) [%s %s %s %s] %s' % (marker, t, hexs[0:2], hexs[2:4], hexs[4:8], hexs[8:], repr(data))
|
||||||
|
|
||||||
|
if scroll:
|
||||||
|
sys.stdout.write(b'\033[s')
|
||||||
|
sys.stdout.write(b'\033[S') # scroll up
|
||||||
|
sys.stdout.write(b'\033[A\033[L\033[G') # insert new line above the current one, position on first column
|
||||||
|
|
||||||
|
sys.stdout.write(s)
|
||||||
|
|
||||||
|
if scroll:
|
||||||
|
sys.stdout.write(b'\033[u')
|
||||||
|
else:
|
||||||
|
sys.stdout.write(b'\n')
|
||||||
|
|
||||||
|
|
||||||
|
def _continuous_read(handle, timeout=1000):
|
||||||
while True:
|
while True:
|
||||||
if read_next(handle, timeout=100, ignore_nodata=True):
|
reply = hidapi.read(handle, 128, timeout)
|
||||||
continue
|
if reply is None:
|
||||||
|
print "!! Read failed, aborting"
|
||||||
line = raw_input('!! Command: ')
|
break
|
||||||
line = line.strip().replace(' ', '').replace('-', '')
|
elif reply:
|
||||||
if not line:
|
_print('>>', reply, True)
|
||||||
continue
|
|
||||||
|
|
||||||
data = None
|
|
||||||
|
|
||||||
if line == 'h':
|
|
||||||
print 'Commands:'
|
|
||||||
print ' <hex bytes> - send a packet to the device'
|
|
||||||
print ' r - re-send last packet'
|
|
||||||
print ' w<float> - listen for events for <float> seconds'
|
|
||||||
print ' h - this help screen'
|
|
||||||
print ' ^C - exit'
|
|
||||||
elif line == 'r':
|
|
||||||
data = last_data
|
|
||||||
elif line[0] == 'w':
|
|
||||||
line = line[1:].strip()
|
|
||||||
try:
|
|
||||||
seconds = float(line)
|
|
||||||
except:
|
|
||||||
print "!! Bad number <" + line + ">"
|
|
||||||
else:
|
|
||||||
count = 0
|
|
||||||
start_time = time.time()
|
|
||||||
while time.time() - start_time < seconds:
|
|
||||||
if read_next(handle, timeout=100, ignore_nodata=True):
|
|
||||||
count += 1
|
|
||||||
print "!! Got %d events" % count
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
data = unhexlify(line)
|
|
||||||
except:
|
|
||||||
print "!! Invalid input."
|
|
||||||
continue
|
|
||||||
|
|
||||||
if data:
|
|
||||||
hexs = hexlify(data)
|
|
||||||
print "<< [%s %s %s %s] %s" % (hexs[0:2], hexs[2:4], hexs[4:8], hexs[8:], repr(data))
|
|
||||||
last_data = data
|
|
||||||
hidapi.write(handle, data)
|
|
||||||
read_next(handle)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
@ -77,22 +45,43 @@ if __name__ == '__main__':
|
||||||
arg_parser = argparse.ArgumentParser()
|
arg_parser = argparse.ArgumentParser()
|
||||||
arg_parser.add_argument('device', default=None,
|
arg_parser.add_argument('device', default=None,
|
||||||
help='linux device to connect to')
|
help='linux device to connect to')
|
||||||
|
arg_parser.add_argument('--history', default='.hidconsole-history',
|
||||||
|
help='history file')
|
||||||
args = arg_parser.parse_args()
|
args = arg_parser.parse_args()
|
||||||
|
|
||||||
import hidapi
|
import hidapi
|
||||||
print "!! Opening device ", args.device
|
print ".. Opening device ", args.device
|
||||||
handle = hidapi.open_path(args.device)
|
handle = hidapi.open_path(args.device)
|
||||||
if handle:
|
if handle:
|
||||||
print "!! Opened %x" % handle
|
print ".. Opened handle %x, vendor %s product %s serial %s" % (handle,
|
||||||
print "!! vendor %s product %s serial %s" % (
|
|
||||||
repr(hidapi.get_manufacturer(handle)),
|
repr(hidapi.get_manufacturer(handle)),
|
||||||
repr(hidapi.get_product(handle)),
|
repr(hidapi.get_product(handle)),
|
||||||
repr(hidapi.get_serial(handle)))
|
repr(hidapi.get_serial(handle)))
|
||||||
print "!! Type 'h' for help."
|
print ".. Press ^C/^D to exit, or type hex bytes to write to the device."
|
||||||
|
|
||||||
|
readline.read_history_file(args.history)
|
||||||
|
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
console_cycle(handle)
|
t = threading.Thread(target=_continuous_read, args=(handle,))
|
||||||
|
t.daemon = True
|
||||||
|
t.start()
|
||||||
|
|
||||||
|
while t.is_alive():
|
||||||
|
line = raw_input('?? Input: ').strip().replace(' ', '')
|
||||||
|
if line:
|
||||||
|
try:
|
||||||
|
data = unhexlify(line)
|
||||||
|
_print('<<', data)
|
||||||
|
hidapi.write(handle, data)
|
||||||
|
except:
|
||||||
|
print "!! Invalid input."
|
||||||
except:
|
except:
|
||||||
print "!! Closing handle %x" % handle
|
pass
|
||||||
hidapi.close(handle)
|
|
||||||
|
print ".. Closing handle %x" % handle
|
||||||
|
hidapi.close(handle)
|
||||||
|
readline.write_history_file(args.history)
|
||||||
else:
|
else:
|
||||||
print "!! Failed to open %s, aborting" % args.device
|
print "!! Failed to open %s, aborting" % args.device
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
cd `dirname "$0"`/../lib
|
cd `dirname "$0"`/..
|
||||||
|
|
||||||
export LD_LIBRARY_PATH=$PWD
|
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/lib
|
||||||
export PYTHONPATH=$PWD
|
export PYTHONPATH=$PWD/lib
|
||||||
|
|
||||||
exec python -OO -m cli.hidconsole "$@"
|
cd -
|
||||||
|
|
||||||
|
exec python -OO -u -m cli.hidconsole "$@"
|
||||||
|
|
Loading…
Reference in New Issue