Add libusb GenericHID Python test script.
authorLászló Monda <laci@monda.hu>
Sat, 2 Nov 2013 17:56:37 +0000 (18:56 +0100)
committerLászló Monda <laci@monda.hu>
Sat, 2 Nov 2013 17:56:37 +0000 (18:56 +0100)
Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid.py [deleted file]
Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid_libusb.py [new file with mode: 0755]
Demos/Device/ClassDriver/GenericHID/HostTestApp/test_generic_hid_winusb.py [new file with mode: 0644]

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 (file)
index 4918055..0000000
+++ /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 (executable)
index 0000000..f5f06bf
--- /dev/null
@@ -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 (file)
index 0000000..4918055
--- /dev/null
@@ -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()