diff --git a/he2325u_hidapi.py b/he2325u_hidapi.py new file mode 100755 index 0000000..ab61385 --- /dev/null +++ b/he2325u_hidapi.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python + +""" +Read from a Hoitek HE2325U or WCH CH9325 USB/HID adapter cable +using the HID-API provided by the operating system. +It relies on cython-hidapi: https://github.com/trezor/cython-hidapi +""" + +import sys + +BPS = 19200 + +def main(): + """ + Main function: Entry point if running this module from the command line. + Prints messages to stdout. + """ + import argparse + from inspect import cleandoc + parser = argparse.ArgumentParser(description=cleandoc(__doc__)) + parser.add_argument('-v', '--verbose', action='store_true', help='Increase verbosity') + parser.add_argument('-d', '--debug', action='store_true', help='Enable debug mode') + args = parser.parse_args() + try: + try: + import hidraw as hid + except ImportError: + import hid + except ImportError: + parser.error("You need to install cython-hidapi first!") + import logging + loglevel = logging.WARNING + if args.verbose: + loglevel = logging.INFO + if args.debug: + loglevel = logging.DEBUG + logging.basicConfig(format='%(message)s', level=loglevel) + + try: + logging.info("Enumerating Devices") + devices = hid.enumerate(0x1a86, 0xe008) + if len(devices) == 0: + raise NameError('No device found. Check your USB connection.') + logging.info("Found {} devices: ".format(len(devices))) + for dev in devices: + name = dev['manufacturer_string'] + " " + dev['product_string'] + path = dev['path'].decode('ascii') + logging.info("* {} [{}]".format(name, path)) + + logging.info("Opening device") + h = hid.device() + try: + h.open(0x1a86, 0xe008) + except IOError as ex: + raise NameError('Cannot open the device. Please check permissions.') + + buf = [0]*6 + buf[0] = 0x0 # report ID + buf[1] = BPS & 0xFF + buf[2] = ( BPS >> 8 ) & 0xFF + buf[3] = ( BPS >> 16 ) & 0xFF + buf[4] = ( BPS >> 24 ) & 0xFF + buf[5] = 0x03 # 3 = enable? + + fr = h.send_feature_report(buf) + if fr == -1: + raise NameError("Sending Feature Report Failed") + logging.debug("Feature Report Sent") + + try: + logging.debug("Start Reading Messages") + while True: + #answer = h.read(256) + answer = h.read(256, timeout_ms=1000) + if len(answer) < 1: continue + nbytes = answer[0] & 0x7 + if nbytes > 0: + if len(answer) < nbytes+1: + raise NameError("More bytes announced then sent") + payload = answer[1:nbytes+1] + data = [b & ( ~(1<<7) ) for b in payload] + data = [chr(b) for b in data] + data = ''.join(data) + sys.stdout.write(data) + sys.stdout.flush() + except KeyboardInterrupt: + logging.info("You pressed CTRL-C, stopping...") + + logging.debug("Closing device") + h.close() + + except IOError as ex: + logging.error(ex) + except Exception as ex: + logging.error(ex) + +if __name__ == "__main__": + main()