Chromium Code Reviews| 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..ab679757fa58479bae30033cdb43ea4179e697da |
| --- /dev/null |
| +++ b/device/hid/hid_report_descriptor_item.h |
| @@ -0,0 +1,186 @@ |
| +// 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 <ostream> |
| + |
| +#include "base/basictypes.h" |
| + |
| +namespace device { |
| + |
| +// An element of a HID report descriptor. |
| +class HidReportDescriptorItem { |
|
Ken Rockot(use gerrit already)
2014/04/21 21:53:53
Use a "private:" specifier please, just for clarit
jracle (use Gerrit)
2014/04/23 07:48:32
Got it
|
| + 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 payloadSize() const { return payload_size_; } |
|
Ken Rockot(use gerrit already)
2014/04/21 21:53:53
payload_size() please.
jracle (use Gerrit)
2014/04/23 07:48:32
Sorry OK
|
| + size_t GetSize() const; |
| + |
| + HidReportDescriptorItem* previous_; |
| + HidReportDescriptorItem* next_; |
| + HidReportDescriptorItem* parent_; |
| + Tag tag_; |
| + uint32_t shortData_; |
| + size_t payload_size_; |
| +}; |
| + |
| +std::ostream& operator<<(std::ostream& os, const HidReportDescriptorItem& item); |
| + |
| +} // namespace device |
| + |
| +#endif // DEVICE_HID_HID_REPORT_DESCRIPTOR_ITEM_H_ |