File: data.py

package info (click to toggle)
solaar 1.1.19-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,936 kB
  • sloc: python: 26,935; sh: 444; xml: 158; makefile: 75
file content (1086 lines) | stat: -rw-r--r-- 57,667 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
# SPDX-License-Identifier: MIT

import enum

from typing import Any
from typing import Dict
from typing import List
from typing import Optional
from typing import Tuple


class _DataMeta(type):
    """
    This metaclass populates _single and _range, following the structure described bellow

    The class should declare data as follows

        MY_DATA_VALUE = 0x01, 'Data description'

    or, for ranges,

        MY_DATA_RANGE = 0x02, ..., 0x06, 'Data range description'

    _single and _range will then be populated with

        MY_DATA_VALUE = 0x01
        _single[0x01] = ('Data description', None)
        MY_DATA_RANGE = range(0x02, 0x06+1)
        _range.append(tuple(0x02, 0x06, ('Data range description', None)))

    As you can see, for single data insertions, the variable will be kept with
    the first value of the tuple. Both single and range data insertions will
    register the data into the correspondent data holders.

    You can also define subdata,

        MY_DATA_VALUE = 0x01, 'Data description', OTHER_DATA_TYPE
        MY_DATA_RANGE = 0x02, ..., 0x06, 'Data range description', YET_OTHER_DATA_TYPE

    Which will result in

        MY_DATA_VALUE = 0x01
        _single[0x01] = ('Data description', OTHER_DATA_TYPE)
        _range.append(tuple(0x02, 0x06, ('Data range description', YET_OTHER_DATA_TYPE)))

    This metaclass also does some verification to prevent duplicated data.
    """

    def __new__(mcs, name: str, bases: Tuple[Any], dic: Dict[str, Any]):  # type: ignore  # noqa: C901
        dic["_single"] = {}
        dic["_range"] = []

        # allow constructing data via a data dictionary as opposed to directly in the object body
        if "data" in dic:
            data = dic.pop("data")
        else:
            data = dic

        for attr in data:
            if not attr.startswith("_") and isinstance(data[attr], tuple):
                if len(data[attr]) == 2 or len(data[attr]) == 4:  # missing sub data
                    data[attr] = data[attr] + (None,)

                if len(data[attr]) == 3:  # single
                    num, desc, sub = data[attr]

                    if not isinstance(num, int):
                        raise TypeError(f"First element of '{attr}' should be an int")
                    if not isinstance(desc, str):
                        raise TypeError(f"Second element of '{attr}' should be a string")

                    if num in dic["_single"]:
                        raise ValueError(f"Duplicated value in '{attr}' ({num})")

                    for nmin, nmax, _ in dic["_range"]:
                        if nmin <= num <= nmax:
                            raise ValueError(f"Duplicated value in '{attr}' ({num})")

                    dic[attr] = num
                    dic["_single"][num] = desc, sub
                elif len(data[attr]) == 5:  # range
                    nmin, el, nmax, desc, sub = data[attr]

                    if not el == Ellipsis:
                        raise TypeError(f"Second element of '{attr}' should be an ellipsis (...)")
                    if not isinstance(nmin, int):
                        raise TypeError(f"First element of '{attr}' should be an int")
                    if not isinstance(nmax, int):
                        raise TypeError(f"Third element of '{attr}' should be an int")
                    if not isinstance(desc, str):
                        raise TypeError(f"Fourth element of '{attr}' should be a string")

                    for num in dic["_single"]:
                        if nmin <= num <= nmax:
                            raise ValueError(f"Duplicated value in '{attr}' ({num})")

                    dic[attr] = range(nmin, nmax + 1)
                    dic["_range"].append((nmin, nmax, (desc, sub)))

                else:
                    raise ValueError(f"Invalid field: {attr}")

        return super().__new__(mcs, name, bases, dic)


class _Data(metaclass=_DataMeta):
    """
    This class provides a get_description method to get data out of _single and _range.
    See the _DataMeta documentation for more information.
    """

    _DATA = Tuple[str, Optional[Any]]
    _single: Dict[int, _DATA]
    _range: List[Tuple[int, int, _DATA]]

    @classmethod
    def _get_data(cls, num: Optional[int]) -> _DATA:
        if num is None:
            raise KeyError("Data index is not an int")

        if num in cls._single:
            return cls._single[num]

        for nmin, nmax, data in cls._range:
            if nmin <= num <= nmax:
                return data

        raise KeyError(f"Data not found for index 0x{num:02x} in {cls.__name__}")

    @classmethod
    def get_description(cls, num: Optional[int]) -> str:
        return cls._get_data(num)[0]

    @classmethod
    def get_subdata(cls, num: Optional[int]) -> Any:
        subdata = cls._get_data(num)[1]

        if not subdata:
            raise ValueError("Sub-data not available")

        return subdata


class UsageTypes(enum.Enum):
    # controls
    LINEAR_CONTROL = LC = 0
    ON_OFF_CONTROL = OOC = 1
    MOMENTARY_CONTROL = MC = 2
    ONE_SHOT_CONTROL = OSC = 3
    RE_TRIGGER_CONTROL = RTC = 4
    # data
    SELECTOR = SEL = 5
    STATIC_VALUE = SV = 6
    STATIC_FLAG = SF = 7
    DYNAMIC_FLAG = DF = 8
    DYNAMIC_VALUE = DV = 9
    # collection
    NAMED_ARRAY = NARY = 10
    COLLECTION_APPLICATION = CA = 11
    COLLECTION_LOGICAL = CL = 12
    COLLECTION_PHYSICAL = CP = 13
    USAGE_SWITCH = US = 14
    USAGE_MODIFIER = UM = 15


UsageTypesControls = (
    UsageTypes.LINEAR_CONTROL,
    UsageTypes.ON_OFF_CONTROL,
    UsageTypes.ONE_SHOT_CONTROL,
    UsageTypes.RE_TRIGGER_CONTROL,
)


UsageTypesData = (
    UsageTypes.SELECTOR,
    UsageTypes.STATIC_VALUE,
    UsageTypes.STATIC_FLAG,
    UsageTypes.DYNAMIC_VALUE,
    UsageTypes.DYNAMIC_FLAG,
)


UsageTypesCollection = (
    UsageTypes.NAMED_ARRAY,
    UsageTypes.COLLECTION_APPLICATION,
    UsageTypes.COLLECTION_LOGICAL,
    UsageTypes.COLLECTION_PHYSICAL,
    UsageTypes.USAGE_SWITCH,
    UsageTypes.USAGE_MODIFIER,
)


class Collections(_Data):
    PHYSICAL = 0x00, "Physical"
    APPLICATION = 0x01, "Application"
    LOGICAL = 0x02, "Logical"
    REPORT = 0x03, "Report"
    NAMED_ARRAY = 0x04, "Named Array"
    USAGE_SWITCH = 0x05, "Usage Switch"
    USAGE_MODIFIER = 0x06, "Usage Modifier"
    VENDOR = 0x80, ..., 0xFF, "Vendor"


class GenericDesktopControls(_Data):
    POINTER = 0x01, "Pointer", UsageTypes.CP
    MOUSE = 0x02, "Mouse", UsageTypes.CA
    JOYSTICK = 0x04, "Joystick", UsageTypes.CA
    GAMEPAD = 0x05, "Game Pad", UsageTypes.CA
    KEYBOARD = 0x06, "Keyboard", UsageTypes.CA
    KEYPAD = 0x07, "Keypad", UsageTypes.CA
    MULTI_AXIS_CONTROLLER = 0x08, "Multi-axis Controller", UsageTypes.CA
    TABLET_PC_SYSTEM_CONTROLS = 0x09, "Tablet PC System Controls", UsageTypes.CA
    X = 0x30, "X", UsageTypes.DV
    Y = 0x31, "Y", UsageTypes.DV
    Z = 0x32, "Z", UsageTypes.DV
    RX = 0x33, "Rx", UsageTypes.DV
    RY = 0x34, "Ry", UsageTypes.DV
    RX = 0x35, "Rz", UsageTypes.DV
    SLIDER = 0x36, "Slider", UsageTypes.DV
    DIAL = 0x37, "Dial", UsageTypes.DV
    WHEEL = 0x38, "Wheel", UsageTypes.DV
    HAT_SWITCH = 0x39, "Hat switch", UsageTypes.DV
    COUNTED_BUFFER = 0x3A, "Counted Buffer", UsageTypes.CL
    BYTE_COUNT = 0x3B, "Byte Count", UsageTypes.DV
    MOTION_WAKEUP = 0x3C, "Motion Wakeup", UsageTypes.OSC
    START = 0x3D, "Start", UsageTypes.OOC
    SELECT = 0x3E, "Select", UsageTypes.OOC
    VX = 0x40, "Vx", UsageTypes.DV
    VY = 0x41, "Vy", UsageTypes.DV
    VZ = 0x42, "Vz", UsageTypes.DV
    VBRX = 0x43, "Vbrx", UsageTypes.DV
    VBRY = 0x44, "Vbry", UsageTypes.DV
    VBRZ = 0x45, "Vbrz", UsageTypes.DV
    VNO = 0x46, "Vno", UsageTypes.DV
    FEATURE_NOTIFICATION = 0x47, "Feature Notification", (UsageTypes.DV, UsageTypes.DF)
    RESOLUTION_MULTIPLIER = 0x48, "Resolution Multiplier", UsageTypes.DV
    SYSTEM_CONTROL = 0x80, "System Control", UsageTypes.CA
    SYSTEM_POWER_CONTROL = 0x81, "System Power Down", UsageTypes.OSC
    SYSTEM_SLEEP = 0x82, "System Sleep", UsageTypes.OSC
    SYSTEM_WAKE_UP = 0x83, "System Wake Up", UsageTypes.OSC
    SYSTEM_CONTEXT_MENU = 0x84, "System Context Menu", UsageTypes.OSC
    SYSTEM_MAIN_MENU = 0x85, "System Main Menu", UsageTypes.OSC
    SYSTEM_APP_MENU = 0x86, "System App Menu", UsageTypes.OSC
    SYSTEM_MENU_HELP = 0x87, "System Menu Help", UsageTypes.OSC
    SYSTEM_MENU_EXIT = 0x88, "System Menu Exit", UsageTypes.OSC
    SYSTEM_MENU_SELECT = 0x89, "System Menu Select", UsageTypes.OSC
    SYSTEM_MENU_RIGHT = 0x8A, "System Menu Right", UsageTypes.RTC
    SYSTEM_MENU_LEFT = 0x8B, "System Menu Left", UsageTypes.RTC
    SYSTEM_MENU_UP = 0x8C, "System Menu Up", UsageTypes.RTC
    SYSTEM_MENU_DOWN = 0x8D, "System Menu Down", UsageTypes.RTC
    SYSTEM_COLD_RESTART = 0x8E, "System Cold Restart", UsageTypes.OSC
    SYSTEM_WARM_RESTART = 0x8F, "System Warm Restart", UsageTypes.OSC
    DPAD_UP = 0x90, "D-pad Up", UsageTypes.OOC
    DPAD_DOWN = 0x91, "D-pad Down", UsageTypes.OOC
    DPAD_RIGHT = 0x92, "D-pad Right", UsageTypes.OOC
    DPAD_LEFT = 0x93, "D-pad Left", UsageTypes.OOC
    SYSTEM_DOCK = 0xA0, "System Dock", UsageTypes.OSC
    SYSTEM_UNDOCK = 0xA1, "System Undock", UsageTypes.OSC
    SYSTEM_SETUP = 0xA2, "System Setup", UsageTypes.OSC
    SYSTEM_BREAK = 0xA3, "System Break", UsageTypes.OSC
    SYSTEM_DEBBUGER_BREAK = 0xA4, "System Debugger Break", UsageTypes.OSC
    APPLICATION_BREAK = 0xA5, "Application Break", UsageTypes.OSC
    APPLICATION_DEBBUGER_BREAK = 0xA6, "Application Debugger Break", UsageTypes.OSC
    SYSTEM_SPEAKER_MUTE = 0xA7, "System Speaker Mute", UsageTypes.OSC
    SYSTEM_HIBERNATE = 0xA8, "System Hibernate", UsageTypes.OSC
    SYSTEM_DISPLAY_INVERT = 0xB0, "System Display Invert", UsageTypes.OSC
    SYSTEM_DISPLAY_INTERNAL = 0xB1, "System Display Internal", UsageTypes.OSC
    SYSTEM_DISPLAY_EXTERNAL = 0xB2, "System Display External", UsageTypes.OSC
    SYSTEM_DISPLAY_BOTH = 0xB3, "System Display Both", UsageTypes.OSC
    SYSTEM_DISPLAY_DUAL = 0xB4, "System Display Dual", UsageTypes.OSC
    SYSTEM_DISPLAY_TOGGLE = 0xB5, "System Display Toggle Int/Ext", UsageTypes.OSC
    SYSTEM_DISPLAY_SWAP = 0xB6, "System Display Swap Primary/Secondary", UsageTypes.OSC
    SYSTEM_DISPLAY_LCD_AUTOSCALE = 0xB7, "System Display LCD Autoscale", UsageTypes.OSC


class KeyboardKeypad(_Data):
    NO_EVENT = 0x00, "No event indicated", UsageTypes.SEL
    KEYBOARD_ERROR_ROLL_OVER = 0x01, "Keyboard ErrorRollOver", UsageTypes.SEL
    KEYBOARD_POST = 0x02, "Keyboard POSTFail", UsageTypes.SEL
    KEYBOARD_ERROR_UNDEFINED = 0x03, "Keyboard ErrorUndefined", UsageTypes.SEL
    KEYBOARD_A = 0x04, "Keyboard a and A", UsageTypes.SEL
    KEYBOARD_B = 0x05, "Keyboard b and B", UsageTypes.SEL
    KEYBOARD_C = 0x06, "Keyboard c and C", UsageTypes.SEL
    KEYBOARD_D = 0x07, "Keyboard d and D", UsageTypes.SEL
    KEYBOARD_E = 0x08, "Keyboard e and E", UsageTypes.SEL
    KEYBOARD_F = 0x09, "Keyboard f and F", UsageTypes.SEL
    KEYBOARD_G = 0x0A, "Keyboard g and G", UsageTypes.SEL
    KEYBOARD_H = 0x0B, "Keyboard h and H", UsageTypes.SEL
    KEYBOARD_I = 0x0C, "Keyboard i and I", UsageTypes.SEL
    KEYBOARD_J = 0x0D, "Keyboard j and J", UsageTypes.SEL
    KEYBOARD_K = 0x0E, "Keyboard k and K", UsageTypes.SEL
    KEYBOARD_L = 0x0F, "Keyboard l and L", UsageTypes.SEL
    KEYBOARD_M = 0x10, "Keyboard m and M", UsageTypes.SEL
    KEYBOARD_N = 0x11, "Keyboard n and N", UsageTypes.SEL
    KEYBOARD_O = 0x12, "Keyboard o and O", UsageTypes.SEL
    KEYBOARD_P = 0x13, "Keyboard p and P", UsageTypes.SEL
    KEYBOARD_Q = 0x14, "Keyboard q and Q", UsageTypes.SEL
    KEYBOARD_R = 0x15, "Keyboard r and R", UsageTypes.SEL
    KEYBOARD_S = 0x16, "Keyboard s and S", UsageTypes.SEL
    KEYBOARD_T = 0x17, "Keyboard t and T", UsageTypes.SEL
    KEYBOARD_U = 0x18, "Keyboard u and U", UsageTypes.SEL
    KEYBOARD_V = 0x19, "Keyboard v and V", UsageTypes.SEL
    KEYBOARD_W = 0x1A, "Keyboard w and W", UsageTypes.SEL
    KEYBOARD_X = 0x1B, "Keyboard x and X", UsageTypes.SEL
    KEYBOARD_Y = 0x1C, "Keyboard y and Y", UsageTypes.SEL
    KEYBOARD_Z = 0x1D, "Keyboard z and Z", UsageTypes.SEL
    KEYBOARD_1 = 0x1E, "Keyboard 1 and !", UsageTypes.SEL
    KEYBOARD_2 = 0x1F, "Keyboard 2 and @", UsageTypes.SEL
    KEYBOARD_3 = 0x20, "Keyboard 3 and #", UsageTypes.SEL
    KEYBOARD_4 = 0x21, "Keyboard 4 and $", UsageTypes.SEL
    KEYBOARD_5 = 0x22, "Keyboard 5 and %", UsageTypes.SEL
    KEYBOARD_6 = 0x23, "Keyboard 6 and ^", UsageTypes.SEL
    KEYBOARD_7 = 0x24, "Keyboard 7 and &", UsageTypes.SEL
    KEYBOARD_8 = 0x25, "Keyboard 8 and *", UsageTypes.SEL
    KEYBOARD_9 = 0x26, "Keyboard 9 and (", UsageTypes.SEL
    KEYBOARD_0 = 0x27, "Keyboard 0 and )", UsageTypes.SEL
    KEYBOARD_ENTER = 0x28, "Keyboard Return (ENTER)", UsageTypes.SEL
    KEYBOARD_ESCAPE = 0x29, "Keyboard ESCAPE", UsageTypes.SEL
    KEYBOARD_DELETE = 0x2A, "Keyboard DELETE (Backspace)", UsageTypes.SEL
    KEYBOARD_TAB = 0x2B, "Keyboard Tab", UsageTypes.SEL
    KEYBOARD_SPACEBAR = 0x2C, "Keyboard Spacebar", UsageTypes.SEL
    KEYBOARD_MINUS = 0x2D, "Keyboard - and (underscore)", UsageTypes.SEL
    KEYBOARD_PLUS = 0x2E, "Keyboard = and +", UsageTypes.SEL
    KEYBOARD_LEFT_BRACKET = 0x2F, "Keyboard [ and {", UsageTypes.SEL
    KEYBOARD_RIGHT_BRACKET = 0x30, "Keyboard ] and }", UsageTypes.SEL
    KEYBOARD_BACKSLASH = 0x31, "Keyboard \\ and |", UsageTypes.SEL
    KEYBOARD_CARDINAL = 0x32, "Keyboard Non-US # and ~", UsageTypes.SEL
    KEYBOARD_SEMICOLON = 0x33, "Keyboard ; and :", UsageTypes.SEL
    KEYBOARD_QUOTE = 0x34, "Keyboard ' and \"", UsageTypes.SEL
    KEYBOARD_GRAVE = 0x35, "Keyboard Grave Accent and Tilde", UsageTypes.SEL
    KEYBOARD_COMMA = 0x36, "Keyboard , and <", UsageTypes.SEL
    KEYBOARD_DOT = 0x37, "Keyboard . and >", UsageTypes.SEL
    KEYBOARD_SLASH = 0x38, "Keyboard / and ?", UsageTypes.SEL
    KEYBOARD_CAPS_LOCK = 0x39, "Keyboard Caps Lock", UsageTypes.SEL
    KEYBOARD_F1 = 0x3A, "Keyboard F1", UsageTypes.SEL
    KEYBOARD_F2 = 0x3B, "Keyboard F2", UsageTypes.SEL
    KEYBOARD_F3 = 0x3C, "Keyboard F3", UsageTypes.SEL
    KEYBOARD_F4 = 0x3D, "Keyboard F4", UsageTypes.SEL
    KEYBOARD_F5 = 0x3E, "Keyboard F5", UsageTypes.SEL
    KEYBOARD_F6 = 0x3F, "Keyboard F6", UsageTypes.SEL
    KEYBOARD_F7 = 0x40, "Keyboard F7", UsageTypes.SEL
    KEYBOARD_F8 = 0x41, "Keyboard F8", UsageTypes.SEL
    KEYBOARD_F9 = 0x42, "Keyboard F9", UsageTypes.SEL
    KEYBOARD_F10 = 0x43, "Keyboard F10", UsageTypes.SEL
    KEYBOARD_F11 = 0x44, "Keyboard F11", UsageTypes.SEL
    KEYBOARD_F12 = 0x45, "Keyboard F12", UsageTypes.SEL
    KEYBOARD_PRINTSCREEN = 0x46, "Keyboard PrintScreen", UsageTypes.SEL
    KEYBOARD_SCROLL_LOCK = 0x47, "Keyboard Scroll Lock", UsageTypes.SEL
    KEYBOARD_PAUSE = 0x48, "Keyboard Pause", UsageTypes.SEL
    KEYBOARD_INSERT = 0x49, "Keyboard Insert", UsageTypes.SEL
    KEYBOARD_HOME = 0x4A, "Keyboard Home", UsageTypes.SEL
    KEYBOARD_PAGE_UP = 0x4B, "Keyboard PageUp", UsageTypes.SEL
    KEYBOARD_DELETE_FORWARD = 0x4C, "Keyboard Delete Forward", UsageTypes.SEL
    KEYBOARD_END = 0x4D, "Keyboard End", UsageTypes.SEL
    KEYBOARD_PAGE_DOWN = 0x4E, "Keyboard PageDown", UsageTypes.SEL
    KEYBOARD_RIGHT_ARROW = 0x4F, "Keyboard RightArrow", UsageTypes.SEL
    KEYBOARD_LEFT_ARROW = 0x50, "Keyboard LeftArrow", UsageTypes.SEL
    KEYBOARD_UP_ARROW = 0x51, "Keyboard DownArrow", UsageTypes.SEL
    KEYBOARD_DOWN_ARROW = 0x52, "Keyboard UpArrow", UsageTypes.SEL
    KEYBOARD_NUM_LOCK = 0x53, "Keypad Num Lock and Clear", UsageTypes.SEL
    KEYPAD_SLASH = 0x54, "Keypad /", UsageTypes.SEL
    KEYPAD_ASTERISK = 0x55, "Keypad *", UsageTypes.SEL
    KEYPAD_MINUS = 0x56, "Keypad -", UsageTypes.SEL
    KEYPAD_PLUS = 0x57, "Keypad +", UsageTypes.SEL
    KEYPAD_ENTER = 0x58, "Keypad ENTER", UsageTypes.SEL
    KEYPAD_1 = 0x59, "Keypad 1 and End", UsageTypes.SEL
    KEYPAD_2 = 0x5A, "Keypad 2 and Down Arrow", UsageTypes.SEL
    KEYPAD_3 = 0x5B, "Keypad 3 and PageDn", UsageTypes.SEL
    KEYPAD_4 = 0x5C, "Keypad 4 and Left Arrow", UsageTypes.SEL
    KEYPAD_5 = 0x5D, "Keypad 5", UsageTypes.SEL
    KEYPAD_6 = 0x5E, "Keypad 6 and Right Arrow", UsageTypes.SEL
    KEYPAD_7 = 0x5F, "Keypad 7 and Home", UsageTypes.SEL
    KEYPAD_8 = 0x60, "Keypad 8 and Up Arrow", UsageTypes.SEL
    KEYPAD_9 = 0x61, "Keypad 9 and PageUp", UsageTypes.SEL
    KEYPAD_0 = 0x62, "Keypad 0 and Insert", UsageTypes.SEL
    KEYPAD_DOT = 0x63, "Keypad . and Delete", UsageTypes.SEL
    KEYPAD_BACKSLASH = 0x64, "Keyboard Non-US \\ and |", UsageTypes.SEL
    KEYPAD_APPLICATION = 0x65, "Keyboard Application", UsageTypes.SEL
    KEYPAD_POWER = 0x66, "Keyboard Power", UsageTypes.SEL
    KEYPAD_EQUALS = 0x67, "Keypad =", UsageTypes.SEL
    KEYBOARD_F13 = 0x68, "Keyboard F13", UsageTypes.SEL
    KEYBOARD_F14 = 0x69, "Keyboard F14", UsageTypes.SEL
    KEYBOARD_F15 = 0x6A, "Keyboard F15", UsageTypes.SEL
    KEYBOARD_F16 = 0x6B, "Keyboard F16", UsageTypes.SEL
    KEYBOARD_F17 = 0x6C, "Keyboard F17", UsageTypes.SEL
    KEYBOARD_F18 = 0x6D, "Keyboard F18", UsageTypes.SEL
    KEYBOARD_F19 = 0x6E, "Keyboard F19", UsageTypes.SEL
    KEYBOARD_F20 = 0x6F, "Keyboard F20", UsageTypes.SEL
    KEYBOARD_F21 = 0x70, "Keyboard F21", UsageTypes.SEL
    KEYBOARD_F22 = 0x71, "Keyboard F22", UsageTypes.SEL
    KEYBOARD_F23 = 0x72, "Keyboard F23", UsageTypes.SEL
    KEYBOARD_F24 = 0x73, "Keyboard F24", UsageTypes.SEL
    KEYBOARD_EXECUTE = 0x74, "Keyboard Execute", UsageTypes.SEL
    KEYBOARD_HELP = 0x75, "Keyboard Help", UsageTypes.SEL
    KEYBOARD_MENU = 0x76, "Keyboard Menu", UsageTypes.SEL
    KEYBOARD_SELECT = 0x77, "Keyboard Select", UsageTypes.SEL
    KEYBOARD_STOP = 0x78, "Keyboard Stop", UsageTypes.SEL
    KEYBOARD_AGAIN = 0x79, "Keyboard Again", UsageTypes.SEL
    KEYBOARD_UNDO = 0x7A, "Keyboard Undo", UsageTypes.SEL
    KEYBOARD_CUT = 0x7B, "Keyboard Cut", UsageTypes.SEL
    KEYBOARD_COPY = 0x7C, "Keyboard Copy", UsageTypes.SEL
    KEYBOARD_PASTE = 0x7D, "Keyboard Paste", UsageTypes.SEL
    KEYBOARD_FIND = 0x7E, "Keyboard Find", UsageTypes.SEL
    KEYBOARD_MUTE = 0x7F, "Keyboard Mute", UsageTypes.SEL
    KEYBOARD_VOLUME_UP = 0x80, "Keyboard Volume Up", UsageTypes.SEL
    KEYBOARD_VOLUME_DOWN = 0x81, "Keyboard Volume Down", UsageTypes.SEL
    KEYBOARD_LOCKING_CAPS_LOCK = 0x82, "Keyboard Locking Caps Lock", UsageTypes.SEL
    KEYBOARD_LOCKING_NUM_LOCK = 0x83, "Keyboard Locking Num Lock", UsageTypes.SEL
    KEYBOARD_LOCKING_SCROLL_LOCK = 0x84, "Keyboard Locking Scroll Lock", UsageTypes.SEL
    KEYPAD_COMMA = 0x85, "Keypad Comma", UsageTypes.SEL
    KEYPAD_EQUALS_SIGN = 0x86, "Keypad Equal Sign", UsageTypes.SEL
    KEYBOARD_INTERNATIONAL1 = 0x87, "Keyboard International1", UsageTypes.SEL
    KEYBOARD_INTERNATIONAL2 = 0x88, "Keyboard International2", UsageTypes.SEL
    KEYBOARD_INTERNATIONAL3 = 0x89, "Keyboard International3", UsageTypes.SEL
    KEYBOARD_INTERNATIONAL4 = 0x8A, "Keyboard International4", UsageTypes.SEL
    KEYBOARD_INTERNATIONAL5 = 0x8B, "Keyboard International5", UsageTypes.SEL
    KEYBOARD_INTERNATIONAL6 = 0x8C, "Keyboard International6", UsageTypes.SEL
    KEYBOARD_INTERNATIONAL7 = 0x8D, "Keyboard International7", UsageTypes.SEL
    KEYBOARD_INTERNATIONAL8 = 0x8E, "Keyboard International8", UsageTypes.SEL
    KEYBOARD_INTERNATIONAL9 = 0x8F, "Keyboard International9", UsageTypes.SEL
    KEYBOARD_LANG1 = 0x90, "Keyboard LANG1", UsageTypes.SEL
    KEYBOARD_LANG2 = 0x91, "Keyboard LANG2", UsageTypes.SEL
    KEYBOARD_LANG3 = 0x92, "Keyboard LANG3", UsageTypes.SEL
    KEYBOARD_LANG4 = 0x93, "Keyboard LANG4", UsageTypes.SEL
    KEYBOARD_LANG5 = 0x94, "Keyboard LANG5", UsageTypes.SEL
    KEYBOARD_LANG6 = 0x95, "Keyboard LANG6", UsageTypes.SEL
    KEYBOARD_LANG7 = 0x96, "Keyboard LANG7", UsageTypes.SEL
    KEYBOARD_LANG8 = 0x97, "Keyboard LANG8", UsageTypes.SEL
    KEYBOARD_LANG9 = 0x98, "Keyboard LANG9", UsageTypes.SEL
    KEYBOARD_ALTERNATE_ERASE = 0x99, "Keyboard Alternate Erase", UsageTypes.SEL
    KEYBOARD_SYSREQ_ATTENTION = 0x9A, "Keyboard SysReq/Attention", UsageTypes.SEL
    KEYBOARD_CANCEL = 0x9B, "Keyboard Cancel", UsageTypes.SEL
    KEYBOARD_CLEAR = 0x9C, "Keyboard Clear", UsageTypes.SEL
    KEYBOARD_PRIOR = 0x9D, "Keyboard Prior", UsageTypes.SEL
    KEYBOARD_RETURN = 0x9E, "Keyboard Return", UsageTypes.SEL
    KEYBOARD_SEPARATOE = 0x9F, "Keyboard Separator", UsageTypes.SEL
    KEYBOARD_OUT = 0xA0, "Keyboard Out", UsageTypes.SEL
    KEYBOARD_OPER = 0xA1, "Keyboard Oper", UsageTypes.SEL
    KEYBOARD_CLEAR_AGAIN = 0xA2, "Keyboard Clear/Again", UsageTypes.SEL
    KEYBOARD_CRSEL_PROPS = 0xA3, "Keyboard CrSel/Props", UsageTypes.SEL
    KEYBOARD_EXSELL = 0xA4, "Keyboard ExSel", UsageTypes.SEL
    KEYPAD_ZERO_ZERO = 0xB0, "Keypad 00", UsageTypes.SEL
    KEYPAD_ZERO_ZERO_ZERO = 0xB1, "Keypad 000", UsageTypes.SEL
    THOUSANDS_SEPARATOR = 0xB2, "Thousands Separator", UsageTypes.SEL
    DECIMAL_SEPARATOR = 0xB3, "Decimal Separator", UsageTypes.SEL
    CURRENCY_UNIT = 0xB4, "Currency Unit", UsageTypes.SEL
    CURRENCY_SUBUNIT = 0xB5, "Currency Sub-unit", UsageTypes.SEL
    KEYPAD_LEFT_PARENTHESIS = 0xB6, "Keypad (", UsageTypes.SEL
    KEYPAD_RIGHT_PARENTHESIS = 0xB7, "Keypad )", UsageTypes.SEL
    KEYPAD_LEFT_CURLY_BRACKET = 0xB8, "Keypad {", UsageTypes.SEL
    KEYPAD_RIGHT_CURLY_BRACKET = 0xB9, "Keypad }", UsageTypes.SEL
    KEYPAD_TAB = 0xBA, "Keypad Tab", UsageTypes.SEL
    KEYPAD_BACKSPACE = 0xBB, "Keypad Backspace", UsageTypes.SEL
    KEYPAD_A = 0xBC, "Keypad A", UsageTypes.SEL
    KEYPAD_B = 0xBD, "Keypad B", UsageTypes.SEL
    KEYPAD_C = 0xBE, "Keypad C", UsageTypes.SEL
    KEYPAD_D = 0xBF, "Keypad D", UsageTypes.SEL
    KEYPAD_E = 0xC0, "Keypad E", UsageTypes.SEL
    KEYPAD_F = 0xC1, "Keypad F", UsageTypes.SEL
    KEYPAD_XOR = 0xC2, "Keypad XOR", UsageTypes.SEL
    KEYPAD_AND = 0xC3, "Keypad ^", UsageTypes.SEL
    KEYPAD_PERCENTAGE = 0xC4, "Keypad %", UsageTypes.SEL
    KEYPAD_LESS_THAN = 0xC5, "Keypad <", UsageTypes.SEL
    KEYPAD_MORE_THAN = 0xC6, "Keypad >", UsageTypes.SEL
    KEYPAD_AMPERSAND = 0xC7, "Keypad &", UsageTypes.SEL
    KEYPAD_2_AMPERSAND = 0xC8, "Keypad &&", UsageTypes.SEL
    KEYPAD_VERTICAL_BAR = 0xC9, "Keypad |", UsageTypes.SEL
    KEYPAD_2_VERTICAL_BAR = 0xCA, "Keypad ||", UsageTypes.SEL
    KEYPAD_COLON = 0xCB, "Keypad :", UsageTypes.SEL
    KEYPAD_CARDINAL = 0xCC, "Keypad #", UsageTypes.SEL
    KEYPAD_SPACE = 0xCD, "Keypad Space", UsageTypes.SEL
    KEYPAD_AT = 0xCE, "Keypad @", UsageTypes.SEL
    KEYPAD_EXCLAMATION = 0xCF, "Keypad !", UsageTypes.SEL
    KEYPAD_MEMORY_STORE = 0xD0, "Keypad Memory Store", UsageTypes.SEL
    KEYPAD_MEMORY_RECALL = 0xD1, "Keypad Memory Recall", UsageTypes.SEL
    KEYPAD_MEMORY_CLEAR = 0xD2, "Keypad Memory Clear", UsageTypes.SEL
    KEYPAD_MEMORY_ADD = 0xD3, "Keypad Memory Add", UsageTypes.SEL
    KEYPAD_MEMORY_SUBTRACT = 0xD4, "Keypad Memory Subtract", UsageTypes.SEL
    KEYPAD_MEMORY_MULTIPLY = 0xD5, "Keypad Memory Multiply", UsageTypes.SEL
    KEYPAD_MEMORY_DIVIDE = 0xD6, "Keypad Memory Divide", UsageTypes.SEL
    KEYPAD_PLUS_MINUS = 0xD7, "Keypad +/-", UsageTypes.SEL
    KEYPAD_CLEAR = 0xD8, "Keypad Clear", UsageTypes.SEL
    KEYPAD_CLEAR_ENTRY = 0xD9, "Keypad Clear Entry", UsageTypes.SEL
    KEYPAD_BINARY = 0xDA, "Keypad Binary", UsageTypes.SEL
    KEYPAD_OCTAL = 0xDB, "Keypad Octal", UsageTypes.SEL
    KEYPAD_DECIMAL = 0xDC, "Keypad Decimal", UsageTypes.SEL
    KEYPAD_HEXADECIMAL = 0xDD, "Keypad Hexadecimal", UsageTypes.DV
    KEYBOARD_LEFT_CONTROL = 0xE0, "Keyboard LeftControl", UsageTypes.DV
    KEYBOARD_LEFT_SHIFT = 0xE1, "Keyboard LeftShift", UsageTypes.DV
    KEYBOARD_LEFT_ALT = 0xE2, "Keyboard LeftAlt", UsageTypes.DV
    KEYBOARD_LEFT_GUI = 0xE3, "Keyboard Left GUI", UsageTypes.DV
    KEYBOARD_RIGHT_CONTROL = 0xE4, "Keyboard RightControl", UsageTypes.DV
    KEYBOARD_RIGHT_SHIFT = 0xE5, "Keyboard RightShift", UsageTypes.DV
    KEYBOARD_RIGHT_ALT = 0xE6, "Keyboard RightAlt", UsageTypes.DV
    KEYBOARD_RIGHT_GUI = 0xE7, "Keyboard Right GUI", UsageTypes.DV


class Led(_Data):
    NUM_LOCK = 0x01, "Num Lock", UsageTypes.OOC
    CAPS_LOCK = 0x02, "Caps Lock", UsageTypes.OOC
    SCROLL_LOCK = 0x03, "Scroll Lock", UsageTypes.OOC
    COMPOSE = 0x04, "Compose", UsageTypes.OOC
    KANA = 0x05, "Kana", UsageTypes.OOC
    POWER = 0x06, "Power", UsageTypes.OOC
    SHIFT = 0x07, "Shift", UsageTypes.OOC
    DO_NOT_DISTURB = 0x08, "Do Not Disturb", UsageTypes.OOC
    MUTE = 0x09, "Mute", UsageTypes.OOC
    TONE_ENABLE = 0x0A, "Tone Enable", UsageTypes.OOC
    HIGH_CUT_FILTER = 0x0B, "High Cut Filter", UsageTypes.OOC
    LOW_CUT_FILTER = 0x0C, "Low Cut Filter", UsageTypes.OOC
    EQUALIZER_ENABLE = 0x0D, "Equalizer Enable", UsageTypes.OOC
    SOUND_FIELD_ON = 0x0E, "Sound Field On", UsageTypes.OOC
    SURROUND_ON = 0x0F, "Surround On", UsageTypes.OOC
    REPEAR = 0x10, "Repeat", UsageTypes.OOC
    STEREO = 0x11, "Stereo", UsageTypes.OOC
    SAMPLING_RATE_DETECT = 0x12, "Sampling Rate Detect", UsageTypes.OOC
    SPINNING = 0x13, "Spinning", UsageTypes.OOC
    CAV = 0x14, "CAV", UsageTypes.OOC
    CLV = 0x15, "CLV", UsageTypes.OOC
    RECORDING_FORMAT_DETECT = 0x16, "Recording Format Detect", UsageTypes.OOC
    OFF_HOOK = 0x17, "Off-Hook", UsageTypes.OOC
    RING = 0x18, "Ring", UsageTypes.OOC
    MESSAGE_WAITING = 0x19, "Message Waiting", UsageTypes.OOC
    DATA_MODE = 0x1A, "Data Mode", UsageTypes.OOC
    BATTERY_OPERATION = 0x1B, "Battery Operation", UsageTypes.OOC
    BATTERY_OK = 0x1C, "Battery OK", UsageTypes.OOC
    BATTERY_LOW = 0x1D, "Battery Low", UsageTypes.OOC
    SPEAKER = 0x1E, "Speaker", UsageTypes.OOC
    HEAD_SET = 0x1F, "Head Set", UsageTypes.OOC
    HOLD = 0x20, "Hold", UsageTypes.OOC
    MICROPHONE = 0x21, "Microphone", UsageTypes.OOC
    COVERAGE = 0x22, "Coverage", UsageTypes.OOC
    NIGHT_MODE = 0x23, "Night Mode", UsageTypes.OOC
    SEND_CALLS = 0x24, "Send Calls", UsageTypes.OOC
    CALL_PICKUP = 0x25, "Call Pickup", UsageTypes.OOC
    CONFERENCE = 0x26, "Conference", UsageTypes.OOC
    STAND_BY = 0x27, "Stand-by", UsageTypes.OOC
    CAMERA_ON = 0x28, "Camera On", UsageTypes.OOC
    CAMERA_OFF = 0x29, "Camera Off", UsageTypes.OOC
    ON_LINE = 0x2A, "On-Line", UsageTypes.OOC
    OFF_LINE = 0x2B, "Off-Line", UsageTypes.OOC
    BUSY = 0x2C, "Busy", UsageTypes.OOC
    READY = 0x2D, "Ready", UsageTypes.OOC
    PAPER_OUT = 0x2E, "Paper-Out", UsageTypes.OOC
    PAPER_JAM = 0x2F, "Paper-Jam", UsageTypes.OOC
    REMOTE = 0x30, "Remote", UsageTypes.OOC
    FORWARD = 0x31, "Forward", UsageTypes.OOC
    REVERSE = 0x32, "Reverse", UsageTypes.OOC
    STOP = 0x33, "Stop", UsageTypes.OOC
    REWIND = 0x34, "Rewind", UsageTypes.OOC
    FAST_FORWARD = 0x35, "Fast Forward", UsageTypes.OOC
    PLAY = 0x36, "Play", UsageTypes.OOC
    PAUSE = 0x37, "Pause", UsageTypes.OOC
    RECORD = 0x38, "Record", UsageTypes.OOC
    ERROR = 0x39, "Error", UsageTypes.OOC
    USAGE_SELECTED_INDICATOR = 0x3A, "Usage Selected Indicator", UsageTypes.US
    USAGE_IN_USE_INDICATOR = 0x3B, "Usage In Use Indicator", UsageTypes.US
    USAGE_MULTI_MODE_INDICATOR = 0x3C, "Usage Multi Mode Indicator", UsageTypes.UM
    INDICATOR_ON = 0x3D, "Indicator On", UsageTypes.SEL
    INDICATOR_FLASH = 0x3E, "Indicator Flash", UsageTypes.SEL
    INDICATOR_SLOW_BLINK = 0x3F, "Indicator Slow Blink", UsageTypes.SEL
    INDICATOR_FAST_BLINK = 0x40, "Indicator Fast Blink", UsageTypes.SEL
    INDICATOR_OFF = 0x41, "Indicator Off", UsageTypes.SEL
    FLASH_ON_TIME = 0x42, "Flash On Time", UsageTypes.DV
    SLOW_BLINK_ON_TIME = 0x43, "Slow Blink On Time", UsageTypes.DV
    SLOW_BLINK_OFF_TIME = 0x44, "Slow Blink Off Time", UsageTypes.DV
    FAST_BLINK_ON_TIME = 0x45, "Fast Blink On Time", UsageTypes.DV
    FAST_BLINK_OFF_TIME = 0x46, "Fast Blink Off Time", UsageTypes.DV
    USAGE_INDICATOR_COLOR = 0x47, "Usage Indicator Color", UsageTypes.UM
    INDICATOR_RED = 0x48, "Indicator Red", UsageTypes.SEL
    INDICATOR_GREEN = 0x49, "Indicator Green", UsageTypes.SEL
    INDICATOR_AMBER = 0x4A, "Indicator Amber", UsageTypes.SEL
    GENERIC_INDICATOR = 0x4B, "Generic Indicator", UsageTypes.OOC
    SYSTEM_SUSPEND = 0x4C, "System Suspend", UsageTypes.OOC
    EXTERNAL_POWER_CONNECTED = 0x4D, "External Power Connected", UsageTypes.OOC


class Button(_Data):
    _USAGE_TYPES = (
        UsageTypes.SEL,
        UsageTypes.OOC,
        UsageTypes.MC,
        UsageTypes.OSC,
    )

    data = {
        "NO_BUTTON": (0x0000, "Button 1 (primary/trigger)", _USAGE_TYPES),
        "BUTTON_1": (0x0001, "Button 1 (primary/trigger)", _USAGE_TYPES),
        "BUTTON_2": (0x0002, "Button 2 (secondary)", _USAGE_TYPES),
        "BUTTON_3": (0x0003, "Button 3 (tertiary)", _USAGE_TYPES),
    }

    for _i in range(0x0004, 0xFFFF):
        data[f"BUTTON_{_i}"] = _i, f"Button {_i}", _USAGE_TYPES


class Consumer(_Data):
    CONSUMER_CONTROL = 0x0001, "Consumer Control", UsageTypes.CA
    NUMERIC_KEY_PAD = 0x0002, "Numeric Key Pad", UsageTypes.NARY
    PROGRAMMABLE_BUTTONS = 0x0003, "Programmable Buttons", UsageTypes.NARY
    MICROPHONE = 0x0004, "Microphone", UsageTypes.CA
    HEADPHONE = 0x0005, "Headphone", UsageTypes.CA
    GRAPHIC_EQUALIZER = 0x0006, "Graphic Equalizer", UsageTypes.CA
    PLUS10 = 0x0020, "+10", UsageTypes.OSC
    PULS100 = 0x0021, "+100", UsageTypes.OSC
    AM_PM = 0x0022, "AM/PM", UsageTypes.OSC
    POWER = 0x0030, "Power", UsageTypes.OOC
    REST = 0x0031, "Reset", UsageTypes.OSC
    SLEEP = 0x0032, "Sleep", UsageTypes.OSC
    SLEEP_AFTER = 0x0033, "Sleep After", UsageTypes.OSC
    SLEEP_MODE = 0x0034, "Sleep Mode", UsageTypes.RTC
    ILLUMINATION = 0x0035, "Illumination", UsageTypes.OOC
    FUNCTION_BUTTONS = 0x0036, "Function Buttons", UsageTypes.NARY
    MENU = 0x0040, "Menu", UsageTypes.OOC
    MENU_PICK = 0x0041, "Menu Pick", UsageTypes.OSC
    MENU_UP = 0x0042, "Menu Up", UsageTypes.OSC
    MENU_DOWN = 0x0043, "Menu Down", UsageTypes.OSC
    MENU_LEFT = 0x0044, "Menu Left", UsageTypes.OSC
    MENU_RIGHT = 0x0045, "Menu Right", UsageTypes.OSC
    MENU_ESCAPE = 0x0046, "Menu Escape", UsageTypes.OSC
    MENU_VALUE_INCREASE = 0x0047, "Menu Value Increase", UsageTypes.OSC
    MENU_VALUE_DECREASE = 0x0048, "Menu Value Decrease", UsageTypes.OSC
    DATA_ON_SCREEN = 0x0060, "Data On Screen", UsageTypes.OOC
    CLOSED_CAPTION = 0x0061, "Closed Caption", UsageTypes.OOC
    CLOSED_CAPTION_SELECT = 0x0062, "Closed Caption Select", UsageTypes.OOC
    VCR_TV = 0x0063, "VCR/TV", UsageTypes.OSC
    BROADCAST_MODE = 0x0064, "Broadcast Mode", UsageTypes.OOC
    SNAPSHOT = 0x0065, "Snapshot", UsageTypes.OOC
    STILL = 0x0066, "Still", UsageTypes.OOC
    SELECTION = 0x0080, "Selection", UsageTypes.NARY
    ASSIGN_SELECTION = 0x0081, "Assign Selection", UsageTypes.OSC
    MODE_STEP = 0x0082, "Mode Step", UsageTypes.OSC
    RECALL_LAST = 0x0083, "Recall Last", UsageTypes.OSC
    ENTER_CHANNEL = 0x0084, "Enter Channel", UsageTypes.OSC
    ORDER_MOVIE = 0x0085, "Order Movie", UsageTypes.OSC
    CHANNEL = 0x0086, "Channel", UsageTypes.LC
    MEDIA_SELECTION = 0x0087, "Media Selection", UsageTypes.NARY
    MEDIA_SELECT_COMPUTER = 0x0088, "Media Select Computer", UsageTypes.SEL
    MEDIA_SELECT_TV = 0x0089, "Media Select TV", UsageTypes.SEL
    MEDIA_SELECT_WWW = 0x008A, "Media Select WWW", UsageTypes.SEL
    MEDIA_SELECT_DVD = 0x008B, "Media Select DVD", UsageTypes.SEL
    MEDIA_SELECT_TELEPHONE = 0x008C, "Media Select Telephone", UsageTypes.SEL
    MEDIA_SELECT_PROGRAM_GUIDE = 0x008D, "Media Select Program Guide", UsageTypes.SEL
    MEDIA_SELECT_VIDEO_PHONE = 0x008E, "Media Select Video Phone", UsageTypes.SEL
    MEDIA_SELECT_GAMES = 0x008F, "Media Select Games", UsageTypes.SEL
    MEDIA_SELECT_MESSAGES = 0x0090, "Media Select Messages", UsageTypes.SEL
    MEDIA_SELECT_CD = 0x0091, "Media Select CD ", UsageTypes.SEL
    MEDIA_SELECT_VCR = 0x0092, "Media Select VCR", UsageTypes.SEL
    MEDIA_SELECT_TUNER = 0x0093, "Media Select Tuner", UsageTypes.SEL
    QUIT = 0x0094, "Quit", UsageTypes.OSC
    HELP = 0x0095, "Help", UsageTypes.OOC
    MEDIA_SELECT_TAPE = 0x0096, "Media Select Tape", UsageTypes.SEL
    MEDIA_SELECT_CABLE = 0x0097, "Media Select Cable", UsageTypes.SEL
    MEDIA_SELECT_SATELLITE = 0x0098, "Media Select Satellite", UsageTypes.SEL
    MEDIA_SELECT_SECURITY = 0x0099, "Media Select Security", UsageTypes.SEL
    MEDIA_SELECT_HOME = 0x009A, "Media Select Home", UsageTypes.SEL
    MEDIA_SELECT_CALL = 0x009B, "Media Select Call", UsageTypes.SEL
    CHANNEL_INCREMENT = 0x009C, "Channel Increment", UsageTypes.OSC
    CHANNEL_DECREMENT = 0x009D, "Channel Decrement", UsageTypes.OSC
    MEDIA_SELECT_SAP = 0x009E, "Media Select SAP", UsageTypes.SEL
    VCR_PLUS = 0x00A0, "VCR Plus", UsageTypes.OSC
    ONCE = 0x00A1, "Once", UsageTypes.OSC
    DAILY = 0x00A2, "Daily", UsageTypes.OSC
    WEEKLY = 0x00A3, "Weekly", UsageTypes.OSC
    MONTHLY = 0x00A4, "Monthly", UsageTypes.OSC
    PLAY = 0x00B0, "Play", UsageTypes.OOC
    PAUSE = 0x00B1, "Pause", UsageTypes.OOC
    RECORD = 0x00B2, "Record", UsageTypes.OOC
    FAST_FORWARD = 0x00B3, "Fast Forward", UsageTypes.OOC
    REWIND = 0x00B4, "Rewind", UsageTypes.OOC
    SCAN_NEXT_TRACK = 0x00B5, "Scan Next Track", UsageTypes.OSC
    SCAN_PREVIOUS_TRACK = 0x00B6, "Scan Previous Track", UsageTypes.OSC
    STOP = 0x00B7, "Stop", UsageTypes.OSC
    EJECT = 0x00B8, "Eject", UsageTypes.OSC
    RANDOM_PLAY = 0x00B9, "Random Play", UsageTypes.OOC
    SELECT_DISC = 0x00BA, "Select Disc", UsageTypes.NARY
    ENTER_DISC = 0x00BB, "Enter Disc", UsageTypes.MC
    REPEAT = 0x00BC, "Repeat", UsageTypes.OSC
    TRACKING = 0x00BD, "Tracking", UsageTypes.LC
    TRACK_NORMAL = 0x00BE, "Track Normal", UsageTypes.OSC
    SLOW_TRACKING = 0x00BF, "Slow Tracking", UsageTypes.LC
    FRAME_FORWARD = 0x00C0, "Frame Forward", UsageTypes.RTC
    FRAME_BACK = 0x00C1, "Frame Back", UsageTypes.RTC
    MARK = 0x00C2, "Mark", UsageTypes.OSC
    CLEAR_MARK = 0x00C3, "Clear Mark", UsageTypes.OSC
    REPEAT_FROM_MARK = 0x00C4, "Repeat From Mark", UsageTypes.OOC
    RETURN_TO_MARK = 0x00C5, "Return To Mark", UsageTypes.OSC
    SEARCH_MARK_FORWARD = 0x00C6, "Search Mark Forward", UsageTypes.OSC
    SEARCH_MARK_BACKWARDS = 0x00C7, "Search Mark Backwards", UsageTypes.OSC
    COUNTER_RESET = 0x00C8, "Counter Reset", UsageTypes.OSC
    SHOW_COUNTER = 0x00C9, "Show Counter", UsageTypes.OSC
    TRACKING_INCREMENT = 0x00CA, "Tracking Increment", UsageTypes.RTC
    TRACKING_DECREMENT = 0x00CB, "Tracking Decrement", UsageTypes.RTC
    STOP_EJECT = 0x00CC, "Stop/Eject", UsageTypes.OSC
    PLAY_PAUSE = 0x00CD, "Play/Pause", UsageTypes.OSC
    PLAY_SKIP = 0x00CE, "Play/Skip", UsageTypes.OSC
    VOLUME = 0x00E0, "Volume", UsageTypes.LC
    BALANCE = 0x00E1, "Balance", UsageTypes.LC
    MUTE = 0x00E2, "Mute", UsageTypes.OOC
    BASS = 0x00E3, "Bass", UsageTypes.LC
    TREBLE = 0x00E4, "Treble", UsageTypes.LC
    BASS_BOOST = 0x00E5, "Bass Boost", UsageTypes.OOC
    SURROUND_MODE = 0x00E6, "Surround Mode", UsageTypes.OSC
    LOUDNESS = 0x00E7, "Loudness", UsageTypes.OOC
    MPX = 0x00E8, "MPX", UsageTypes.OOC
    VOLUME_INCREMENT = 0x00E9, "Volume Increment", UsageTypes.RTC
    VOLUME_DECREMENT = 0x00EA, "Volume Decrement", UsageTypes.RTC
    SPEED_SELECT = 0x00F0, "Speed Select", UsageTypes.OSC
    PLAYBACK_SPEED = 0x00F1, "Playback Speed", UsageTypes.NARY
    STANDARD_PLAY = 0x00F2, "Standard Play", UsageTypes.SEL
    LONG_PLAY = 0x00F3, "Long Play", UsageTypes.SEL
    EXTENDED_PLAY = 0x00F4, "Extended Play", UsageTypes.SEL
    SLOW = 0x00F5, "Slow", UsageTypes.OSC
    FAN_ENABLE = 0x0100, "Fan Enable", UsageTypes.OOC
    FAN_SPEED = 0x0101, "Fan Speed", UsageTypes.LC
    LIGHT_ENABLE = 0x0102, "Light Enable", UsageTypes.OOC
    LIGHT_ILLUMINATION_LEVEL = 0x0103, "Light Illumination Level", UsageTypes.LC
    CLIMATE_CONTROL_ENABLE = 0x0104, "Climate Control Enable", UsageTypes.OOC
    ROOM_TEMPERATURE = 0x0105, "Room Temperature", UsageTypes.LC
    SECURITY_ENABLE = 0x0106, "Security Enable", UsageTypes.OOC
    FIRE_ALARM = 0x0107, "Fire Alarm", UsageTypes.OSC
    POLICE_ALARM = 0x0108, "Police Alarm", UsageTypes.OSC
    PROXIMITY = 0x0109, "Proximity", UsageTypes.LC
    MOTION = 0x010A, "Motion", UsageTypes.OSC
    DURESS_ALARM = 0x010B, "Duress Alarm", UsageTypes.OSC
    HOLDUP_ALARM = 0x010C, "Holdup Alarm", UsageTypes.OSC
    MEDICAL_ALARM = 0x010D, "Medical Alarm", UsageTypes.OSC
    BALANCE_RIGHT = 0x0150, "Balance Right", UsageTypes.RTC
    BALANCE_LEFT = 0x0151, "Balance Left", UsageTypes.RTC
    BASS_INCREMENT = 0x0152, "Bass Increment", UsageTypes.RTC
    BASS_DECREMENT = 0x0153, "Bass Decrement", UsageTypes.RTC
    TREBLE_INCREMENT = 0x0154, "Treble Increment", UsageTypes.RTC
    TREBLE_DECREMENT = 0x0155, "Treble Decrement", UsageTypes.RTC
    SPEAKER_SYSTEM = 0x0160, "Speaker System", UsageTypes.CL
    CHANNEL_LEFT = 0x0161, "Channel Left", UsageTypes.CL
    CHANNEL_RIGHT = 0x0162, "Channel Right", UsageTypes.CL
    CHANNEL_CENTER = 0x0163, "Channel Center", UsageTypes.CL
    CHANNEL_FRONT = 0x0164, "Channel Front", UsageTypes.CL
    CHANNEL_CENTER_FRONT = 0x0165, "Channel Center Front", UsageTypes.CL
    CHANNEL_SIDE = 0x0166, "Channel Side", UsageTypes.CL
    CHANNEL_SURROUND = 0x0167, "Channel Surround", UsageTypes.CL
    CHANNEL_LOW_FREQUENCY_ENHANCEMENT = 0x0168, "Channel Low Frequency Enhancement", UsageTypes.CL
    CHANNEL_TOP = 0x0169, "Channel Top", UsageTypes.CL
    CHANNEL_UNKNOWN = 0x016A, "Channel Unknown", UsageTypes.CL
    SUBCHANNEL = 0x0170, "Sub-channel", UsageTypes.LC
    SUBCHANNEL_INCREMENT = 0x0171, "Sub-channel Increment", UsageTypes.OSC
    SUBCHANNEL_DECREMENT = 0x0172, "Sub-channel Decrement", UsageTypes.OSC
    ALTERNATE_AUDIO_INCREMENT = 0x0173, "Alternate Audio Increment", UsageTypes.OSC
    ALTERNATE_AUDIO_DECREMENT = 0x0174, "Alternate Audio Decrement", UsageTypes.OSC
    APPLICATION_LAUNCH_BUTTONS = 0x0180, "Application Launch Buttons", UsageTypes.NARY
    AL_LAUCH_BUTTON_CONFIGURATION_TOOL = 0x0181, "AL Launch Button Configuration Tool", UsageTypes.SEL
    AL_PROGRAMMABLE_BUTTON_CONFIGURATION = 0x0182, "AL Programmable Button Configuration", UsageTypes.SEL
    AL_CONSUMER_CONTROL_CONFIGURATION = 0x0183, "AL Consumer Control Configuration", UsageTypes.SEL
    AL_WORD_PROCESSOR = 0x0184, "AL Word Processor", UsageTypes.SEL
    AL_TEXT_EDITOR = 0x0185, "AL Text Editor", UsageTypes.SEL
    AL_SPREADSHEET = 0x0186, "AL Spreadsheet", UsageTypes.SEL
    AL_GRAPHICS_EDITOR = 0x0187, "AL Graphics Editor", UsageTypes.SEL
    AL_PRESENTATION_APP = 0x0188, "AL Presentation App", UsageTypes.SEL
    AL_DATABASE_APP = 0x0189, "AL Database App", UsageTypes.SEL
    AL_EMAIL_READER = 0x018A, "AL Email Reader", UsageTypes.SEL
    AL_NEWSREADER = 0x018B, "AL Newsreader", UsageTypes.SEL
    AL_VOICEMAIL = 0x018C, "AL Voicemail", UsageTypes.SEL
    AL_CONTACTS_ADDRESS_BOOK = 0x018D, "AL Contacts/Address Book", UsageTypes.SEL
    AL_CALENDAR_SCHEDULE = 0x018E, "AL Calendar/Schedule", UsageTypes.SEL
    AL_TASK_PROJECT_MANAGER = 0x018F, "AL Task/Project Manager", UsageTypes.SEL
    AL_LOG_JOURNAL_TIMECARD = 0x0190, "AL Log/Journal/Timecard", UsageTypes.SEL
    AL_CHECKBOOK_FINANCE = 0x0191, "AL Checkbook/Finance", UsageTypes.SEL
    AL_CALCULATOR = 0x0192, "AL Calculator", UsageTypes.SEL
    AL_AV_CAPTURE_PLAYBACK = 0x0193, "AL A/V Capture/Playback", UsageTypes.SEL
    AL_LOCAL_MACHINE_BROWSER = 0x0194, "AL Local Machine Browser", UsageTypes.SEL
    AL_LAN_WAN_BROWSER = 0x0195, "AL LAN/WAN Browser", UsageTypes.SEL
    AL_INTERNET_BROWSER = 0x0196, "AL Internet Browser", UsageTypes.SEL
    AL_REMOTE_NETWORKING_ISP_CONNECT = 0x0197, "AL Remote Networking/ISP Connect", UsageTypes.SEL
    AL_NETWORK_CONFERENCE = 0x0198, "AL Network Conference", UsageTypes.SEL
    AL_NETWORK_CHAT = 0x0199, "AL Network Chat", UsageTypes.SEL
    AL_TELEPHONY_DIALER = 0x019A, "AL Telephony/Dialer", UsageTypes.SEL
    AL_LOGON = 0x019B, "AL Logon", UsageTypes.SEL
    AL_LOGOFF = 0x019C, "AL Logoff", UsageTypes.SEL
    AL_LOGON_LOGOFF = 0x019D, "AL Logon/Logoff", UsageTypes.SEL
    AL_LOCK_SCREEN_SAVER = 0x019E, "AL Terminal Lock/Screensaver", UsageTypes.SEL
    AL_CONTROL_PANEL = 0x019F, "AL Control Panel", UsageTypes.SEL
    AL_COMMAND_LINE_PROCESSOR_RUN = 0x01A0, "AL Command Line Processor/Run", UsageTypes.SEL
    AL_PROCESS_TASK_MANAGER = 0x01A1, "AL Process/Task Manager", UsageTypes.SEL
    AL_SELECT_TASK_APPLICATION = 0x01A2, "AL Select Task/Application", UsageTypes.SEL
    AL_NEXT_TASK_APPLICATION = 0x01A3, "AL Next Task/Application", UsageTypes.SEL
    AL_PREVIOUS_TASK_APPLICATION = 0x01A4, "AL Previous Task/Application", UsageTypes.SEL
    AL_HALT_TASK_APPLICATION = 0x01A5, "AL Preemptive Halt Task/Application", UsageTypes.SEL
    AL_INTEGRATED_HELP_CENTER = 0x01A6, "AL Integrated Help Center", UsageTypes.SEL
    AL_DOCUMENTS = 0x01A7, "AL Documents", UsageTypes.SEL
    AL_THESAURUS = 0x01A8, "AL Thesaurus", UsageTypes.SEL
    AL_DICTIONARY = 0x01A9, "AL Dictionary", UsageTypes.SEL
    AL_DESKTOP = 0x01AA, "AL Desktop", UsageTypes.SEL
    AL_SPELL_CHECK = 0x01AB, "AL Spell Check", UsageTypes.SEL
    AL_GRAMMAR_CHECK = 0x01AC, "AL Grammar Check", UsageTypes.SEL
    AL_WIRELESS_STATUS = 0x01AD, "AL Wireless Status", UsageTypes.SEL
    AL_KEYBOARD_LAYOUT = 0x01AE, "AL Keyboard Layout", UsageTypes.SEL
    AL_VIRUS_PROTECTION = 0x01AF, "AL Virus Protection", UsageTypes.SEL
    AL_ENCRYPTION = 0x01B0, "AL Encryption", UsageTypes.SEL
    AL_SCREEN_SAVER = 0x01B1, "AL Screen Saver", UsageTypes.SEL
    AL_ALARMS = 0x01B2, "AL Alarms", UsageTypes.SEL
    AL_CLOCK = 0x01B3, "AL Clock", UsageTypes.SEL
    AL_FILE_BROWSER = 0x01B4, "AL File Browser", UsageTypes.SEL
    AL_POWER_STATUS = 0x01B5, "AL Power Status", UsageTypes.SEL
    AL_IMAGE_BROWSER = 0x01B6, "AL Image Browser", UsageTypes.SEL
    AL_AUDIO_BROWSER = 0x01B7, "AL Audio Browser", UsageTypes.SEL
    AL_VIDEO_BROWSER = 0x01B8, "AL Movie Browser", UsageTypes.SEL
    AL_DIGITAL_RIGHTS_MANAGER = 0x01B9, "AL Digital Rights Manager", UsageTypes.SEL
    AL_DIGITAL_WALLET = 0x01BA, "AL Digital Wallet", UsageTypes.SEL
    AL_INSTANT_MESSAGING = 0x01BC, "AL Instant Messaging", UsageTypes.SEL
    AL_OEM_FEATURES_TIPS_TUTORIAL_BROWSER = 0x01BD, "AL OEM Features/ Tips/Tutorial Browser", UsageTypes.SEL
    AL_OEM_HELP = 0x01BE, "AL OEM Help", UsageTypes.SEL
    AL_ONLINE_COMMUNITY = 0x01BF, "AL Online Community", UsageTypes.SEL
    AL_ENTERTAINMENT_CONTENT_BROWSER = 0x01C0, "AL Entertainment Content Browser", UsageTypes.SEL
    AL_ONLINE_SHOPPING_BROWSER = 0x01C1, "AL Online Shopping Browser", UsageTypes.SEL
    AL_SMARTCARD_INFORMATION_HELP = 0x01C2, "AL SmartCard Information/Help", UsageTypes.SEL
    AL_MARKET_MONITOR_FINANCE_BROWSER = 0x01C3, "AL Market Monitor/Finance Browser", UsageTypes.SEL
    AL_CUSTOMIZED_CORPORATE_NEWS_BROWSER = 0x01C4, "AL Customized Corporate News Browser", UsageTypes.SEL
    AL_ONLINE_ACTIVITY_BROWSER = 0x01C5, "AL Online Activity Browser", UsageTypes.SEL
    AL_RESEARCH_SEARCH_BROWSER = 0x01C6, "AL Research/Search Browser", UsageTypes.SEL
    AL_AUDIO_PLAYER = 0x01C7, "AL Audio Player", UsageTypes.SEL
    GENERIC_GUI_APPLICATION_CONTROLS = 0x0200, "Generic GUI Application Controls", UsageTypes.NARY
    AC_NEW = 0x0201, "AC New", UsageTypes.SEL
    AC_OPEN = 0x0202, "AC Open", UsageTypes.SEL
    AC_CLOSE = 0x0203, "AC Close", UsageTypes.SEL
    AC_EXIT = 0x0204, "AC Exit", UsageTypes.SEL
    AC_MAXIMIZE = 0x0205, "AC Maximize", UsageTypes.SEL
    AC_MINIMIZE = 0x0206, "AC Minimize", UsageTypes.SEL
    AC_SAVE = 0x0207, "AC Save", UsageTypes.SEL
    AC_PRINT = 0x0208, "AC Print", UsageTypes.SEL
    AC_PROPERTIES = 0x0209, "AC Properties", UsageTypes.SEL
    AC_UNDO = 0x021A, "AC Undo", UsageTypes.SEL
    AC_COPY = 0x021B, "AC Copy", UsageTypes.SEL
    AC_CUT = 0x021C, "AC Cut", UsageTypes.SEL
    AC_PASTE = 0x021D, "AC Paste", UsageTypes.SEL
    AC_SELECT_ALL = 0x021E, "AC Select All", UsageTypes.SEL
    AC_FIND = 0x021F, "AC Find", UsageTypes.SEL
    AC_FIND_AND_REPLACE = 0x0220, "AC Find and Replace", UsageTypes.SEL
    AC_SEARCH = 0x0221, "AC Search", UsageTypes.SEL
    AC_GO_TO = 0x0222, "AC Go To", UsageTypes.SEL
    AC_HOME = 0x0223, "AC Home", UsageTypes.SEL
    AC_BACK = 0x0224, "AC Back", UsageTypes.SEL
    AC_FORWARD = 0x0225, "AC Forward", UsageTypes.SEL
    AC_STOP = 0x0226, "AC Stop", UsageTypes.SEL
    AC_REFRESH = 0x0227, "AC Refresh", UsageTypes.SEL
    AC_PREVIOUS_LINK = 0x0228, "AC Previous Link", UsageTypes.SEL
    AC_NEXT_LINK = 0x0229, "AC Next Link", UsageTypes.SEL
    AC_BOOKMARKS = 0x022A, "AC Bookmarks", UsageTypes.SEL
    AC_HISTORY = 0x022B, "AC History", UsageTypes.SEL
    AC_SUBSCRIPTIONS = 0x022C, "AC Subscriptions", UsageTypes.SEL
    AC_ZOOM_IN = 0x022D, "AC Zoom In", UsageTypes.SEL
    AC_ZOOM_OUT = 0x022E, "AC Zoom Out", UsageTypes.SEL
    AC_ZOOM = 0x022F, "AC Zoom", UsageTypes.LC
    AC_FULL_SCREEN_VIEW = 0x0230, "AC Full Screen View", UsageTypes.SEL
    AC_NORMAL_VIEW = 0x0231, "AC Normal View", UsageTypes.SEL
    AC_VIEW_TOGGLE = 0x0232, "AC View Toggle", UsageTypes.SEL
    AC_SCROLL_UP = 0x0233, "AC Scroll Up", UsageTypes.SEL
    AC_SCROLL_DOWN = 0x0234, "AC Scroll Down", UsageTypes.SEL
    AC_SCROLL = 0x0235, "AC Scroll", UsageTypes.LC
    AC_PAN_LEFT = 0x0236, "AC Pan Left", UsageTypes.SEL
    AC_PAN_RIGHT = 0x0237, "AC Pan Right", UsageTypes.SEL
    AC_PAN = 0x0238, "AC Pan", UsageTypes.LC
    AC_NEW_WINDOWS = 0x0239, "AC New Window", UsageTypes.SEL
    AC_TILE_HORIZONTALLY = 0x023A, "AC Tile Horizontally", UsageTypes.SEL
    AC_TILE_VERTICALLY = 0x023B, "AC Tile Vertically", UsageTypes.SEL
    AC_FORMAT = 0x023C, "AC Format", UsageTypes.SEL
    AC_EDIT = 0x023D, "AC Edit", UsageTypes.SEL
    AC_BOLD = 0x023E, "AC Bold", UsageTypes.SEL
    AC_ITALICS = 0x023F, "AC Italics", UsageTypes.SEL
    AC_UNDERLINE = 0x0240, "AC Underline", UsageTypes.SEL
    AC_STRIKETHROUGH = 0x0241, "AC Strikethrough", UsageTypes.SEL
    AC_SUBSCRIPT = 0x0242, "AC Subscript", UsageTypes.SEL
    AC_SUPERSCRIPT = 0x0243, "AC Superscript", UsageTypes.SEL
    AC_ALL_CAPS = 0x0244, "AC All Caps", UsageTypes.SEL
    AC_ROTATE = 0x0245, "AC Rotate", UsageTypes.SEL
    AC_RESIZE = 0x0246, "AC Resize", UsageTypes.SEL
    AC_FLIP_HORIZONTAL = 0x0247, "AC Flip horizontal", UsageTypes.SEL
    AC_FLIP_VERTICAL = 0x0248, "AC Flip Vertical", UsageTypes.SEL
    AC_MIRROR_HORIZONTAL = 0x0249, "AC Mirror Horizontal", UsageTypes.SEL
    AC_MIRROR_VERTICAL = 0x024A, "AC Mirror Vertical", UsageTypes.SEL
    AC_FONT_SELECT = 0x024B, "AC Font Select", UsageTypes.SEL
    AC_FONT_COLOR = 0x024C, "AC Font Color", UsageTypes.SEL
    AC_FONT_SIZE = 0x024D, "AC Font Size", UsageTypes.SEL
    AC_JUSTIFY_LEFT = 0x024E, "AC Justify Left", UsageTypes.SEL
    AC_JUSTIFY_CENTER_H = 0x024F, "AC Justify Center H", UsageTypes.SEL
    AC_JUSTIFY_RIGHT = 0x0250, "AC Justify Right", UsageTypes.SEL
    AC_JUSTIFY_BLOCK_H = 0x0251, "AC Justify Block H", UsageTypes.SEL
    AC_JUSTIFY_TOP = 0x0252, "AC Justify Top", UsageTypes.SEL
    AC_JUSTIFY_CENTER_V = 0x0253, "AC Justify Center V", UsageTypes.SEL
    AC_JUSTIFY_BOTTOM = 0x0254, "AC Justify Bottom", UsageTypes.SEL
    AC_JUSTIFY_BLOCK_V = 0x0255, "AC Justify Block V", UsageTypes.SEL
    AC_INDENT_INCREASE = 0x0256, "AC Indent Decrease", UsageTypes.SEL
    AC_INDENT_DECREASE = 0x0257, "AC Indent Increase", UsageTypes.SEL
    AC_NUMBERED_LIST = 0x0258, "AC Numbered List", UsageTypes.SEL
    AC_RESTART_NUMBERING = 0x0259, "AC Restart Numbering", UsageTypes.SEL
    AC_BULLETED_LIST = 0x025A, "AC Bulleted List", UsageTypes.SEL
    AC_PROMOTE = 0x025B, "AC Promote", UsageTypes.SEL
    AC_DEMOTE = 0x025C, "AC Demote", UsageTypes.SEL
    AC_YES = 0x025D, "AC Yes", UsageTypes.SEL
    AC_NO = 0x025E, "AC No", UsageTypes.SEL
    AC_CANCEL = 0x025F, "AC Cancel", UsageTypes.SEL
    AC_CATALOG = 0x0260, "AC Catalog", UsageTypes.SEL
    AC_BUY_CHECKOUT = 0x0261, "AC Buy/Checkout", UsageTypes.SEL
    AC_ADD_TO_CART = 0x0262, "AC Add to Cart", UsageTypes.SEL
    AC_EXPAND = 0x0263, "AC Expand", UsageTypes.SEL
    AC_EXPAND_ALL = 0x0264, "AC Expand All", UsageTypes.SEL
    AC_COLLAPSE = 0x0265, "AC Collapse", UsageTypes.SEL
    AC_COLLAPSE_ALL = 0x0266, "AC Collapse All", UsageTypes.SEL
    AC_PRINT_PREVIEW = 0x0267, "AC Print Preview", UsageTypes.SEL
    AC_PASTE_SPECIAL = 0x0268, "AC Paste Special", UsageTypes.SEL
    AC_INSER_MODE = 0x0269, "AC Insert Mode", UsageTypes.SEL
    AC_DELETE = 0x026A, "AC Delete", UsageTypes.SEL
    AC_LOCK = 0x026B, "AC Lock", UsageTypes.SEL
    AC_UNLOCK = 0x026C, "AC Unlock", UsageTypes.SEL
    AC_PROTECT = 0x026D, "AC Protect", UsageTypes.SEL
    AC_UNPROTECT = 0x026E, "AC Unprotect", UsageTypes.SEL
    AC_ATTACH_COMMENT = 0x026F, "AC Attach Comment", UsageTypes.SEL
    AC_DELETE_COMMENT = 0x0270, "AC Delete Comment", UsageTypes.SEL
    AC_VIEW_COMMENT = 0x0271, "AC View Comment", UsageTypes.SEL
    AC_SELECT_WORD = 0x0272, "AC Select Word", UsageTypes.SEL
    AC_SELECT_SENTENCE = 0x0273, "AC Select Sentence", UsageTypes.SEL
    AC_SELECT_PARAGRAPH = 0x0274, "AC Select Paragraph", UsageTypes.SEL
    AC_SELECT_COLUMN = 0x0275, "AC Select Column", UsageTypes.SEL
    AC_SELECT_ROW = 0x0276, "AC Select Row", UsageTypes.SEL
    AC_SELECT_TABLE = 0x0277, "AC Select Table", UsageTypes.SEL
    AC_SELECT_OBJECT = 0x0278, "AC Select Object", UsageTypes.SEL
    AC_REDO_REPEAT = 0x0279, "AC Redo/Repeat", UsageTypes.SEL
    AC_SORT = 0x027A, "AC Sort", UsageTypes.SEL
    AC_SORT_ASCENDING = 0x027B, "AC Sort Ascending", UsageTypes.SEL
    AC_SORT_DESCENDING = 0x027C, "AC Sort Descending", UsageTypes.SEL
    AC_FILTER = 0x027D, "AC Filter", UsageTypes.SEL
    AC_SET_CLOCK = 0x027E, "AC Set Clock", UsageTypes.SEL
    AC_VIEW_CLOCK = 0x027F, "AC View Clock", UsageTypes.SEL
    AC_SELECT_TIME_ZONE = 0x0280, "AC Select Time Zone", UsageTypes.SEL
    AC_EDIT_TIME_ZONES = 0x0281, "AC Edit Time Zones", UsageTypes.SEL
    AC_SET_ALARM = 0x0282, "AC Set Alarm", UsageTypes.SEL
    AC_CLEAR_ALARM = 0x0283, "AC Clear Alarm", UsageTypes.SEL
    AC_SNOOZE_ALARM = 0x0284, "AC Snooze Alarm", UsageTypes.SEL
    AC_RESET_ALARM = 0x0285, "AC Reset Alarm", UsageTypes.SEL
    AC_SYNCHRONIZE = 0x0286, "AC Synchronize", UsageTypes.SEL
    AC_SEND_RECEIVE = 0x0287, "AC Send/Receive", UsageTypes.SEL
    AC_SEND_TO = 0x0288, "AC Send To", UsageTypes.SEL
    AC_REPLY = 0x0289, "AC Reply", UsageTypes.SEL
    AC_REPLY_ALL = 0x028A, "AC Reply All", UsageTypes.SEL
    AC_FORWARD_MSG = 0x028B, "AC Forward Msg", UsageTypes.SEL
    AC_SEND = 0x028C, "AC Send", UsageTypes.SEL
    AC_ATTACH_FILE = 0x028D, "AC Attach File", UsageTypes.SEL
    AC_UPLOAD = 0x028E, "AC Upload", UsageTypes.SEL
    AC_DOWNLOAD = 0x028F, "AC Download (Save Target As)", UsageTypes.SEL
    AC_SET_BORDERS = 0x0290, "AC Set Borders", UsageTypes.SEL
    AC_INSERT_ROW = 0x0291, "AC Insert Row", UsageTypes.SEL
    AC_INSERT_COLUMN = 0x0292, "AC Insert Column", UsageTypes.SEL
    AC_INSERT_FILE = 0x0293, "AC Insert File", UsageTypes.SEL
    AC_INSERT_PICTURE = 0x0294, "AC Insert Picture", UsageTypes.SEL
    AC_INSERT_OBJECT = 0x0295, "AC Insert Object", UsageTypes.SEL
    AC_INSERT_SYMBOL = 0x0296, "AC Insert Symbol", UsageTypes.SEL
    AC_SAVE_AND_CLOSE = 0x0297, "AC Save and Close", UsageTypes.SEL
    AC_RENAME = 0x0298, "AC Rename", UsageTypes.SEL
    AC_MERGE = 0x0299, "AC Merge", UsageTypes.SEL
    AC_SPLIT = 0x029A, "AC Split", UsageTypes.SEL
    AC_DISTRIBUTE_HORIZONTICALLY = 0x029B, "AC Disribute Horizontally", UsageTypes.SEL
    AC_DISTRIBUTE_VERTICALLY = 0x029C, "AC Distribute Vertically", UsageTypes.SEL


class PowerDevice(_Data):
    INAME = 0x01, "iName", UsageTypes.SV
    PRESENT_STATUS = 0x02, "PresentStatus", UsageTypes.CL
    CHARGED_STATUS = 0x03, "ChangedStatus", UsageTypes.CL
    UPS = 0x04, "UPS", UsageTypes.CA
    POWER_SUPPLY = 0x05, "PowerSupply", UsageTypes.CA
    BATTERY_SYSTEM = 0x10, "BatterySystem", UsageTypes.CP
    BATTERY_SYSTEM_ID = 0x11, "BatterySystemID", UsageTypes.SV
    BATTERY = 0x12, "Battery", UsageTypes.CP
    BATTERY_ID = 0x13, "BatteryID", UsageTypes.SV
    CHARGER = 0x14, "Charger", UsageTypes.CP
    CHARGER_ID = 0x15, "ChargerID", UsageTypes.SV
    POWER_CONVERTER = 0x16, "PowerConverter", UsageTypes.CP
    POWER_CONVERTER_ID = 0x17, "PowerConverterID", UsageTypes.SV
    OUTLET_SYSTEM = 0x18, "OutletSystem", UsageTypes.CP
    OUTLET_SYSTEM_ID = 0x19, "OutletSystemID", UsageTypes.SV
    INPUT = 0x1A, "Input", UsageTypes.CP
    INPUT_ID = 0x1B, "InputID", UsageTypes.SV
    OUTPUT = 0x1C, "Output", UsageTypes.CP
    OUTPUT_ID = 0x1D, "OutputID", UsageTypes.SV
    FLOW = 0x1E, "Flow", UsageTypes.CP
    FLOW_ID = 0x1F, "FlowID", UsageTypes.SV
    OUTLET = 0x20, "Outlet", UsageTypes.CP
    OUTLET_ID = 0x21, "OutletID", UsageTypes.SV
    GANG = 0x22, "Gang", UsageTypes.CP
    GANG_ID = 0x23, "GangID", UsageTypes.SV
    POWER_SUMMARY = 0x24, "PowerSummary", UsageTypes.CP
    POWER_SUMMARY_ID = 0x25, "PowerSummaryID", UsageTypes.SV
    VOLTAGE = 0x30, "Voltage", UsageTypes.DV
    CURRENT = 0x31, "Current", UsageTypes.DV
    FREQUENCY = 0x32, "Frequency", UsageTypes.DV
    APPARENT_POWER = 0x33, "ApparentPower", UsageTypes.DV
    ACTIVE_POWER = 0x34, "ActivePower", UsageTypes.DV
    PERCENT_LOAD = 0x35, "PercentLoad", UsageTypes.DV
    TEMPERATURE = 0x36, "Temperature", UsageTypes.DV
    HUMIFITY = 0x37, "Humidity", UsageTypes.DV
    BAD_COUNT = 0x38, "BadCount", UsageTypes.DV
    CONFIG_VOLTAGE = 0x40, "ConfigVoltage", (UsageTypes.SV, UsageTypes.DV)
    CONFIG_CURRENT = 0x41, "ConfigCurrent", (UsageTypes.SV, UsageTypes.DV)
    CONFIG_FREQUENCY = 0x42, "ConfigFrequency", (UsageTypes.SV, UsageTypes.DV)
    CONFIG_APPARENT_POWER = 0x43, "ConfigApparentPower", (UsageTypes.SV, UsageTypes.DV)
    CONFIG_ACTIVE_POWER = 0x44, "ConfigActivePower", (UsageTypes.SV, UsageTypes.DV)
    CONFIG_PERCENT_LOAD = 0x45, "ConfigPercentLoad", (UsageTypes.SV, UsageTypes.DV)
    CONFIG_TEMPERATURE = 0x46, "ConfigTemperature", (UsageTypes.SV, UsageTypes.DV)
    CONFIG_HUMIFITY = 0x47, "ConfigHumidity", (UsageTypes.SV, UsageTypes.DV)
    SWITCH_ON_CONTROL = 0x50, "SwitchOnControl", UsageTypes.DV
    SWITCH_OFF_CONTROL = 0x51, "SwitchOffControl", UsageTypes.DV
    TOGGLE_CONTROL = 0x52, "ToggleControl", UsageTypes.DV
    LOW_VOLTAGE_TRANSFER = 0x53, "LowVoltageTransfer", UsageTypes.DV
    HIGH_VOLTAGE_TRANSFER = 0x54, "HighVoltageTransfer", UsageTypes.DV
    DELAY_BEFORE_REBOOT = 0x55, "DelayBeforeReboot", UsageTypes.DV
    DELAY_BEFORE_STARTUP = 0x56, "DelayBeforeStartup", UsageTypes.DV
    DELAY_BEFORE_SHUTDOWN = 0x57, "DelayBeforeShutdown", UsageTypes.DV
    TEST = 0x58, "Test", UsageTypes.DV
    MODULE_RESET = 0x59, "ModuleReset", UsageTypes.DV
    AUDIBLE_ALARM_CONTROL = 0x5A, "AudibleAlarmControl", UsageTypes.DV
    PRESENT = 0x60, "Present", UsageTypes.DF
    GOOD = 0x61, "Good", UsageTypes.DF
    INTERNAL_FAILURE = 0x62, "InternalFailure", UsageTypes.DF
    VOLTAGE_OUT_OF_RANGE = 0x63, "VoltageOutOfRange", UsageTypes.DF
    FREQUENCY_OUT_OF_RANGE = 0x64, "FrequencyOutOfRange", UsageTypes.DF
    OVERLOAD = 0x65, "Overload", UsageTypes.DF
    OVERCHARGED = 0x66, "OverCharged", UsageTypes.DF
    OVER_TEMPERATURE = 0x67, "OverTemperature", UsageTypes.DF
    SHUTDOWN_REQUESTED = 0x68, "ShutdownRequested", UsageTypes.DF
    SHUTDOWN_IMMINEBT = 0x69, "ShutdownImminent", UsageTypes.DF
    SWITCH_ON_OFF = 0x6B, "SwitchOn/Off", UsageTypes.DF
    SWITCHABLE = 0x6C, "Switchable", UsageTypes.DF
    USED = 0x6D, "Used", UsageTypes.DF
    BOOST = 0x6E, "Boost", UsageTypes.DF
    BUCK = 0x6F, "Buck", UsageTypes.DF
    INITIALIZED = 0x70, "Initialized", UsageTypes.DF
    TESTED = 0x71, "Tested", UsageTypes.DF
    AWAITING_POWER = 0x72, "AwaitingPower", UsageTypes.DF
    COMMUNICATION_LOST = 0x73, "CommunicationLost", UsageTypes.DF
    IMANUFACTURER = 0xFD, "iManufacturer", UsageTypes.SV
    IPRODUCT = 0xFE, "iProduct", UsageTypes.SV
    ISERIALNUMBER = 0xFF, "iSerialNumber", UsageTypes.SV


class FIDO(_Data):
    U2F_AUTHENTICATOR_DEVICEM = 0x01, "U2F Authenticator Device"
    INPUT_REPORT_DATA = 0x20, "Input Report Data"
    OUTPUT_REPORT_DATA = 0x21, "Output Report Data"


class UsagePages(_Data):
    GENERIC_DESKTOP_CONTROLS_PAGE = 0x01, "Generic Desktop Controls", GenericDesktopControls
    SIMULATION_CONTROLS_PAGE = 0x02, "Simulation Controls"
    VR_CONTROLS_PAGE = 0x03, "VR Controls"
    SPORT_CONTROLS_PAGE = 0x04, "Sport Controls"
    GAME_CONTROLS_PAGE = 0x05, "Game Controls"
    GENERIC_DEVICE_CONTROLS_PAGE = 0x06, "Generic Device Controls"
    KEYBOARD_KEYPAD_PAGE = 0x07, "Keyboard/Keypad", KeyboardKeypad
    LED_PAGE = 0x08, "LED", Led
    BUTTON_PAGE = 0x09, "Button", Button
    ORDINAL_PAGE = 0x0A, "Ordinal"
    TELEPHONY_PAGE = 0x0B, "Telephony"
    CONSUMER_PAGE = 0x0C, "Consumer", Consumer
    DIGITIZER_PAGE = 0x0D, "Digitizer"
    HAPTICS_PAGE = 0x0E, "Haptics"
    PID_PAGE = 0x0F, "PID"
    UNICODE_PAGE = 0x10, "Unicode"
    EYE_AND_HEAD_TRACKER_PAGE = 0x12, "Eye and Head Tracker"
    ALPHANUMERIC_DISPLAY_PAGE = 0x14, "Alphanumeric Display"
    SENSOR_PAGE = 0x20, "Sensor"
    MEDICAL_INSTRUMENTS_PAGE = 0x40, "Medical Instruments"
    BRAILLE_DISPLAY_PAGE = 0x41, "Braillie"
    LIGHTING_AND_ILLUMINATION_PAGE = 0x59, "Lighting and Illumination"
    USB_MONITOR_PAGE = 0x80, "USB Monitor"
    USB_ENUMERATED_VALUES_PAGE = 0x81, "USB Enumerated Values"
    VESA_VIRTUAL_CONTROLS_PAGE = 0x82, "VESA Virtual Controls"
    POWER_DEVICE_PAGE = 0x84, "Power Device", PowerDevice
    BATTERY_SYSTEM_PAGE = 0x85, "Battery System"
    BARCODE_SCANNER_PAGE = 0x8C, "Barcode Scanner"
    WEIGHING_PAGE = 0x8D, "Weighing"
    MSR_PAGE = 0x8E, "MSR"
    RESERVED_POS_PAGE = 0x8F, "Reserved POS"
    CAMERA_CONTROL_PAGE = 0x90, "Camera Control"
    ARCADE_PAGE = 0x91, "Arcade"
    GAMING_DEVICE_PAGE = 0x92, "Gaming Device"
    FIDO_ALLIANCE_PAGE = 0xF1D0, "FIDO Alliance", FIDO
    VENDOR_PAGE = 0xFF00, ..., 0xFFFF, "Vendor Page"