hid_report/
local_items.rs

1use crate::{UsagePage, __data_size, __data_to_unsigned, __set_data_size, macros::*};
2use alloc::{borrow::Cow, format};
3use std::{
4    cmp::{Eq, PartialEq},
5    fmt::Display,
6};
7
8__impls_for_short_items! {
9    /// Determines the body part used for a control. Index
10    /// points to a designator in the Physical descriptor.
11    DesignatorIndex: 0b0011_1000;
12    /// Defines the index of the starting designator
13    /// associated with an array or bitmap.
14    DesignatorMinimum: 0b0100_1000;
15    /// Defines the index of the ending designator
16    /// associated with an array or bitmap.
17    DesignatorMaximum: 0b0101_1000;
18    /// String index for a String descriptor; allows a string
19    /// to be associated with a particular item or control.
20    StringIndex: 0b0111_1000;
21    /// Specifies the first string index when assigning a
22    /// group of sequential strings to controls in an array
23    /// or bitmap.
24    StringMinimum: 0b1000_1000;
25    /// Specifies the last string index when assigning a
26    /// group of sequential strings to controls in an array
27    /// or bitmap.
28    StringMaximum: 0b1001_1000;
29    /// Defines the beginning or end of a set of local items
30    /// (1 = open set, 0 = close set).
31    Delimiter: 0b1010_1000;
32}
33
34/// Usage index for an item usage; represents a
35/// suggested usage for the item or collection.
36///
37/// In the case where an item represents multiple controls, a
38/// Usage tag may suggest a usage for every variable
39/// or element in an array.
40///
41/// # Data (Little Endian)
42///
43/// Depends on the value of [UsagePage](crate::UsagePage).
44/// See [HID Usage Tables FOR Universal Serial Bus](https://usb.org/sites/default/files/hut1_5.pdf).
45#[derive(Clone, Debug)]
46pub struct Usage {
47    raw: [u8; 5],
48    usage_page: Option<UsagePage>,
49}
50
51/// Defines the starting usage associated with an array or bitmap.
52///
53/// # Data (Little Endian)
54///
55/// Depends on the value of [UsagePage](crate::UsagePage).
56/// See [HID Usage Tables FOR Universal Serial Bus](https://usb.org/sites/default/files/hut1_5.pdf).
57#[derive(Clone, Debug)]
58pub struct UsageMinimum {
59    raw: [u8; 5],
60    usage_page: Option<UsagePage>,
61}
62/// Defines the ending usage associated with an array or bitmap.
63///
64/// # Data (Little Endian)
65///
66/// Depends on the value of [UsagePage](crate::UsagePage).
67/// See [HID Usage Tables FOR Universal Serial Bus](https://usb.org/sites/default/files/hut1_5.pdf).
68#[derive(Clone, Debug)]
69pub struct UsageMaximum {
70    raw: [u8; 5],
71    usage_page: Option<UsagePage>,
72}
73
74impl AsRef<[u8]> for Usage {
75    fn as_ref(&self) -> &[u8] {
76        let end = __data_size(self.raw[0]) + 1;
77        &self.raw[..end]
78    }
79}
80
81impl Default for Usage {
82    fn default() -> Self {
83        Self {
84            raw: [Self::PREFIX, 0, 0, 0, 0],
85            usage_page: None,
86        }
87    }
88}
89
90impl Usage {
91    /// Prefix consists of tag(bit 7-4), type(bit 3-2) and size(bit 1-0).
92    /// The "size" part is set to `00` in this constant value.
93    pub const PREFIX: u8 = 0b0000_1000;
94
95    /// Create an item with prefix check.
96    pub fn new(raw: &[u8]) -> Result<Self, crate::HidError> {
97        if raw.is_empty() {
98            return Err(crate::HidError::EmptyRawInput);
99        };
100        if raw[0] & 0b1111_1100 != Self::PREFIX {
101            return Err(crate::HidError::PrefixNotMatch);
102        }
103        let expected = crate::__data_size(raw[0]);
104        if expected + 1 != raw.len() {
105            return Err(crate::HidError::DataSizeNotMatch {
106                expected,
107                provided: raw.len() - 1,
108            });
109        };
110        let mut storage = [0; 5];
111        storage[..raw.len()].copy_from_slice(raw);
112        Ok(Self {
113            raw: storage,
114            usage_page: None,
115        })
116    }
117
118    /// Create an item *WITHOUT* prefix check.
119    ///
120    /// # Safety
121    ///
122    /// Must ensure that the prefix part is correct.
123    pub unsafe fn new_unchecked(raw: &[u8]) -> Self {
124        let mut storage = [0; 5];
125        storage[..raw.len()].copy_from_slice(raw);
126        Self {
127            raw: storage,
128            usage_page: None,
129        }
130    }
131
132    /// Get prefix part of the item. Equivalent to `item.as_ref()[0]`.
133    pub fn prefix(&self) -> u8 {
134        self.raw[0]
135    }
136
137    /// Get data part of the item. Equivalent to `&item.as_ref()[1..]`.
138    pub fn data(&self) -> &[u8] {
139        let end = __data_size(self.raw[0]) + 1;
140        &self.raw[1..end]
141    }
142
143    /// If you want more detailed content printed when formatting,
144    /// you need to set the related usage page.
145    ///
146    /// # Equality
147    ///
148    /// Equality between two Usage items ignores usage page.
149    pub fn set_usage_page(&mut self, usage_page: UsagePage) {
150        self.usage_page = Some(usage_page);
151    }
152
153    /// Get usage page.
154    pub fn usage_page(&self) -> Option<&UsagePage> {
155        self.usage_page.as_ref()
156    }
157
158    /// Create an item with specific data.
159    ///
160    /// *NOTE*: data size must be: 0, 1, 2 or 4.
161    pub fn new_with(data: &[u8]) -> Result<Self, crate::HidError> {
162        let mut item = Self {
163            raw: [0; 5],
164            usage_page: None,
165        };
166        item.raw[0] = 0b0000_1000;
167        __set_data_size(&mut item.raw[0], data)?;
168        item.data_mut().copy_from_slice(data);
169        Ok(item)
170    }
171
172    /// Set data part of the item.
173    ///
174    /// *NOTE*: data size must be: 0, 1, 2 or 4.
175    pub fn set_data(&mut self, data: &[u8]) -> Result<&mut Self, crate::HidError> {
176        __set_data_size(&mut self.raw[0], data)?;
177        self.data_mut().copy_from_slice(data);
178        Ok(self)
179    }
180
181    /// Get mutable data part of the item.
182    pub fn data_mut(&mut self) -> &mut [u8] {
183        let end = __data_size(self.raw[0]) + 1;
184        &mut self.raw[1..end]
185    }
186}
187
188impl PartialEq for Usage {
189    fn eq(&self, other: &Self) -> bool {
190        self.raw.eq(&other.raw)
191    }
192}
193
194impl Eq for Usage {}
195
196impl AsRef<[u8]> for UsageMinimum {
197    fn as_ref(&self) -> &[u8] {
198        let end = __data_size(self.raw[0]) + 1;
199        &self.raw[..end]
200    }
201}
202
203impl Default for UsageMinimum {
204    fn default() -> Self {
205        Self {
206            raw: [Self::PREFIX, 0, 0, 0, 0],
207            usage_page: None,
208        }
209    }
210}
211
212impl UsageMinimum {
213    /// Prefix consists of tag(bit 7-4), type(bit 3-2) and size(bit 1-0).
214    /// The "size" part is set to `00` in this constant value.
215    pub const PREFIX: u8 = 0b0001_1000;
216
217    /// Create an item with prefix check.
218    pub fn new(raw: &[u8]) -> Result<Self, crate::HidError> {
219        if raw.is_empty() {
220            return Err(crate::HidError::EmptyRawInput);
221        };
222        if raw[0] & 0b1111_1100 != Self::PREFIX {
223            return Err(crate::HidError::PrefixNotMatch);
224        }
225        let expected = crate::__data_size(raw[0]);
226        if expected + 1 != raw.len() {
227            return Err(crate::HidError::DataSizeNotMatch {
228                expected,
229                provided: raw.len() - 1,
230            });
231        };
232        let mut storage = [0; 5];
233        storage[..raw.len()].copy_from_slice(raw);
234        Ok(Self {
235            raw: storage,
236            usage_page: None,
237        })
238    }
239
240    /// Create an item *WITHOUT* prefix check.
241    ///
242    /// # Safety
243    ///
244    /// Must ensure that the prefix part is correct.
245    pub unsafe fn new_unchecked(raw: &[u8]) -> Self {
246        let mut storage = [0; 5];
247        storage[..raw.len()].copy_from_slice(raw);
248        Self {
249            raw: storage,
250            usage_page: None,
251        }
252    }
253
254    /// Get prefix part of the item. Equivalent to `item.as_ref()[0]`.
255    pub fn prefix(&self) -> u8 {
256        self.raw[0]
257    }
258
259    /// Get data part of the item. Equivalent to `&item.as_ref()[1..]`.
260    pub fn data(&self) -> &[u8] {
261        let end = __data_size(self.raw[0]) + 1;
262        &self.raw[1..end]
263    }
264
265    /// If you want more detailed content printed when formatting,
266    /// you need to set the related usage page.
267    ///
268    /// # Equality
269    ///
270    /// Equality between two UsageMinimum items ignores usage page.
271    pub fn set_usage_page(&mut self, usage_page: UsagePage) {
272        self.usage_page = Some(usage_page);
273    }
274
275    /// Get usage page.
276    pub fn usage_page(&self) -> Option<&UsagePage> {
277        self.usage_page.as_ref()
278    }
279
280    /// Create an item with specific data.
281    ///
282    /// *NOTE*: data size must be: 0, 1, 2 or 4.
283    pub fn new_with(data: &[u8]) -> Result<Self, crate::HidError> {
284        let mut item = Self {
285            raw: [0; 5],
286            usage_page: None,
287        };
288        item.raw[0] = 0b0001_1000;
289        __set_data_size(&mut item.raw[0], data)?;
290        item.data_mut().copy_from_slice(data);
291        Ok(item)
292    }
293
294    /// Set data part of the item.
295    ///
296    /// *NOTE*: data size must be: 0, 1, 2 or 4.
297    pub fn set_data(&mut self, data: &[u8]) -> Result<&mut Self, crate::HidError> {
298        crate::__set_data_size(&mut self.raw[0], data)?;
299        self.data_mut().copy_from_slice(data);
300        Ok(self)
301    }
302
303    /// Get mutable data part of the item.
304    pub fn data_mut(&mut self) -> &mut [u8] {
305        let end = __data_size(self.raw[0]) + 1;
306        &mut self.raw[1..end]
307    }
308}
309
310impl PartialEq for UsageMinimum {
311    fn eq(&self, other: &Self) -> bool {
312        self.raw.eq(&other.raw)
313    }
314}
315
316impl Eq for UsageMinimum {}
317
318impl AsRef<[u8]> for UsageMaximum {
319    fn as_ref(&self) -> &[u8] {
320        let end = __data_size(self.raw[0]) + 1;
321        &self.raw[..end]
322    }
323}
324
325impl Default for UsageMaximum {
326    fn default() -> Self {
327        Self {
328            raw: [Self::PREFIX, 0, 0, 0, 0],
329            usage_page: None,
330        }
331    }
332}
333
334impl UsageMaximum {
335    /// Prefix consists of tag(bit 7-4), type(bit 3-2) and size(bit 1-0).
336    /// The "size" part is set to `00` in this constant value.
337    pub const PREFIX: u8 = 0b0010_1000;
338
339    /// Create an item with prefix check.
340    pub fn new(raw: &[u8]) -> Result<Self, crate::HidError> {
341        if raw.is_empty() {
342            return Err(crate::HidError::EmptyRawInput);
343        };
344        if raw[0] & 0b1111_1100 != Self::PREFIX {
345            return Err(crate::HidError::PrefixNotMatch);
346        }
347        let expected = crate::__data_size(raw[0]);
348        if expected + 1 != raw.len() {
349            return Err(crate::HidError::DataSizeNotMatch {
350                expected,
351                provided: raw.len() - 1,
352            });
353        };
354        let mut storage = [0; 5];
355        storage[..raw.len()].copy_from_slice(raw);
356        Ok(Self {
357            raw: storage,
358            usage_page: None,
359        })
360    }
361
362    /// Create an item *WITHOUT* prefix check.
363    ///
364    /// # Safety
365    ///
366    /// Must ensure that the prefix part is correct.
367    pub unsafe fn new_unchecked(raw: &[u8]) -> Self {
368        let mut storage = [0; 5];
369        storage[..raw.len()].copy_from_slice(raw);
370        Self {
371            raw: storage,
372            usage_page: None,
373        }
374    }
375
376    /// Get prefix part of the item. Equivalent to `item.as_ref()[0]`.
377    pub fn prefix(&self) -> u8 {
378        self.raw[0]
379    }
380
381    /// Get data part of the item. Equivalent to `&item.as_ref()[1..]`.
382    pub fn data(&self) -> &[u8] {
383        let end = __data_size(self.raw[0]) + 1;
384        &self.raw[1..end]
385    }
386
387    /// If you want more detailed content printed when formatting,
388    /// you need to set the related usage page.
389    ///
390    /// # Equality
391    ///
392    /// Equality between two UsageMaximum items ignores usage page.
393    pub fn set_usage_page(&mut self, usage_page: UsagePage) {
394        self.usage_page = Some(usage_page);
395    }
396
397    /// Get usage page.
398    pub fn usage_page(&self) -> Option<&UsagePage> {
399        self.usage_page.as_ref()
400    }
401
402    /// Create an item with specific data.
403    ///
404    /// *NOTE*: data size must be: 0, 1, 2 or 4.
405    pub fn new_with(data: &[u8]) -> Result<Self, crate::HidError> {
406        let mut item = Self {
407            raw: [0; 5],
408            usage_page: None,
409        };
410        item.raw[0] = 0b0010_1000;
411        crate::__set_data_size(&mut item.raw[0], data)?;
412        item.data_mut().copy_from_slice(data);
413        Ok(item)
414    }
415
416    /// Set data part of the item.
417    ///
418    /// *NOTE*: data size must be: 0, 1, 2 or 4.
419    pub fn set_data(&mut self, data: &[u8]) -> Result<&mut Self, crate::HidError> {
420        crate::__set_data_size(&mut self.raw[0], data)?;
421        self.data_mut().copy_from_slice(data);
422        Ok(self)
423    }
424
425    /// Get mutable data part of the item.
426    pub fn data_mut(&mut self) -> &mut [u8] {
427        let end = __data_size(self.raw[0]) + 1;
428        &mut self.raw[1..end]
429    }
430}
431
432impl PartialEq for UsageMaximum {
433    fn eq(&self, other: &Self) -> bool {
434        self.raw.eq(&other.raw)
435    }
436}
437
438impl Eq for UsageMaximum {}
439
440fn __usage_format_helper(usage: u32, usage_page: u32) -> Cow<'static, str> {
441    match usage_page {
442        // Generic Desktop
443        0x01 => Cow::Borrowed(match usage {
444            0x00 => "Undefined",
445            0x01 => "Pointer",
446            0x02 => "Mouse",
447            0x04 => "Joystick",
448            0x05 => "Gamepad",
449            0x06 => "Keyboard",
450            0x07 => "Keypad",
451            0x08 => "Multi-Axis Controller",
452            0x09 => "Tablet PC System Controls",
453            0x0A => "Water Cooling Device",
454            0x0B => "Computer Chassis Device",
455            0x0C => "Wireless Radio Controls",
456            0x0D => "Portable Device Control",
457            0x0E => "System Multi-Axis Controller",
458            0x0F => "Spatial Controller",
459            0x10 => "Assistive Control",
460            0x11 => "Device Dock",
461            0x12 => "Dockable Device",
462            0x13 => "Call State Management Control",
463            0x30 => "X",
464            0x31 => "Y",
465            0x32 => "Z",
466            0x33 => "Rx",
467            0x34 => "Ry",
468            0x35 => "Rz",
469            0x36 => "Slider",
470            0x37 => "Dial",
471            0x38 => "Wheel",
472            0x39 => "Hat Switch",
473            0x3A => "Counted Buffer",
474            0x3B => "Byte Count",
475            0x3C => "Motion Wakeup",
476            0x3D => "Start",
477            0x3E => "Select",
478            0x40 => "Vx",
479            0x41 => "Vy",
480            0x42 => "Vz",
481            0x43 => "Vbrx",
482            0x44 => "Vbry",
483            0x45 => "Vbrz",
484            0x46 => "Vno",
485            0x47 => "Feature Notification",
486            0x48 => "Resolution Multiplier",
487            0x49 => "Qx",
488            0x4A => "Qy",
489            0x4B => "Qz",
490            0x4C => "Qw",
491            0x80 => "System Control",
492            0x81 => "System Power Down",
493            0x82 => "System Sleep",
494            0x83 => "System Wake Up",
495            0x84 => "System Context Menu",
496            0x85 => "System Main Menu",
497            0x86 => "System App Menu",
498            0x87 => "System Menu Help",
499            0x88 => "System Menu Exit",
500            0x89 => "System Menu Select",
501            0x8A => "System Menu Right",
502            0x8B => "System Menu Left",
503            0x8C => "System Menu Up",
504            0x8D => "System Menu Down",
505            0x8E => "System Cold Restart",
506            0x8F => "System Warm Restart",
507            0x90 => "D-pad Up",
508            0x91 => "D-pad Down",
509            0x92 => "D-pad Right",
510            0x93 => "D-pad Left",
511            0x94 => "Index Trigger",
512            0x95 => "Palm Trigger",
513            0x96 => "Thumbstick",
514            0x97 => "System Function Shift",
515            0x98 => "System Function Shift Lock",
516            0x99 => "System Function Shift Lock Indicator",
517            0x9A => "System Dismiss Notification",
518            0x9B => "System Do Not Disturb",
519            0xA0 => "System Dock",
520            0xA1 => "System Undock",
521            0xA2 => "System Setup",
522            0xA3 => "System Break",
523            0xA4 => "System Debugger Break",
524            0xA5 => "Application Break",
525            0xA6 => "Application Debugger Break",
526            0xA7 => "System Speaker Mute",
527            0xA8 => "System Hibernate",
528            0xA9 => "System Microphone Mute",
529            0xB0 => "System Display Invert",
530            0xB1 => "System Display Internal",
531            0xB2 => "System Display External",
532            0xB3 => "System Display Both",
533            0xB4 => "System Display Dual",
534            0xB5 => "System Display Toggle Int/Ext",
535            0xB6 => "System Display Swap Primary/Secondary",
536            0xB7 => "System Display LCD Autoscale",
537            0xC0 => "Sensor Zone",
538            0xC1 => "RPM",
539            0xC2 => "Coolant Level",
540            0xC3 => "Coolant Critical Level",
541            0xC4 => "Coolant Pump",
542            0xC5 => "Chassis Enclosure",
543            0xC6 => "Wireless Radio Button",
544            0xC7 => "Wireless Radio LED",
545            0xC8 => "Wireless Radio Slider Switch",
546            0xC9 => "System Display Rotation Lock Button",
547            0xCA => "System Display Rotation Lock Slider Switch",
548            0xCB => "Control Enable",
549            0xD0 => "Dockable Device Unique ID",
550            0xD1 => "Dockable Device Vendor ID",
551            0xD2 => "Dockable Device Primary Usage Page",
552            0xD3 => "Dockable Device Primary Usage ID",
553            0xD4 => "Dockable Device Docking State",
554            0xD5 => "Dockable Device Display Occlusion",
555            0xD6 => "Dockable Device Object Type",
556            0xE0 => "Call Active LED",
557            0xE1 => "Call Mute Toggle",
558            0xE2 => "Call Mute LED",
559            _ => "Reserved",
560        }),
561        // Simulation Controls
562        0x02 => Cow::Borrowed(match usage {
563            0x00 => "Undefined",
564            0x01 => "Flight Simulation Device",
565            0x02 => "Automobile Simulation Device",
566            0x03 => "Tank Simulation Device",
567            0x04 => "Spaceship Simulation Device",
568            0x05 => "Submarine Simulation Device",
569            0x06 => "Sailing Simulation Device",
570            0x07 => "Motorcycle Simulation Device",
571            0x08 => "Sports Simulation Device",
572            0x09 => "Airplane Simulation Device",
573            0x0A => "Helicopter Simulation Device",
574            0x0B => "Magic Carpet Simulation Device",
575            0x0C => "Bicycle Simulation Device",
576            0x20 => "Flight Control Stick",
577            0x21 => "Flight Stick",
578            0x22 => "Cyclic Control",
579            0x23 => "Cyclic Trim",
580            0x24 => "Flight Yoke",
581            0x25 => "Track Control",
582            0xB0 => "Aileron",
583            0xB1 => "Aileron Trim",
584            0xB2 => "Anti-Torque Control",
585            0xB3 => "Autopilot Enable",
586            0xB4 => "Chaff Release",
587            0xB5 => "Collective Control",
588            0xB6 => "Dive Brake",
589            0xB7 => "Electronic Countermeasures",
590            0xB8 => "Elevator",
591            0xB9 => "Elevator Trim",
592            0xBA => "Rudder",
593            0xBB => "Throttle",
594            0xBC => "Flight Communications",
595            0xBD => "Flare Release",
596            0xBE => "Landing Gear",
597            0xBF => "Toe Brake",
598            0xC0 => "Trigger",
599            0xC1 => "Weapons Arm",
600            0xC2 => "Weapons Select",
601            0xC3 => "Wing Flaps",
602            0xC4 => "Accelerator",
603            0xC5 => "Brake",
604            0xC6 => "Clutch",
605            0xC7 => "Shifter",
606            0xC8 => "Steering",
607            0xC9 => "Turret Direction",
608            0xCA => "Barrel Elevation",
609            0xCB => "Dive Plane",
610            0xCC => "Ballast",
611            0xCD => "Bicycle Crank",
612            0xCE => "Handle Bars",
613            0xCF => "Front Brake",
614            0xD0 => "Rear Brake",
615            _ => "Reserved",
616        }),
617        // VR Controls
618        0x03 => Cow::Borrowed(match usage {
619            0x00 => "Undefined",
620            0x01 => "Belt",
621            0x02 => "Body Suit",
622            0x03 => "Flexor",
623            0x04 => "Glove",
624            0x05 => "Head Tracker",
625            0x06 => "Head Mounted Display",
626            0x07 => "Hand Tracker",
627            0x08 => "Oculometer",
628            0x09 => "Vest",
629            0x0A => "Animatronic Device",
630            0x20 => "Stereo Enable",
631            0x21 => "Display Enable",
632            _ => "Reserved",
633        }),
634        // Sport Controls
635        0x04 => Cow::Borrowed(match usage {
636            0x00 => "Undefined",
637            0x01 => "Baseball Bat",
638            0x02 => "Golf Club",
639            0x03 => "Rowing Machine",
640            0x04 => "Treadmill",
641            0x30 => "Oar",
642            0x31 => "Slope",
643            0x32 => "Rate",
644            0x33 => "Stick Speed",
645            0x34 => "Stick Face Angle",
646            0x35 => "Stick Heel/Toe",
647            0x36 => "Stick Follow Through",
648            0x37 => "Stick Tempo",
649            0x38 => "Stick Type",
650            0x39 => "Stick Height",
651            0x50 => "Putter",
652            0x51 => "1 Iron",
653            0x52 => "2 Iron",
654            0x53 => "3 Iron",
655            0x54 => "4 Iron",
656            0x55 => "5 Iron",
657            0x56 => "6 Iron",
658            0x57 => "7 Iron",
659            0x58 => "8 Iron",
660            0x59 => "9 Iron",
661            0x5A => "10 Iron",
662            0x5B => "11 Iron",
663            0x5C => "Sand Wedge",
664            0x5D => "Loft Wedge",
665            0x5E => "Power Wedge",
666            0x5F => "1 Wood",
667            0x60 => "3 Wood",
668            0x61 => "5 Wood",
669            0x62 => "7 Wood",
670            0x63 => "9 Wood",
671            _ => "Reserved",
672        }),
673        // Game Controls
674        0x05 => Cow::Borrowed(match usage {
675            0x00 => "Undefined",
676            0x01 => "3D Game Controller",
677            0x02 => "Pinball Device",
678            0x03 => "Gun Device",
679            0x20 => "Point of View",
680            0x21 => "Turn Right/Left",
681            0x22 => "Pitch Forward/Backward",
682            0x23 => "Roll Right/Left",
683            0x24 => "Move Right/Left",
684            0x25 => "Move Forward/Backward",
685            0x26 => "Move Up/Down",
686            0x27 => "Lean Right/Left",
687            0x28 => "Lean Forward/Backward",
688            0x29 => "Height of POV",
689            0x2A => "Flipper",
690            0x2B => "Secondary Flipper",
691            0x2C => "Bump",
692            0x2D => "New Game",
693            0x2E => "Shoot Ball",
694            0x2F => "Player",
695            0x30 => "Gun Bolt",
696            0x31 => "Gun Clip",
697            0x32 => "Gun Selector",
698            0x33 => "Gun Single Shot",
699            0x34 => "Gun Burst",
700            0x35 => "Gun Automatic",
701            0x36 => "Gun Safety",
702            0x37 => "Gamepad Fire/Jump",
703            0x39 => "Gamepad Trigger",
704            0x3A => "Form-fitting Gamepad",
705            _ => "Reserved",
706        }),
707        // Generic Device Controls
708        0x06 => Cow::Borrowed(match usage {
709            0x00 => "Undefined",
710            0x01 => "Background/Nonuser Controls",
711            0x20 => "Battery Strength",
712            0x21 => "Wireless Channel",
713            0x22 => "Wireless ID",
714            0x23 => "Discover Wireless Control",
715            0x24 => "Security Code Character Entered",
716            0x25 => "Security Code Character Erased",
717            0x26 => "Security Code Cleared",
718            0x27 => "Sequence ID",
719            0x28 => "Sequence ID Reset",
720            0x29 => "RF Signal Strength",
721            0x2A => "Software Version",
722            0x2B => "Protocol Version",
723            0x2C => "Hardware Version",
724            0x2D => "Major",
725            0x2E => "Minor",
726            0x2F => "Revision",
727            0x30 => "Handedness",
728            0x31 => "Either Hand",
729            0x32 => "Left Hand",
730            0x33 => "Right Hand",
731            0x34 => "Both Hands",
732            0x40 => "Grip Pose Offset",
733            0x41 => "Pointer Pose Offset",
734            _ => "Reserved",
735        }),
736        // Keyboard/Keypad
737        0x07 => Cow::Borrowed(match usage {
738            0x01 => "Keyboard ErrorRollOver",
739            0x02 => "Keyboard POSTFail",
740            0x03 => "Keyboard ErrorUndefined",
741            0x04 => "Keyboard a and A",
742            0x05 => "Keyboard b and B",
743            0x06 => "Keyboard c and C",
744            0x07 => "Keyboard d and D",
745            0x08 => "Keyboard e and E",
746            0x09 => "Keyboard f and F",
747            0x0A => "Keyboard g and G",
748            0x0B => "Keyboard h and H",
749            0x0C => "Keyboard i and I",
750            0x0D => "Keyboard j and J",
751            0x0E => "Keyboard k and K",
752            0x0F => "Keyboard l and L",
753            0x10 => "Keyboard m and M",
754            0x11 => "Keyboard n and N",
755            0x12 => "Keyboard o and O",
756            0x13 => "Keyboard p and P",
757            0x14 => "Keyboard q and Q",
758            0x15 => "Keyboard r and R",
759            0x16 => "Keyboard s and S",
760            0x17 => "Keyboard t and T",
761            0x18 => "Keyboard u and U",
762            0x19 => "Keyboard v and V",
763            0x1A => "Keyboard w and W",
764            0x1B => "Keyboard x and X",
765            0x1C => "Keyboard y and Y",
766            0x1D => "Keyboard z and Z",
767            0x1E => "Keyboard 1 and !",
768            0x1F => "Keyboard 2 and @",
769            0x20 => "Keyboard 3 and #",
770            0x21 => "Keyboard 4 and $",
771            0x22 => "Keyboard 5 and %",
772            0x23 => "Keyboard 6 and ∧",
773            0x24 => "Keyboard 7 and &",
774            0x25 => "Keyboard 8 and *",
775            0x26 => "Keyboard 9 and (",
776            0x27 => "Keyboard 0 and )",
777            0x28 => "Keyboard Return (ENTER)",
778            0x29 => "Keyboard ESCAPE",
779            0x2A => "Keyboard DELETE (Backspace)",
780            0x2B => "Keyboard Tab",
781            0x2C => "Keyboard Spacebar",
782            0x2D => "Keyboard - and (underscore)",
783            0x2E => "Keyboard = and +",
784            0x2F => "Keyboard [ and {",
785            0x30 => "Keyboard ] and }",
786            0x31 => "Keyboard \\ and |",
787            0x32 => "Keyboard Non-US # and ˜",
788            0x33 => "Keyboard ; and :",
789            0x34 => "Keyboard ‘ and “",
790            0x35 => "Keyboard Grave Accent and Tilde",
791            0x36 => "Keyboard , and <",
792            0x37 => "Keyboard . and >",
793            0x38 => "Keyboard / and ?",
794            0x39 => "Keyboard Caps Lock",
795            0x3A => "Keyboard F1",
796            0x3B => "Keyboard F2",
797            0x3C => "Keyboard F3",
798            0x3D => "Keyboard F4",
799            0x3E => "Keyboard F5",
800            0x3F => "Keyboard F6",
801            0x40 => "Keyboard F7",
802            0x41 => "Keyboard F8",
803            0x42 => "Keyboard F9",
804            0x43 => "Keyboard F10",
805            0x44 => "Keyboard F11",
806            0x45 => "Keyboard F12",
807            0x46 => "Keyboard PrintScreen",
808            0x47 => "Keyboard Scroll Lock",
809            0x48 => "Keyboard Pause",
810            0x49 => "Keyboard Insert",
811            0x4A => "Keyboard Home",
812            0x4B => "Keyboard PageUp",
813            0x4C => "Keyboard Delete Forward",
814            0x4D => "Keyboard End",
815            0x4E => "Keyboard PageDown",
816            0x4F => "Keyboard RightArrow",
817            0x50 => "Keyboard LeftArrow",
818            0x51 => "Keyboard DownArrow",
819            0x52 => "Keyboard UpArrow",
820            0x53 => "Keypad Num Lock and Clear",
821            0x54 => "Keypad /",
822            0x55 => "Keypad *",
823            0x56 => "Keypad -",
824            0x57 => "Keypad +",
825            0x58 => "Keypad ENTER",
826            0x59 => "Keypad 1 and End",
827            0x5A => "Keypad 2 and Down Arrow",
828            0x5B => "Keypad 3 and PageDn",
829            0x5C => "Keypad 4 and Left Arrow",
830            0x5D => "Keypad 5",
831            0x5E => "Keypad 6 and Right Arrow",
832            0x5F => "Keypad 7 and Home",
833            0x60 => "Keypad 8 and Up Arrow",
834            0x61 => "Keypad 9 and PageUp",
835            0x62 => "Keypad 0 and Insert",
836            0x63 => "Keypad . and Delete",
837            0x64 => "Keyboard Non-US \\ and |",
838            0x65 => "Keyboard Application",
839            0x66 => "Keyboard Power",
840            0x67 => "Keypad =",
841            0x68 => "Keyboard F13",
842            0x69 => "Keyboard F14",
843            0x6A => "Keyboard F15",
844            0x6B => "Keyboard F16",
845            0x6C => "Keyboard F17",
846            0x6D => "Keyboard F18",
847            0x6E => "Keyboard F19",
848            0x6F => "Keyboard F20",
849            0x70 => "Keyboard F21",
850            0x71 => "Keyboard F22",
851            0x72 => "Keyboard F23",
852            0x73 => "Keyboard F24",
853            0x74 => "Keyboard Execute",
854            0x75 => "Keyboard Help",
855            0x76 => "Keyboard Menu",
856            0x77 => "Keyboard",
857            0x78 => "Keyboard Stop",
858            0x79 => "Keyboard Again",
859            0x7A => "Keyboard Undo",
860            0x7B => "Keyboard Cut",
861            0x7C => "Keyboard Copy",
862            0x7D => "Keyboard Paste",
863            0x7E => "Keyboard Find",
864            0x7F => "Keyboard Mute",
865            0x80 => "Keyboard Volume Up",
866            0x81 => "Keyboard Volume Down",
867            0x82 => "Keyboard Locking Caps Lock",
868            0x83 => "Keyboard Locking Num Lock",
869            0x84 => "Keyboard Locking Scroll Lock",
870            0x85 => "Keypad Comma",
871            0x86 => "Keypad Equal Sign",
872            0x87 => "Keyboard International1",
873            0x88 => "Keyboard International2",
874            0x89 => "Keyboard International3",
875            0x8A => "Keyboard International4",
876            0x8B => "Keyboard International5",
877            0x8C => "Keyboard International6",
878            0x8D => "Keyboard International7",
879            0x8E => "Keyboard International8",
880            0x8F => "Keyboard International9",
881            0x90 => "Keyboard LANG1",
882            0x91 => "Keyboard LANG2",
883            0x92 => "Keyboard LANG3",
884            0x93 => "Keyboard LANG4",
885            0x94 => "Keyboard LANG5",
886            0x95 => "Keyboard LANG6",
887            0x96 => "Keyboard LANG7",
888            0x97 => "Keyboard LANG8",
889            0x98 => "Keyboard LANG9",
890            0x99 => "Keyboard Alternate Erase",
891            0x9A => "Keyboard SysReq/Attention",
892            0x9B => "Keyboard Cancel",
893            0x9C => "Keyboard Clear",
894            0x9D => "Keyboard Prior",
895            0x9E => "Keyboard Return",
896            0x9F => "Keyboard Separator",
897            0xA0 => "Keyboard Out",
898            0xA1 => "Keyboard Oper",
899            0xA2 => "Keyboard Clear/Again",
900            0xA3 => "Keyboard CrSel/Props",
901            0xA4 => "Keyboard ExSel",
902            0xB0 => "Keypad 00",
903            0xB1 => "Keypad 000",
904            0xB2 => "Thousands Separator",
905            0xB3 => "Decimal Separator",
906            0xB4 => "Currency Unit",
907            0xB5 => "Currency Sub-unit",
908            0xB6 => "Keypad (",
909            0xB7 => "Keypad )",
910            0xB8 => "Keypad {",
911            0xB9 => "Keypad }",
912            0xBA => "Keypad Tab",
913            0xBB => "Keypad Backspace",
914            0xBC => "Keypad A",
915            0xBD => "Keypad B",
916            0xBE => "Keypad C",
917            0xBF => "Keypad D",
918            0xC0 => "Keypad E",
919            0xC1 => "Keypad F",
920            0xC2 => "Keypad XOR",
921            0xC3 => "Keypad ∧",
922            0xC4 => "Keypad %",
923            0xC5 => "Keypad <",
924            0xC6 => "Keypad >",
925            0xC7 => "Keypad &",
926            0xC8 => "Keypad &&",
927            0xC9 => "Keypad |",
928            0xCA => "Keypad ||",
929            0xCB => "Keypad :",
930            0xCC => "Keypad #",
931            0xCD => "Keypad Space",
932            0xCE => "Keypad @",
933            0xCF => "Keypad !",
934            0xD0 => "Keypad Memory Store",
935            0xD1 => "Keypad Memory Recall",
936            0xD2 => "Keypad Memory Clear",
937            0xD3 => "Keypad Memory Add",
938            0xD4 => "Keypad Memory Subtract",
939            0xD5 => "Keypad Memory Multiply",
940            0xD6 => "Keypad Memory Divide",
941            0xD7 => "Keypad +/-",
942            0xD8 => "Keypad Clear",
943            0xD9 => "Keypad Clear Entry",
944            0xDA => "Keypad Binary",
945            0xDB => "Keypad Octal",
946            0xDC => "Keypad Decimal",
947            0xDD => "Keypad Hexadecimal",
948            0xE0 => "Keyboard LeftControl",
949            0xE1 => "Keyboard LeftShift",
950            0xE2 => "Keyboard LeftAlt",
951            0xE3 => "Keyboard Left GUI",
952            0xE4 => "Keyboard RightControl",
953            0xE5 => "Keyboard RightShift",
954            0xE6 => "Keyboard RightAlt",
955            0xE7 => "Keyboard Right GUI",
956            _ => "Reserved",
957        }),
958        // LED
959        0x08 => Cow::Borrowed(match usage {
960            0x00 => "Undefined",
961            0x01 => "Num Lock",
962            0x02 => "Caps Lock",
963            0x03 => "Scroll Lock",
964            0x04 => "Compose",
965            0x05 => "Kana",
966            0x06 => "Power",
967            0x07 => "Shift",
968            0x08 => "Do Not Disturb",
969            0x09 => "Mute",
970            0x0A => "Tone Enable",
971            0x0B => "High Cut Filter",
972            0x0C => "Low Cut Filter",
973            0x0D => "Equalizer Enable",
974            0x0E => "Sound Field On",
975            0x0F => "Surround On",
976            0x10 => "Repeat",
977            0x11 => "Stereo",
978            0x12 => "Sampling Rate Detect",
979            0x13 => "Spinning",
980            0x14 => "CAV",
981            0x15 => "CLV",
982            0x16 => "Recording Format Detect",
983            0x17 => "Off-Hook",
984            0x18 => "Ring",
985            0x19 => "Message Waiting",
986            0x1A => "Data Mode",
987            0x1B => "Battery Operation",
988            0x1C => "Battery OK",
989            0x1D => "Battery Low",
990            0x1E => "Speaker",
991            0x1F => "Headset",
992            0x20 => "Hold",
993            0x21 => "Microphone",
994            0x22 => "Coverage",
995            0x23 => "Night Mode",
996            0x24 => "Send Calls",
997            0x25 => "Call Pickup",
998            0x26 => "Conference",
999            0x27 => "Stand-by",
1000            0x28 => "Camera On",
1001            0x29 => "Camera Off",
1002            0x2A => "On-Line",
1003            0x2B => "Off-Line",
1004            0x2C => "Busy",
1005            0x2D => "Ready",
1006            0x2E => "Paper-Out",
1007            0x2F => "Paper-Jam",
1008            0x30 => "Remote",
1009            0x31 => "Forward",
1010            0x32 => "Reverse",
1011            0x33 => "Stop",
1012            0x34 => "Rewind",
1013            0x35 => "Fast Forward",
1014            0x36 => "Play",
1015            0x37 => "Pause",
1016            0x38 => "Record",
1017            0x39 => "Error",
1018            0x3A => "Usage Selected Indicator",
1019            0x3B => "Usage In Use Indicator",
1020            0x3C => "Usage Multi Mode Indicator",
1021            0x3D => "Indicator On",
1022            0x3E => "Indicator Flash",
1023            0x3F => "Indicator Slow Blink",
1024            0x40 => "Indicator Fast Blink",
1025            0x41 => "Indicator Off",
1026            0x42 => "Flash On Time",
1027            0x43 => "Slow Blink On Time",
1028            0x44 => "Slow Blink Off Time",
1029            0x45 => "Fast Blink On Time",
1030            0x46 => "Fast Blink Off Time",
1031            0x47 => "Usage Indicator Color",
1032            0x48 => "Indicator Red",
1033            0x49 => "Indicator Green",
1034            0x4A => "Indicator Amber",
1035            0x4B => "Generic Indicator",
1036            0x4C => "System Suspend",
1037            0x4D => "External Power Connected",
1038            0x4E => "Indicator Blue",
1039            0x4F => "Indicator Orange",
1040            0x50 => "Good Status",
1041            0x51 => "Warning Status",
1042            0x52 => "RGB LED",
1043            0x53 => "Red LED Channel",
1044            0x54 => "Blue LED Channel",
1045            0x55 => "Green LED Channel",
1046            0x56 => "LED Intensity",
1047            0x57 => "System Microphone Mute",
1048            0x60 => "Player Indicator",
1049            0x61 => "Player 1",
1050            0x62 => "Player 2",
1051            0x63 => "Player 3",
1052            0x64 => "Player 4",
1053            0x65 => "Player 5",
1054            0x66 => "Player 6",
1055            0x67 => "Player 7",
1056            0x68 => "Player 8",
1057            _ => "Reserved",
1058        }),
1059        // Button
1060        0x09 => match usage {
1061            0x00 => Cow::Borrowed("No Button Pressed"),
1062            _ => Cow::Owned(format!("Button {}", usage)),
1063        },
1064        // Ordinal
1065        0x0A => match usage {
1066            0x00 => Cow::Borrowed("Reserved"),
1067            _ => Cow::Owned(format!("Instance {}", usage)),
1068        },
1069        // Telephony Device
1070        0x0B => Cow::Borrowed(match usage {
1071            0x00 => "Undefined",
1072            0x01 => "Phone",
1073            0x02 => "Answering Machine",
1074            0x03 => "Message Controls",
1075            0x04 => "Handset",
1076            0x05 => "Headset CL/CA 14.1",
1077            0x06 => "Telephony Key Pad",
1078            0x07 => "Programmable Button",
1079            0x20 => "Hook Switch",
1080            0x21 => "Flash",
1081            0x22 => "Feature",
1082            0x23 => "Hold",
1083            0x24 => "Redial",
1084            0x25 => "Transfer",
1085            0x26 => "Drop",
1086            0x27 => "Park",
1087            0x28 => "Forward Calls",
1088            0x29 => "Alternate Function",
1089            0x2A => "Line OSC/NAry 14.3",
1090            0x2B => "Speaker Phone",
1091            0x2C => "Conference",
1092            0x2D => "Ring Enable",
1093            0x2E => "Ring Select",
1094            0x2F => "Phone Mute",
1095            0x30 => "Caller ID",
1096            0x31 => "Send",
1097            0x50 => "Speed Dial",
1098            0x51 => "Store Number",
1099            0x52 => "Recall Number",
1100            0x53 => "Phone Directory",
1101            0x70 => "Voice Mail",
1102            0x71 => "Screen Calls",
1103            0x72 => "Do Not Disturb",
1104            0x73 => "Message",
1105            0x74 => "Answer On/Off",
1106            0x90 => "Inside Dial Tone",
1107            0x91 => "Outside Dial Tone",
1108            0x92 => "Inside Ring Tone",
1109            0x93 => "Outside Ring Tone",
1110            0x94 => "Priority Ring Tone",
1111            0x95 => "Inside Ringback",
1112            0x96 => "Priority Ringback",
1113            0x97 => "Line Busy Tone",
1114            0x98 => "Reorder Tone",
1115            0x99 => "Call Waiting Tone",
1116            0x9A => "Confirmation Tone 1",
1117            0x9B => "Confirmation Tone 2",
1118            0x9C => "Tones Off",
1119            0x9D => "Outside Ringback",
1120            0x9E => "Ringer",
1121            0xB0 => "Phone Key 0",
1122            0xB1 => "Phone Key 1",
1123            0xB2 => "Phone Key 2",
1124            0xB3 => "Phone Key 3",
1125            0xB4 => "Phone Key 4",
1126            0xB5 => "Phone Key 5",
1127            0xB6 => "Phone Key 6",
1128            0xB7 => "Phone Key 7",
1129            0xB8 => "Phone Key 8",
1130            0xB9 => "Phone Key 9",
1131            0xBA => "Phone Key Star",
1132            0xBB => "Phone Key Pound",
1133            0xBC => "Phone Key A",
1134            0xBD => "Phone Key B",
1135            0xBE => "Phone Key C",
1136            0xBF => "Phone Key D",
1137            0xC0 => "Phone Call History Key",
1138            0xC1 => "Phone Caller ID Key",
1139            0xC2 => "Phone Settings Key",
1140            0xF0 => "Host Control",
1141            0xF1 => "Host Available",
1142            0xF2 => "Host Call Active",
1143            0xF3 => "Activate Handset Audio",
1144            0xF4 => "Ring Type",
1145            0xF5 => "Re-dialable Phone Number",
1146            0xF8 => "Stop Ring Tone",
1147            0xF9 => "PSTN Ring Tone",
1148            0xFA => "Host Ring Tone",
1149            0xFB => "Alert Sound Error",
1150            0xFC => "Alert Sound Confirm",
1151            0xFD => "Alert Sound Notification",
1152            0xFE => "Silent Ring",
1153            0x108 => "Email Message Waiting",
1154            0x109 => "Voicemail Message Waiting",
1155            0x10A => "Host Hold",
1156            0x110 => "Incoming Call History Count",
1157            0x111 => "Outgoing Call History Count",
1158            0x112 => "Incoming Call History",
1159            0x113 => "Outgoing Call History",
1160            0x114 => "Phone Locale",
1161            0x140 => "Phone Time Second",
1162            0x141 => "Phone Time Minute",
1163            0x142 => "Phone Time Hour",
1164            0x143 => "Phone Date Day",
1165            0x144 => "Phone Date Month",
1166            0x145 => "Phone Date Year",
1167            0x146 => "Handset Nickname",
1168            0x147 => "Address Book ID",
1169            0x14A => "Call Duration",
1170            0x14B => "Dual Mode Phone",
1171            _ => "Reserved",
1172        }),
1173        // Consumer
1174        0x0C => Cow::Borrowed(match usage {
1175            0x00 => "Undefined",
1176            0x01 => "Consumer Control",
1177            0x02 => "Numeric Key Pad",
1178            0x03 => "Programmable Buttons",
1179            0x04 => "Microphone",
1180            0x05 => "Headphone",
1181            0x06 => "Graphic Equalizer",
1182            0x20 => "+10",
1183            0x21 => "+100",
1184            0x22 => "AM/PM",
1185            0x30 => "Power",
1186            0x31 => "Reset",
1187            0x32 => "Sleep",
1188            0x33 => "Sleep After",
1189            0x34 => "Sleep Mode",
1190            0x35 => "Illumination",
1191            0x36 => "Function Buttons",
1192            0x40 => "Menu",
1193            0x41 => "Menu Pick",
1194            0x42 => "Menu Up",
1195            0x43 => "Menu Down",
1196            0x44 => "Menu Left",
1197            0x45 => "Menu Right",
1198            0x46 => "Menu Escape",
1199            0x47 => "Menu Value Increase",
1200            0x48 => "Menu Value Decrease",
1201            0x60 => "Data On Screen",
1202            0x61 => "Closed Caption",
1203            0x62 => "Closed Caption Select",
1204            0x63 => "VCR/TV",
1205            0x64 => "Broadcast Mode",
1206            0x65 => "Snapshot",
1207            0x66 => "Still",
1208            0x67 => "Picture-in-Picture Toggle",
1209            0x68 => "Picture-in-Picture Swap",
1210            0x69 => "Red Menu Button",
1211            0x6A => "Green Menu Button",
1212            0x6B => "Blue Menu Button",
1213            0x6C => "Yellow Menu Button",
1214            0x6D => "Aspect",
1215            0x6E => "3D Mode Select",
1216            0x6F => "Display Brightness Increment",
1217            0x70 => "Display Brightness Decrement",
1218            0x71 => "Display Brightness",
1219            0x72 => "Display Backlight Toggle",
1220            0x73 => "Display Set Brightness to Minimum",
1221            0x74 => "Display Set Brightness to Maximum",
1222            0x75 => "Display Set Auto Brightness",
1223            0x76 => "Camera Access Enabled",
1224            0x77 => "Camera Access Disabled",
1225            0x78 => "Camera Access Toggle",
1226            0x79 => "Keyboard Brightness Increment",
1227            0x7A => "Keyboard Brightness Decrement",
1228            0x7B => "Keyboard Backlight Set Level",
1229            0x7C => "Keyboard Backlight OOC",
1230            0x7D => "Keyboard Backlight Set Minimum",
1231            0x7E => "Keyboard Backlight Set Maximum",
1232            0x7F => "Keyboard Backlight Auto",
1233            0x80 => "Selection",
1234            0x81 => "Assign Selection",
1235            0x82 => "Mode Step",
1236            0x83 => "Recall Last",
1237            0x84 => "Enter Channel",
1238            0x85 => "Order Movie",
1239            0x86 => "Channel",
1240            0x87 => "Media Selection",
1241            0x88 => "Media Select Computer",
1242            0x89 => "Media Select TV",
1243            0x8A => "Media Select WWW",
1244            0x8B => "Media Select DVD",
1245            0x8C => "Media Select Telephone",
1246            0x8D => "Media Select Program Guide",
1247            0x8E => "Media Select Video Phone",
1248            0x8F => "Media Select Games",
1249            0x90 => "Media Select Messages",
1250            0x91 => "Media Select CD",
1251            0x92 => "Media Select VCR",
1252            0x93 => "Media Select Tuner",
1253            0x94 => "Quit",
1254            0x95 => "Help",
1255            0x96 => "Media Select Tape",
1256            0x97 => "Media Select Cable",
1257            0x98 => "Media Select Satellite",
1258            0x99 => "Media Select Security",
1259            0x9A => "Media Select Home",
1260            0x9B => "Media Select Call",
1261            0x9C => "Channel Increment",
1262            0x9D => "Channel Decrement",
1263            0x9E => "Media Select SAP",
1264            0xA0 => "VCR Plus",
1265            0xA1 => "Once",
1266            0xA2 => "Daily",
1267            0xA3 => "Weekly",
1268            0xA4 => "Monthly",
1269            0xB0 => "Play",
1270            0xB1 => "Pause",
1271            0xB2 => "Record",
1272            0xB3 => "Fast Forward",
1273            0xB4 => "Rewind",
1274            0xB5 => "Scan Next Track",
1275            0xB6 => "Scan Previous Track",
1276            0xB7 => "Stop",
1277            0xB8 => "Eject",
1278            0xB9 => "Random Play",
1279            0xBA => "Select Disc",
1280            0xBB => "Enter Disc",
1281            0xBC => "Repeat",
1282            0xBD => "Tracking",
1283            0xBE => "Track Normal",
1284            0xBF => "Slow Tracking",
1285            0xC0 => "Frame Forward",
1286            0xC1 => "Frame Back",
1287            0xC2 => "Mark",
1288            0xC3 => "Clear Mark",
1289            0xC4 => "Repeat From Mark",
1290            0xC5 => "Return To Mark",
1291            0xC6 => "Search Mark Forward",
1292            0xC7 => "Search Mark Backwards",
1293            0xC8 => "Counter Reset",
1294            0xC9 => "Show Counter",
1295            0xCA => "Tracking Increment",
1296            0xCB => "Tracking Decrement",
1297            0xCC => "Stop/Eject",
1298            0xCD => "Play/Pause",
1299            0xCE => "Play/Skip",
1300            0xCF => "Voice Command",
1301            0xD0 => "Invoke Capture Interface",
1302            0xD1 => "Start or Stop Game Recording",
1303            0xD2 => "Historical Game Capture",
1304            0xD3 => "Capture Game Screenshot",
1305            0xD4 => "Show or Hide Recording Indicator",
1306            0xD5 => "Start or Stop Microphone Capture",
1307            0xD6 => "Start or Stop Camera Capture",
1308            0xD7 => "Start or Stop Game Broadcast",
1309            0xD8 => "Start or Stop Voice Dictation Session",
1310            0xD9 => "Invoke/Dismiss Emoji Picker",
1311            0xE0 => "Volume",
1312            0xE1 => "Balance",
1313            0xE2 => "Mute",
1314            0xE3 => "Bass",
1315            0xE4 => "Treble",
1316            0xE5 => "Bass Boost",
1317            0xE6 => "Surround Mode",
1318            0xE7 => "Loudness",
1319            0xE8 => "MPX",
1320            0xE9 => "Volume Increment",
1321            0xEA => "Volume Decrement",
1322            0xF0 => "Speed Select",
1323            0xF1 => "Playback Speed",
1324            0xF2 => "Standard Play",
1325            0xF3 => "Long Play",
1326            0xF4 => "Extended Play",
1327            0xF5 => "Slow",
1328            0x100 => "Fan Enable",
1329            0x101 => "Fan Speed",
1330            0x102 => "Light Enable",
1331            0x103 => "Light Illumination Level",
1332            0x104 => "Climate Control Enable",
1333            0x105 => "Room Temperature",
1334            0x106 => "Security Enable",
1335            0x107 => "Fire Alarm",
1336            0x108 => "Police Alarm",
1337            0x109 => "Proximity",
1338            0x10A => "Motion",
1339            0x10B => "Duress Alarm",
1340            0x10C => "Holdup Alarm",
1341            0x10D => "Medical Alarm",
1342            0x150 => "Balance Right",
1343            0x151 => "Balance Left",
1344            0x152 => "Bass Increment",
1345            0x153 => "Bass Decrement",
1346            0x154 => "Treble Increment",
1347            0x155 => "Treble Decrement",
1348            0x160 => "Speaker System",
1349            0x161 => "Channel Left",
1350            0x162 => "Channel Right",
1351            0x163 => "Channel Center",
1352            0x164 => "Channel Front",
1353            0x165 => "Channel Center Front",
1354            0x166 => "Channel Side",
1355            0x167 => "Channel Surround",
1356            0x168 => "Channel Low Frequency Enhancement",
1357            0x169 => "Channel Top",
1358            0x16A => "Channel Unknown",
1359            0x170 => "Sub-channel",
1360            0x171 => "Sub-channel Increment",
1361            0x172 => "Sub-channel Decrement",
1362            0x173 => "Alternate Audio Increment",
1363            0x174 => "Alternate Audio Decrement",
1364            0x180 => "Application Launch Buttons",
1365            0x181 => "AL Launch Button Configuration Tool",
1366            0x182 => "AL Programmable Button Configuration",
1367            0x183 => "AL Consumer Control Configuration",
1368            0x184 => "AL Word Processor",
1369            0x185 => "AL Text Editor",
1370            0x186 => "AL Spreadsheet",
1371            0x187 => "AL Graphics Editor",
1372            0x188 => "AL Presentation App",
1373            0x189 => "AL Database App",
1374            0x18A => "AL Email Reader",
1375            0x18B => "AL Newsreader",
1376            0x18C => "AL Voicemail",
1377            0x18D => "AL Contacts/Address Book",
1378            0x18E => "AL Calendar/Schedule",
1379            0x18F => "AL Task/Project Manager",
1380            0x190 => "AL Log/Journal/Timecard",
1381            0x191 => "AL Checkbook/Finance",
1382            0x192 => "AL Calculator",
1383            0x193 => "AL A/V Capture/Playback",
1384            0x194 => "AL Local Machine Browser",
1385            0x195 => "AL LAN/WAN Browser",
1386            0x196 => "AL Internet Browser",
1387            0x197 => "AL Remote Networking/ISP Connect",
1388            0x198 => "AL Network Conference",
1389            0x199 => "AL Network Chat",
1390            0x19A => "AL Telephony/Dialer",
1391            0x19B => "AL Logon",
1392            0x19C => "AL Logoff",
1393            0x19D => "AL Logon/Logoff",
1394            0x19E => "AL Terminal Lock/Screensaver",
1395            0x19F => "AL Control Panel",
1396            0x1A0 => "AL Command Line Processor/Run",
1397            0x1A1 => "AL Process/Task Manager",
1398            0x1A2 => "AL Select Task/Application",
1399            0x1A3 => "AL Next Task/Application",
1400            0x1A4 => "AL Previous Task/Application",
1401            0x1A5 => "AL Preemptive Halt Task/Application",
1402            0x1A6 => "AL Integrated Help Center",
1403            0x1A7 => "AL Documents",
1404            0x1A8 => "AL Thesaurus",
1405            0x1A9 => "AL Dictionary",
1406            0x1AA => "AL Desktop",
1407            0x1AB => "AL Spell Check",
1408            0x1AC => "AL Grammar Check",
1409            0x1AD => "AL Wireless Status",
1410            0x1AE => "AL Keyboard Layout",
1411            0x1AF => "AL Virus Protection",
1412            0x1B0 => "AL Encryption",
1413            0x1B1 => "AL Screen Saver",
1414            0x1B2 => "AL Alarms",
1415            0x1B3 => "AL Clock",
1416            0x1B4 => "AL File Browser",
1417            0x1B5 => "AL Power Status",
1418            0x1B6 => "AL Image Browser",
1419            0x1B7 => "AL Audio Browser",
1420            0x1B8 => "AL Movie Browser",
1421            0x1B9 => "AL Digital Rights Manager",
1422            0x1BA => "AL Digital Wallet",
1423            0x1BC => "AL Instant Messaging",
1424            0x1BD => "AL OEM Features/ Tips/Tutorial Browser",
1425            0x1BE => "AL OEM Help",
1426            0x1BF => "AL Online Community",
1427            0x1C0 => "AL Entertainment Content Browser",
1428            0x1C1 => "AL Online Shopping Browser",
1429            0x1C2 => "AL SmartCard Information/Help",
1430            0x1C3 => "AL Market Monitor/Finance Browser",
1431            0x1C4 => "AL Customized Corporate News Browser",
1432            0x1C5 => "AL Online Activity Browser",
1433            0x1C6 => "AL Research/Search Browser",
1434            0x1C7 => "AL Audio Player",
1435            0x1C8 => "AL Message Status",
1436            0x1C9 => "AL Contact Sync",
1437            0x1CA => "AL Navigation",
1438            0x1CB => "AL Context-aware Desktop Assistant",
1439            0x200 => "Generic GUI Application Controls",
1440            0x201 => "AC New",
1441            0x202 => "AC Open",
1442            0x203 => "AC Close",
1443            0x204 => "AC Exit",
1444            0x205 => "AC Maximize",
1445            0x206 => "AC Minimize",
1446            0x207 => "AC Save",
1447            0x208 => "AC Print",
1448            0x209 => "AC Properties",
1449            0x21A => "AC Undo",
1450            0x21B => "AC Copy",
1451            0x21C => "AC Cut",
1452            0x21D => "AC Paste",
1453            0x21E => "AC Select All",
1454            0x21F => "AC Find",
1455            0x220 => "AC Find and Replace",
1456            0x221 => "AC Search",
1457            0x222 => "AC Go To",
1458            0x223 => "AC Home",
1459            0x224 => "AC Back",
1460            0x225 => "AC Forward",
1461            0x226 => "AC Stop",
1462            0x227 => "AC Refresh",
1463            0x228 => "AC Previous Link",
1464            0x229 => "AC Next Link",
1465            0x22A => "AC Bookmarks",
1466            0x22B => "AC History",
1467            0x22C => "AC Subscriptions",
1468            0x22D => "AC Zoom In",
1469            0x22E => "AC Zoom Out",
1470            0x22F => "AC Zoom",
1471            0x230 => "AC Full Screen View",
1472            0x231 => "AC Normal View",
1473            0x232 => "AC View Toggle",
1474            0x233 => "AC Scroll Up",
1475            0x234 => "AC Scroll Down",
1476            0x235 => "AC Scroll",
1477            0x236 => "AC Pan Left",
1478            0x237 => "AC Pan Right",
1479            0x238 => "AC Pan",
1480            0x239 => "AC New Window",
1481            0x23A => "AC Tile Horizontally",
1482            0x23B => "AC Tile Vertically",
1483            0x23C => "AC Format",
1484            0x23D => "AC Edit",
1485            0x23E => "AC Bold",
1486            0x23F => "AC Italics",
1487            0x240 => "AC Underline",
1488            0x241 => "AC Strikethrough",
1489            0x242 => "AC Subscript",
1490            0x243 => "AC Superscript",
1491            0x244 => "AC All Caps",
1492            0x245 => "AC Rotate",
1493            0x246 => "AC Resize",
1494            0x247 => "AC Flip Horizontal",
1495            0x248 => "AC Flip Vertical",
1496            0x249 => "AC Mirror Horizontal",
1497            0x24A => "AC Mirror Vertical",
1498            0x24B => "AC Font Select",
1499            0x24C => "AC Font Color",
1500            0x24D => "AC Font Size",
1501            0x24E => "AC Justify Left",
1502            0x24F => "AC Justify Center H",
1503            0x250 => "AC Justify Right",
1504            0x251 => "AC Justify Block H",
1505            0x252 => "AC Justify Top",
1506            0x253 => "AC Justify Center V",
1507            0x254 => "AC Justify Bottom",
1508            0x255 => "AC Justify Block V",
1509            0x256 => "AC Indent Decrease",
1510            0x257 => "AC Indent Increase",
1511            0x258 => "AC Numbered List",
1512            0x259 => "AC Restart Numbering",
1513            0x25A => "AC Bulleted List",
1514            0x25B => "AC Promote",
1515            0x25C => "AC Demote",
1516            0x25D => "AC Yes",
1517            0x25E => "AC No",
1518            0x25F => "AC Cancel",
1519            0x260 => "AC Catalog",
1520            0x261 => "AC Buy/Checkout",
1521            0x262 => "AC Add to Cart",
1522            0x263 => "AC Expand",
1523            0x264 => "AC Expand All",
1524            0x265 => "AC Collapse",
1525            0x266 => "AC Collapse All",
1526            0x267 => "AC Print Preview",
1527            0x268 => "AC Paste Special",
1528            0x269 => "AC Insert Mode",
1529            0x26A => "AC Delete",
1530            0x26B => "AC Lock",
1531            0x26C => "AC Unlock",
1532            0x26D => "AC Protect",
1533            0x26E => "AC Unprotect",
1534            0x26F => "AC Attach Comment",
1535            0x270 => "AC Delete Comment",
1536            0x271 => "AC View Comment",
1537            0x272 => "AC Select Word",
1538            0x273 => "AC Select Sentence",
1539            0x274 => "AC Select Paragraph",
1540            0x275 => "AC Select Column",
1541            0x276 => "AC Select Row",
1542            0x277 => "AC Select Table",
1543            0x278 => "AC Select Object",
1544            0x279 => "AC Redo/Repeat",
1545            0x27A => "AC Sort",
1546            0x27B => "AC Sort Ascending",
1547            0x27C => "AC Sort Descending",
1548            0x27D => "AC Filter",
1549            0x27E => "AC Set Clock",
1550            0x27F => "AC View Clock",
1551            0x280 => "AC Select Time Zone",
1552            0x281 => "AC Edit Time Zones",
1553            0x282 => "AC Set Alarm",
1554            0x283 => "AC Clear Alarm",
1555            0x284 => "AC Snooze Alarm",
1556            0x285 => "AC Reset Alarm",
1557            0x286 => "AC Synchronize",
1558            0x287 => "AC Send/Receive",
1559            0x288 => "AC Send To",
1560            0x289 => "AC Reply",
1561            0x28A => "AC Reply All",
1562            0x28B => "AC Forward Msg",
1563            0x28C => "AC Send",
1564            0x28D => "AC Attach File",
1565            0x28E => "AC Upload",
1566            0x28F => "AC Download (Save Target As)",
1567            0x290 => "AC Set Borders",
1568            0x291 => "AC Insert Row",
1569            0x292 => "AC Insert Column",
1570            0x293 => "AC Insert File",
1571            0x294 => "AC Insert Picture",
1572            0x295 => "AC Insert Object",
1573            0x296 => "AC Insert Symbol",
1574            0x297 => "AC Save and Close",
1575            0x298 => "AC Rename",
1576            0x299 => "AC Merge",
1577            0x29A => "AC Split",
1578            0x29B => "AC Disribute Horizontally",
1579            0x29C => "AC Distribute Vertically",
1580            0x29D => "AC Next Keyboard Layout Select",
1581            0x29E => "AC Navigation Guidance",
1582            0x29F => "AC Desktop Show All Windows",
1583            0x2A0 => "AC Soft Key Left",
1584            0x2A1 => "AC Soft Key Right",
1585            0x2A2 => "AC Desktop Show All Applications",
1586            0x2B0 => "AC Idle Keep Alive",
1587            0x2C0 => "Extended Keyboard Attributes Collection",
1588            0x2C1 => "Keyboard Form Factor",
1589            0x2C2 => "Keyboard Key Type",
1590            0x2C3 => "Keyboard Physical Layout",
1591            0x2C4 => "Vendor-Specific Keyboard Physical Layout",
1592            0x2C5 => "Keyboard IETF Language Tag Index",
1593            0x2C6 => "Implemented Keyboard Input Assist Controls",
1594            0x2C7 => "Keyboard Input Assist Previous",
1595            0x2C8 => "Keyboard Input Assist Next",
1596            0x2C9 => "Keyboard Input Assist Previous Group",
1597            0x2CA => "Keyboard Input Assist Next Group",
1598            0x2CB => "Keyboard Input Assist Accept",
1599            0x2CC => "Keyboard Input Assist Cancel",
1600            0x2D0 => "Privacy Screen Toggle",
1601            0x2D1 => "Privacy Screen Level Decrement",
1602            0x2D2 => "Privacy Screen Level Increment",
1603            0x2D3 => "Privacy Screen Level Minimum",
1604            0x2D4 => "Privacy Screen Level Maximum",
1605            0x500 => "Contact Edited",
1606            0x501 => "Contact Added",
1607            0x502 => "Contact Record Active",
1608            0x503 => "Contact Index",
1609            0x504 => "Contact Nickname",
1610            0x505 => "Contact First Name",
1611            0x506 => "Contact Last Name",
1612            0x507 => "Contact Full Name",
1613            0x508 => "Contact Phone Number Personal",
1614            0x509 => "Contact Phone Number Business",
1615            0x50A => "Contact Phone Number Mobile",
1616            0x50B => "Contact Phone Number Pager",
1617            0x50C => "Contact Phone Number Fax",
1618            0x50D => "Contact Phone Number Other",
1619            0x50E => "Contact Email Personal",
1620            0x50F => "Contact Email Business",
1621            0x510 => "Contact Email Other",
1622            0x511 => "Contact Email Main",
1623            0x512 => "Contact Speed Dial Number",
1624            0x513 => "Contact Status Flag",
1625            0x514 => "Contact Misc",
1626            _ => "Reserved",
1627        }),
1628        // Digitizers
1629        0x0D => Cow::Borrowed(match usage {
1630            0x00 => "Undefined",
1631            0x01 => "Digitizer",
1632            0x02 => "Pen",
1633            0x03 => "Light Pen",
1634            0x04 => "Touch Screen",
1635            0x05 => "Touch Pad",
1636            0x06 => "Whiteboard",
1637            0x07 => "Coordinate Measuring Machine",
1638            0x08 => "3D Digitizer",
1639            0x09 => "Stereo Plotter",
1640            0x0A => "Articulated Arm",
1641            0x0B => "Armature",
1642            0x0C => "Multiple Point Digitizer",
1643            0x0D => "Free Space Wand",
1644            0x0E => "Device Configuration",
1645            0x0F => "Capacitive Heat Map Digitizer",
1646            0x20 => "Stylus [55] CA/CL 16.2",
1647            0x21 => "Puck",
1648            0x22 => "Finger",
1649            0x23 => "Device settings",
1650            0x24 => "Character Gesture",
1651            0x30 => "Tip Pressure",
1652            0x31 => "Barrel Pressure",
1653            0x32 => "In Range",
1654            0x33 => "Touch",
1655            0x34 => "Untouch",
1656            0x35 => "Tap",
1657            0x36 => "Quality",
1658            0x37 => "Data Valid",
1659            0x38 => "Transducer Index",
1660            0x39 => "Tablet Function Keys",
1661            0x3A => "Program Change Keys",
1662            0x3B => "Battery Strength",
1663            0x3C => "Invert",
1664            0x3D => "X Tilt",
1665            0x3E => "Y Tilt",
1666            0x3F => "Azimuth",
1667            0x40 => "Altitude",
1668            0x41 => "Twist",
1669            0x42 => "Tip Switch",
1670            0x43 => "Secondary Tip Switch",
1671            0x44 => "Barrel Switch",
1672            0x45 => "Eraser",
1673            0x46 => "Tablet Pick",
1674            0x47 => "Touch Valid",
1675            0x48 => "Width",
1676            0x49 => "Height",
1677            0x51 => "Contact Identifier",
1678            0x52 => "Device Mode",
1679            0x53 => "Device Identifier [7] DV/SV 16.7",
1680            0x54 => "Contact Count",
1681            0x55 => "Contact Count Maximum",
1682            0x56 => "Scan Time",
1683            0x57 => "Surface Switch",
1684            0x58 => "Button Switch",
1685            0x59 => "Pad Type",
1686            0x5A => "Secondary Barrel Switch",
1687            0x5B => "Transducer Serial Number",
1688            0x5C => "Preferred Color",
1689            0x5D => "Preferred Color is Locked",
1690            0x5E => "Preferred Line Width",
1691            0x5F => "Preferred Line Width is Locked",
1692            0x60 => "Latency Mode",
1693            0x61 => "Gesture Character Quality",
1694            0x62 => "Character Gesture Data Length",
1695            0x63 => "Character Gesture Data",
1696            0x64 => "Gesture Character Encoding",
1697            0x65 => "UTF8 Character Gesture Encoding",
1698            0x66 => "UTF16 Little Endian Character Gesture Encoding",
1699            0x67 => "UTF16 Big Endian Character Gesture Encoding",
1700            0x68 => "UTF32 Little Endian Character Gesture Encoding",
1701            0x69 => "UTF32 Big Endian Character Gesture Encoding",
1702            0x6A => "Capacitive Heat Map Protocol Vendor ID",
1703            0x6B => "Capacitive Heat Map Protocol Version",
1704            0x6C => "Capacitive Heat Map Frame Data",
1705            0x6D => "Gesture Character Enable",
1706            0x6E => "Transducer Serial Number Part 2",
1707            0x6F => "No Preferred Color",
1708            0x70 => "Preferred Line Style",
1709            0x71 => "Preferred Line Style is Locked",
1710            0x72 => "Ink",
1711            0x73 => "Pencil",
1712            0x74 => "Highlighter",
1713            0x75 => "Chisel Marker",
1714            0x76 => "Brush",
1715            0x77 => "No Preference",
1716            0x80 => "Digitizer Diagnostic",
1717            0x81 => "Digitizer Error",
1718            0x82 => "Err Normal Status",
1719            0x83 => "Err Transducers Exceeded",
1720            0x84 => "Err Full Trans Features Unavailable",
1721            0x85 => "Err Charge Low",
1722            0x90 => "Transducer Software Info",
1723            0x91 => "Transducer Vendor Id",
1724            0x92 => "Transducer Product Id",
1725            0x93 => "Device Supported Protocols [36] NAry/CL 16.3.1",
1726            0x94 => "Transducer Supported Protocols [36] NAry/CL 16.3.1",
1727            0x95 => "No Protocol",
1728            0x96 => "Wacom AES Protocol",
1729            0x97 => "USI Protocol",
1730            0x98 => "Microsoft Pen Protocol",
1731            0xA0 => "Supported Report Rates [36] SV/CL 16.3.1",
1732            0xA1 => "Report Rate",
1733            0xA2 => "Transducer Connected",
1734            0xA3 => "Switch Disabled",
1735            0xA4 => "Switch Unimplemented",
1736            0xA5 => "Transducer Switches",
1737            0xA6 => "Transducer Index Selector",
1738            0xB0 => "Button Press Threshold",
1739            _ => "Reserved",
1740        }),
1741        // Haptics
1742        0x0E => Cow::Borrowed(match usage {
1743            0x00 => "Undefined",
1744            0x01 => "Simple Haptic Controller CA/CL 17.1",
1745            0x10 => "Waveform List",
1746            0x11 => "Duration List",
1747            0x20 => "Auto Trigger",
1748            0x21 => "Manual Trigger",
1749            0x22 => "Auto Trigger Associated Control",
1750            0x23 => "Intensity",
1751            0x24 => "Repeat Count",
1752            0x25 => "Retrigger Period",
1753            0x26 => "Waveform Vendor Page",
1754            0x27 => "Waveform Vendor ID",
1755            0x28 => "Waveform Cutoff Time",
1756            0x1001 => "Waveform None",
1757            0x1002 => "Waveform Stop",
1758            0x1003 => "Waveform Click",
1759            0x1004 => "Waveform Buzz Continuous",
1760            0x1005 => "Waveform Rumble Continuous",
1761            0x1006 => "Waveform Press",
1762            0x1007 => "Waveform Release",
1763            0x1008 => "Waveform Hover",
1764            0x1009 => "Waveform Success",
1765            0x100A => "Waveform Error",
1766            0x100B => "Waveform Ink Continuous",
1767            0x100C => "Waveform Pencil Continuous",
1768            0x100D => "Waveform Marker Continuous",
1769            0x100E => "Waveform Chisel Marker Continuous",
1770            0x100F => "Waveform Brush Continuous",
1771            0x1010 => "Waveform Eraser Continuous",
1772            0x1011 => "Waveform Sparkle Continuous",
1773            _ => "Reserved",
1774        }),
1775        // Physical Input Device
1776        0x0F => Cow::Borrowed(match usage {
1777            0x00 => "Undefined",
1778            0x01 => "Physical Input Device",
1779            0x20 => "Normal",
1780            0x21 => "Set Effect Report",
1781            0x22 => "Effect Parameter Block Index",
1782            0x23 => "Parameter Block Offset",
1783            0x24 => "ROM Flag",
1784            0x25 => "Effect Type",
1785            0x26 => "ET Constant-Force",
1786            0x27 => "ET Ramp",
1787            0x28 => "ET Custom-Force",
1788            0x30 => "ET Square",
1789            0x31 => "ET Sine",
1790            0x32 => "ET Triangle",
1791            0x33 => "ET Sawtooth Up",
1792            0x34 => "ET Sawtooth Down",
1793            0x40 => "ET Spring",
1794            0x41 => "ET Damper",
1795            0x42 => "ET Inertia",
1796            0x43 => "ET Friction",
1797            0x50 => "Duration",
1798            0x51 => "Sample Period",
1799            0x52 => "Gain",
1800            0x53 => "Trigger Button",
1801            0x54 => "Trigger Repeat Interval",
1802            0x55 => "Axes Enable",
1803            0x56 => "Direction Enable",
1804            0x57 => "Direction",
1805            0x58 => "Type Specific Block Offset",
1806            0x59 => "Block Type",
1807            0x5A => "Set Envelope Report CL/SV 18.5",
1808            0x5B => "Attack Level",
1809            0x5C => "Attack Time",
1810            0x5D => "Fade Level",
1811            0x5E => "Fade Time",
1812            0x5F => "Set Condition Report CL/SV 18.6",
1813            0x60 => "Center-Point Offset",
1814            0x61 => "Positive Coefficient",
1815            0x62 => "Negative Coefficient",
1816            0x63 => "Positive Saturation",
1817            0x64 => "Negative Saturation",
1818            0x65 => "Dead Band",
1819            0x66 => "Download Force Sample",
1820            0x67 => "Isoch Custom-Force Enable",
1821            0x68 => "Custom-Force Data Report",
1822            0x69 => "Custom-Force Data",
1823            0x6A => "Custom-Force Vendor Defined Data",
1824            0x6B => "Set Custom-Force Report CL/SV 18.10",
1825            0x6C => "Custom-Force Data Offset",
1826            0x6D => "Sample Count",
1827            0x6E => "Set Periodic Report CL/SV 18.7",
1828            0x6F => "Offset",
1829            0x70 => "Magnitude",
1830            0x71 => "Phase",
1831            0x72 => "Period",
1832            0x73 => "Set Constant-Force Report CL/SV 18.8",
1833            0x74 => "Set Ramp-Force Report CL/SV 18.9",
1834            0x75 => "Ramp Start",
1835            0x76 => "Ramp End",
1836            0x77 => "Effect Operation Report",
1837            0x78 => "Effect Operation",
1838            0x79 => "Op Effect Start",
1839            0x7A => "Op Effect Start Solo",
1840            0x7B => "Op Effect Stop",
1841            0x7C => "Loop Count",
1842            0x7D => "Device Gain Report",
1843            0x7E => "Device Gain",
1844            0x7F => "Parameter Block Pools Report",
1845            0x80 => "RAM Pool Size",
1846            0x81 => "ROM Pool Size",
1847            0x82 => "ROM Effect Block Count",
1848            0x83 => "Simultaneous Effects Max",
1849            0x84 => "Pool Alignment",
1850            0x85 => "Parameter Block Move Report",
1851            0x86 => "Move Source",
1852            0x87 => "Move Destination",
1853            0x88 => "Move Length",
1854            0x89 => "Effect Parameter Block Load Report",
1855            0x8B => "Effect Parameter Block Load Status",
1856            0x8C => "Block Load Success",
1857            0x8D => "Block Load Full",
1858            0x8E => "Block Load Error",
1859            0x8F => "Block Handle",
1860            0x90 => "Effect Parameter Block Free Report",
1861            0x91 => "Type Specific Block Handle",
1862            0x92 => "PID State Report",
1863            0x94 => "Effect Playing",
1864            0x95 => "PID Device Control Report",
1865            0x96 => "PID Device Control",
1866            0x97 => "DC Enable Actuators",
1867            0x98 => "DC Disable Actuators",
1868            0x99 => "DC Stop All Effects",
1869            0x9A => "DC Reset",
1870            0x9B => "DC Pause",
1871            0x9C => "DC Continue",
1872            0x9F => "Device Paused",
1873            0xA0 => "Actuators Enabled",
1874            0xA4 => "Safety Switch",
1875            0xA5 => "Actuator Override Switch",
1876            0xA6 => "Actuator Power",
1877            0xA7 => "Start Delay",
1878            0xA8 => "Parameter Block Size",
1879            0xA9 => "Device-Managed Pool",
1880            0xAA => "Shared Parameter Blocks",
1881            0xAB => "Create New Effect Parameter Block Report",
1882            0xAC => "RAM Pool Available",
1883            _ => "Reserved",
1884        }),
1885        // Unicode
1886        0x10 => Cow::Owned(format!(
1887            "\"{}\"",
1888            char::from_u32(usage).unwrap_or('\u{FFFD}')
1889        )),
1890        // SoC
1891        0x11 => Cow::Borrowed(match usage {
1892            0x00 => "Undefined",
1893            0x01 => "SocControl",
1894            0x02 => "FirmwareTransfer",
1895            0x03 => "FirmwareFileId",
1896            0x04 => "FileOffsetInBytes",
1897            0x05 => "FileTransferSizeMaxInBytes",
1898            0x06 => "FilePayload",
1899            0x07 => "FilePayloadSizeInBytes",
1900            0x08 => "FilePayloadContainsLastBytes",
1901            0x09 => "FileTransferStop",
1902            0x0A => "FileTransferTillEnd",
1903            _ => "Reserved",
1904        }),
1905        // Eye and Head Trackers
1906        0x12 => Cow::Borrowed(match usage {
1907            0x00 => "Undefined",
1908            0x01 => "Eye Tracker",
1909            0x02 => "Head Tracker",
1910            0x10 => "Tracking Data",
1911            0x11 => "Capabilities",
1912            0x12 => "Configuration",
1913            0x13 => "Status",
1914            0x14 => "Control",
1915            0x20 => "Sensor Timestamp",
1916            0x21 => "Position X",
1917            0x22 => "Position Y",
1918            0x23 => "Position Z",
1919            0x24 => "Gaze Point",
1920            0x25 => "Left Eye Position",
1921            0x26 => "Right Eye Position",
1922            0x27 => "Head Position",
1923            0x28 => "Head Direction Point",
1924            0x29 => "Rotation about X axis",
1925            0x2A => "Rotation about Y axis",
1926            0x2B => "Rotation about Z axis",
1927            0x100 => "Tracker Quality",
1928            0x101 => "Minimum Tracking Distance",
1929            0x102 => "Optimum Tracking Distance",
1930            0x103 => "Maximum Tracking Distance",
1931            0x104 => "Maximum Screen Plane Width",
1932            0x105 => "Maximum Screen Plane Height",
1933            0x200 => "Display Manufacturer ID",
1934            0x201 => "Display Product ID",
1935            0x202 => "Display Serial Number",
1936            0x203 => "Display Manufacturer Date",
1937            0x204 => "Calibrated Screen Width",
1938            0x205 => "Calibrated Screen Height",
1939            0x300 => "Sampling Frequency",
1940            0x301 => "Configuration Status",
1941            0x400 => "Device Mode Request",
1942            _ => "Reserved",
1943        }),
1944        // Auxiliary Display
1945        0x14 => Cow::Borrowed(match usage {
1946            0x00 => "Undefined",
1947            0x01 => "Alphanumeric Display",
1948            0x02 => "Auxiliary Display",
1949            0x20 => "Display Attributes Report",
1950            0x21 => "ASCII Character Set",
1951            0x22 => "Data Read Back",
1952            0x23 => "Font Read Back",
1953            0x24 => "Display Control Report",
1954            0x25 => "Clear Display",
1955            0x26 => "Display Enable",
1956            0x27 => "Screen Saver Delay",
1957            0x28 => "Screen Saver Enable",
1958            0x29 => "Vertical Scroll",
1959            0x2A => "Horizontal Scroll",
1960            0x2B => "Character Report",
1961            0x2C => "Display Data",
1962            0x2D => "Display Status",
1963            0x2E => "Stat Not Ready",
1964            0x2F => "Stat Ready",
1965            0x30 => "Err Not a loadable character",
1966            0x31 => "Err Font data cannot be read",
1967            0x32 => "Cursor Position Report",
1968            0x33 => "Row",
1969            0x34 => "Column",
1970            0x35 => "Rows",
1971            0x36 => "Columns",
1972            0x37 => "Cursor Pixel Positioning",
1973            0x38 => "Cursor Mode",
1974            0x39 => "Cursor Enable",
1975            0x3A => "Cursor Blink",
1976            0x3B => "Font Report",
1977            0x3C => "Font Data",
1978            0x3D => "Character Width",
1979            0x3E => "Character Height",
1980            0x3F => "Character Spacing Horizontal",
1981            0x40 => "Character Spacing Vertical",
1982            0x41 => "Unicode Character Set",
1983            0x42 => "Font 7-Segment",
1984            0x43 => "7-Segment Direct Map",
1985            0x44 => "Font 14-Segment",
1986            0x45 => "14-Segment Direct Map",
1987            0x46 => "Display Brightness",
1988            0x47 => "Display Contrast",
1989            0x48 => "Character Attribute",
1990            0x49 => "Attribute Readback",
1991            0x4A => "Attribute Data",
1992            0x4B => "Char Attr Enhance",
1993            0x4C => "Char Attr Underline",
1994            0x4D => "Char Attr Blink",
1995            0x80 => "Bitmap Size X",
1996            0x81 => "Bitmap Size Y",
1997            0x82 => "Max Blit Size",
1998            0x83 => "Bit Depth Format",
1999            0x84 => "Display Orientation",
2000            0x85 => "Palette Report",
2001            0x86 => "Palette Data Size",
2002            0x87 => "Palette Data Offset",
2003            0x88 => "Palette Data",
2004            0x8A => "Blit Report",
2005            0x8B => "Blit Rectangle X1",
2006            0x8C => "Blit Rectangle Y1",
2007            0x8D => "Blit Rectangle X2",
2008            0x8E => "Blit Rectangle Y2",
2009            0x8F => "Blit Data",
2010            0x90 => "Soft Button",
2011            0x91 => "Soft Button ID",
2012            0x92 => "Soft Button Side",
2013            0x93 => "Soft Button Offset 1",
2014            0x94 => "Soft Button Offset 2",
2015            0x95 => "Soft Button Report",
2016            0xC2 => "Soft Keys",
2017            0xCC => "Display Data Extensions",
2018            0xCF => "Character Mapping",
2019            0xDD => "Unicode Equivalent",
2020            0xDF => "Character Page Mapping",
2021            0xFF => "Request Report",
2022            _ => "Reserved",
2023        }),
2024        // Sensors
2025        0x20 => Cow::Borrowed(match usage {
2026            0x00 => "Undefined",
2027            0x01 => "Sensor",
2028            0x10 => "Biometric",
2029            0x11 => "Biometric: Human Presence",
2030            0x12 => "Biometric: Human Proximity",
2031            0x13 => "Biometric: Human Touch",
2032            0x14 => "Biometric: Blood Pressure",
2033            0x15 => "Biometric: Body Temperature",
2034            0x16 => "Biometric: Heart Rate",
2035            0x17 => "Biometric: Heart Rate Variability",
2036            0x18 => "Biometric: Peripheral Oxygen Saturation",
2037            0x19 => "Biometric: Respiratory Rate",
2038            0x20 => "Electrical",
2039            0x21 => "Electrical: Capacitance",
2040            0x22 => "Electrical: Current",
2041            0x23 => "Electrical: Power",
2042            0x24 => "Electrical: Inductance",
2043            0x25 => "Electrical: Resistance",
2044            0x26 => "Electrical: Voltage",
2045            0x27 => "Electrical: Potentiometer",
2046            0x28 => "Electrical: Frequency",
2047            0x29 => "Electrical: Period",
2048            0x30 => "Environmental",
2049            0x31 => "Environmental: Atmospheric Pressure",
2050            0x32 => "Environmental: Humidity",
2051            0x33 => "Environmental: Temperature",
2052            0x34 => "Environmental: Wind Direction",
2053            0x35 => "Environmental: Wind Speed",
2054            0x36 => "Environmental: Air Quality",
2055            0x37 => "Environmental: Heat Index",
2056            0x38 => "Environmental: Surface Temperature",
2057            0x39 => "Environmental: Volatile Organic Compounds",
2058            0x3A => "Environmental: Object Presence",
2059            0x3B => "Environmental: Object Proximity",
2060            0x40 => "Light",
2061            0x41 => "Light: Ambient Light",
2062            0x42 => "Light: Consumer Infrared",
2063            0x43 => "Light: Infrared Light",
2064            0x44 => "Light: Visible Light",
2065            0x45 => "Light: Ultraviolet Light",
2066            0x50 => "Location",
2067            0x51 => "Location: Broadcast",
2068            0x52 => "Location: Dead Reckoning",
2069            0x53 => "Location: GPS (Global Positioning System)",
2070            0x54 => "Location: Lookup",
2071            0x55 => "Location: Other",
2072            0x56 => "Location: Static",
2073            0x57 => "Location: Triangulation",
2074            0x60 => "Mechanical",
2075            0x61 => "Mechanical: Boolean Switch",
2076            0x62 => "Mechanical: Boolean Switch Array",
2077            0x63 => "Mechanical: Multivalue Switch",
2078            0x64 => "Mechanical: Force",
2079            0x65 => "Mechanical: Pressure",
2080            0x66 => "Mechanical: Strain",
2081            0x67 => "Mechanical: Weight",
2082            0x68 => "Mechanical: Haptic Vibrator",
2083            0x69 => "Mechanical: Hall Effect Switch",
2084            0x70 => "Motion",
2085            0x71 => "Motion: Accelerometer 1D",
2086            0x72 => "Motion: Accelerometer 2D",
2087            0x73 => "Motion: Accelerometer 3D",
2088            0x74 => "Motion: Gyrometer 1D",
2089            0x75 => "Motion: Gyrometer 2D",
2090            0x76 => "Motion: Gyrometer 3D",
2091            0x77 => "Motion: Motion Detector",
2092            0x78 => "Motion: Speedometer",
2093            0x79 => "Motion: Accelerometer",
2094            0x7A => "Motion: Gyrometer",
2095            0x7B => "Motion: Gravity Vector",
2096            0x7C => "Motion: Linear Accelerometer",
2097            0x80 => "Orientation",
2098            0x81 => "Orientation: Compass 1D",
2099            0x82 => "Orientation: Compass 2D",
2100            0x83 => "Orientation: Compass 3D",
2101            0x84 => "Orientation: Inclinometer 1D",
2102            0x85 => "Orientation: Inclinometer 2D",
2103            0x86 => "Orientation: Inclinometer 3D",
2104            0x87 => "Orientation: Distance 1D",
2105            0x88 => "Orientation: Distance 2D",
2106            0x89 => "Orientation: Distance 3D",
2107            0x8A => "Orientation: Device Orientation",
2108            0x8B => "Orientation: Compass",
2109            0x8C => "Orientation: Inclinometer",
2110            0x8D => "Orientation: Distance",
2111            0x8E => "Orientation: Relative Orientation",
2112            0x8F => "Orientation: Simple Orientation",
2113            0x90 => "Scanner",
2114            0x91 => "Scanner: Barcode",
2115            0x92 => "Scanner: RFID",
2116            0x93 => "Scanner: NFC",
2117            0xA0 => "Time",
2118            0xA1 => "Time: Alarm Timer",
2119            0xA2 => "Time: Real Time Clock",
2120            0xB0 => "Personal Activity",
2121            0xB1 => "Personal Activity: Activity Detection",
2122            0xB2 => "Personal Activity: Device Position",
2123            0xB3 => "Personal Activity: Floor Tracker",
2124            0xB4 => "Personal Activity: Pedometer",
2125            0xB5 => "Personal Activity: Step Detection",
2126            0xC0 => "Orientation Extended",
2127            0xC1 => "Orientation Extended: Geomagnetic Orientation",
2128            0xC2 => "Orientation Extended: Magnetometer",
2129            0xD0 => "Gesture",
2130            0xD1 => "Gesture: Chassis Flip Gesture",
2131            0xD2 => "Gesture: Hinge Fold Gesture",
2132            0xE0 => "Other",
2133            0xE1 => "Other: Custom",
2134            0xE2 => "Other: Generic",
2135            0xE3 => "Other: Generic Enumerator",
2136            0xE4 => "Other: Hinge Angle",
2137            0xF0 => "Vendor Reserved 1",
2138            0xF1 => "Vendor Reserved 2",
2139            0xF2 => "Vendor Reserved 3",
2140            0xF3 => "Vendor Reserved 4",
2141            0xF4 => "Vendor Reserved 5",
2142            0xF5 => "Vendor Reserved 6",
2143            0xF6 => "Vendor Reserved 7",
2144            0xF7 => "Vendor Reserved 8",
2145            0xF8 => "Vendor Reserved 9",
2146            0xF9 => "Vendor Reserved 10",
2147            0xFA => "Vendor Reserved 11",
2148            0xFB => "Vendor Reserved 12",
2149            0xFC => "Vendor Reserved 13",
2150            0xFD => "Vendor Reserved 14",
2151            0xFE => "Vendor Reserved 15",
2152            0xFF => "Vendor Reserved 16",
2153            0x200 => "Event",
2154            0x201 => "Event: Sensor State",
2155            0x202 => "Event: Sensor Event",
2156            0x300 => "Property",
2157            0x301 => "Property: Friendly Name",
2158            0x302 => "Property: Persistent Unique ID",
2159            0x303 => "Property: Sensor Status",
2160            0x304 => "Property: Minimum Report Interval",
2161            0x305 => "Property: Sensor Manufacturer",
2162            0x306 => "Property: Sensor Model",
2163            0x307 => "Property: Sensor Serial Number",
2164            0x308 => "Property: Sensor Description",
2165            0x309 => "Property: Sensor Connection Type",
2166            0x30A => "Property: Sensor Device Path",
2167            0x30B => "Property: Hardware Revision",
2168            0x30C => "Property: Firmware Version",
2169            0x30D => "Property: Release Date",
2170            0x30E => "Property: Report Interval",
2171            0x30F => "Property: Change Sensitivity Absolute",
2172            0x310 => "Property: Change Sensitivity Percent of Range",
2173            0x311 => "Property: Change Sensitivity Percent Relative",
2174            0x312 => "Property: Accuracy",
2175            0x313 => "Property: Resolution",
2176            0x314 => "Property: Maximum",
2177            0x315 => "Property: Minimum",
2178            0x316 => "Property: Reporting State",
2179            0x317 => "Property: Sampling Rate",
2180            0x318 => "Property: Response Curve",
2181            0x319 => "Property: Power State",
2182            0x31A => "Property: Maximum FIFO Events",
2183            0x31B => "Property: Report Latency",
2184            0x31C => "Property: Flush FIFO Events",
2185            0x31D => "Property: Maximum Power Consumption",
2186            0x31E => "Property: Is Primary",
2187            0x31F => "Property: Human Presence Detection Type",
2188            0x400 => "Data Field: Location",
2189            0x402 => "Data Field: Altitude Antenna Sea Level",
2190            0x403 => "Data Field: Differential Reference Station ID",
2191            0x404 => "Data Field: Altitude Ellipsoid Error",
2192            0x405 => "Data Field: Altitude Ellipsoid",
2193            0x406 => "Data Field: Altitude Sea Level Error",
2194            0x407 => "Data Field: Altitude Sea Level",
2195            0x408 => "Data Field: Differential GPS Data Age",
2196            0x409 => "Data Field: Error Radius",
2197            0x40A => "Data Field: Fix Quality",
2198            0x40B => "Data Field: Fix Type",
2199            0x40C => "Data Field: Geoidal Separation",
2200            0x40D => "Data Field: GPS Operation Mode",
2201            0x40E => "Data Field: GPS Selection Mode",
2202            0x40F => "Data Field: GPS Status",
2203            0x410 => "Data Field: Position Dilution of Precision",
2204            0x411 => "Data Field: Horizontal Dilution of Precision",
2205            0x412 => "Data Field: Vertical Dilution of Precision",
2206            0x413 => "Data Field: Latitude",
2207            0x414 => "Data Field: Longitude",
2208            0x415 => "Data Field: True Heading",
2209            0x416 => "Data Field: Magnetic Heading",
2210            0x417 => "Data Field: Magnetic Variation",
2211            0x418 => "Data Field: Speed",
2212            0x419 => "Data Field: Satellites in View",
2213            0x41A => "Data Field: Satellites in View Azimuth",
2214            0x41B => "Data Field: Satellites in View Elevation",
2215            0x41C => "Data Field: Satellites in View IDs",
2216            0x41D => "Data Field: Satellites in View PRNs",
2217            0x41E => "Data Field: Satellites in View S/N Ratios",
2218            0x41F => "Data Field: Satellites Used Count",
2219            0x420 => "Data Field: Satellites Used PRNs",
2220            0x421 => "Data Field: NMEA Sentence",
2221            0x422 => "Data Field: Address Line 1",
2222            0x423 => "Data Field: Address Line 2",
2223            0x424 => "Data Field: City",
2224            0x425 => "Data Field: State or Province",
2225            0x426 => "Data Field: Country or Region",
2226            0x427 => "Data Field: Postal Code",
2227            0x42A => "Property: Location",
2228            0x42B => "Property: Location Desired Accuracy",
2229            0x430 => "Data Field: Environmental",
2230            0x431 => "Data Field: Atmospheric Pressure",
2231            0x433 => "Data Field: Relative Humidity",
2232            0x434 => "Data Field: Temperature",
2233            0x435 => "Data Field: Wind Direction",
2234            0x436 => "Data Field: Wind Speed",
2235            0x437 => "Data Field: Air Quality Index",
2236            0x438 => "Data Field: Equivalent CO2",
2237            0x439 => "Data Field: Volatile Organic Compound Concentration",
2238            0x43A => "Data Field: Object Presence",
2239            0x43B => "Data Field: Object Proximity Range",
2240            0x43C => "Data Field: Object Proximity Out of Range",
2241            0x440 => "Property: Environmental",
2242            0x441 => "Property: Reference Pressure",
2243            0x450 => "Data Field: Motion",
2244            0x451 => "Data Field: Motion State",
2245            0x452 => "Data Field: Acceleration",
2246            0x453 => "Data Field: Acceleration Axis X",
2247            0x454 => "Data Field: Acceleration Axis Y",
2248            0x455 => "Data Field: Acceleration Axis Z",
2249            0x456 => "Data Field: Angular Velocity",
2250            0x457 => "Data Field: Angular Velocity about X Axis",
2251            0x458 => "Data Field: Angular Velocity about Y Axis",
2252            0x459 => "Data Field: Angular Velocity about Z Axis",
2253            0x45A => "Data Field: Angular Position",
2254            0x45B => "Data Field: Angular Position about X Axis",
2255            0x45C => "Data Field: Angular Position about Y Axis",
2256            0x45D => "Data Field: Angular Position about Z Axis",
2257            0x45E => "Data Field: Motion Speed",
2258            0x45F => "Data Field: Motion Intensity",
2259            0x470 => "Data Field: Orientation",
2260            0x471 => "Data Field: Heading",
2261            0x472 => "Data Field: Heading X Axis",
2262            0x473 => "Data Field: Heading Y Axis",
2263            0x474 => "Data Field: Heading Z Axis",
2264            0x475 => "Data Field: Heading Compensated Magnetic North",
2265            0x476 => "Data Field: Heading Compensated True North",
2266            0x477 => "Data Field: Heading Magnetic North",
2267            0x478 => "Data Field: Heading True North",
2268            0x479 => "Data Field: Distance",
2269            0x47A => "Data Field: Distance X Axis",
2270            0x47B => "Data Field: Distance Y Axis",
2271            0x47C => "Data Field: Distance Z Axis",
2272            0x47D => "Data Field: Distance Out-of-Range",
2273            0x47E => "Data Field: Tilt",
2274            0x47F => "Data Field: Tilt X Axis",
2275            0x480 => "Data Field: Tilt Y Axis",
2276            0x481 => "Data Field: Tilt Z Axis",
2277            0x482 => "Data Field: Rotation Matrix",
2278            0x483 => "Data Field: Quaternion",
2279            0x484 => "Data Field: Magnetic Flux",
2280            0x485 => "Data Field: Magnetic Flux X Axis",
2281            0x486 => "Data Field: Magnetic Flux Y Axis",
2282            0x487 => "Data Field: Magnetic Flux Z Axis",
2283            0x488 => "Data Field: Magnetometer Accuracy",
2284            0x489 => "Data Field: Simple Orientation Direction",
2285            0x490 => "Data Field: Mechanical",
2286            0x491 => "Data Field: Boolean Switch State",
2287            0x492 => "Data Field: Boolean Switch Array States",
2288            0x493 => "Data Field: Multivalue Switch Value",
2289            0x494 => "Data Field: Force",
2290            0x495 => "Data Field: Absolute Pressure",
2291            0x496 => "Data Field: Gauge Pressure",
2292            0x497 => "Data Field: Strain",
2293            0x498 => "Data Field: Weight",
2294            0x4A0 => "Property: Mechanical",
2295            0x4A1 => "Property: Vibration State",
2296            0x4A2 => "Property: Forward Vibration Speed",
2297            0x4A3 => "Property: Backward Vibration Speed",
2298            0x4B0 => "Data Field: Biometric",
2299            0x4B1 => "Data Field: Human Presence",
2300            0x4B2 => "Data Field: Human Proximity Range",
2301            0x4B3 => "Data Field: Human Proximity Out of Range",
2302            0x4B4 => "Data Field: Human Touch State",
2303            0x4B5 => "Data Field: Blood Pressure",
2304            0x4B6 => "Data Field: Blood Pressure Diastolic",
2305            0x4B7 => "Data Field: Blood Pressure Systolic",
2306            0x4B8 => "Data Field: Heart Rate",
2307            0x4B9 => "Data Field: Resting Heart Rate",
2308            0x4BA => "Data Field: Heartbeat Interval",
2309            0x4BB => "Data Field: Respiratory Rate",
2310            0x4BC => "Data Field: SpO2",
2311            0x4BD => "Data Field: Human Attention Detected",
2312            0x4BE => "Data Field: Human Head Azimuth",
2313            0x4BF => "Data Field: Human Head Altitude",
2314            0x4C0 => "Data Field: Human Head Roll",
2315            0x4C1 => "Data Field: Human Head Pitch",
2316            0x4C2 => "Data Field: Human Head Yaw",
2317            0x4C3 => "Data Field: Human Correlation Id",
2318            0x4D0 => "Data Field: Light",
2319            0x4D1 => "Data Field: Illuminance",
2320            0x4D2 => "Data Field: Color Temperature",
2321            0x4D3 => "Data Field: Chromaticity",
2322            0x4D4 => "Data Field: Chromaticity X",
2323            0x4D5 => "Data Field: Chromaticity Y",
2324            0x4D6 => "Data Field: Consumer IR Sentence Receive",
2325            0x4D7 => "Data Field: Infrared Light",
2326            0x4D8 => "Data Field: Red Light",
2327            0x4D9 => "Data Field: Green Light",
2328            0x4DA => "Data Field: Blue Light",
2329            0x4DB => "Data Field: Ultraviolet A Light",
2330            0x4DC => "Data Field: Ultraviolet B Light",
2331            0x4DD => "Data Field: Ultraviolet Index",
2332            0x4DE => "Data Field: Near Infrared Light",
2333            0x4DF => "Property: Light",
2334            0x4E0 => "Property: Consumer IR Sentence Send",
2335            0x4E2 => "Property: Auto Brightness Preferred",
2336            0x4E3 => "Property: Auto Color Preferred",
2337            0x4F0 => "Data Field: Scanner",
2338            0x4F1 => "Data Field: RFID Tag 40 Bit",
2339            0x4F2 => "Data Field: NFC Sentence Receive",
2340            0x4F8 => "Property: Scanner",
2341            0x4F9 => "Property: NFC Sentence Send",
2342            0x500 => "Data Field: Electrical",
2343            0x501 => "Data Field: Capacitance",
2344            0x502 => "Data Field: Current",
2345            0x503 => "Data Field: Electrical Power",
2346            0x504 => "Data Field: Inductance",
2347            0x505 => "Data Field: Resistance",
2348            0x506 => "Data Field: Voltage",
2349            0x507 => "Data Field: Frequency",
2350            0x508 => "Data Field: Period",
2351            0x509 => "Data Field: Percent of Range",
2352            0x520 => "Data Field: Time",
2353            0x521 => "Data Field: Year",
2354            0x522 => "Data Field: Month",
2355            0x523 => "Data Field: Day",
2356            0x524 => "Data Field: Day of Week",
2357            0x525 => "Data Field: Hour",
2358            0x526 => "Data Field: Minute",
2359            0x527 => "Data Field: Second",
2360            0x528 => "Data Field: Millisecond",
2361            0x529 => "Data Field: Timestamp",
2362            0x52A => "Data Field: Julian Day of Year",
2363            0x52B => "Data Field: Time Since System Boot",
2364            0x530 => "Property: Time",
2365            0x531 => "Property: Time Zone Offset from UTC",
2366            0x532 => "Property: Time Zone Name",
2367            0x533 => "Property: Daylight Savings Time Observed",
2368            0x534 => "Property: Time Trim Adjustment",
2369            0x535 => "Property: Arm Alarm",
2370            0x540 => "Data Field: Custom",
2371            0x541 => "Data Field: Custom Usage",
2372            0x542 => "Data Field: Custom Boolean Array",
2373            0x543 => "Data Field: Custom Value",
2374            0x544 => "Data Field: Custom Value 1",
2375            0x545 => "Data Field: Custom Value 2",
2376            0x546 => "Data Field: Custom Value 3",
2377            0x547 => "Data Field: Custom Value 4",
2378            0x548 => "Data Field: Custom Value 5",
2379            0x549 => "Data Field: Custom Value 6",
2380            0x54A => "Data Field: Custom Value 7",
2381            0x54B => "Data Field: Custom Value 8",
2382            0x54C => "Data Field: Custom Value 9",
2383            0x54D => "Data Field: Custom Value 10",
2384            0x54E => "Data Field: Custom Value 11",
2385            0x54F => "Data Field: Custom Value 12",
2386            0x550 => "Data Field: Custom Value 13",
2387            0x551 => "Data Field: Custom Value 14",
2388            0x552 => "Data Field: Custom Value 15",
2389            0x553 => "Data Field: Custom Value 16",
2390            0x554 => "Data Field: Custom Value 17",
2391            0x555 => "Data Field: Custom Value 18",
2392            0x556 => "Data Field: Custom Value 19",
2393            0x557 => "Data Field: Custom Value 20",
2394            0x558 => "Data Field: Custom Value 21",
2395            0x559 => "Data Field: Custom Value 22",
2396            0x55A => "Data Field: Custom Value 23",
2397            0x55B => "Data Field: Custom Value 24",
2398            0x55C => "Data Field: Custom Value 25",
2399            0x55D => "Data Field: Custom Value 26",
2400            0x55E => "Data Field: Custom Value 27",
2401            0x55F => "Data Field: Custom Value 28",
2402            0x560 => "Data Field: Generic",
2403            0x561 => "Data Field: Generic GUID or PROPERTYKEY",
2404            0x562 => "Data Field: Generic Category GUID",
2405            0x563 => "Data Field: Generic Type GUID",
2406            0x564 => "Data Field: Generic Event PROPERTYKEY",
2407            0x565 => "Data Field: Generic Property PROPERTYKEY",
2408            0x566 => "Data Field: Generic Data Field PROPERTYKEY",
2409            0x567 => "Data Field: Generic Event",
2410            0x568 => "Data Field: Generic Property",
2411            0x569 => "Data Field: Generic Data Field",
2412            0x56A => "Data Field: Enumerator Table Row Index",
2413            0x56B => "Data Field: Enumerator Table Row Count",
2414            0x56C => "Data Field: Generic GUID or PROPERTYKEY kind",
2415            0x56D => "Data Field: Generic GUID",
2416            0x56E => "Data Field: Generic PROPERTYKEY",
2417            0x56F => "Data Field: Generic Top Level Collection ID",
2418            0x570 => "Data Field: Generic Report ID",
2419            0x571 => "Data Field: Generic Report Item Position Index",
2420            0x572 => "Data Field: Generic Firmware VARTYPE",
2421            0x573 => "Data Field: Generic Unit of Measure",
2422            0x574 => "Data Field: Generic Unit Exponent",
2423            0x575 => "Data Field: Generic Report Size",
2424            0x576 => "Data Field: Generic Report Count",
2425            0x580 => "Property: Generic",
2426            0x581 => "Property: Enumerator Table Row Index",
2427            0x582 => "Property: Enumerator Table Row Count",
2428            0x590 => "Data Field: Personal Activity",
2429            0x591 => "Data Field: Activity Type",
2430            0x592 => "Data Field: Activity State",
2431            0x593 => "Data Field: Device Position",
2432            0x594 => "Data Field: Step Count",
2433            0x595 => "Data Field: Step Count Reset",
2434            0x596 => "Data Field: Step Duration",
2435            0x597 => "Data Field: Step Type",
2436            0x5A0 => "Property: Minimum Activity Detection Interval",
2437            0x5A1 => "Property: Supported Activity Types",
2438            0x5A2 => "Property: Subscribed Activity Types",
2439            0x5A3 => "Property: Supported Step Types",
2440            0x5A4 => "Property: Subscribed Step Types",
2441            0x5A5 => "Property: Floor Height",
2442            0x5B0 => "Data Field: Custom Type ID",
2443            0x5C0 => "Property: Custom",
2444            0x5C1 => "Property: Custom Value 1",
2445            0x5C2 => "Property: Custom Value 2",
2446            0x5C3 => "Property: Custom Value 3",
2447            0x5C4 => "Property: Custom Value 4",
2448            0x5C5 => "Property: Custom Value 5",
2449            0x5C6 => "Property: Custom Value 6",
2450            0x5C7 => "Property: Custom Value 7",
2451            0x5C8 => "Property: Custom Value 8",
2452            0x5C9 => "Property: Custom Value 9",
2453            0x5CA => "Property: Custom Value 10",
2454            0x5CB => "Property: Custom Value 11",
2455            0x5CC => "Property: Custom Value 12",
2456            0x5CD => "Property: Custom Value 13",
2457            0x5CE => "Property: Custom Value 14",
2458            0x5CF => "Property: Custom Value 15",
2459            0x5D0 => "Property: Custom Value 16",
2460            0x5E0 => "Data Field: Hinge",
2461            0x5E1 => "Data Field: Hinge Angle",
2462            0x5F0 => "Data Field: Gesture Sensor",
2463            0x5F1 => "Data Field: Gesture State",
2464            0x5F2 => "Data Field: Hinge Fold Initial Angle",
2465            0x5F3 => "Data Field: Hinge Fold Final Angle",
2466            0x5F4 => "Data Field: Hinge Fold Contributing Panel",
2467            0x5F5 => "Data Field: Hinge Fold Type",
2468            0x800 => "Sensor State: Undefined",
2469            0x801 => "Sensor State: Ready",
2470            0x802 => "Sensor State: Not Available",
2471            0x803 => "Sensor State: No Data",
2472            0x804 => "Sensor State: Initializing",
2473            0x805 => "Sensor State: Access Denied",
2474            0x806 => "Sensor State: Error",
2475            0x810 => "Sensor Event: Unknown",
2476            0x811 => "Sensor Event: State Changed",
2477            0x812 => "Sensor Event: Property Changed",
2478            0x813 => "Sensor Event: Data Updated",
2479            0x814 => "Sensor Event: Poll Response",
2480            0x815 => "Sensor Event: Change Sensitivity",
2481            0x816 => "Sensor Event: Range Maximum Reached",
2482            0x817 => "Sensor Event: Range Minimum Reached",
2483            0x818 => "Sensor Event: High Threshold Cross Upward",
2484            0x819 => "Sensor Event: High Threshold Cross Downward",
2485            0x81A => "Sensor Event: Low Threshold Cross Upward",
2486            0x81B => "Sensor Event: Low Threshold Cross Downward",
2487            0x81C => "Sensor Event: Zero Threshold Cross Upward",
2488            0x81D => "Sensor Event: Zero Threshold Cross Downward",
2489            0x81E => "Sensor Event: Period Exceeded",
2490            0x81F => "Sensor Event: Frequency Exceeded",
2491            0x820 => "Sensor Event: Complex Trigger",
2492            0x830 => "Connection Type: PC Integrated",
2493            0x831 => "Connection Type: PC Attached",
2494            0x832 => "Connection Type: PC External",
2495            0x840 => "Reporting State: Report No Events",
2496            0x841 => "Reporting State: Report All Events",
2497            0x842 => "Reporting State: Report Threshold Events",
2498            0x843 => "Reporting State: Wake On No Events",
2499            0x844 => "Reporting State: Wake On All Events",
2500            0x845 => "Reporting State: Wake On Threshold Events",
2501            0x846 => "Reporting State: Anytime",
2502            0x850 => "Power State: Undefined",
2503            0x851 => "Power State: D0 Full Power",
2504            0x852 => "Power State: D1 Low Power",
2505            0x853 => "Power State: D2 Standby Power with Wakeup",
2506            0x854 => "Power State: D3 Sleep with Wakeup",
2507            0x855 => "Power State: D4 Power Off",
2508            0x860 => "Accuracy: Default",
2509            0x861 => "Accuracy: High",
2510            0x862 => "Accuracy: Medium",
2511            0x863 => "Accuracy: Low",
2512            0x870 => "Fix Quality: No Fix",
2513            0x871 => "Fix Quality: GPS",
2514            0x872 => "Fix Quality: DGPS",
2515            0x880 => "Fix Type: No Fix",
2516            0x881 => "Fix Type: GPS SPS Mode, Fix Valid",
2517            0x882 => "Fix Type: DGPS SPS Mode, Fix Valid",
2518            0x883 => "Fix Type: GPS PPS Mode, Fix Valid",
2519            0x884 => "Fix Type: Real Time Kinematic",
2520            0x885 => "Fix Type: Float RTK",
2521            0x886 => "Fix Type: Estimated (dead reckoned)",
2522            0x887 => "Fix Type: Manual Input Mode",
2523            0x888 => "Fix Type: Simulator Mode",
2524            0x890 => "GPS Operation Mode: Manual",
2525            0x891 => "GPS Operation Mode: Automatic",
2526            0x8A0 => "GPS Selection Mode: Autonomous",
2527            0x8A1 => "GPS Selection Mode: DGPS",
2528            0x8A2 => "GPS Selection Mode: Estimated (dead reckoned)",
2529            0x8A3 => "GPS Selection Mode: Manual Input",
2530            0x8A4 => "GPS Selection Mode: Simulator",
2531            0x8A5 => "GPS Selection Mode: Data Not Valid",
2532            0x8B0 => "GPS Status Data: Valid",
2533            0x8B1 => "GPS Status Data: Not Valid",
2534            0x8C0 => "Day of Week: Sunday",
2535            0x8C1 => "Day of Week: Monday",
2536            0x8C2 => "Day of Week: Tuesday",
2537            0x8C3 => "Day of Week: Wednesday",
2538            0x8C4 => "Day of Week: Thursday",
2539            0x8C5 => "Day of Week: Friday",
2540            0x8C6 => "Day of Week: Saturday",
2541            0x8D0 => "Kind: Category",
2542            0x8D1 => "Kind: Type",
2543            0x8D2 => "Kind: Event",
2544            0x8D3 => "Kind: Property",
2545            0x8D4 => "Kind: Data Field",
2546            0x8E0 => "Magnetometer Accuracy: Low",
2547            0x8E1 => "Magnetometer Accuracy: Medium",
2548            0x8E2 => "Magnetometer Accuracy: High",
2549            0x8F0 => "Simple Orientation Direction: Not Rotated",
2550            0x8F1 => "Simple Orientation Direction: Rotated 90 Degrees CCW",
2551            0x8F2 => "Simple Orientation Direction: Degrees CCW",
2552            0x8F3 => "Simple Orientation Direction: Degrees CCW",
2553            0x8F4 => "Simple Orientation Direction: Face Up",
2554            0x8F5 => "Simple Orientation Direction: Face Down",
2555            0x900 => "VT_NULL",
2556            0x901 => "VT_BOOL",
2557            0x902 => "VT_UI1",
2558            0x903 => "VT_I1",
2559            0x904 => "VT_UI2",
2560            0x905 => "VT_I2",
2561            0x906 => "VT_UI4",
2562            0x907 => "VT_I4",
2563            0x908 => "VT_UI8",
2564            0x909 => "VT_I8",
2565            0x90A => "VT_R4",
2566            0x90B => "VT_R8",
2567            0x90C => "VT_WSTR",
2568            0x90D => "VT_STR",
2569            0x90E => "VT_CLSID",
2570            0x90F => "VT_VECTOR VT_UI1",
2571            0x910 => "VT_F16E0",
2572            0x911 => "VT_F16E1",
2573            0x912 => "VT_F16E2",
2574            0x913 => "VT_F16E3",
2575            0x914 => "VT_F16E4",
2576            0x915 => "VT_F16E5",
2577            0x916 => "VT_F16E6",
2578            0x917 => "VT_F16E7",
2579            0x918 => "VT_F16E8",
2580            0x919 => "VT_F16E9",
2581            0x91A => "VT_F16EA",
2582            0x91B => "VT_F16EB",
2583            0x91C => "VT_F16EC",
2584            0x91D => "VT_F16ED",
2585            0x91E => "VT_F16EE",
2586            0x91F => "VT_F16EF",
2587            0x920 => "VT_F32E0",
2588            0x921 => "VT_F32E1",
2589            0x922 => "VT_F32E2",
2590            0x923 => "VT_F32E3",
2591            0x924 => "VT_F32E4",
2592            0x925 => "VT_F32E5",
2593            0x926 => "VT_F32E6",
2594            0x927 => "VT_F32E7",
2595            0x928 => "VT_F32E8",
2596            0x929 => "VT_F32E9",
2597            0x92A => "VT_F32EA",
2598            0x92B => "VT_F32EB",
2599            0x92C => "VT_F32EC",
2600            0x92D => "VT_F32ED",
2601            0x92E => "VT_F32EE",
2602            0x92F => "VT_F32EF",
2603            0x930 => "Activity Type: Unknown",
2604            0x931 => "Activity Type: Stationary",
2605            0x932 => "Activity Type: Fidgeting",
2606            0x933 => "Activity Type: Walking",
2607            0x934 => "Activity Type: Running",
2608            0x935 => "Activity Type: In Vehicle",
2609            0x936 => "Activity Type: Biking",
2610            0x937 => "Activity Type: Idle",
2611            0x940 => "Unit: Not Specified",
2612            0x941 => "Unit: Lux",
2613            0x942 => "Unit: Degrees Kelvin",
2614            0x943 => "Unit: Degrees Celsius",
2615            0x944 => "Unit: Pascal",
2616            0x945 => "Unit: Newton",
2617            0x946 => "Unit: Meters/Second",
2618            0x947 => "Unit: Kilogram",
2619            0x948 => "Unit: Meter",
2620            0x949 => "Unit: Meters/Second/Second",
2621            0x94A => "Unit: Farad",
2622            0x94B => "Unit: Ampere",
2623            0x94C => "Unit: Watt",
2624            0x94D => "Unit: Henry",
2625            0x94E => "Unit: Ohm",
2626            0x94F => "Unit: Volt",
2627            0x950 => "Unit: Hertz",
2628            0x951 => "Unit: Bar",
2629            0x952 => "Unit: Degrees Anti-clockwise",
2630            0x953 => "Unit: Degrees Clockwise",
2631            0x954 => "Unit: Degrees",
2632            0x955 => "Unit: Degrees/Second",
2633            0x956 => "Unit: Degrees/Second/Second",
2634            0x957 => "Unit: Knot",
2635            0x958 => "Unit: Percent",
2636            0x959 => "Unit: Second",
2637            0x95A => "Unit: Millisecond",
2638            0x95B => "Unit: G",
2639            0x95C => "Unit: Bytes",
2640            0x95D => "Unit: Milligauss",
2641            0x95E => "Unit: Bits",
2642            0x960 => "Activity State: No State Change",
2643            0x961 => "Activity State: Start Activity",
2644            0x962 => "Activity State: End Activity",
2645            0x970 => "Exponent 0",
2646            0x971 => "Exponent 1",
2647            0x972 => "Exponent 2",
2648            0x973 => "Exponent 3",
2649            0x974 => "Exponent 4",
2650            0x975 => "Exponent 5",
2651            0x976 => "Exponent 6",
2652            0x977 => "Exponent 7",
2653            0x978 => "Exponent 8",
2654            0x979 => "Exponent 9",
2655            0x97A => "Exponent A",
2656            0x97B => "Exponent B",
2657            0x97C => "Exponent C",
2658            0x97D => "Exponent D",
2659            0x97E => "Exponent E",
2660            0x97F => "Exponent F",
2661            0x980 => "Device Position: Unknown",
2662            0x981 => "Device Position: Unchanged",
2663            0x982 => "Device Position: On Desk",
2664            0x983 => "Device Position: In Hand",
2665            0x984 => "Device Position: Moving in Bag",
2666            0x985 => "Device Position: Stationary in Bag",
2667            0x990 => "Step Type: Unknown",
2668            0x991 => "Step Type: Walking",
2669            0x992 => "Step Type: Running",
2670            0x9A0 => "Gesture State: Unknown",
2671            0x9A1 => "Gesture State: Started",
2672            0x9A2 => "Gesture State: Completed",
2673            0x9A3 => "Gesture State: Cancelled",
2674            0x9B0 => "Hinge Fold Contributing Panel: Unknown",
2675            0x9B1 => "Hinge Fold Contributing Panel: Panel 1",
2676            0x9B2 => "Hinge Fold Contributing Panel: Panel 2",
2677            0x9B3 => "Hinge Fold Contributing Panel: Both",
2678            0x9B4 => "Hinge Fold Type: Unknown",
2679            0x9B5 => "Hinge Fold Type: Increasing",
2680            0x9B6 => "Hinge Fold Type: Decreasing",
2681            0x9C0 => "Human Presence Detection Type: Vendor-Defined Non-Biometric",
2682            0x9C1 => "Human Presence Detection Type: Vendor-Defined Biometric",
2683            0x9C2 => "Human Presence Detection Type: Facial Biometric",
2684            0x9C3 => "Human Presence Detection Type: Audio Biometric",
2685            0x1000 => "Modifier: Change Sensitivity Absolute",
2686            0x2000 => "Modifier: Maximum",
2687            0x3000 => "Modifier: Minimum",
2688            0x4000 => "Modifier: Accuracy",
2689            0x5000 => "Modifier: Resolution",
2690            0x6000 => "Modifier: Threshold High",
2691            0x7000 => "Modifier: Threshold Low",
2692            0x8000 => "Modifier: Calibration Offset",
2693            0x9000 => "Modifier: Calibration Multiplier",
2694            0xA000 => "Modifier: Report Interval",
2695            0xB000 => "Modifier: Frequency Max",
2696            0xC000 => "Modifier: Period Max",
2697            0xD000 => "Modifier: Change Sensitivity Percent of Range",
2698            0xE000 => "Modifier: Change Sensitivity Percent Relative",
2699            0xF000 => "Modifier: Vendor Reserved",
2700            _ => "Reserved",
2701        }),
2702        // Medical Instrument
2703        0x40 => Cow::Borrowed(match usage {
2704            0x00 => "Undefined",
2705            0x01 => "Medical Ultrasound",
2706            0x20 => "VCR/Acquisition",
2707            0x21 => "Freeze/Thaw",
2708            0x22 => "Clip Store",
2709            0x23 => "Update",
2710            0x24 => "Next",
2711            0x25 => "Save",
2712            0x26 => "Print",
2713            0x27 => "Microphone Enable",
2714            0x40 => "Cine",
2715            0x41 => "Transmit Power",
2716            0x42 => "Volume",
2717            0x43 => "Focus",
2718            0x44 => "Depth",
2719            0x60 => "Soft Step - Primary",
2720            0x61 => "Soft Step - Secondary",
2721            0x70 => "Depth Gain Compensation",
2722            0x80 => "Zoom Select",
2723            0x81 => "Zoom Adjust",
2724            0x82 => "Spectral Doppler Mode Select",
2725            0x83 => "Spectral Doppler Adjust",
2726            0x84 => "Color Doppler Mode Select",
2727            0x85 => "Color Doppler Adjust",
2728            0x86 => "Motion Mode Select",
2729            0x87 => "Motion Mode Adjust",
2730            0x88 => "2-D Mode Select",
2731            0x89 => "2-D Mode Adjust",
2732            0xA0 => "Soft Control Select",
2733            0xA1 => "Soft Control Adjust",
2734            _ => "Reserved",
2735        }),
2736        // Braille Display
2737        0x41 => Cow::Borrowed(match usage {
2738            0x00 => "Undefined",
2739            0x01 => "Braille Display",
2740            0x02 => "Braille Row",
2741            0x03 => "8 Dot Braille Cell",
2742            0x04 => "6 Dot Braille Cell",
2743            0x05 => "Number of Braille Cells",
2744            0x06 => "Screen Reader Control",
2745            0x07 => "Screen Reader Identifier",
2746            0xFA => "Router Set 1",
2747            0xFB => "Router Set 2",
2748            0xFC => "Router Set 3",
2749            0x100 => "Router Key",
2750            0x101 => "Row Router Key",
2751            0x200 => "Braille Buttons",
2752            0x201 => "Braille Keyboard Dot 1",
2753            0x202 => "Braille Keyboard Dot 2",
2754            0x203 => "Braille Keyboard Dot 3",
2755            0x204 => "Braille Keyboard Dot 4",
2756            0x205 => "Braille Keyboard Dot 5",
2757            0x206 => "Braille Keyboard Dot 6",
2758            0x207 => "Braille Keyboard Dot 7",
2759            0x208 => "Braille Keyboard Dot 8",
2760            0x209 => "Braille Keyboard Space",
2761            0x20A => "Braille Keyboard Left Space",
2762            0x20B => "Braille Keyboard Right Space",
2763            0x20C => "Braille Face Controls",
2764            0x20D => "Braille Left Controls",
2765            0x20E => "Braille Right Controls",
2766            0x20F => "Braille Top Controls",
2767            0x210 => "Braille Joystick Center",
2768            0x211 => "Braille Joystick Up",
2769            0x212 => "Braille Joystick Down",
2770            0x213 => "Braille Joystick Left",
2771            0x214 => "Braille Joystick Right",
2772            0x215 => "Braille D-Pad Center",
2773            0x216 => "Braille D-Pad Up",
2774            0x217 => "Braille D-Pad Down",
2775            0x218 => "Braille D-Pad Left",
2776            0x219 => "Braille D-Pad Right",
2777            0x21A => "Braille Pan Left",
2778            0x21B => "Braille Pan Right",
2779            0x21C => "Braille Rocker Up",
2780            0x21D => "Braille Rocker Down",
2781            0x21E => "Braille Rocker Press",
2782            _ => "Reserved",
2783        }),
2784        // Lighting And Illumination
2785        0x59 => Cow::Borrowed(match usage {
2786            0x00 => "Undefined",
2787            0x01 => "LampArray",
2788            0x02 => "LampArrayAttributesReport",
2789            0x03 => "LampCount",
2790            0x04 => "BoundingBoxWidthInMicrometers",
2791            0x05 => "BoundingBoxHeightInMicrometers",
2792            0x06 => "BoundingBoxDepthInMicrometers",
2793            0x07 => "LampArrayKind",
2794            0x08 => "MinUpdateIntervalInMicroseconds",
2795            0x20 => "LampAttributesRequestReport",
2796            0x21 => "LampId",
2797            0x22 => "LampAttributesResponseReport",
2798            0x23 => "PositionXInMicrometers",
2799            0x24 => "PositionYInMicrometers",
2800            0x25 => "PositionZInMicrometers",
2801            0x26 => "LampPurposes",
2802            0x27 => "UpdateLatencyInMicroseconds",
2803            0x28 => "RedLevelCount",
2804            0x29 => "GreenLevelCount",
2805            0x2A => "BlueLevelCount",
2806            0x2B => "IntensityLevelCount",
2807            0x2C => "IsProgrammable",
2808            0x2D => "InputBinding",
2809            0x50 => "LampMultiUpdateReport",
2810            0x51 => "RedUpdateChannel",
2811            0x52 => "GreenUpdateChannel",
2812            0x53 => "BlueUpdateChannel",
2813            0x54 => "IntensityUpdateChannel",
2814            0x55 => "LampUpdateFlags",
2815            0x60 => "LampRangeUpdateReport",
2816            0x61 => "LampIdStart",
2817            0x62 => "LampIdEnd",
2818            0x70 => "LampArrayControlReport",
2819            0x71 => "AutonomousMode",
2820            _ => "Reserved",
2821        }),
2822        // Monitor
2823        0x80 => Cow::Borrowed(match usage {
2824            0x00 => "Undefined",
2825            0x01 => "Monitor Control",
2826            0x02 => "EDID Information",
2827            0x03 => "VDIF Information",
2828            0x04 => "VESA Version",
2829            _ => "Reserved",
2830        }),
2831        // Monitor Enumerated
2832        0x81 => match usage {
2833            0x00 => Cow::Borrowed("Reserved"),
2834            _ => Cow::Owned(format!("Enum {}", usage)),
2835        },
2836        // VESA Virtual Controls
2837        0x82 => Cow::Borrowed(match usage {
2838            0x00 => "Undefined",
2839            0x01 => "Degauss",
2840            0x10 => "Brightness",
2841            0x12 => "Contrast",
2842            0x16 => "Red Video Gain",
2843            0x18 => "Green Video Gain",
2844            0x1A => "Blue Video Gain",
2845            0x1C => "Focus",
2846            0x20 => "Horizontal Position",
2847            0x22 => "Horizontal Size",
2848            0x24 => "Horizontal Pincushion",
2849            0x26 => "Horizontal Pincushion Balance",
2850            0x28 => "Horizontal Misconvergence",
2851            0x2A => "Horizontal Linearity",
2852            0x2C => "Horizontal Linearity Balance",
2853            0x30 => "Vertical Position",
2854            0x32 => "Vertical Size",
2855            0x34 => "Vertical Pincushion",
2856            0x36 => "Vertical Pincushion Balance",
2857            0x38 => "Vertical Misconvergence",
2858            0x3A => "Vertical Linearity",
2859            0x3C => "Vertical Linearity Balance",
2860            0x40 => "Parallelogram Distortion (Key Balance)",
2861            0x42 => "Trapezoidal Distortion (Key)",
2862            0x44 => "Tilt (Rotation)",
2863            0x46 => "Top Corner Distortion Control",
2864            0x48 => "Top Corner Distortion Balance",
2865            0x4A => "Bottom Corner Distortion Control",
2866            0x4C => "Bottom Corner Distortion Balance",
2867            0x56 => "Horizontal Moiré",
2868            0x58 => "Vertical Moiré",
2869            0x5E => "Input Level Select",
2870            0x60 => "Input Source Select",
2871            0x6C => "Red Video Black Level",
2872            0x6E => "Green Video Black Level",
2873            0x70 => "Blue Video Black Level",
2874            0xA2 => "Auto Size Center",
2875            0xA4 => "Polarity Horizontal Synchronization",
2876            0xA6 => "Polarity Vertical Synchronization",
2877            0xA8 => "Synchronization Type",
2878            0xAA => "Screen Orientation",
2879            0xAC => "Horizontal Frequency",
2880            0xAE => "Vertical Frequency",
2881            0xB0 => "Settings",
2882            0xCA => "On Screen Display",
2883            0xD4 => "Stereo Mode",
2884            _ => "Reserved",
2885        }),
2886        // Power
2887        0x84 => Cow::Borrowed(match usage {
2888            0x00 => "Undefined",
2889            0x01 => "iName",
2890            0x02 => "Present Status",
2891            0x03 => "Changed Status",
2892            0x04 => "UPS",
2893            0x05 => "Power Supply",
2894            0x10 => "Battery System",
2895            0x11 => "Battery System Id",
2896            0x12 => "Battery",
2897            0x13 => "Battery Id",
2898            0x14 => "Charger",
2899            0x15 => "Charger Id",
2900            0x16 => "Power Converter",
2901            0x17 => "Power Converter Id",
2902            0x18 => "Outlet System",
2903            0x19 => "Outlet System Id",
2904            0x1A => "Input",
2905            0x1B => "Input Id",
2906            0x1C => "Output",
2907            0x1D => "Output Id",
2908            0x1E => "Flow",
2909            0x1F => "Flow Id",
2910            0x20 => "Outlet",
2911            0x21 => "Outlet Id",
2912            0x22 => "Gang",
2913            0x23 => "Gang Id",
2914            0x24 => "Power Summary",
2915            0x25 => "Power Summary Id",
2916            0x30 => "Voltage",
2917            0x31 => "Current",
2918            0x32 => "Frequency",
2919            0x33 => "Apparent Power",
2920            0x34 => "Active Power",
2921            0x35 => "Percent Load",
2922            0x36 => "Temperature",
2923            0x37 => "Humidity",
2924            0x38 => "Bad Count",
2925            0x40 => "Config Voltage",
2926            0x41 => "Config Current",
2927            0x42 => "Config Frequency",
2928            0x43 => "Config Apparent Power",
2929            0x44 => "Config Active Power",
2930            0x45 => "Config Percent Load",
2931            0x46 => "Config Temperature",
2932            0x47 => "Config Humidity",
2933            0x50 => "Switch On Control",
2934            0x51 => "Switch Off Control",
2935            0x52 => "Toggle Control",
2936            0x53 => "Low Voltage Transfer",
2937            0x54 => "High Voltage Transfer",
2938            0x55 => "Delay Before Reboot",
2939            0x56 => "Delay Before Startup",
2940            0x57 => "Delay Before Shutdown",
2941            0x58 => "Test",
2942            0x59 => "Module Reset",
2943            0x5A => "Audible Alarm Control",
2944            0x60 => "Present",
2945            0x61 => "Good",
2946            0x62 => "Internal Failure",
2947            0x63 => "Voltag Out Of Range",
2948            0x64 => "Frequency Out Of Range",
2949            0x65 => "Overload",
2950            0x66 => "Over Charged",
2951            0x67 => "Over Temperature",
2952            0x68 => "Shutdown Requested",
2953            0x69 => "Shutdown Imminent",
2954            0x6B => "Switch On/Off",
2955            0x6C => "Switchable",
2956            0x6D => "Used",
2957            0x6E => "Boost",
2958            0x6F => "Buck",
2959            0x70 => "Initialized",
2960            0x71 => "Tested",
2961            0x72 => "Awaiting Power",
2962            0x73 => "Communication Lost",
2963            0xFD => "iManufacturer",
2964            0xFE => "iProduct",
2965            0xFF => "iSerialNumber",
2966            _ => "Reserved",
2967        }),
2968        // Battery System
2969        0x85 => Cow::Borrowed(match usage {
2970            0x00 => "Undefined",
2971            0x01 => "Smart Battery Battery Mode",
2972            0x02 => "Smart Battery Battery Status",
2973            0x03 => "Smart Battery Alarm Warning",
2974            0x04 => "Smart Battery Charger Mode",
2975            0x05 => "Smart Battery Charger Status",
2976            0x06 => "Smart Battery Charger Spec Info",
2977            0x07 => "Smart Battery Selector State",
2978            0x08 => "Smart Battery Selector Presets",
2979            0x09 => "Smart Battery Selector Info",
2980            0x10 => "Optional Mfg Function 1",
2981            0x11 => "Optional Mfg Function 2",
2982            0x12 => "Optional Mfg Function 3",
2983            0x13 => "Optional Mfg Function 4",
2984            0x14 => "Optional Mfg Function 5",
2985            0x15 => "Connection To SM Bus",
2986            0x16 => "Output Connection",
2987            0x17 => "Charger Connection",
2988            0x18 => "Battery Insertion",
2989            0x19 => "Use Next",
2990            0x1A => "OK To Use",
2991            0x1B => "Battery Supported",
2992            0x1C => "Selector Revision",
2993            0x1D => "Charging Indicator",
2994            0x28 => "Manufacturer Access",
2995            0x29 => "Remaining Capacity Limit",
2996            0x2A => "Remaining Time Limit",
2997            0x2B => "At Rate",
2998            0x2C => "Capacity Mode",
2999            0x2D => "Broadcast To Charger",
3000            0x2E => "Primary Battery",
3001            0x2F => "Charge Controller",
3002            0x40 => "Terminate Charge",
3003            0x41 => "Terminate Discharge",
3004            0x42 => "Below Remaining Capacity Limit",
3005            0x43 => "Remaining Time Limit Expired",
3006            0x44 => "Charging",
3007            0x45 => "Discharging",
3008            0x46 => "Fully Charged",
3009            0x47 => "Fully Discharged",
3010            0x48 => "Conditioning Flag",
3011            0x49 => "At Rate OK",
3012            0x4A => "Smart Battery Error Code",
3013            0x4B => "Need Replacement",
3014            0x60 => "At Rate Time To Full",
3015            0x61 => "At Rate Time To Empty",
3016            0x62 => "Average Current",
3017            0x63 => "Max Error",
3018            0x64 => "Relative State Of Charge",
3019            0x65 => "Absolute State Of Charge",
3020            0x66 => "Remaining Capacity",
3021            0x67 => "Full Charge Capacity",
3022            0x68 => "Run Time To Empty",
3023            0x69 => "Average Time To Empty",
3024            0x6A => "Average Time To Full",
3025            0x6B => "Cycle Count",
3026            0x80 => "Battery Pack Model Level",
3027            0x81 => "Internal Charge Controller",
3028            0x82 => "Primary Battery Support",
3029            0x83 => "Design Capacity",
3030            0x84 => "Specification Info",
3031            0x85 => "Manufacture Date",
3032            0x86 => "Serial Number",
3033            0x87 => "iManufacturer Name",
3034            0x88 => "iDevice Name",
3035            0x89 => "iDevice Chemistry",
3036            0x8A => "Manufacturer Data",
3037            0x8B => "Rechargable",
3038            0x8C => "Warning Capacity Limit",
3039            0x8D => "Capacity Granularity 1",
3040            0x8E => "Capacity Granularity 2",
3041            0x8F => "iOEM Information",
3042            0xC0 => "Inhibit Charge",
3043            0xC1 => "Enable Polling",
3044            0xC2 => "Reset To Zero",
3045            0xD0 => "AC Present",
3046            0xD1 => "Battery Present",
3047            0xD2 => "Power Fail",
3048            0xD3 => "Alarm Inhibited",
3049            0xD4 => "Thermistor Under Range",
3050            0xD5 => "Thermistor Hot",
3051            0xD6 => "Thermistor Cold",
3052            0xD7 => "Thermistor Over Range",
3053            0xD8 => "Voltage Out Of Range",
3054            0xD9 => "Current Out Of Range",
3055            0xDA => "Current Not Regulated",
3056            0xDB => "Voltage Not Regulated",
3057            0xDC => "Master Mode",
3058            0xF0 => "Charger Selector Support",
3059            0xF1 => "Charger Spec",
3060            0xF2 => "Level 2",
3061            0xF3 => "Level 3",
3062            _ => "Reserved",
3063        }),
3064        // Bar Code Scanner
3065        0x8C => Cow::Borrowed(match usage {
3066            0x00 => "Undefined",
3067            0x01 => "Barcode Badge Reader",
3068            0x02 => "Barcode Scanner",
3069            0x03 => "Dumb Bar Code Scanner",
3070            0x04 => "Cordless Scanner Base",
3071            0x05 => "Bar Code Scanner Cradle",
3072            0x10 => "Attribute Report",
3073            0x11 => "Settings Report",
3074            0x12 => "Scanned Data Report",
3075            0x13 => "Raw Scanned Data Report",
3076            0x14 => "Trigger Report",
3077            0x15 => "Status Report",
3078            0x16 => "UPC/EAN Control Report",
3079            0x17 => "EAN 2/3 Label Control Report",
3080            0x18 => "Code 39 Control Report",
3081            0x19 => "Interleaved 2 of 5 Control Report",
3082            0x1A => "Standard 2 of 5 Control Report",
3083            0x1B => "MSI Plessey Control Report",
3084            0x1C => "Codabar Control Report",
3085            0x1D => "Code 128 Control Report",
3086            0x1E => "Misc 1D Control Report",
3087            0x1F => "2D Control Report",
3088            0x30 => "Aiming/Pointer Mode",
3089            0x31 => "Bar Code Present Sensor",
3090            0x32 => "Class 1A Laser",
3091            0x33 => "Class 2 Laser",
3092            0x34 => "Heater Present",
3093            0x35 => "Contact Scanner",
3094            0x36 => "Electronic Article Surveillance Notification",
3095            0x37 => "Constant Electronic Article Surveillance",
3096            0x38 => "Error Indication",
3097            0x39 => "Fixed Beeper",
3098            0x3A => "Good Decode Indication",
3099            0x3B => "Hands Free Scanning",
3100            0x3C => "Intrinsically Safe",
3101            0x3D => "Klasse Eins Laser",
3102            0x3E => "Long Range Scanner",
3103            0x3F => "Mirror Speed Control",
3104            0x40 => "Not On File Indication",
3105            0x41 => "Programmable Beeper",
3106            0x42 => "Triggerless",
3107            0x43 => "Wand",
3108            0x44 => "Water Resistant",
3109            0x45 => "Multi-Range Scanner",
3110            0x46 => "Proximity Sensor",
3111            0x4D => "Fragment Decoding",
3112            0x4E => "Scanner Read Confidence",
3113            0x4F => "Data Prefix",
3114            0x50 => "Prefix AIMI",
3115            0x51 => "Prefix None",
3116            0x52 => "Prefix Proprietary",
3117            0x55 => "Active Time",
3118            0x56 => "Aiming Laser Pattern",
3119            0x57 => "Bar Code Present",
3120            0x58 => "Beeper State",
3121            0x59 => "Laser On Time",
3122            0x5A => "Laser State",
3123            0x5B => "Lockout Time",
3124            0x5C => "Motor State",
3125            0x5D => "Motor Timeout",
3126            0x5E => "Power On Reset Scanner",
3127            0x5F => "Prevent Read of Barcodes",
3128            0x60 => "Initiate Barcode Read",
3129            0x61 => "Trigger State",
3130            0x62 => "Trigger Mode",
3131            0x63 => "Trigger Mode Blinking Laser On",
3132            0x64 => "Trigger Mode Continuous Laser On",
3133            0x65 => "Trigger Mode Laser on while Pulled",
3134            0x66 => "Trigger Mode Laser stays on after release",
3135            0x6D => "Commit Parameters to NVM",
3136            0x6E => "Parameter Scanning",
3137            0x6F => "Parameters Changed",
3138            0x70 => "Set parameter default values",
3139            0x75 => "Scanner In Cradle",
3140            0x76 => "Scanner In Range",
3141            0x7A => "Aim Duration",
3142            0x7B => "Good Read Lamp Duration",
3143            0x7C => "Good Read Lamp Intensity",
3144            0x7D => "Good Read LED",
3145            0x7E => "Good Read Tone Frequency",
3146            0x7F => "Good Read Tone Length",
3147            0x80 => "Good Read Tone Volume",
3148            0x82 => "No Read Message",
3149            0x83 => "Not on File Volume",
3150            0x84 => "Powerup Beep",
3151            0x85 => "Sound Error Beep",
3152            0x86 => "Sound Good Read Beep",
3153            0x87 => "Sound Not On File Beep",
3154            0x88 => "Good Read When to Write",
3155            0x89 => "GRWTI After Decode",
3156            0x8A => "GRWTI Beep/Lamp after transmit",
3157            0x8B => "GRWTI No Beep/Lamp use at all",
3158            0x91 => "Bookland EAN",
3159            0x92 => "Convert EAN 8 to 13 Type",
3160            0x93 => "Convert UPC A to EAN-13",
3161            0x94 => "Convert UPC-E to A",
3162            0x95 => "EAN-13",
3163            0x96 => "EAN-8",
3164            0x97 => "EAN-99 128 Mandatory",
3165            0x98 => "EAN-99 P5/128 Optional",
3166            0x99 => "Enable EAN Two Label",
3167            0x9A => "UPC/EAN",
3168            0x9B => "UPC/EAN Coupon Code",
3169            0x9C => "UPC/EAN Periodicals",
3170            0x9D => "UPC-A",
3171            0x9E => "UPC-A Mandatory",
3172            0x9F => "UPC-A Optional",
3173            0xA0 => "UPC-A with P5 Optional",
3174            0xA1 => "UPC-E",
3175            0xA2 => "UPC-E1",
3176            0xA9 => "Periodical",
3177            0xAA => "Periodical Auto-Discriminate +2",
3178            0xAB => "Periodical Only Decode with +2",
3179            0xAC => "Periodical Ignore +2",
3180            0xAD => "Periodical Auto-Discriminate +5",
3181            0xAE => "Periodical Only Decode with +5",
3182            0xAF => "Periodical Ignore +5",
3183            0xB0 => "Check",
3184            0xB1 => "Check Disable Price",
3185            0xB2 => "Check Enable 4 digit Price",
3186            0xB3 => "Check Enable 5 digit Price",
3187            0xB4 => "Check Enable European 4 digit Price",
3188            0xB5 => "Check Enable European 5 digit Price",
3189            0xB7 => "EAN Two Label",
3190            0xB8 => "EAN Three Label",
3191            0xB9 => "EAN 8 Flag Digit 1",
3192            0xBA => "EAN 8 Flag Digit 2",
3193            0xBB => "EAN 8 Flag Digit 3",
3194            0xBC => "EAN 13 Flag Digit 1",
3195            0xBD => "EAN 13 Flag Digit 2",
3196            0xBE => "EAN 13 Flag Digit 3",
3197            0xBF => "Add Label Definition",
3198            0xC0 => "Clear all Label Definitions",
3199            0xC3 => "Codabar",
3200            0xC4 => "Code 128",
3201            0xC7 => "Code 39",
3202            0xC8 => "Code 93",
3203            0xC9 => "Full ASCII Conversion",
3204            0xCA => "Interleaved 2 of 5",
3205            0xCB => "Italian Pharmacy Code",
3206            0xCC => "MSI/Plessey",
3207            0xCD => "Standard 2 of 5 IATA",
3208            0xCE => "Standard 2 of 5",
3209            0xD3 => "Transmit Start/Stop",
3210            0xD4 => "Tri-Optic",
3211            0xD5 => "UCC/EAN-128",
3212            0xD6 => "Check Digit",
3213            0xD7 => "Check Digit Disable",
3214            0xD8 => "Check Digit Enable Interleaved 2 of 5 OPCC",
3215            0xD9 => "Check Digit Enable Interleaved 2 of 5 USS",
3216            0xDA => "Check Digit Enable Standard 2 of 5 OPCC",
3217            0xDB => "Check Digit Enable Standard 2 of 5 USS",
3218            0xDC => "Check Digit Enable One MSI Plessey",
3219            0xDD => "Check Digit Enable Two MSI Plessey",
3220            0xDE => "Check Digit Codabar Enable",
3221            0xDF => "Check Digit Code 39 Enable",
3222            0xF0 => "Transmit Check Digit",
3223            0xF1 => "Disable Check Digit Transmit",
3224            0xF2 => "Enable Check Digit Transmit",
3225            0xFB => "Symbology Identifier 1",
3226            0xFC => "Symbology Identifier 2",
3227            0xFD => "Symbology Identifier 3",
3228            0xFE => "Decoded Data",
3229            0xFF => "Decode Data Continued",
3230            0x100 => "Bar Space Data",
3231            0x101 => "Scanner Data Accuracy",
3232            0x102 => "Raw Data Polarity",
3233            0x103 => "Polarity Inverted Bar Code",
3234            0x104 => "Polarity Normal Bar Code",
3235            0x106 => "Minimum Length to Decode",
3236            0x107 => "Maximum Length to Decode",
3237            0x108 => "Discrete Length to Decode 1",
3238            0x109 => "Discrete Length to Decode 2",
3239            0x10A => "Data Length Method",
3240            0x10B => "DL Method Read any",
3241            0x10C => "DL Method Check in Range",
3242            0x10D => "DL Method Check for Discrete",
3243            0x110 => "Aztec Code",
3244            0x111 => "BC412",
3245            0x112 => "Channel Code",
3246            0x113 => "Code 16",
3247            0x114 => "Code 32",
3248            0x115 => "Code 49",
3249            0x116 => "Code One",
3250            0x117 => "Colorcode",
3251            0x118 => "Data Matrix",
3252            0x119 => "MaxiCode",
3253            0x11A => "MicroPDF",
3254            0x11B => "PDF-417",
3255            0x11C => "PosiCode",
3256            0x11D => "QR Code",
3257            0x11E => "SuperCode",
3258            0x11F => "UltraCode",
3259            0x120 => "USD-5 (Slug Code)",
3260            0x121 => "VeriCode",
3261            _ => "Reserved",
3262        }),
3263        // Scale
3264        0x8D => Cow::Borrowed(match usage {
3265            0x00 => "Undefined",
3266            0x01 => "Scales",
3267            0x20 => "Scale Device",
3268            0x21 => "Scale Class",
3269            0x22 => "Scale Class I Metric",
3270            0x23 => "Scale Class II Metric",
3271            0x24 => "Scale Class III Metric",
3272            0x25 => "Scale Class IIIL Metric",
3273            0x26 => "Scale Class IV Metric",
3274            0x27 => "Scale Class III English",
3275            0x28 => "Scale Class IIIL English",
3276            0x29 => "Scale Class IV English",
3277            0x2A => "Scale Class Generic",
3278            0x30 => "Scale Attribute Report",
3279            0x31 => "Scale Control Report",
3280            0x32 => "Scale Data Report",
3281            0x33 => "Scale Status Report",
3282            0x34 => "Scale Weight Limit Report",
3283            0x35 => "Scale Statistics Report",
3284            0x40 => "Data Weight",
3285            0x41 => "Data Scaling",
3286            0x50 => "Weight Unit",
3287            0x51 => "Weight Unit Milligram",
3288            0x52 => "Weight Unit Gram",
3289            0x53 => "Weight Unit Kilogram",
3290            0x54 => "Weight Unit Carats",
3291            0x55 => "Weight Unit Taels",
3292            0x56 => "Weight Unit Grains",
3293            0x57 => "Weight Unit Pennyweights",
3294            0x58 => "Weight Unit Metric Ton",
3295            0x59 => "Weight Unit Avoir Ton",
3296            0x5A => "Weight Unit Troy Ounce",
3297            0x5B => "Weight Unit Ounce",
3298            0x5C => "Weight Unit Pound",
3299            0x60 => "Calibration Count",
3300            0x61 => "Re-Zero Count",
3301            0x70 => "Scale Status",
3302            0x71 => "Scale Status Fault",
3303            0x72 => "Scale Status Stable at Center of Zero",
3304            0x73 => "Scale Status In Motion",
3305            0x74 => "Scale Status Weight Stable",
3306            0x75 => "Scale Status Under Zero",
3307            0x76 => "Scale Status Over Weight Limit",
3308            0x77 => "Scale Status Requires Calibration",
3309            0x78 => "Scale Status Requires Rezeroing",
3310            0x80 => "Zero Scale",
3311            0x81 => "Enforced Zero Return",
3312            _ => "Reserved",
3313        }),
3314        // Magnetic Stripe Reading
3315        0x8E => Cow::Borrowed(match usage {
3316            0x00 => "Undefined",
3317            0x01 => "MSR Device Read-Only",
3318            0x11 => "Track 1 Length",
3319            0x12 => "Track 2 Length",
3320            0x13 => "Track 3 Length",
3321            0x14 => "Track JIS Length",
3322            0x20 => "Track Data",
3323            0x21 => "Track 1 Data",
3324            0x22 => "Track 2 Data",
3325            0x23 => "Track 3 Data",
3326            0x24 => "Track JIS Data",
3327            _ => "Reserved",
3328        }),
3329        // Camera Control
3330        0x90 => Cow::Borrowed(match usage {
3331            0x00 => "Undefined",
3332            0x20 => "Camera Auto-focus",
3333            0x21 => "Camera Shutter",
3334            _ => "Reserved",
3335        }),
3336        // Arcade
3337        0x91 => Cow::Borrowed(match usage {
3338            0x00 => "Undefined",
3339            0x01 => "General Purpose IO Card",
3340            0x02 => "Coin Door",
3341            0x03 => "Watchdog Timer",
3342            0x30 => "General Purpose Analog Input State",
3343            0x31 => "General Purpose Digital Input State",
3344            0x32 => "General Purpose Optical Input State",
3345            0x33 => "General Purpose Digital Output State",
3346            0x34 => "Number of Coin Doors",
3347            0x35 => "Coin Drawer Drop Count",
3348            0x36 => "Coin Drawer Start",
3349            0x37 => "Coin Drawer Service",
3350            0x38 => "Coin Drawer Tilt",
3351            0x39 => "Coin Door Test",
3352            0x40 => "Coin Door Lockout",
3353            0x41 => "Watchdog Timeout",
3354            0x42 => "Watchdog Action",
3355            0x43 => "Watchdog Reboot",
3356            0x44 => "Watchdog Restart",
3357            0x45 => "Alarm Input",
3358            0x46 => "Coin Door Counter",
3359            0x47 => "I/O Direction Mapping",
3360            0x48 => "Set I/O Direction Mapping",
3361            0x49 => "Extended Optical Input State",
3362            0x4A => "Pin Pad Input State",
3363            0x4B => "Pin Pad Status",
3364            0x4C => "Pin Pad Output",
3365            0x4D => "Pin Pad Command",
3366            _ => "Reserved",
3367        }),
3368        // Gaming Device
3369        0x92 => Cow::Borrowed(match usage {
3370            0x40 => "ACK",
3371            0x41 => "Enable",
3372            0x42 => "Disable",
3373            0x43 => "Self Test",
3374            0x44 => "Request GAT Report",
3375            0x47 => "Calculate CRC",
3376            0x210 => "Number of Note Data Entries",
3377            0x211 => "Read Note Table",
3378            0x212 => "Extend Timeout",
3379            0x213 => "Accept Note/Ticket",
3380            0x214 => "Return Note/Ticket",
3381            0x21A => "Read Note Acceptor Metrics",
3382            _ => "Reserved",
3383        }),
3384        // FIDO Alliance
3385        0xF1D0 => Cow::Borrowed(match usage {
3386            0x00 => "Undefined",
3387            0x01 => "U2F Authenticator Device",
3388            0x20 => "Input Report Data",
3389            0x21 => "Output Report Data",
3390            _ => "Reserved",
3391        }),
3392        _ => Cow::Borrowed(""),
3393    }
3394}
3395
3396impl Display for Usage {
3397    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3398        match &self.usage_page {
3399            Some(usage_page) => {
3400                let usage = __usage_format_helper(
3401                    __data_to_unsigned(self.data()),
3402                    __data_to_unsigned(usage_page.data()),
3403                );
3404                if usage.is_empty() {
3405                    write!(f, "Usage")
3406                } else {
3407                    write!(f, "Usage ({})", usage)
3408                }
3409            }
3410            None => write!(f, "Usage"),
3411        }
3412    }
3413}
3414
3415impl Display for UsageMinimum {
3416    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3417        match &self.usage_page {
3418            Some(usage_page) => {
3419                let usage = __usage_format_helper(
3420                    __data_to_unsigned(self.data()),
3421                    __data_to_unsigned(usage_page.data()),
3422                );
3423                if usage.is_empty() {
3424                    write!(f, "Usage Minimum")
3425                } else {
3426                    write!(f, "Usage Minimum ({})", usage)
3427                }
3428            }
3429            None => write!(f, "Usage Minimum"),
3430        }
3431    }
3432}
3433
3434impl Display for UsageMaximum {
3435    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3436        match &self.usage_page {
3437            Some(usage_page) => {
3438                let usage = __usage_format_helper(
3439                    __data_to_unsigned(self.data()),
3440                    __data_to_unsigned(usage_page.data()),
3441                );
3442                if usage.is_empty() {
3443                    write!(f, "Usage Maximum")
3444                } else {
3445                    write!(f, "Usage Maximum ({})", usage)
3446                }
3447            }
3448            None => write!(f, "Usage Maximum"),
3449        }
3450    }
3451}
3452
3453impl Display for DesignatorIndex {
3454    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3455        match self.data().len() {
3456            0 => write!(f, "Designator Index"),
3457            1.. => write!(f, "Designator Index ({})", __data_to_unsigned(self.data())),
3458        }
3459    }
3460}
3461
3462impl Display for DesignatorMinimum {
3463    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3464        match self.data().len() {
3465            0 => write!(f, "Designator Minimum"),
3466            1.. => write!(
3467                f,
3468                "Designator Minimum ({})",
3469                __data_to_unsigned(self.data())
3470            ),
3471        }
3472    }
3473}
3474
3475impl Display for DesignatorMaximum {
3476    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3477        match self.data().len() {
3478            0 => write!(f, "Designator Maximum"),
3479            1.. => write!(
3480                f,
3481                "Designator Maximum ({})",
3482                __data_to_unsigned(self.data())
3483            ),
3484        }
3485    }
3486}
3487
3488impl Display for StringIndex {
3489    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3490        match self.data().len() {
3491            0 => write!(f, "String Index"),
3492            1.. => write!(f, "String Index ({})", __data_to_unsigned(self.data())),
3493        }
3494    }
3495}
3496
3497impl Display for StringMinimum {
3498    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3499        match self.data().len() {
3500            0 => write!(f, "String Minimum"),
3501            1.. => write!(f, "String Minimum ({})", __data_to_unsigned(self.data())),
3502        }
3503    }
3504}
3505
3506impl Display for StringMaximum {
3507    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3508        match self.data().len() {
3509            0 => write!(f, "String Maximum"),
3510            1.. => write!(f, "String Maximum ({})", __data_to_unsigned(self.data())),
3511        }
3512    }
3513}
3514
3515impl Display for Delimiter {
3516    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3517        match self.data().len() {
3518            0 => write!(f, "Delimiter"),
3519            1.. => write!(f, "Delimiter ({})", __data_to_unsigned(self.data())),
3520        }
3521    }
3522}