| Index: device/hid/hid_report_descriptor_item.h
|
| diff --git a/device/hid/hid_report_descriptor_item.h b/device/hid/hid_report_descriptor_item.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d3392330709e6d3928b2a2cc3b4f54b2fa61acb0
|
| --- /dev/null
|
| +++ b/device/hid/hid_report_descriptor_item.h
|
| @@ -0,0 +1,183 @@
|
| +// 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.
|
| +
|
| +#ifndef DEVICE_HID_HID_REPORT_DESCRIPTOR_ITEM_H_
|
| +#define DEVICE_HID_HID_REPORT_DESCRIPTOR_ITEM_H_
|
| +
|
| +#include "base/basictypes.h"
|
| +
|
| +namespace device {
|
| +
|
| +// An element of a HID report descriptor.
|
| +class HidReportDescriptorItem {
|
| + private:
|
| + friend class HidReportDescriptor;
|
| +
|
| + enum Type {
|
| + kTypeMain = 0,
|
| + kTypeGlobal = 1,
|
| + kTypeLocal = 2,
|
| + kTypeReserved = 3
|
| + };
|
| +
|
| + enum MainTag {
|
| + kMainTagDefault = 0x00, // 0000
|
| + kMainTagInput = 0x08, // 1000
|
| + kMainTagOutput = 0x09, // 1001
|
| + kMainTagFeature = 0x0B, // 1011
|
| + kMainTagCollection = 0x0A, // 1010
|
| + kMainTagEndCollection = 0x0C // 1100
|
| + };
|
| +
|
| + enum GlobalTag {
|
| + kGlobalTagUsagePage = 0x00, // 0000
|
| + kGlobalTagLogicalMinimum = 0x01, // 0001
|
| + kGlobalTagLogicalMaximum = 0x02, // 0010
|
| + kGlobalTagPhysicalMinimum = 0x03, // 0011
|
| + kGlobalTagPhysicalMaximum = 0x04, // 0100
|
| + kGlobalTagUnitExponent = 0x05, // 0101
|
| + kGlobalTagUnit = 0x06, // 0110
|
| + kGlobalTagReportSize = 0x07, // 0111
|
| + kGlobalTagReportId = 0x08, // 1000
|
| + kGlobalTagReportCount = 0x09, // 1001
|
| + kGlobalTagPush = 0x0A, // 1010
|
| + kGlobalTagPop = 0x0B // 1011
|
| + };
|
| +
|
| + enum LocalTag {
|
| + kLocalTagUsage = 0x00, // 0000
|
| + kLocalTagUsageMinimum = 0x01, // 0001
|
| + kLocalTagUsageMaximum = 0x02, // 0010
|
| + kLocalTagDesignatorIndex = 0x03, // 0011
|
| + kLocalTagDesignatorMinimum = 0x04, // 0100
|
| + kLocalTagDesignatorMaximum = 0x05, // 0101
|
| + kLocalTagStringIndex = 0x07, // 0111
|
| + kLocalTagStringMinimum = 0x08, // 1000
|
| + kLocalTagStringMaximum = 0x09, // 1001
|
| + kLocalTagDelimiter = 0x0A // 1010
|
| + };
|
| +
|
| + enum ReservedTag {
|
| + kReservedTagLong = 0xF // 1111
|
| + };
|
| +
|
| + public:
|
| + enum Tag {
|
| + kTagDefault = kMainTagDefault << 2 | kTypeMain,
|
| + kTagInput = kMainTagInput << 2 | kTypeMain,
|
| + kTagOutput = kMainTagOutput << 2 | kTypeMain,
|
| + kTagFeature = kMainTagFeature << 2 | kTypeMain,
|
| + kTagCollection = kMainTagCollection << 2 | kTypeMain,
|
| + kTagEndCollection = kMainTagEndCollection << 2 | kTypeMain,
|
| + kTagUsagePage = kGlobalTagUsagePage << 2 | kTypeGlobal,
|
| + kTagLogicalMinimum = kGlobalTagLogicalMinimum << 2 | kTypeGlobal,
|
| + kTagLogicalMaximum = kGlobalTagLogicalMaximum << 2 | kTypeGlobal,
|
| + kTagPhysicalMinimum = kGlobalTagPhysicalMinimum << 2 | kTypeGlobal,
|
| + kTagPhysicalMaximum = kGlobalTagPhysicalMaximum << 2 | kTypeGlobal,
|
| + kTagUnitExponent = kGlobalTagUnitExponent << 2 | kTypeGlobal,
|
| + kTagUnit = kGlobalTagUnit << 2 | kTypeGlobal,
|
| + kTagReportSize = kGlobalTagReportSize << 2 | kTypeGlobal,
|
| + kTagReportId = kGlobalTagReportId << 2 | kTypeGlobal,
|
| + kTagReportCount = kGlobalTagReportCount << 2 | kTypeGlobal,
|
| + kTagPush = kGlobalTagPush << 2 | kTypeGlobal,
|
| + kTagPop = kGlobalTagPop << 2 | kTypeGlobal,
|
| + kTagUsage = kLocalTagUsage << 2 | kTypeLocal,
|
| + kTagUsageMinimum = kLocalTagUsageMinimum << 2 | kTypeLocal,
|
| + kTagUsageMaximum = kLocalTagUsageMaximum << 2 | kTypeLocal,
|
| + kTagDesignatorIndex = kLocalTagDesignatorIndex << 2 | kTypeLocal,
|
| + kTagDesignatorMinimum = kLocalTagDesignatorMinimum << 2 | kTypeLocal,
|
| + kTagDesignatorMaximum = kLocalTagDesignatorMaximum << 2 | kTypeLocal,
|
| + kTagStringIndex = kLocalTagStringIndex << 2 | kTypeLocal,
|
| + kTagStringMinimum = kLocalTagStringMinimum << 2 | kTypeLocal,
|
| + kTagStringMaximum = kLocalTagStringMaximum << 2 | kTypeLocal,
|
| + kTagDelimiter = kLocalTagDelimiter << 2 | kTypeLocal,
|
| + kTagLong = kReservedTagLong << 2 | kTypeReserved
|
| + };
|
| +
|
| + // HID Input/Output/Feature report information.
|
| + // Can be retrieved from GetShortData()
|
| + // when item.tag() == HidReportDescriptorItem::kTagInput
|
| + // or HidReportDescriptorItem::kTagOutput
|
| + // or HidReportDescriptorItem::kTagFeature
|
| + struct ReportInfo {
|
| + uint8_t data_or_constant : 1;
|
| + uint8_t array_or_variable : 1;
|
| + uint8_t absolute_or_relative : 1;
|
| + uint8_t wrap : 1;
|
| + uint8_t linear : 1;
|
| + uint8_t preferred : 1;
|
| + uint8_t null : 1;
|
| + uint8_t reserved_1 : 1;
|
| + uint8_t bit_field_or_buffer : 1;
|
| + uint8_t reserved_2 : 1;
|
| + };
|
| +
|
| + // HID collection type.
|
| + // Can be retrieved from GetShortData()
|
| + // when item.tag() == HidReportDescriptorItem::kTagCollection
|
| + enum CollectionType {
|
| + kCollectionTypePhysical,
|
| + kCollectionTypeApplication,
|
| + kCollectionTypeLogical,
|
| + kCollectionTypeReport,
|
| + kCollectionTypeNamedArray,
|
| + kCollectionTypeUsageSwitch,
|
| + kCollectionTypeUsageModifier,
|
| + kCollectionTypeReserved,
|
| + kCollectionTypeVendor
|
| + };
|
| +
|
| + private:
|
| + HidReportDescriptorItem(const uint8_t* bytes,
|
| + HidReportDescriptorItem* previous);
|
| +
|
| + public:
|
| + ~HidReportDescriptorItem() {}
|
| +
|
| + // Previous element in report descriptor.
|
| + // Owned by descriptor instance.
|
| + HidReportDescriptorItem* previous() const {
|
| + return previous_;
|
| + };
|
| + // Next element in report descriptor.
|
| + // Owned by descriptor instance.
|
| + HidReportDescriptorItem* next() const {
|
| + return next_;
|
| + };
|
| + // Parent element in report descriptor.
|
| + // Owned by descriptor instance.
|
| + // Can be NULL.
|
| + HidReportDescriptorItem* parent() const {
|
| + return parent_;
|
| + };
|
| + // Level in Parent-Children relationship tree.
|
| + // 0 for top-level items (parent()==NULL).
|
| + // 1 if parent() is top-level.
|
| + // 2 if parent() has a top-level parent. Etc.
|
| + size_t GetDepth() const;
|
| + Tag tag() const { return tag_; }
|
| + // Returns true for a long item, false otherwise.
|
| + bool IsLong() const;
|
| + // Raw data of a short item.
|
| + // Not valid for a long item.
|
| + uint32_t GetShortData() const;
|
| +
|
| + static CollectionType GetCollectionTypeFromValue(uint32_t value);
|
| +
|
| + private:
|
| + size_t GetHeaderSize() const;
|
| + size_t payload_size() const { return payload_size_; }
|
| + size_t GetSize() const;
|
| +
|
| + HidReportDescriptorItem* previous_;
|
| + HidReportDescriptorItem* next_;
|
| + HidReportDescriptorItem* parent_;
|
| + Tag tag_;
|
| + uint32_t shortData_;
|
| + size_t payload_size_;
|
| +};
|
| +
|
| +} // namespace device
|
| +
|
| +#endif // DEVICE_HID_HID_REPORT_DESCRIPTOR_ITEM_H_
|
|
|