| # Copyright 2015 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. |
| |
| import uuid |
| |
| import composite_gadget |
| import echo_gadget |
| import hid_echo_gadget |
| import hid_gadget |
| import usb_constants |
| import usb_descriptors |
| |
| |
| class CompositeEchoGadget(composite_gadget.CompositeGadget): |
| |
| def __init__(self): |
| device_desc = usb_descriptors.DeviceDescriptor( |
| idVendor=usb_constants.VendorID.GOOGLE, |
| idProduct=usb_constants.ProductID.GOOGLE_COMPOSITE_ECHO_GADGET, |
| bcdUSB=0x0210, # USB 2.1 to indicate support for BOS descriptors. |
| iManufacturer=1, |
| iProduct=2, |
| iSerialNumber=3, |
| bcdDevice=0x0100) |
| |
| echo_feature = echo_gadget.EchoCompositeFeature( |
| endpoints=[(0, 5, 0x81, 0x01), (1, 6, 0x82, 0x02), (2, 7, 0x83, 0x03)]) |
| |
| hid_echo_feature = hid_echo_gadget.EchoFeature() |
| hid_feature = hid_gadget.HidCompositeFeature( |
| report_desc=hid_echo_gadget.EchoFeature.REPORT_DESC, |
| features={0: hid_echo_feature}, |
| interface_number=3, |
| interface_string=4, |
| in_endpoint=0x84, out_endpoint=0x04) |
| |
| super(CompositeEchoGadget, self).__init__( |
| device_desc, [echo_feature, hid_feature]) |
| self.AddStringDescriptor(1, 'Google Inc.') |
| self.AddStringDescriptor(2, 'Echo Gadget') |
| self.AddStringDescriptor(3, '{:06X}'.format(uuid.getnode())) |
| self.AddStringDescriptor(4, 'HID Echo') |
| self.AddStringDescriptor(5, 'Interrupt Echo') |
| self.AddStringDescriptor(6, 'Bulk Echo') |
| self.AddStringDescriptor(7, 'Isochronous Echo') |
| |
| # Enable Microsoft OS 2.0 Descriptors for Windows 8.1 and above. |
| self.EnableMicrosoftOSDescriptorsV2(vendor_code=0x02) |
| # These are used to force Windows to load WINUSB.SYS for the echo functions. |
| self.SetMicrosoftCompatId(0, 'WINUSB') |
| self.SetMicrosoftCompatId(1, 'WINUSB') |
| self.SetMicrosoftCompatId(2, 'WINUSB') |
| |
| def RegisterHandlers(): |
| """Registers web request handlers with the application server.""" |
| |
| import server |
| from tornado import web |
| |
| class WebConfigureHandler(web.RequestHandler): |
| |
| def post(self): |
| server.SwitchGadget(CompositeEchoGadget()) |
| |
| server.app.add_handlers('.*$', [ |
| (r'/composite_echo/configure', WebConfigureHandler), |
| ]) |