Index: tools/usb_gadget/mouse_gadget.py |
diff --git a/tools/usb_gadget/mouse_gadget.py b/tools/usb_gadget/mouse_gadget.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..531697b41fbb81227caaf65c54a62e87b28511d4 |
--- /dev/null |
+++ b/tools/usb_gadget/mouse_gadget.py |
@@ -0,0 +1,119 @@ |
+# Copyright 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Implementation of a USB HID mouse. |
+ |
+Two classes are provided by this module. The MouseFeature class implements |
+the core functionality of a HID mouse and can be included in any HID gadget. |
+The MouseGadget class implements an example mouse gadget. |
+""" |
+ |
+import struct |
+ |
+import hid_constants |
+import hid_descriptors |
+import hid_gadget |
+import usb_constants |
+ |
+ |
+class MouseFeature(hid_gadget.HidFeature): |
+ """HID feature implementation for a mouse. |
+ |
+ REPORT_DESC provides an example HID report descriptor for a device including |
+ this functionality. |
+ """ |
+ |
+ REPORT_DESC = hid_descriptors.ReportDescriptor( |
+ hid_descriptors.UsagePage(0x01), # Generic Desktop |
+ hid_descriptors.Usage(0x02), # Mouse |
+ hid_descriptors.Collection( |
+ hid_constants.CollectionType.APPLICATION, |
+ hid_descriptors.Usage(0x01), # Pointer |
+ hid_descriptors.Collection( |
+ hid_constants.CollectionType.PHYSICAL, |
+ hid_descriptors.UsagePage(0x09), # Buttons |
+ hid_descriptors.UsageMinimum(1), |
+ hid_descriptors.UsageMaximum(3), |
+ hid_descriptors.LogicalMinimum(0, force_length=1), |
+ hid_descriptors.LogicalMaximum(1), |
+ hid_descriptors.ReportCount(3), |
+ hid_descriptors.ReportSize(1), |
+ hid_descriptors.Input(hid_descriptors.Data, |
+ hid_descriptors.Variable, |
+ hid_descriptors.Absolute), |
+ hid_descriptors.ReportCount(1), |
+ hid_descriptors.ReportSize(5), |
+ hid_descriptors.Input(hid_descriptors.Constant), |
+ hid_descriptors.UsagePage(0x01), # Generic Desktop |
+ hid_descriptors.Usage(0x30), # X |
+ hid_descriptors.Usage(0x31), # Y |
+ hid_descriptors.LogicalMinimum(0x81), # -127 |
+ hid_descriptors.LogicalMaximum(127), |
+ hid_descriptors.ReportSize(8), |
+ hid_descriptors.ReportCount(2), |
+ hid_descriptors.Input(hid_descriptors.Data, |
+ hid_descriptors.Variable, |
+ hid_descriptors.Relative) |
+ ) |
+ ) |
+ ) |
+ |
+ def __init__(self): |
+ super(MouseFeature, self).__init__() |
+ self._buttons = 0 |
+ |
+ def ButtonDown(self, button): |
+ self._buttons |= button |
+ if self.IsConnected(): |
+ self.SendReport(self.EncodeInputReport()) |
+ |
+ def ButtonUp(self, button): |
+ self._buttons &= ~button |
+ if self.IsConnected(): |
+ self.SendReport(self.EncodeInputReport()) |
+ |
+ def Move(self, x_displacement, y_displacement): |
+ if self.IsConnected(): |
+ self.SendReport(self.EncodeInputReport(x_displacement, y_displacement)) |
+ |
+ def EncodeInputReport(self, x_displacement=0, y_displacement=0): |
+ return struct.pack('Bbb', self._buttons, x_displacement, y_displacement) |
+ |
+ def GetInputReport(self): |
+ """Construct an input report. |
+ |
+ See Device Class Definition for Human Interface Devices (HID) Version 1.11 |
+ Appendix B.2. |
+ |
+ Returns: |
+ A packed input report. |
+ """ |
+ return self.EncodeInputReport() |
+ |
+ |
+class MouseGadget(hid_gadget.HidGadget): |
+ """USB gadget implementation of a HID mouse.""" |
+ |
+ def __init__(self): |
+ self._feature = MouseFeature() |
+ super(MouseGadget, self).__init__( |
+ report_desc=MouseFeature.REPORT_DESC, |
+ features={0: self._feature}, |
+ packet_size=8, |
+ interval_ms=1, |
+ out_endpoint=False, |
+ vendor_id=usb_constants.VendorID.GOOGLE, |
+ product_id=usb_constants.ProductID.GOOGLE_MOUSE_GADGET, |
+ device_version=0x0100) |
+ self.AddStringDescriptor(1, 'Google Inc.') |
+ self.AddStringDescriptor(2, 'Mouse Gadget') |
+ |
+ def ButtonDown(self, button): |
+ self._feature.ButtonDown(button) |
+ |
+ def ButtonUp(self, button): |
+ self._feature.ButtonUp(button) |
+ |
+ def Move(self, x_displacement, y_displacement): |
+ self._feature.Move(x_displacement, y_displacement) |