From d31e0a4d379aa7e46ba28fe7e4bc04962e2eca2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Sat, 2 Nov 2013 18:56:37 +0100 Subject: Add libusb GenericHID Python test script. --- .../GenericHID/HostTestApp/test_generic_hid.py | 96 --------------------- .../HostTestApp/test_generic_hid_libusb.py | 98 ++++++++++++++++++++++ .../HostTestApp/test_generic_hid_winusb.py | 96 +++++++++++++++++++++ 3 files changed, 194 insertions(+), 96 deletions(-) delete mode 100644 Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid.py create mode 100755 Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid_libusb.py create mode 100644 Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid_winusb.py diff --git a/Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid.py b/Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid.py deleted file mode 100644 index 491805509..000000000 --- a/Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid.py +++ /dev/null @@ -1,96 +0,0 @@ -""" - LUFA Library - Copyright (C) Dean Camera, 2013. - - dean [at] fourwalledcubicle [dot] com - www.lufa-lib.org -""" - -""" - LUFA Generic HID device demo host test script. This script will send a - continuous stream of generic reports to the device, to show a variable LED - pattern on the target board. Send and received report data is printed to - the terminal. - - Requires the pywinusb library (https://pypi.python.org/pypi/pywinusb/). -""" - -import sys -from time import sleep -import pywinusb.hid as hid - -# Generic HID device VID, PID and report payload length (length is increased -# by one to account for the Report ID byte that must be pre-pended) -device_vid = 0x03EB -device_pid = 0x204F -report_length = 1 + 8 - - -def get_hid_device_handle(): - hid_device_filter = hid.HidDeviceFilter(vendor_id=device_vid, - product_id=device_pid) - - valid_hid_devices = hid_device_filter.get_devices() - - if len(valid_hid_devices) is 0: - return None - else: - return valid_hid_devices[0] - - -def send_led_pattern(device, led1, led2, led3, led4): - # Report data for the demo is the report ID (always zero) followed by the - # LED on/off data - report_data = [0, led1, led2, led3, led4] - - # Zero-extend the array to the length the report should be - report_data.extend([0] * (report_length - len(report_data))) - - # Send the generated report to the device - device.send_output_report(report_data) - - print("Sent LED Pattern: {0}".format(report_data[1:5])) - - -def received_led_pattern(report_data): - print("Received LED Pattern: {0}".format(report_data[1:5])) - - -def main(): - hid_device = get_hid_device_handle() - - if hid_device is None: - print("No valid HID device found.") - sys.exit(1) - - try: - hid_device.open() - - print("Connected to device 0x%04X/0x%04X - %s [%s]" % - (hid_device.vendor_id, hid_device.product_id, - hid_device.product_name, hid_device.vendor_name)) - - # Set up the HID input report handler to receive reports - hid_device.set_raw_data_handler(received_led_pattern) - - p = 0 - while (hid_device.is_plugged()): - # Convert the current pattern index to a bit-mask and send - send_led_pattern(hid_device, - (p >> 3) & 1, - (p >> 2) & 1, - (p >> 1) & 1, - (p >> 0) & 1) - - # Compute next LED pattern in sequence - p = (p + 1) % 16 - - # Delay a bit for visual effect - sleep(.2) - - finally: - hid_device.close() - - -if __name__ == '__main__': - main() diff --git a/Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid_libusb.py b/Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid_libusb.py new file mode 100755 index 000000000..f5f06bf86 --- /dev/null +++ b/Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid_libusb.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python + +""" + LUFA Library + Copyright (C) Dean Camera, 2013. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +""" + +""" + LUFA Generic HID device demo host test script. This script will send a + continuous stream of generic reports to the device, to show a variable LED + pattern on the target board. Send and received report data is printed to + the terminal. + + Requires the PyUSB library (http://sourceforge.net/apps/trac/pyusb/). +""" + +import sys +from time import sleep +import usb.core +import usb.util + +# Generic HID device VID, PID and report payload length (length is increased +# by one to account for the Report ID byte that must be pre-pended) +device_vid = 0x03EB +device_pid = 0x204F + +def get_and_init_hid_device(): + device = usb.core.find(idVendor=device_vid, idProduct=device_pid) + + if device is None: + sys.exit("Could not find USB device.") + + if device.is_kernel_driver_active(0): + try: + device.detach_kernel_driver(0) + except usb.core.USBError as exception: + sys.exit("Could not detatch kernel driver: %s" % str(exception)) + + try: + device.set_configuration() + except usb.core.USBError as exception: + sys.exit("Could not set configuration: %s" % str(exception)) + + return device + +def send_led_pattern(device, led1, led2, led3, led4): + # Report data for the demo is LED on/off data + report_data = [led1, led2, led3, led4] + + # Send the generated report to the device + number_of_bytes_written = device.ctrl_transfer( # Set Report control request + 0b00100001, # bmRequestType (constant for this control request) + 0x09, # bmRequest (constant for this control request) + 0, # wValue (MSB is report type, LSB is report number) + 0, # wIndex (interface number) + report_data # report data to be sent + ); + assert number_of_bytes_written == len(report_data) + + print("Sent LED Pattern: {0}".format(report_data)) + +def receive_led_pattern(hid_device): + endpoint = hid_device[0][(0,0)][0] + report_data = hid_device.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize) + return list(report_data) + +def main(): + hid_device = get_and_init_hid_device() + + print("Connected to device 0x%04X/0x%04X - %s [%s]" % + (hid_device.idVendor, hid_device.idProduct, + usb.util.get_string(hid_device, 256, hid_device.iProduct), + usb.util.get_string(hid_device, 256, hid_device.iManufacturer))) + + p = 0 + while (True): + # Convert the current pattern index to a bit-mask and send + send_led_pattern(hid_device, + (p >> 3) & 1, + (p >> 2) & 1, + (p >> 1) & 1, + (p >> 0) & 1) + + # Receive and print the current LED pattern + led_pattern = receive_led_pattern(hid_device)[0:4] + print("Received LED Pattern: {0}".format(led_pattern)) + + # Compute next LED pattern in sequence + p = (p + 1) % 16 + + # Delay a bit for visual effect + sleep(.2) + +if __name__ == '__main__': + main() diff --git a/Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid_winusb.py b/Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid_winusb.py new file mode 100644 index 000000000..491805509 --- /dev/null +++ b/Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid_winusb.py @@ -0,0 +1,96 @@ +""" + LUFA Library + Copyright (C) Dean Camera, 2013. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +""" + +""" + LUFA Generic HID device demo host test script. This script will send a + continuous stream of generic reports to the device, to show a variable LED + pattern on the target board. Send and received report data is printed to + the terminal. + + Requires the pywinusb library (https://pypi.python.org/pypi/pywinusb/). +""" + +import sys +from time import sleep +import pywinusb.hid as hid + +# Generic HID device VID, PID and report payload length (length is increased +# by one to account for the Report ID byte that must be pre-pended) +device_vid = 0x03EB +device_pid = 0x204F +report_length = 1 + 8 + + +def get_hid_device_handle(): + hid_device_filter = hid.HidDeviceFilter(vendor_id=device_vid, + product_id=device_pid) + + valid_hid_devices = hid_device_filter.get_devices() + + if len(valid_hid_devices) is 0: + return None + else: + return valid_hid_devices[0] + + +def send_led_pattern(device, led1, led2, led3, led4): + # Report data for the demo is the report ID (always zero) followed by the + # LED on/off data + report_data = [0, led1, led2, led3, led4] + + # Zero-extend the array to the length the report should be + report_data.extend([0] * (report_length - len(report_data))) + + # Send the generated report to the device + device.send_output_report(report_data) + + print("Sent LED Pattern: {0}".format(report_data[1:5])) + + +def received_led_pattern(report_data): + print("Received LED Pattern: {0}".format(report_data[1:5])) + + +def main(): + hid_device = get_hid_device_handle() + + if hid_device is None: + print("No valid HID device found.") + sys.exit(1) + + try: + hid_device.open() + + print("Connected to device 0x%04X/0x%04X - %s [%s]" % + (hid_device.vendor_id, hid_device.product_id, + hid_device.product_name, hid_device.vendor_name)) + + # Set up the HID input report handler to receive reports + hid_device.set_raw_data_handler(received_led_pattern) + + p = 0 + while (hid_device.is_plugged()): + # Convert the current pattern index to a bit-mask and send + send_led_pattern(hid_device, + (p >> 3) & 1, + (p >> 2) & 1, + (p >> 1) & 1, + (p >> 0) & 1) + + # Compute next LED pattern in sequence + p = (p + 1) % 16 + + # Delay a bit for visual effect + sleep(.2) + + finally: + hid_device.close() + + +if __name__ == '__main__': + main() -- cgit v1.2.3