Home | History | Annotate | Download | only in test
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 #include "TestHidDescriptor.h"
     17 #include "TestHidSensorSpec.h"
     18 #include <cstring>
     19 
     20 /**
     21  * Example HID sensor descriptors in this file is extracted from published document
     22  * "HID Sensors Usage" (hid-sensors-usage.docx). They are added for testing of HidParser.
     23  *
     24  * It is slightly modified in order to compile.
     25  */
     26 namespace {
     27 /**
     28  * Two sensors collection skeleton example.
     29  */
     30 const unsigned char col1_report_descriptor[] = {
     31     HID_USAGE_PAGE_SENSOR,
     32     HID_USAGE_SENSOR_TYPE_COLLECTION,
     33     HID_COLLECTION(Application),
     34 
     35     HID_REPORT_ID(1),
     36     HID_USAGE_PAGE_SENSOR,
     37 
     38     HID_USAGE_SENSOR_TYPE_MOTION_ACCELEROMETER_3D,
     39     HID_COLLECTION(Physical),
     40 
     41     //Feature Report Descriptor for Sensor Report ID = 1
     42 
     43     //Input Report Descriptor for Sensor Report ID = 1
     44 
     45     HID_END_COLLECTION, //for Report ID = 1
     46 
     47     HID_REPORT_ID(2),
     48     HID_USAGE_PAGE_SENSOR,
     49     HID_USAGE_SENSOR_TYPE_MOTION_GYROMETER_3D,
     50     HID_COLLECTION(Physical),
     51 
     52     //Feature Report Descriptor for Sensor Report ID = 2
     53 
     54     //Input Report Descriptor for Sensor Report ID = 2
     55 
     56     HID_END_COLLECTION, //for Report ID = 2
     57 
     58     //More sensors follow using the same pattern
     59 
     60     HID_END_COLLECTION //Application
     61 };
     62 
     63 
     64 /**
     65  * Composite device descriptor example: two sensors with a keyboard and a mouse.
     66  */
     67 const unsigned char col2_report_descriptor[] = {
     68     //keyboard
     69     0x05U, 0x01U,         // USAGE PAGE (Generic Desktop)
     70     0x09U, 0x06U,         // USAGE (Keyboard)
     71     0xA1U, 0x01U,         // COLLECTION (Application)
     72 
     73     0x85U, 0x03U,         // REPORT_ID (1)
     74 
     75     0x15U, 0x00U,         //   LOGICAL MINIMUM (0)
     76     0x25U, 0x01U,         //   LOGICAL MAXIMUM (1)
     77     0x75U, 0x01U,         //   REPORT SIZE (1)
     78     0x95U, 0x08U,         //   REPORT COUNT (8)
     79     0x05U, 0x07U,         //   USAGE PAGE (Keyboard)
     80     0x19U, 0xE0U,         //   USAGE MINIMUM (Keyboard LeftControl)
     81     0x29U, 0xE7U,         //   USAGE MAXIMUM (Keyboard Right GUI)
     82     0x81U, 0x02U,         //   INPUT (Var)
     83 
     84     0x75U, 0x08U,         //   REPORT SIZE (8)
     85     0x95U, 0x0AU,         //   REPORT COUNT (10)
     86     0x19U, 0x00U,         //   USAGE MINIMUM (No event)
     87     0x29U, 0x91U,         //   USAGE MAXIMUM (Keyboard LANG2)
     88     0x26U, 0xFFU, 0x00U,  //   LOGICAL MAXIMUM (0xFF)
     89     0x81U, 0x00U,         //   INPUT (Data,Ary,Abs)
     90 
     91     0xC0U,                // END COLLECTION, //keyboard
     92 
     93     // Two sensor collection skeleton example:
     94     HID_USAGE_PAGE_SENSOR,
     95     HID_USAGE_SENSOR_TYPE_COLLECTION,
     96     HID_COLLECTION(Application),
     97 
     98     HID_REPORT_ID(2),
     99     HID_USAGE_PAGE_SENSOR,
    100 
    101     HID_USAGE_SENSOR_TYPE_MOTION_ACCELEROMETER_3D,
    102     HID_COLLECTION(Physical),
    103 
    104     //Feature Report Descriptor for Sensor Report ID = 2
    105 
    106     //Input Report Descriptor for Sensor Report ID = 2
    107 
    108     HID_END_COLLECTION, //for Report ID = 2
    109 
    110     HID_REPORT_ID(3),
    111     HID_USAGE_PAGE_SENSOR,
    112     HID_USAGE_SENSOR_TYPE_MOTION_GYROMETER_3D,
    113     HID_COLLECTION(Physical),
    114 
    115     //Feature Report Descriptor for Sensor Report ID = 3
    116 
    117     //Input Report Descriptor for Sensor Report ID = 3
    118 
    119     HID_END_COLLECTION, //for Report ID = 3
    120 
    121     //More sensors follow using the same pattern
    122 
    123     HID_END_COLLECTION, //Sensor collection
    124 
    125     //mouse
    126     0x05U, 0x01U,         // USAGE PAGE (Generic Desktop)
    127     0x09U, 0x02U,         // USAGE (Mouse)
    128     0xA1U, 0x01U,         // COLLECTION (Application)
    129     0x85U, 0x04U,         // REPORT_ID (4)
    130 
    131     // 5 mouse buttons
    132     0x05U, 0x09U,         //   USAGE PAGE (Button)
    133     0x19U, 0x01U,         //   USAGE MINIMUM (Button 1)
    134     0x29U, 0x05U,         //   USAGE MAXIMUM (Button 5)
    135     0x15U, 0x00U,         //   LOGICAL MINIMUM (0)
    136     0x25U, 0x01U,         //   LOGICAL MAXIMUM (1)
    137     0x95U, 0x05U,         //   REPORT COUNT (5)
    138     0x75U, 0x01U,         //   REPORT SIZE (1)
    139     0x81U, 0x02U,         //   INPUT (Data,Var,Abs)
    140 
    141     //  3 unused buttons:
    142     0x95U, 0x01U,         //   REPORT COUNT (1)
    143     0x75U, 0x03U,         //   REPORT SIZE (3)
    144     0x81U, 0x03U,         //   INPUT (Cnst,Var,Abs)
    145 
    146     // mouse (delta x, delta y) position
    147     0x15U, 0x81U,         //   LOGICAL MINIMUM (-127)
    148     0x25U, 0x7fU,         //   LOGICAL MAXIMUM (+127)
    149     0x75U, 0x08U,         //   REPORT SIZE (8)
    150     0x95U, 0x02U,         //   REPORT COUNT (2)
    151     0x05U, 0x01U,         //   USAGE PAGE (Generic Desktop)
    152     0x09U, 0x30U,         //   USAGE(X)
    153     0x09U, 0x31U,         //   USAGE (Y)
    154     0x81U, 0x06U,         //   INPUT (Data,Var,Rel)
    155 
    156     0xC0U,                // END COLLECTION //mouse
    157 };
    158 
    159 
    160 /**
    161  * Composite device descriptor example: one sensor with a keyboard and a mouse.
    162  */
    163 const unsigned char col3_report_descriptor[] = {
    164     //keyboard
    165     0x05U, 0x01U,         // USAGE PAGE (Generic Desktop)
    166     0x09U, 0x06U,         // USAGE (Keyboard)
    167     0xA1U, 0x01U,         // COLLECTION (Application)
    168 
    169     0x85U, 0x03U,         // REPORT_ID (1)
    170 
    171     0x15U, 0x00U,         //   LOGICAL MINIMUM (0)
    172     0x25U, 0x01U,         //   LOGICAL MAXIMUM (1)
    173     0x75U, 0x01U,         //   REPORT SIZE (1)
    174     0x95U, 0x08U,         //   REPORT COUNT (8)
    175     0x05U, 0x07U,         //   USAGE PAGE (Keyboard)
    176     0x19U, 0xE0U,         //   USAGE MINIMUM (Keyboard LeftControl)
    177     0x29U, 0xE7U,         //   USAGE MAXIMUM (Keyboard Right GUI)
    178     0x81U, 0x02U,         //   INPUT (Var)
    179 
    180     0x75U, 0x08U,         //   REPORT SIZE (8)
    181     0x95U, 0x0AU,         //   REPORT COUNT (10)
    182     0x19U, 0x00U,         //   USAGE MINIMUM (No event)
    183     0x29U, 0x91U,         //   USAGE MAXIMUM (Keyboard LANG2)
    184     0x26U, 0xFFU, 0x00U,  //   LOGICAL MAXIMUM (0xFF)
    185     0x81U, 0x00U,         //   INPUT (Data,Ary,Abs)
    186 
    187     0xC0U,                // END COLLECTION, //keyboard
    188 
    189     // One sensor collection skeleton example:
    190     HID_USAGE_PAGE_SENSOR,
    191     HID_USAGE_SENSOR_TYPE_COLLECTION,
    192     HID_COLLECTION(Application),
    193 
    194     HID_REPORT_ID(2),
    195     HID_USAGE_PAGE_SENSOR,
    196 
    197     HID_USAGE_SENSOR_TYPE_MOTION_GYROMETER_3D,
    198     HID_COLLECTION(Physical),
    199 
    200     //Feature Report Descriptor for Sensor Report ID = 2
    201 
    202     //Input Report Descriptor for Sensor Report ID = 2
    203 
    204     HID_END_COLLECTION, //for Report ID = 2
    205 
    206     HID_END_COLLECTION, //Sensor collection
    207 
    208     //mouse
    209     0x05U, 0x01U,         // USAGE PAGE (Generic Desktop)
    210     0x09U, 0x02U,         // USAGE (Mouse)
    211     0xA1U, 0x01U,         // COLLECTION (Application)
    212     0x85U, 0x04U,         // REPORT_ID (3)
    213 
    214     // 5 mouse buttons
    215     0x05U, 0x09U,         //   USAGE PAGE (Button)
    216     0x19U, 0x01U,         //   USAGE MINIMUM (Button 1)
    217     0x29U, 0x05U,         //   USAGE MAXIMUM (Button 5)
    218     0x15U, 0x00U,         //   LOGICAL MINIMUM (0)
    219     0x25U, 0x01U,         //   LOGICAL MAXIMUM (1)
    220     0x95U, 0x05U,         //   REPORT COUNT (5)
    221     0x75U, 0x01U,         //   REPORT SIZE (1)
    222     0x81U, 0x02U,         //   INPUT (Data,Var,Abs)
    223 
    224     //  3 unused buttons:
    225     0x95U, 0x01U,         //   REPORT COUNT (1)
    226     0x75U, 0x03U,         //   REPORT SIZE (3)
    227     0x81U, 0x03U,         //   INPUT (Cnst,Var,Abs)
    228 
    229     // mouse (delta x, delta y) position
    230     0x15U, 0x81U,         //   LOGICAL MINIMUM (-127)
    231     0x25U, 0x7fU,         //   LOGICAL MAXIMUM (+127)
    232     0x75U, 0x08U,         //   REPORT SIZE (8)
    233     0x95U, 0x02U,         //   REPORT COUNT (2)
    234     0x05U, 0x01U,         //   USAGE PAGE (Generic Desktop)
    235     0x09U, 0x30U,         //   USAGE(X)
    236     0x09U, 0x31U,         //   USAGE (Y)
    237     0x81U, 0x06U,         //   INPUT (Data,Var,Rel)
    238 
    239     0xC0U,                 //   END COLLECTION //mouse
    240 };
    241 
    242 
    243 /**
    244  * Simple custom sensor example.
    245  */
    246 const unsigned char cus1_report_descriptor[] = {
    247     HID_USAGE_PAGE_SENSOR,         // USAGE_PAGE (Sensor)
    248     HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM, // USAGE (Simple Custom)
    249     HID_COLLECTION(Physical),
    250 
    251     //input reports (transmit)
    252     HID_USAGE_PAGE_SENSOR,
    253     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
    254     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    255     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    256     HID_REPORT_SIZE(16),
    257     HID_REPORT_COUNT(1),
    258     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    259     HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value
    260 
    261     HID_END_COLLECTION
    262 };
    263 
    264 
    265 /**
    266  * More complex custom sensor example.
    267  */
    268 const unsigned char cus2_report_descriptor[] = {
    269     HID_USAGE_PAGE_SENSOR,         // USAGE_PAGE (Sensor)
    270     HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM, // USAGE (Simple Custom)
    271     HID_COLLECTION(Physical),
    272 
    273     //input reports (transmit)
    274     HID_USAGE_PAGE_SENSOR,
    275     HID_USAGE_SENSOR_DATA_CUSTOM_USAGE,
    276     HID_LOGICAL_MIN_8(0),
    277     HID_LOGICAL_MAX_16(0xFF,0xFF),
    278     HID_REPORT_SIZE(16),
    279     HID_REPORT_COUNT(1),
    280     HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_TYPE_MOTION_SPEEDOMETER
    281     HID_USAGE_SENSOR_DATA_CUSTOM_BOOLEAN_ARRAY,
    282     HID_LOGICAL_MIN_8(0),
    283     HID_LOGICAL_MAX_16(0xFF,0xFF),
    284     HID_REPORT_SIZE(16),
    285     HID_REPORT_COUNT(1),
    286     HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_TYPE_MOTION_SPEEDOMETER
    287     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
    288     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    289     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    290     HID_REPORT_SIZE(16),
    291     HID_REPORT_COUNT(1),
    292     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    293     HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value
    294     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_2,
    295     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    296     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    297     HID_REPORT_SIZE(16),
    298     HID_REPORT_COUNT(1),
    299     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    300     HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value
    301     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_3,
    302     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    303     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    304     HID_REPORT_SIZE(16),
    305     HID_REPORT_COUNT(1),
    306     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    307     HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value
    308     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_4,
    309     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    310     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    311     HID_REPORT_SIZE(16),
    312     HID_REPORT_COUNT(1),
    313     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    314     HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value
    315     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_5,
    316     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    317     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    318     HID_REPORT_SIZE(16),
    319     HID_REPORT_COUNT(1),
    320     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    321     HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value
    322     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_6,
    323     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    324     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    325     HID_REPORT_SIZE(16),
    326     HID_REPORT_COUNT(1),
    327     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    328     HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value
    329 
    330     HID_END_COLLECTION
    331 };
    332 
    333 
    334 /**
    335  * Custom sensor example with features
    336  */
    337 const unsigned char cus3_report_descriptor[] = {
    338     HID_USAGE_PAGE_SENSOR,         // USAGE_PAGE (Sensor)
    339     HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM, // USAGE (Simple Custom)
    340     HID_COLLECTION(Physical),
    341 
    342     //feature reports (xmit/receive)
    343     HID_USAGE_PAGE_SENSOR,
    344     HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    345     HID_LOGICAL_MIN_8(0),
    346     HID_LOGICAL_MAX_8(2),
    347     HID_REPORT_SIZE(8),
    348     HID_REPORT_COUNT(1),
    349     HID_COLLECTION(Logical),
    350     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    351     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    352     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    353     HID_FEATURE(Data_Arr_Abs),
    354     HID_END_COLLECTION,
    355     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    356     HID_LOGICAL_MIN_8(0),
    357     HID_LOGICAL_MAX_8(5),
    358     HID_REPORT_SIZE(8),
    359     HID_REPORT_COUNT(1),
    360     HID_COLLECTION(Logical),
    361     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    362     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    363     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    364     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    365     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    366     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    367     HID_FEATURE(Data_Arr_Abs),
    368     HID_END_COLLECTION,
    369     HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    370     HID_LOGICAL_MIN_8(0),
    371     HID_LOGICAL_MAX_8(5),
    372     HID_REPORT_SIZE(8),
    373     HID_REPORT_COUNT(1),
    374     HID_COLLECTION(Logical),
    375     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    376     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    377     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    378     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    379     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    380     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    381     HID_FEATURE(Data_Arr_Abs),
    382     HID_END_COLLECTION,
    383     HID_USAGE_SENSOR_STATE,
    384     HID_LOGICAL_MIN_8(0),
    385     HID_LOGICAL_MAX_8(6),
    386     HID_REPORT_SIZE(8),
    387     HID_REPORT_COUNT(1),
    388     HID_COLLECTION(Logical),
    389     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    390     HID_USAGE_SENSOR_STATE_READY_SEL,
    391     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    392     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    393     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    394     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    395     HID_USAGE_SENSOR_STATE_ERROR_SEL,
    396     HID_FEATURE(Data_Arr_Abs),
    397     HID_END_COLLECTION,
    398     HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    399     HID_LOGICAL_MIN_8(0),
    400     HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    401     HID_REPORT_SIZE(32),
    402     HID_REPORT_COUNT(1),
    403     HID_UNIT_EXPONENT(0),
    404     HID_FEATURE(Data_Var_Abs),
    405     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_CUSTOM,
    406                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    407     HID_LOGICAL_MIN_8(0),
    408     HID_LOGICAL_MAX_16(0xFF,0xFF),
    409     HID_REPORT_SIZE(16),
    410     HID_REPORT_COUNT(1),
    411     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    412     HID_FEATURE(Data_Var_Abs),
    413     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_CUSTOM,HID_USAGE_SENSOR_DATA_MOD_MAX),
    414     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    415     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    416     HID_REPORT_SIZE(16),
    417     HID_REPORT_COUNT(1),
    418     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    419     HID_FEATURE(Data_Var_Abs),
    420     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_CUSTOM,HID_USAGE_SENSOR_DATA_MOD_MIN),
    421     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    422     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    423     HID_REPORT_SIZE(16),
    424     HID_REPORT_COUNT(1),
    425     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    426     HID_FEATURE(Data_Var_Abs),
    427 
    428     //input reports (transmit)
    429     HID_USAGE_PAGE_SENSOR,
    430     HID_USAGE_SENSOR_STATE,
    431     HID_LOGICAL_MIN_8(0),
    432     HID_LOGICAL_MAX_8(6),
    433     HID_REPORT_SIZE(8),
    434     HID_REPORT_COUNT(1),
    435     HID_COLLECTION(Logical),
    436     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    437     HID_USAGE_SENSOR_STATE_READY_SEL,
    438     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    439     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    440     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    441     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    442     HID_USAGE_SENSOR_STATE_ERROR_SEL,
    443     HID_INPUT(Data_Arr_Abs),
    444     HID_END_COLLECTION,
    445     HID_USAGE_SENSOR_EVENT,
    446     HID_LOGICAL_MIN_8(0),
    447     HID_LOGICAL_MAX_8(5),
    448     HID_REPORT_SIZE(8),
    449     HID_REPORT_COUNT(1),
    450     HID_COLLECTION(Logical),
    451     HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    452     HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    453     HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    454     HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    455     HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    456     HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    457     HID_INPUT(Data_Arr_Abs),
    458     HID_END_COLLECTION,
    459     HID_USAGE_SENSOR_DATA_CUSTOM_USAGE,
    460     HID_LOGICAL_MIN_8(0),
    461     HID_LOGICAL_MAX_16(0xFF,0xFF),
    462     HID_REPORT_SIZE(16),
    463     HID_REPORT_COUNT(1),
    464     HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_TYPE_MOTION_SPEEDOMETER
    465     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
    466     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    467     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    468     HID_REPORT_SIZE(16),
    469     HID_REPORT_COUNT(1),
    470     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    471     HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value
    472 
    473     HID_END_COLLECTION
    474 };
    475 
    476 
    477 /**
    478  * Full custom sensor example with feature.
    479  */
    480 const unsigned char cus4_report_descriptor[] = {
    481     HID_USAGE_PAGE_SENSOR,         // USAGE_PAGE (Sensor)
    482     HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM, // USAGE (Simple Custom)
    483     HID_COLLECTION(Application),
    484 
    485     //feature reports (xmit/receive)
    486     HID_USAGE_PAGE_SENSOR,
    487     HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    488     HID_LOGICAL_MIN_8(0),
    489     HID_LOGICAL_MAX_8(2),
    490     HID_REPORT_SIZE(8),
    491     HID_REPORT_COUNT(1),
    492     HID_COLLECTION(Logical),
    493     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    494     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    495     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    496     HID_FEATURE(Data_Arr_Abs),
    497     HID_END_COLLECTION,
    498     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    499     HID_LOGICAL_MIN_8(0),
    500     HID_LOGICAL_MAX_8(5),
    501     HID_REPORT_SIZE(8),
    502     HID_REPORT_COUNT(1),
    503     HID_COLLECTION(Logical),
    504     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    505     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    506     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    507     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    508     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    509     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    510     HID_FEATURE(Data_Arr_Abs),
    511     HID_END_COLLECTION,
    512     HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    513     HID_LOGICAL_MIN_8(0),
    514     HID_LOGICAL_MAX_8(5),
    515     HID_REPORT_SIZE(8),
    516     HID_REPORT_COUNT(1),
    517     HID_COLLECTION(Logical),
    518     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    519     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    520     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    521     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    522     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    523     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    524     HID_FEATURE(Data_Arr_Abs),
    525     HID_END_COLLECTION,
    526     HID_USAGE_SENSOR_STATE,
    527     HID_LOGICAL_MIN_8(0),
    528     HID_LOGICAL_MAX_8(6),
    529     HID_REPORT_SIZE(8),
    530     HID_REPORT_COUNT(1),
    531     HID_COLLECTION(Logical),
    532     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    533     HID_USAGE_SENSOR_STATE_READY_SEL,
    534     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    535     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    536     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    537     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    538     HID_USAGE_SENSOR_STATE_ERROR_SEL,
    539     HID_FEATURE(Data_Arr_Abs),
    540     HID_END_COLLECTION,
    541     HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    542     HID_LOGICAL_MIN_8(0),
    543     HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    544     HID_REPORT_SIZE(32),
    545     HID_REPORT_COUNT(1),
    546     HID_UNIT_EXPONENT(0),
    547     HID_FEATURE(Data_Var_Abs),
    548     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_CUSTOM,
    549                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    550     HID_LOGICAL_MIN_8(0),
    551     HID_LOGICAL_MAX_16(0xFF,0xFF),
    552     HID_REPORT_SIZE(16),
    553     HID_REPORT_COUNT(1),
    554     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    555     HID_FEATURE(Data_Var_Abs),
    556     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_CUSTOM,HID_USAGE_SENSOR_DATA_MOD_MAX),
    557     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    558     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    559     HID_REPORT_SIZE(16),
    560     HID_REPORT_COUNT(1),
    561     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    562     HID_FEATURE(Data_Var_Abs),
    563     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_CUSTOM,HID_USAGE_SENSOR_DATA_MOD_MIN),
    564     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    565     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    566     HID_REPORT_SIZE(16),
    567     HID_REPORT_COUNT(1),
    568     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    569     HID_FEATURE(Data_Var_Abs),
    570 
    571     //input reports (transmit)
    572     HID_USAGE_PAGE_SENSOR,
    573     HID_USAGE_SENSOR_STATE,
    574     HID_LOGICAL_MIN_8(0),
    575     HID_LOGICAL_MAX_8(6),
    576     HID_REPORT_SIZE(8),
    577     HID_REPORT_COUNT(1),
    578     HID_COLLECTION(Logical),
    579     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    580     HID_USAGE_SENSOR_STATE_READY_SEL,
    581     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    582     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    583     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    584     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    585     HID_USAGE_SENSOR_STATE_ERROR_SEL,
    586     HID_INPUT(Data_Arr_Abs),
    587     HID_END_COLLECTION,
    588     HID_USAGE_SENSOR_EVENT,
    589     HID_LOGICAL_MIN_8(0),
    590     HID_LOGICAL_MAX_8(5),
    591     HID_REPORT_SIZE(8),
    592     HID_REPORT_COUNT(1),
    593     HID_COLLECTION(Logical),
    594     HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    595     HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    596     HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    597     HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    598     HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    599     HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    600     HID_INPUT(Data_Arr_Abs),
    601     HID_END_COLLECTION,
    602     HID_USAGE_SENSOR_DATA_CUSTOM_USAGE,
    603     HID_LOGICAL_MIN_8(0),
    604     HID_LOGICAL_MAX_16(0xFF,0xFF),
    605     HID_REPORT_SIZE(16),
    606     HID_REPORT_COUNT(1),
    607     HID_INPUT(Data_Var_Abs),
    608     HID_USAGE_SENSOR_DATA_CUSTOM_BOOLEAN_ARRAY,
    609     HID_LOGICAL_MIN_8(0),
    610     HID_LOGICAL_MAX_16(0xFF,0xFF),
    611     HID_REPORT_SIZE(16),
    612     HID_REPORT_COUNT(1),
    613     HID_INPUT(Data_Var_Abs),
    614     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
    615     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    616     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    617     HID_REPORT_SIZE(16),
    618     HID_REPORT_COUNT(1),
    619     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    620     HID_INPUT(Data_Var_Abs),
    621     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_2,
    622     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    623     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    624     HID_REPORT_SIZE(16),
    625     HID_REPORT_COUNT(1),
    626     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    627     HID_INPUT(Data_Var_Abs),
    628     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_3,
    629     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    630     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    631     HID_REPORT_SIZE(16),
    632     HID_REPORT_COUNT(1),
    633     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    634     HID_INPUT(Data_Var_Abs),
    635     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_4,
    636     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    637     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    638     HID_REPORT_SIZE(16),
    639     HID_REPORT_COUNT(1),
    640     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    641     HID_INPUT(Data_Var_Abs),
    642     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_5,
    643     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    644     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    645     HID_REPORT_SIZE(16),
    646     HID_REPORT_COUNT(1),
    647     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    648     HID_INPUT(Data_Var_Abs),
    649     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_6,
    650     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    651     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    652     HID_REPORT_SIZE(16),
    653     HID_REPORT_COUNT(1),
    654     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    655     HID_INPUT(Data_Var_Abs),
    656 
    657 #if 1 //define vendor-specific (non-spec) custom datafields
    658     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_7,
    659     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    660     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    661     HID_REPORT_SIZE(16),
    662     HID_REPORT_COUNT(1),
    663     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    664     HID_INPUT(Data_Var_Abs),
    665     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_8,
    666     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    667     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    668     HID_REPORT_SIZE(16),
    669     HID_REPORT_COUNT(1),
    670     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    671     HID_INPUT(Data_Var_Abs),
    672     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_9,
    673     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    674     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    675     HID_REPORT_SIZE(16),
    676     HID_REPORT_COUNT(1),
    677     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    678     HID_INPUT(Data_Var_Abs),
    679     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_10,
    680     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    681     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    682     HID_REPORT_SIZE(16),
    683     HID_REPORT_COUNT(1),
    684     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    685     HID_INPUT(Data_Var_Abs),
    686     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_11,
    687     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    688     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    689     HID_REPORT_SIZE(16),
    690     HID_REPORT_COUNT(1),
    691     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    692     HID_INPUT(Data_Var_Abs),
    693     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_12,
    694     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    695     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    696     HID_REPORT_SIZE(16),
    697     HID_REPORT_COUNT(1),
    698     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    699     HID_INPUT(Data_Var_Abs),
    700     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_13,
    701     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    702     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    703     HID_REPORT_SIZE(16),
    704     HID_REPORT_COUNT(1),
    705     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    706     HID_INPUT(Data_Var_Abs),
    707     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_14,
    708     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    709     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    710     HID_REPORT_SIZE(16),
    711     HID_REPORT_COUNT(1),
    712     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    713     HID_INPUT(Data_Var_Abs),
    714     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_15,
    715     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    716     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    717     HID_REPORT_SIZE(16),
    718     HID_REPORT_COUNT(1),
    719     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    720     HID_INPUT(Data_Var_Abs),
    721     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_16,
    722     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    723     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    724     HID_REPORT_SIZE(16),
    725     HID_REPORT_COUNT(1),
    726     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    727     HID_INPUT(Data_Var_Abs),
    728     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_17,
    729     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    730     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    731     HID_REPORT_SIZE(16),
    732     HID_REPORT_COUNT(1),
    733     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    734     HID_INPUT(Data_Var_Abs),
    735     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_18,
    736     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    737     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    738     HID_REPORT_SIZE(16),
    739     HID_REPORT_COUNT(1),
    740     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    741     HID_INPUT(Data_Var_Abs),
    742     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_19,
    743     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    744     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    745     HID_REPORT_SIZE(16),
    746     HID_REPORT_COUNT(1),
    747     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    748     HID_INPUT(Data_Var_Abs),
    749     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_20,
    750     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    751     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    752     HID_REPORT_SIZE(16),
    753     HID_REPORT_COUNT(1),
    754     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    755     HID_INPUT(Data_Var_Abs),
    756     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_21,
    757     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    758     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    759     HID_REPORT_SIZE(16),
    760     HID_REPORT_COUNT(1),
    761     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    762     HID_INPUT(Data_Var_Abs),
    763     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_22,
    764     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    765     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    766     HID_REPORT_SIZE(16),
    767     HID_REPORT_COUNT(1),
    768     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    769     HID_INPUT(Data_Var_Abs),
    770     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_23,
    771     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    772     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    773     HID_REPORT_SIZE(16),
    774     HID_REPORT_COUNT(1),
    775     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    776     HID_INPUT(Data_Var_Abs),
    777     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_24,
    778     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    779     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    780     HID_REPORT_SIZE(16),
    781     HID_REPORT_COUNT(1),
    782     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    783     HID_INPUT(Data_Var_Abs),
    784     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_25,
    785     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    786     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    787     HID_REPORT_SIZE(16),
    788     HID_REPORT_COUNT(1),
    789     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    790     HID_INPUT(Data_Var_Abs),
    791     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_26,
    792     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    793     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    794     HID_REPORT_SIZE(16),
    795     HID_REPORT_COUNT(1),
    796     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    797     HID_INPUT(Data_Var_Abs),
    798     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_27,
    799     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    800     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    801     HID_REPORT_SIZE(16),
    802     HID_REPORT_COUNT(1),
    803     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    804     HID_INPUT(Data_Var_Abs),
    805     HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_28,
    806     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    807     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    808     HID_REPORT_SIZE(16),
    809     HID_REPORT_COUNT(1),
    810     HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    811     HID_INPUT(Data_Var_Abs),
    812 #endif
    813     HID_END_COLLECTION
    814 };
    815 
    816 
    817 /**
    818  * Human presence sensor example.
    819  */
    820 const unsigned char pres_report_descriptor[] = {
    821     HID_USAGE_PAGE_SENSOR,
    822     HID_USAGE_SENSOR_TYPE_BIOMETRIC_PRESENCE,
    823     HID_COLLECTION(Physical),
    824 
    825     //feature reports (xmit/receive)
    826     HID_USAGE_PAGE_SENSOR,
    827     HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    828     HID_LOGICAL_MIN_8(0),
    829     HID_LOGICAL_MAX_8(2),
    830     HID_REPORT_SIZE(8),
    831     HID_REPORT_COUNT(1),
    832     HID_COLLECTION(Logical),
    833     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    834     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    835     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    836     HID_FEATURE(Data_Arr_Abs),
    837     HID_END_COLLECTION,
    838     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    839     HID_LOGICAL_MIN_8(0),
    840     HID_LOGICAL_MAX_8(5),
    841     HID_REPORT_SIZE(8),
    842     HID_REPORT_COUNT(1),
    843     HID_COLLECTION(Logical),
    844     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    845     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    846     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    847     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    848     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    849     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    850     HID_FEATURE(Data_Arr_Abs),
    851     HID_END_COLLECTION,
    852     HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    853     HID_LOGICAL_MIN_8(0),
    854     HID_LOGICAL_MAX_8(5),
    855     HID_REPORT_SIZE(8),
    856     HID_REPORT_COUNT(1),
    857     HID_COLLECTION(Logical),
    858     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    859     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    860     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    861     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    862     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    863     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    864     HID_FEATURE(Data_Arr_Abs),
    865     HID_END_COLLECTION,
    866     HID_USAGE_SENSOR_STATE,
    867     HID_LOGICAL_MIN_8(0),
    868     HID_LOGICAL_MAX_8(6),
    869     HID_REPORT_SIZE(8),
    870     HID_REPORT_COUNT(1),
    871     HID_COLLECTION(Logical),
    872     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    873     HID_USAGE_SENSOR_STATE_READY_SEL,
    874     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    875     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    876     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    877     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    878     HID_USAGE_SENSOR_STATE_ERROR_SEL,
    879     HID_FEATURE(Data_Arr_Abs),
    880     HID_END_COLLECTION,
    881     HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    882     HID_LOGICAL_MIN_8(0),
    883     HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    884     HID_REPORT_SIZE(32),
    885     HID_REPORT_COUNT(1),
    886     HID_UNIT_EXPONENT(0),
    887     HID_FEATURE(Data_Var_Abs),
    888 
    889     //input reports (transmit)
    890     HID_USAGE_PAGE_SENSOR,
    891     HID_USAGE_SENSOR_STATE,
    892     HID_LOGICAL_MIN_8(0),
    893     HID_LOGICAL_MAX_8(6),
    894     HID_REPORT_SIZE(8),
    895     HID_REPORT_COUNT(1),
    896     HID_COLLECTION(Logical),
    897     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    898     HID_USAGE_SENSOR_STATE_READY_SEL,
    899     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    900     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    901     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    902     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    903     HID_USAGE_SENSOR_STATE_ERROR_SEL,
    904     HID_INPUT(Data_Arr_Abs),
    905     HID_END_COLLECTION,
    906     HID_USAGE_SENSOR_EVENT,
    907     HID_LOGICAL_MIN_8(0),
    908     HID_LOGICAL_MAX_8(5),
    909     HID_REPORT_SIZE(8),
    910     HID_REPORT_COUNT(1),
    911     HID_COLLECTION(Logical),
    912     HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    913     HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    914     HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    915     HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    916     HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    917     HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    918     HID_INPUT(Data_Arr_Abs),
    919     HID_END_COLLECTION,
    920     HID_USAGE_SENSOR_DATA_BIOMETRIC_HUMAN_PRESENCE,
    921     HID_LOGICAL_MIN_8(0), // False
    922     HID_LOGICAL_MAX_8(1), // True
    923     HID_REPORT_SIZE(8),
    924     HID_REPORT_COUNT(1),
    925     HID_INPUT(Data_Var_Abs),
    926 
    927     HID_END_COLLECTION
    928 };
    929 
    930 
    931 /**
    932  * Proximity sensor example.
    933  */
    934 const unsigned char prox_report_descriptor[] = {
    935     HID_USAGE_PAGE_SENSOR,
    936     HID_USAGE_SENSOR_TYPE_BIOMETRIC_PROXIMITY,
    937     HID_COLLECTION(Physical),
    938 
    939     //feature reports (xmit/receive)
    940     HID_USAGE_PAGE_SENSOR,
    941     HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    942     HID_LOGICAL_MIN_8(0),
    943     HID_LOGICAL_MAX_8(2),
    944     HID_REPORT_SIZE(8),
    945     HID_REPORT_COUNT(1),
    946     HID_COLLECTION(Logical),
    947     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    948     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    949     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    950     HID_FEATURE(Data_Arr_Abs),
    951     HID_END_COLLECTION,
    952     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    953     HID_LOGICAL_MIN_8(0),
    954     HID_LOGICAL_MAX_8(5),
    955     HID_REPORT_SIZE(8),
    956     HID_REPORT_COUNT(1),
    957     HID_COLLECTION(Logical),
    958     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    959     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    960     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    961     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    962     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    963     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    964     HID_FEATURE(Data_Arr_Abs),
    965     HID_END_COLLECTION,
    966     HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    967     HID_LOGICAL_MIN_8(0),
    968     HID_LOGICAL_MAX_8(5),
    969     HID_REPORT_SIZE(8),
    970     HID_REPORT_COUNT(1),
    971     HID_COLLECTION(Logical),
    972     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    973     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    974     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    975     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    976     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    977     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    978     HID_FEATURE(Data_Arr_Abs),
    979     HID_END_COLLECTION,
    980     HID_USAGE_SENSOR_STATE,
    981     HID_LOGICAL_MIN_8(0),
    982     HID_LOGICAL_MAX_8(6),
    983     HID_REPORT_SIZE(8),
    984     HID_REPORT_COUNT(1),
    985     HID_COLLECTION(Logical),
    986     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    987     HID_USAGE_SENSOR_STATE_READY_SEL,
    988     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    989     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    990     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    991     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    992     HID_USAGE_SENSOR_STATE_ERROR_SEL,
    993     HID_FEATURE(Data_Arr_Abs),
    994     HID_END_COLLECTION,
    995     HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    996     HID_LOGICAL_MIN_8(0),
    997     HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    998     HID_REPORT_SIZE(32),
    999     HID_REPORT_COUNT(1),
   1000     HID_UNIT_EXPONENT(0),
   1001     HID_FEATURE(Data_Var_Abs),
   1002     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_BIOMETRIC_HUMAN_PROXIMITY_RANGE,
   1003                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
   1004     HID_LOGICAL_MIN_8(0),
   1005     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1006     HID_REPORT_SIZE(16),
   1007     HID_REPORT_COUNT(1),
   1008     HID_UNIT_EXPONENT(0x0D), // scale default unit "meter" to "centimeter"
   1009     // to provide 2 digits past decimal point
   1010     HID_FEATURE(Data_Var_Abs),
   1011     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_BIOMETRIC_HUMAN_PROXIMITY_RANGE,
   1012                           HID_USAGE_SENSOR_DATA_MOD_MAX),
   1013     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1014     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1015     HID_REPORT_SIZE(16),
   1016     HID_REPORT_COUNT(1),
   1017     HID_UNIT_EXPONENT(0x0D), // scale default unit "meter" to "centimeter"
   1018     // to provide 2 digits past decimal point
   1019     HID_FEATURE(Data_Var_Abs),
   1020     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_BIOMETRIC_HUMAN_PROXIMITY_RANGE,
   1021                           HID_USAGE_SENSOR_DATA_MOD_MIN),
   1022     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1023     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1024     HID_REPORT_SIZE(16),
   1025     HID_REPORT_COUNT(1),
   1026     HID_UNIT_EXPONENT(0x0D), // scale default unit "meter" to "centimeter"
   1027     // to provide 2 digits past decimal point
   1028     HID_FEATURE(Data_Var_Abs),
   1029 
   1030     //input reports (transmit)
   1031     HID_USAGE_PAGE_SENSOR,
   1032     HID_USAGE_SENSOR_STATE,
   1033     HID_LOGICAL_MIN_8(0),
   1034     HID_LOGICAL_MAX_8(6),
   1035     HID_REPORT_SIZE(8),
   1036     HID_REPORT_COUNT(1),
   1037     HID_COLLECTION(Logical),
   1038     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   1039     HID_USAGE_SENSOR_STATE_READY_SEL,
   1040     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   1041     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   1042     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   1043     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   1044     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   1045     HID_INPUT(Data_Arr_Abs),
   1046     HID_END_COLLECTION,
   1047     HID_USAGE_SENSOR_EVENT,
   1048     HID_LOGICAL_MIN_8(0),
   1049     HID_LOGICAL_MAX_8(5),
   1050     HID_REPORT_SIZE(8),
   1051     HID_REPORT_COUNT(1),
   1052     HID_COLLECTION(Logical),
   1053     HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
   1054     HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
   1055     HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
   1056     HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
   1057     HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
   1058     HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
   1059     HID_INPUT(Data_Arr_Abs),
   1060     HID_END_COLLECTION,
   1061     HID_USAGE_SENSOR_DATA_BIOMETRIC_HUMAN_PROXIMITY_OUT_OF_RANGE,
   1062     HID_LOGICAL_MIN_8(0), // False
   1063     HID_LOGICAL_MAX_8(1), // True
   1064     HID_REPORT_SIZE(8),
   1065     HID_REPORT_COUNT(1),
   1066     HID_INPUT(Data_Var_Abs),
   1067     HID_USAGE_SENSOR_DATA_BIOMETRIC_HUMAN_PROXIMITY_RANGE,
   1068     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1069     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1070     HID_REPORT_SIZE(16),
   1071     HID_REPORT_COUNT(1),
   1072     HID_UNIT_EXPONENT(0x0D),  // scale default unit "meter" to "centimeter"
   1073     // to provide 2 digits past decimal point
   1074     HID_INPUT(Data_Var_Abs),
   1075 
   1076     HID_END_COLLECTION
   1077 };
   1078 
   1079 
   1080 /**
   1081  * Barometer sensor example.
   1082  */
   1083 const unsigned char bar_report_descriptor[] = {
   1084     HID_USAGE_PAGE_SENSOR,
   1085     HID_USAGE_SENSOR_TYPE_ENVIRONMENTAL_ATMOSPHERIC_PRESSURE,
   1086     HID_COLLECTION(Physical),
   1087 
   1088     //feature reports (xmit/receive)
   1089     HID_USAGE_PAGE_SENSOR,
   1090     HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
   1091     HID_LOGICAL_MIN_8(0),
   1092     HID_LOGICAL_MAX_8(2),
   1093     HID_REPORT_SIZE(8),
   1094     HID_REPORT_COUNT(1),
   1095     HID_COLLECTION(Logical),
   1096     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
   1097     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
   1098     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
   1099     HID_FEATURE(Data_Arr_Abs),
   1100     HID_END_COLLECTION,
   1101     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
   1102     HID_LOGICAL_MIN_8(0),
   1103     HID_LOGICAL_MAX_8(5),
   1104     HID_REPORT_SIZE(8),
   1105     HID_REPORT_COUNT(1),
   1106     HID_COLLECTION(Logical),
   1107     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
   1108     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
   1109     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
   1110     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
   1111     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
   1112     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
   1113     HID_FEATURE(Data_Arr_Abs),
   1114     HID_END_COLLECTION,
   1115     HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
   1116     HID_LOGICAL_MIN_8(0),
   1117     HID_LOGICAL_MAX_8(5),
   1118     HID_REPORT_SIZE(8),
   1119     HID_REPORT_COUNT(1),
   1120     HID_COLLECTION(Logical),
   1121     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
   1122     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
   1123     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
   1124     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
   1125     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
   1126     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
   1127     HID_FEATURE(Data_Arr_Abs),
   1128     HID_END_COLLECTION,
   1129     HID_USAGE_SENSOR_STATE,
   1130     HID_LOGICAL_MIN_8(0),
   1131     HID_LOGICAL_MAX_8(6),
   1132     HID_REPORT_SIZE(8),
   1133     HID_REPORT_COUNT(1),
   1134     HID_COLLECTION(Logical),
   1135     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   1136     HID_USAGE_SENSOR_STATE_READY_SEL,
   1137     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   1138     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   1139     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   1140     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   1141     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   1142     HID_FEATURE(Data_Arr_Abs),
   1143     HID_END_COLLECTION,
   1144     HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
   1145     HID_LOGICAL_MIN_8(0),
   1146     HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
   1147     HID_REPORT_SIZE(32),
   1148     HID_REPORT_COUNT(1),
   1149     HID_UNIT_EXPONENT(0),
   1150     HID_FEATURE(Data_Var_Abs),
   1151     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_ATMOSPHERIC_PRESSURE,
   1152                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
   1153     HID_LOGICAL_MIN_8(0),
   1154     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1155     HID_REPORT_SIZE(16),
   1156     HID_REPORT_COUNT(1),
   1157     HID_UNIT_EXPONENT(0x0E), // scale default unit "Bar" to provide 2 digits past the decimal point
   1158     HID_FEATURE(Data_Var_Abs),
   1159     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_ATMOSPHERIC_PRESSURE,
   1160                           HID_USAGE_SENSOR_DATA_MOD_MAX),
   1161     HID_LOGICAL_MIN_8(0),
   1162     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1163     HID_REPORT_SIZE(16),
   1164     HID_REPORT_COUNT(1),
   1165     HID_UNIT_EXPONENT(0x0E), // scale default unit "Bar" to provide 2 digits past the decimal point
   1166     HID_FEATURE(Data_Var_Abs),
   1167     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_ATMOSPHERIC_PRESSURE,
   1168                           HID_USAGE_SENSOR_DATA_MOD_MIN),
   1169     HID_LOGICAL_MIN_8(0),
   1170     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1171     HID_REPORT_SIZE(16),
   1172     HID_REPORT_COUNT(1),
   1173     HID_UNIT_EXPONENT(0x0E), // scale default unit "Bar" to provide 2 digits past the decimal point
   1174     HID_FEATURE(Data_Var_Abs),
   1175 
   1176     //input reports (transmit)
   1177     HID_USAGE_PAGE_SENSOR,
   1178     HID_USAGE_SENSOR_STATE,
   1179     HID_LOGICAL_MIN_8(0),
   1180     HID_LOGICAL_MAX_8(6),
   1181     HID_REPORT_SIZE(8),
   1182     HID_REPORT_COUNT(1),
   1183     HID_COLLECTION(Logical),
   1184     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   1185     HID_USAGE_SENSOR_STATE_READY_SEL,
   1186     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   1187     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   1188     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   1189     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   1190     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   1191     HID_INPUT(Data_Arr_Abs),
   1192     HID_END_COLLECTION,
   1193     HID_USAGE_SENSOR_EVENT,
   1194     HID_LOGICAL_MIN_8(0),
   1195     HID_LOGICAL_MAX_8(5),
   1196     HID_REPORT_SIZE(8),
   1197     HID_REPORT_COUNT(1),
   1198     HID_COLLECTION(Logical),
   1199     HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
   1200     HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
   1201     HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
   1202     HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
   1203     HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
   1204     HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
   1205     HID_INPUT(Data_Arr_Abs),
   1206     HID_END_COLLECTION,
   1207     HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_ATMOSPHERIC_PRESSURE,
   1208     HID_LOGICAL_MIN_8(0),
   1209     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1210     HID_REPORT_SIZE(16),
   1211     HID_REPORT_COUNT(1),
   1212     HID_UNIT_EXPONENT(0x0E), // scale default unit "Bar" to provide 2 digits past the decimal point
   1213     HID_INPUT(Data_Var_Abs),
   1214 
   1215     HID_END_COLLECTION
   1216 };
   1217 
   1218 
   1219 /**
   1220  * Humidity sensor example.
   1221  */
   1222 const unsigned char humi_report_descriptor[] = {
   1223     HID_USAGE_PAGE_SENSOR,
   1224     HID_USAGE_SENSOR_TYPE_ENVIRONMENTAL_HUMIDITY,
   1225     HID_COLLECTION(Physical),
   1226 
   1227     //feature reports (xmit/receive)
   1228     HID_USAGE_PAGE_SENSOR,
   1229     HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
   1230     HID_LOGICAL_MIN_8(0),
   1231     HID_LOGICAL_MAX_8(2),
   1232     HID_REPORT_SIZE(8),
   1233     HID_REPORT_COUNT(1),
   1234     HID_COLLECTION(Logical),
   1235     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
   1236     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
   1237     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
   1238     HID_FEATURE(Data_Arr_Abs),
   1239     HID_END_COLLECTION,
   1240     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
   1241     HID_LOGICAL_MIN_8(0),
   1242     HID_LOGICAL_MAX_8(5),
   1243     HID_REPORT_SIZE(8),
   1244     HID_REPORT_COUNT(1),
   1245     HID_COLLECTION(Logical),
   1246     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
   1247     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
   1248     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
   1249     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
   1250     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
   1251     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
   1252     HID_FEATURE(Data_Arr_Abs),
   1253     HID_END_COLLECTION,
   1254     HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
   1255     HID_LOGICAL_MIN_8(0),
   1256     HID_LOGICAL_MAX_8(5),
   1257     HID_REPORT_SIZE(8),
   1258     HID_REPORT_COUNT(1),
   1259     HID_COLLECTION(Logical),
   1260     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
   1261     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
   1262     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
   1263     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
   1264     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
   1265     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
   1266     HID_FEATURE(Data_Arr_Abs),
   1267     HID_END_COLLECTION,
   1268     HID_USAGE_SENSOR_STATE,
   1269     HID_LOGICAL_MIN_8(0),
   1270     HID_LOGICAL_MAX_8(6),
   1271     HID_REPORT_SIZE(8),
   1272     HID_REPORT_COUNT(1),
   1273     HID_COLLECTION(Logical),
   1274     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   1275     HID_USAGE_SENSOR_STATE_READY_SEL,
   1276     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   1277     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   1278     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   1279     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   1280     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   1281     HID_FEATURE(Data_Arr_Abs),
   1282     HID_END_COLLECTION,
   1283     HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
   1284     HID_LOGICAL_MIN_8(0),
   1285     HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
   1286     HID_REPORT_SIZE(32),
   1287     HID_REPORT_COUNT(1),
   1288     HID_UNIT_EXPONENT(0),
   1289     HID_FEATURE(Data_Var_Abs),
   1290     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_RELATIVE_HUMIDITY,
   1291                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
   1292     HID_LOGICAL_MIN_8(0),
   1293     HID_LOGICAL_MAX_16(0x10,0x27), // 10000 = 0.00 to 100.00 percent with 2 digits past decimal point
   1294     HID_REPORT_SIZE(16),
   1295     HID_REPORT_COUNT(1),
   1296     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past the decimal point
   1297     HID_FEATURE(Data_Var_Abs),
   1298     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_RELATIVE_HUMIDITY,
   1299                           HID_USAGE_SENSOR_DATA_MOD_MAX),
   1300     HID_LOGICAL_MIN_8(0),
   1301     HID_LOGICAL_MAX_16(0x10,0x27), // 10000 = 0.00 to 100.00 percent with 2 digits past decimal point
   1302     HID_REPORT_SIZE(16),
   1303     HID_REPORT_COUNT(1),
   1304     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past the decimal point
   1305     HID_FEATURE(Data_Var_Abs),
   1306     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_RELATIVE_HUMIDITY,
   1307                           HID_USAGE_SENSOR_DATA_MOD_MIN),
   1308     HID_LOGICAL_MIN_8(0),
   1309     HID_LOGICAL_MAX_16(0x10,0x27), // 10000 = 0.00 to 100.00 percent with 2 digits past decimal point
   1310     HID_REPORT_SIZE(16),
   1311     HID_REPORT_COUNT(1),
   1312     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past the decimal point
   1313     HID_FEATURE(Data_Var_Abs),
   1314 
   1315     //input reports (transmit)
   1316     HID_USAGE_PAGE_SENSOR,
   1317     HID_USAGE_SENSOR_STATE,
   1318     HID_LOGICAL_MIN_8(0),
   1319     HID_LOGICAL_MAX_8(6),
   1320     HID_REPORT_SIZE(8),
   1321     HID_REPORT_COUNT(1),
   1322     HID_COLLECTION(Logical),
   1323     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   1324     HID_USAGE_SENSOR_STATE_READY_SEL,
   1325     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   1326     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   1327     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   1328     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   1329     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   1330     HID_INPUT(Data_Arr_Abs),
   1331     HID_END_COLLECTION,
   1332     HID_USAGE_SENSOR_EVENT,
   1333     HID_LOGICAL_MIN_8(0),
   1334     HID_LOGICAL_MAX_8(5),
   1335     HID_REPORT_SIZE(8),
   1336     HID_REPORT_COUNT(1),
   1337     HID_COLLECTION(Logical),
   1338     HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
   1339     HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
   1340     HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
   1341     HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
   1342     HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
   1343     HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
   1344     HID_INPUT(Data_Arr_Abs),
   1345     HID_END_COLLECTION,
   1346     HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_RELATIVE_HUMIDITY,
   1347     HID_LOGICAL_MIN_8(0),
   1348     HID_LOGICAL_MAX_16(0x10,0x27), // 10000 = 0.00 to 100.00 percent with 2 digits past decimal point
   1349     HID_REPORT_SIZE(16),
   1350     HID_REPORT_COUNT(1),
   1351     HID_UNIT_EXPONENT(0x0E), // scale default unit "percent"
   1352     // to provide 2 digits past the decimal point
   1353     HID_INPUT(Data_Var_Abs),
   1354 
   1355     HID_END_COLLECTION
   1356 };
   1357 
   1358 
   1359 /**
   1360  * Temperature sensor example.
   1361  */
   1362 const unsigned char temp_report_descriptor[] = {
   1363     HID_USAGE_PAGE_SENSOR,
   1364     HID_USAGE_SENSOR_TYPE_ENVIRONMENTAL_TEMPERATURE,
   1365     HID_COLLECTION(Physical),
   1366 
   1367     //feature reports (xmit/receive)
   1368     HID_USAGE_PAGE_SENSOR,
   1369     HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
   1370     HID_LOGICAL_MIN_8(0),
   1371     HID_LOGICAL_MAX_8(2),
   1372     HID_REPORT_SIZE(8),
   1373     HID_REPORT_COUNT(1),
   1374     HID_COLLECTION(Logical),
   1375     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
   1376     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
   1377     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
   1378     HID_FEATURE(Data_Arr_Abs),
   1379     HID_END_COLLECTION,
   1380     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
   1381     HID_LOGICAL_MIN_8(0),
   1382     HID_LOGICAL_MAX_8(5),
   1383     HID_REPORT_SIZE(8),
   1384     HID_REPORT_COUNT(1),
   1385     HID_COLLECTION(Logical),
   1386     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
   1387     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
   1388     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
   1389     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
   1390     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
   1391     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
   1392     HID_FEATURE(Data_Arr_Abs),
   1393     HID_END_COLLECTION,
   1394     HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
   1395     HID_LOGICAL_MIN_8(0),
   1396     HID_LOGICAL_MAX_8(5),
   1397     HID_REPORT_SIZE(8),
   1398     HID_REPORT_COUNT(1),
   1399     HID_COLLECTION(Logical),
   1400     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
   1401     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
   1402     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
   1403     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
   1404     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
   1405     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
   1406     HID_FEATURE(Data_Arr_Abs),
   1407     HID_END_COLLECTION,
   1408     HID_USAGE_SENSOR_STATE,
   1409     HID_LOGICAL_MIN_8(0),
   1410     HID_LOGICAL_MAX_8(6),
   1411     HID_REPORT_SIZE(8),
   1412     HID_REPORT_COUNT(1),
   1413     HID_COLLECTION(Logical),
   1414     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   1415     HID_USAGE_SENSOR_STATE_READY_SEL,
   1416     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   1417     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   1418     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   1419     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   1420     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   1421     HID_FEATURE(Data_Arr_Abs),
   1422     HID_END_COLLECTION,
   1423     HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
   1424     HID_LOGICAL_MIN_8(0),
   1425     HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
   1426     HID_REPORT_SIZE(32),
   1427     HID_REPORT_COUNT(1),
   1428     HID_UNIT_EXPONENT(0),
   1429     HID_FEATURE(Data_Var_Abs),
   1430     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_TEMPERATURE,
   1431                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
   1432     HID_LOGICAL_MIN_8(0),
   1433     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1434     HID_REPORT_SIZE(16),
   1435     HID_REPORT_COUNT(1),
   1436     HID_UNIT_EXPONENT(0x0E), // scale default unit "Celsius"
   1437     // to provide 2 digits past the decimal point
   1438     HID_FEATURE(Data_Var_Abs),
   1439     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_TEMPERATURE,
   1440                           HID_USAGE_SENSOR_DATA_MOD_MAX),
   1441     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1442     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1443     HID_REPORT_SIZE(16),
   1444     HID_REPORT_COUNT(1),
   1445     HID_UNIT_EXPONENT(0x0E), // scale default unit "Celsius"
   1446     // to provide 2 digits past the decimal point
   1447     HID_FEATURE(Data_Var_Abs),
   1448     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_TEMPERATURE,
   1449                           HID_USAGE_SENSOR_DATA_MOD_MIN),
   1450     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1451     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1452     HID_REPORT_SIZE(16),
   1453     HID_REPORT_COUNT(1),
   1454     HID_UNIT_EXPONENT(0x0E), // scale default unit "Celsius"
   1455     // to provide 2 digits past the decimal point
   1456     HID_FEATURE(Data_Var_Abs),
   1457 
   1458     //input reports (transmit)
   1459     HID_USAGE_PAGE_SENSOR,
   1460     HID_USAGE_SENSOR_STATE,
   1461     HID_LOGICAL_MIN_8(0),
   1462     HID_LOGICAL_MAX_8(6),
   1463     HID_REPORT_SIZE(8),
   1464     HID_REPORT_COUNT(1),
   1465     HID_COLLECTION(Logical),
   1466     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   1467     HID_USAGE_SENSOR_STATE_READY_SEL,
   1468     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   1469     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   1470     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   1471     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   1472     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   1473     HID_INPUT(Data_Arr_Abs),
   1474     HID_END_COLLECTION,
   1475     HID_USAGE_SENSOR_EVENT,
   1476     HID_LOGICAL_MIN_8(0),
   1477     HID_LOGICAL_MAX_8(16),
   1478     HID_REPORT_SIZE(8),
   1479     HID_REPORT_COUNT(1),
   1480     HID_COLLECTION(Logical),
   1481     HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
   1482     HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
   1483     HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
   1484     HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
   1485     HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
   1486     HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
   1487     HID_INPUT(Data_Arr_Abs),
   1488     HID_END_COLLECTION,
   1489     HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_TEMPERATURE,
   1490     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1491     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1492     HID_REPORT_SIZE(16),
   1493     HID_REPORT_COUNT(1),
   1494     HID_UNIT_EXPONENT(0x0E), // scale default unit "Celsius"
   1495     // to provide 2 digits past the decimal point
   1496     HID_INPUT(Data_Var_Abs),
   1497 
   1498     HID_END_COLLECTION
   1499 };
   1500 
   1501 
   1502 /**
   1503  * Ambient light sensor example.
   1504  */
   1505 const unsigned char als_report_descriptor[] = {
   1506     HID_USAGE_PAGE_SENSOR,         // USAGE_PAGE (Sensor)
   1507     HID_USAGE_SENSOR_TYPE_LIGHT_AMBIENTLIGHT, // USAGE (AmbientLight)
   1508     HID_COLLECTION(Physical),
   1509 
   1510     //feature reports (xmit/receive)
   1511     HID_USAGE_PAGE_SENSOR,
   1512     HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
   1513     HID_LOGICAL_MIN_8(0),
   1514     HID_LOGICAL_MAX_8(2),
   1515     HID_REPORT_SIZE(8),
   1516     HID_REPORT_COUNT(1),
   1517     HID_COLLECTION(Logical),
   1518     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
   1519     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
   1520     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
   1521     HID_FEATURE(Data_Arr_Abs),
   1522     HID_END_COLLECTION,
   1523     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
   1524     HID_LOGICAL_MIN_8(0),
   1525     HID_LOGICAL_MAX_8(5),
   1526     HID_REPORT_SIZE(8),
   1527     HID_REPORT_COUNT(1),
   1528     HID_COLLECTION(Logical),
   1529     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
   1530     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
   1531     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
   1532     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
   1533     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
   1534     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
   1535     HID_FEATURE(Data_Arr_Abs),
   1536     HID_END_COLLECTION,
   1537     HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
   1538     HID_LOGICAL_MIN_8(0),
   1539     HID_LOGICAL_MAX_8(5),
   1540     HID_REPORT_SIZE(8),
   1541     HID_REPORT_COUNT(1),
   1542     HID_COLLECTION(Logical),
   1543     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
   1544     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
   1545     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
   1546     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
   1547     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
   1548     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
   1549     HID_FEATURE(Data_Arr_Abs),
   1550     HID_END_COLLECTION,
   1551     HID_USAGE_SENSOR_STATE,
   1552     HID_LOGICAL_MIN_8(0),
   1553     HID_LOGICAL_MAX_8(6),
   1554     HID_REPORT_SIZE(8),
   1555     HID_REPORT_COUNT(1),
   1556     HID_COLLECTION(Logical),
   1557     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   1558     HID_USAGE_SENSOR_STATE_READY_SEL,
   1559     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   1560     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   1561     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   1562     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   1563     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   1564     HID_FEATURE(Data_Arr_Abs),
   1565     HID_END_COLLECTION,
   1566     HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
   1567     HID_LOGICAL_MIN_8(0),
   1568     HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
   1569     HID_REPORT_SIZE(32),
   1570     HID_REPORT_COUNT(1),
   1571     HID_UNIT_EXPONENT(0),
   1572     HID_FEATURE(Data_Var_Abs),
   1573     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_LIGHT_ILLUMINANCE,
   1574                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_REL_PCT),
   1575     HID_LOGICAL_MIN_8(0),
   1576     HID_LOGICAL_MAX_16(0x10,0x27), // 10000 = 0.00 to 100.00 percent with 2 digits past decimal point
   1577     HID_REPORT_SIZE(16),
   1578     HID_REPORT_COUNT(1),
   1579     HID_UNIT_EXPONENT(0x0E),  // scale default unit to provide 2 digits past decimal point
   1580     HID_FEATURE(Data_Var_Abs),
   1581     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_LIGHT_ILLUMINANCE,HID_USAGE_SENSOR_DATA_MOD_MAX),
   1582     HID_LOGICAL_MIN_8(0),
   1583     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1584     HID_REPORT_SIZE(16),
   1585     HID_REPORT_COUNT(1),
   1586     HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
   1587     HID_FEATURE(Data_Var_Abs),
   1588     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_LIGHT_ILLUMINANCE,HID_USAGE_SENSOR_DATA_MOD_MIN),
   1589     HID_LOGICAL_MIN_8(0),
   1590     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1591     HID_REPORT_SIZE(16),
   1592     HID_REPORT_COUNT(1),
   1593     HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
   1594     HID_FEATURE(Data_Var_Abs),
   1595 
   1596     //add this definition if required by the specific application
   1597     HID_USAGE_SENSOR_PROPERTY_RESPONSE_CURVE,
   1598     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1599     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1600     HID_REPORT_SIZE(16),
   1601     HID_REPORT_COUNT(10), //as required for n pair of values
   1602     HID_UNIT_EXPONENT(0x0), // scale default unit to provide 0 digits past the decimal point
   1603     HID_FEATURE(Data_Var_Abs),
   1604 
   1605     //input reports (transmit)
   1606     HID_USAGE_PAGE_SENSOR,
   1607     HID_USAGE_SENSOR_STATE,
   1608     HID_LOGICAL_MIN_8(0),
   1609     HID_LOGICAL_MAX_8(6),
   1610     HID_REPORT_SIZE(8),
   1611     HID_REPORT_COUNT(1),
   1612     HID_COLLECTION(Logical),
   1613     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   1614     HID_USAGE_SENSOR_STATE_READY_SEL,
   1615     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   1616     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   1617     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   1618     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   1619     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   1620     HID_INPUT(Data_Arr_Abs),
   1621     HID_END_COLLECTION,
   1622     HID_USAGE_SENSOR_EVENT,
   1623     HID_LOGICAL_MIN_8(0),
   1624     HID_LOGICAL_MAX_8(5),
   1625     HID_REPORT_SIZE(8),
   1626     HID_REPORT_COUNT(1),
   1627     HID_COLLECTION(Logical),
   1628     HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
   1629     HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
   1630     HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
   1631     HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
   1632     HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
   1633     HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
   1634     HID_INPUT(Data_Arr_Abs),
   1635     HID_END_COLLECTION,
   1636     HID_USAGE_SENSOR_DATA_LIGHT_ILLUMINANCE,
   1637     HID_LOGICAL_MIN_8(0),
   1638     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1639     HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
   1640     HID_REPORT_SIZE(16),
   1641     HID_REPORT_COUNT(1),
   1642     HID_INPUT(Data_Var_Abs),
   1643     HID_USAGE_SENSOR_DATA_LIGHT_COLOR_TEMPERATURE,
   1644     HID_LOGICAL_MIN_8(0),
   1645     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1646     HID_UNIT_EXPONENT(0),
   1647     HID_REPORT_SIZE(16),
   1648     HID_REPORT_COUNT(1),
   1649     HID_INPUT(Data_Var_Abs),
   1650     HID_USAGE_SENSOR_DATA_LIGHT_CHROMATICITY_X,
   1651     HID_LOGICAL_MIN_8(0),
   1652     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1653     HID_UNIT_EXPONENT(0x0C), // scale default unit to provide 4 digits past decimal point
   1654     HID_REPORT_SIZE(16),
   1655     HID_REPORT_COUNT(1),
   1656     HID_INPUT(Data_Var_Abs),
   1657     HID_USAGE_SENSOR_DATA_LIGHT_CHROMATICITY_Y,
   1658     HID_LOGICAL_MIN_8(0),
   1659     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1660     HID_UNIT_EXPONENT(0x0C), // scale default unit to provide 4 digits past decimal point
   1661     HID_REPORT_SIZE(16),
   1662     HID_REPORT_COUNT(1),
   1663     HID_INPUT(Data_Var_Abs),
   1664 
   1665     HID_END_COLLECTION
   1666 };
   1667 
   1668 
   1669 /**
   1670  * 3D accelerometer sensor example.
   1671  */
   1672 const unsigned char accel3_report_descriptor[] = {
   1673     HID_USAGE_PAGE_SENSOR,
   1674     HID_USAGE_SENSOR_TYPE_MOTION_ACCELEROMETER_3D,
   1675     HID_COLLECTION(Physical),
   1676 
   1677     //feature reports (xmit/receive)
   1678     HID_USAGE_PAGE_SENSOR,
   1679     HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
   1680     HID_LOGICAL_MIN_8(0),
   1681     HID_LOGICAL_MAX_8(2),
   1682     HID_REPORT_SIZE(8),
   1683     HID_REPORT_COUNT(1),
   1684     HID_COLLECTION(Logical),
   1685     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
   1686     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
   1687     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
   1688     HID_FEATURE(Data_Arr_Abs),
   1689     HID_END_COLLECTION,
   1690     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
   1691     HID_LOGICAL_MIN_8(0),
   1692     HID_LOGICAL_MAX_8(5),
   1693     HID_REPORT_SIZE(8),
   1694     HID_REPORT_COUNT(1),
   1695     HID_COLLECTION(Logical),
   1696     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
   1697     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
   1698     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
   1699     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
   1700     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
   1701     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
   1702     HID_FEATURE(Data_Arr_Abs),
   1703     HID_END_COLLECTION,
   1704     HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
   1705     HID_LOGICAL_MIN_8(0),
   1706     HID_LOGICAL_MAX_8(5),
   1707     HID_REPORT_SIZE(8),
   1708     HID_REPORT_COUNT(1),
   1709     HID_COLLECTION(Logical),
   1710     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
   1711     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
   1712     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
   1713     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
   1714     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
   1715     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
   1716     HID_FEATURE(Data_Arr_Abs),
   1717     HID_END_COLLECTION,
   1718     HID_USAGE_SENSOR_STATE,
   1719     HID_LOGICAL_MIN_8(0),
   1720     HID_LOGICAL_MAX_8(6),
   1721     HID_REPORT_SIZE(8),
   1722     HID_REPORT_COUNT(1),
   1723     HID_COLLECTION(Logical),
   1724     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   1725     HID_USAGE_SENSOR_STATE_READY_SEL,
   1726     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   1727     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   1728     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   1729     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   1730     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   1731     HID_FEATURE(Data_Arr_Abs),
   1732     HID_END_COLLECTION,
   1733     HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
   1734     HID_LOGICAL_MIN_8(0),
   1735     HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
   1736     HID_REPORT_SIZE(32),
   1737     HID_REPORT_COUNT(1),
   1738     HID_UNIT_EXPONENT(0),
   1739     HID_FEATURE(Data_Var_Abs),
   1740 
   1741     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION,
   1742                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
   1743     HID_LOGICAL_MIN_8(0),
   1744     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1745     HID_REPORT_SIZE(16),
   1746     HID_REPORT_COUNT(1),
   1747     HID_UNIT_EXPONENT(0x0E),  // scale default unit Gs to centi-Gs
   1748     // to provide 2 digits past Gs decimal point
   1749     HID_FEATURE(Data_Var_Abs),
   1750 
   1751     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION,HID_USAGE_SENSOR_DATA_MOD_MAX),
   1752     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1753     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1754     HID_REPORT_SIZE(16),
   1755     HID_REPORT_COUNT(1),
   1756     HID_UNIT_EXPONENT(0x0E),  // scale default unit Gs to centi-Gs
   1757     // to provide 2 digits past Gs decimal point
   1758     HID_FEATURE(Data_Var_Abs),
   1759 
   1760     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION,HID_USAGE_SENSOR_DATA_MOD_MIN),
   1761     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1762     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1763     HID_REPORT_SIZE(16),
   1764     HID_REPORT_COUNT(1),
   1765     HID_UNIT_EXPONENT(0x0E),  // scale default unit Gs to centi-Gs
   1766     // to provide 2 digits past Gs decimal point
   1767     HID_FEATURE(Data_Var_Abs),
   1768 
   1769     //input reports (transmit)
   1770     HID_USAGE_PAGE_SENSOR,
   1771     HID_USAGE_SENSOR_STATE,
   1772     HID_LOGICAL_MIN_8(0),
   1773     HID_LOGICAL_MAX_8(6),
   1774     HID_REPORT_SIZE(8),
   1775     HID_REPORT_COUNT(1),
   1776     HID_COLLECTION(Logical),
   1777     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   1778     HID_USAGE_SENSOR_STATE_READY_SEL,
   1779     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   1780     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   1781     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   1782     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   1783     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   1784     HID_INPUT(Data_Arr_Abs),
   1785     HID_END_COLLECTION,
   1786     HID_USAGE_SENSOR_EVENT,
   1787     HID_LOGICAL_MIN_8(0),
   1788     HID_LOGICAL_MAX_8(5),
   1789     HID_REPORT_SIZE(8),
   1790     HID_REPORT_COUNT(1),
   1791     HID_COLLECTION(Logical),
   1792     HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
   1793     HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
   1794     HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
   1795     HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
   1796     HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
   1797     HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
   1798     HID_INPUT(Data_Arr_Abs),
   1799     HID_END_COLLECTION,
   1800     HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_X_AXIS,
   1801     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1802     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1803     HID_REPORT_SIZE(16),
   1804     HID_REPORT_COUNT(1),
   1805     HID_UNIT_EXPONENT(0x0E),  // scale default unit Gs to centi-Gs
   1806     // to provide 2 digits past Gs decimal point
   1807     HID_INPUT(Data_Var_Abs),
   1808     HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Y_AXIS,
   1809     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1810     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1811     HID_REPORT_SIZE(16),
   1812     HID_REPORT_COUNT(1),
   1813     HID_UNIT_EXPONENT(0x0E),  // scale default unit Gs to centi-Gs
   1814     // to provide 2 digits past Gs decimal point
   1815     HID_INPUT(Data_Var_Abs),
   1816     HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Z_AXIS,
   1817     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1818     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1819     HID_REPORT_SIZE(16),
   1820     HID_REPORT_COUNT(1),
   1821     HID_UNIT_EXPONENT(0x0E),  // scale default unit Gs to centi-Gs
   1822     // to provide 2 digits past Gs decimal point
   1823     HID_INPUT(Data_Var_Abs),
   1824 
   1825     //include the following datafield if required to support the shake event
   1826     HID_USAGE_SENSOR_DATA_MOTION_STATE,
   1827     HID_LOGICAL_MIN_8(0), // False = Still
   1828     HID_LOGICAL_MAX_8(1), // True = In Motion
   1829     HID_REPORT_SIZE(8),
   1830     HID_REPORT_COUNT(1),
   1831     HID_INPUT(Data_Var_Abs),
   1832 
   1833     HID_END_COLLECTION
   1834 };
   1835 
   1836 
   1837 /**
   1838  * 3D gyroscope sensor example.
   1839  */
   1840 const unsigned char gyro3_report_descriptor[] = {
   1841     HID_USAGE_PAGE_SENSOR,
   1842     HID_USAGE_SENSOR_TYPE_MOTION_GYROMETER_3D,
   1843     HID_COLLECTION(Physical),
   1844 
   1845     //feature reports (xmit/receive)
   1846     HID_USAGE_PAGE_SENSOR,
   1847     HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
   1848     HID_LOGICAL_MIN_8(0),
   1849     HID_LOGICAL_MAX_8(2),
   1850     HID_REPORT_SIZE(8),
   1851     HID_REPORT_COUNT(1),
   1852     HID_COLLECTION(Logical),
   1853     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
   1854     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
   1855     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
   1856     HID_FEATURE(Data_Arr_Abs),
   1857     HID_END_COLLECTION,
   1858     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
   1859     HID_LOGICAL_MIN_8(0),
   1860     HID_LOGICAL_MAX_8(5),
   1861     HID_REPORT_SIZE(8),
   1862     HID_REPORT_COUNT(1),
   1863     HID_COLLECTION(Logical),
   1864     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
   1865     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
   1866     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
   1867     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
   1868     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
   1869     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
   1870     HID_FEATURE(Data_Arr_Abs),
   1871     HID_END_COLLECTION,
   1872     HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
   1873     HID_LOGICAL_MIN_8(0),
   1874     HID_LOGICAL_MAX_8(5),
   1875     HID_REPORT_SIZE(8),
   1876     HID_REPORT_COUNT(1),
   1877     HID_COLLECTION(Logical),
   1878     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
   1879     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
   1880     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
   1881     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
   1882     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
   1883     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
   1884     HID_FEATURE(Data_Arr_Abs),
   1885     HID_END_COLLECTION,
   1886     HID_USAGE_SENSOR_STATE,
   1887     HID_LOGICAL_MIN_8(0),
   1888     HID_LOGICAL_MAX_8(6),
   1889     HID_REPORT_SIZE(8),
   1890     HID_REPORT_COUNT(1),
   1891     HID_COLLECTION(Logical),
   1892     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   1893     HID_USAGE_SENSOR_STATE_READY_SEL,
   1894     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   1895     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   1896     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   1897     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   1898     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   1899     HID_FEATURE(Data_Arr_Abs),
   1900     HID_END_COLLECTION,
   1901     HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
   1902     HID_LOGICAL_MIN_8(0),
   1903     HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
   1904     HID_REPORT_SIZE(32),
   1905     HID_REPORT_COUNT(1),
   1906     HID_UNIT_EXPONENT(0),
   1907     HID_FEATURE(Data_Var_Abs),
   1908     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY,
   1909                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
   1910     HID_LOGICAL_MIN_8(0),
   1911     HID_LOGICAL_MAX_16(0xFF,0xFF),
   1912     HID_REPORT_SIZE(16),
   1913     HID_REPORT_COUNT(1),
   1914     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   1915     HID_FEATURE(Data_Var_Abs),
   1916     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY,
   1917                           HID_USAGE_SENSOR_DATA_MOD_MAX),
   1918     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1919     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1920     HID_REPORT_SIZE(16),
   1921     HID_REPORT_COUNT(1),
   1922     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   1923     HID_FEATURE(Data_Var_Abs),
   1924     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY,
   1925                           HID_USAGE_SENSOR_DATA_MOD_MIN),
   1926     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1927     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1928     HID_REPORT_SIZE(16),
   1929     HID_REPORT_COUNT(1),
   1930     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   1931     HID_FEATURE(Data_Var_Abs),
   1932 
   1933     //input reports (transmit)
   1934     HID_USAGE_PAGE_SENSOR,
   1935     HID_USAGE_SENSOR_STATE,
   1936     HID_LOGICAL_MIN_8(0),
   1937     HID_LOGICAL_MAX_8(6),
   1938     HID_REPORT_SIZE(8),
   1939     HID_REPORT_COUNT(1),
   1940     HID_COLLECTION(Logical),
   1941     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   1942     HID_USAGE_SENSOR_STATE_READY_SEL,
   1943     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   1944     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   1945     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   1946     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   1947     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   1948     HID_INPUT(Data_Arr_Abs),
   1949     HID_END_COLLECTION,
   1950     HID_USAGE_SENSOR_EVENT,
   1951     HID_LOGICAL_MIN_8(0),
   1952     HID_LOGICAL_MAX_8(5),
   1953     HID_REPORT_SIZE(8),
   1954     HID_REPORT_COUNT(1),
   1955     HID_COLLECTION(Logical),
   1956     HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
   1957     HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
   1958     HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
   1959     HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
   1960     HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
   1961     HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
   1962     HID_INPUT(Data_Arr_Abs),
   1963     HID_END_COLLECTION,
   1964     HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY_X_AXIS,
   1965     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1966     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1967     HID_REPORT_SIZE(16),
   1968     HID_REPORT_COUNT(1),
   1969     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   1970     HID_INPUT(Data_Var_Abs),
   1971     HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY_Y_AXIS,
   1972     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1973     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1974     HID_REPORT_SIZE(16),
   1975     HID_REPORT_COUNT(1),
   1976     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   1977     HID_INPUT(Data_Var_Abs),
   1978     HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY_Z_AXIS,
   1979     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   1980     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   1981     HID_REPORT_SIZE(16),
   1982     HID_REPORT_COUNT(1),
   1983     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   1984     HID_INPUT(Data_Var_Abs),
   1985 
   1986     HID_END_COLLECTION
   1987 };
   1988 
   1989 
   1990 /**
   1991  * 3D compass sensor example.
   1992  */
   1993 const unsigned char comp3_report_descriptor[] = {
   1994     HID_USAGE_PAGE_SENSOR,
   1995     HID_USAGE_SENSOR_TYPE_ORIENTATION_COMPASS_3D,
   1996     HID_COLLECTION(Physical),
   1997 
   1998     //feature reports (xmit/receive)
   1999     HID_USAGE_PAGE_SENSOR,
   2000     HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
   2001     HID_LOGICAL_MIN_8(0),
   2002     HID_LOGICAL_MAX_8(2),
   2003     HID_REPORT_SIZE(8),
   2004     HID_REPORT_COUNT(1),
   2005     HID_COLLECTION(Logical),
   2006     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
   2007     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
   2008     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
   2009     HID_FEATURE(Data_Arr_Abs),
   2010     HID_END_COLLECTION,
   2011     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
   2012     HID_LOGICAL_MIN_8(0),
   2013     HID_LOGICAL_MAX_8(5),
   2014     HID_REPORT_SIZE(8),
   2015     HID_REPORT_COUNT(1),
   2016     HID_COLLECTION(Logical),
   2017     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
   2018     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
   2019     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
   2020     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
   2021     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
   2022     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
   2023     HID_FEATURE(Data_Arr_Abs),
   2024     HID_END_COLLECTION,
   2025     HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
   2026     HID_LOGICAL_MIN_8(0),
   2027     HID_LOGICAL_MAX_8(5),
   2028     HID_REPORT_SIZE(8),
   2029     HID_REPORT_COUNT(1),
   2030     HID_COLLECTION(Logical),
   2031     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
   2032     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
   2033     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
   2034     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
   2035     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
   2036     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
   2037     HID_FEATURE(Data_Arr_Abs),
   2038     HID_END_COLLECTION,
   2039     HID_USAGE_SENSOR_STATE,
   2040     HID_LOGICAL_MIN_8(0),
   2041     HID_LOGICAL_MAX_8(6),
   2042     HID_REPORT_SIZE(8),
   2043     HID_REPORT_COUNT(1),
   2044     HID_COLLECTION(Logical),
   2045     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   2046     HID_USAGE_SENSOR_STATE_READY_SEL,
   2047     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   2048     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   2049     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   2050     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   2051     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   2052     HID_FEATURE(Data_Arr_Abs),
   2053     HID_END_COLLECTION,
   2054     HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
   2055     HID_LOGICAL_MIN_8(0),
   2056     HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
   2057     HID_REPORT_SIZE(32),
   2058     HID_REPORT_COUNT(1),
   2059     HID_UNIT_EXPONENT(0),
   2060     HID_FEATURE(Data_Var_Abs),
   2061     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_HEADING,
   2062                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
   2063     HID_LOGICAL_MIN_8(0),
   2064     HID_LOGICAL_MAX_16(0xFF,0xFF),
   2065     HID_REPORT_SIZE(16),
   2066     HID_REPORT_COUNT(1),
   2067     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   2068     HID_FEATURE(Data_Var_Abs),
   2069     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_HEADING,
   2070                           HID_USAGE_SENSOR_DATA_MOD_MAX),
   2071     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2072     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2073     HID_REPORT_SIZE(16),
   2074     HID_REPORT_COUNT(1),
   2075     HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
   2076     HID_FEATURE(Data_Var_Abs),
   2077     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_HEADING,
   2078                           HID_USAGE_SENSOR_DATA_MOD_MIN),
   2079     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2080     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2081     HID_REPORT_SIZE(16),
   2082     HID_REPORT_COUNT(1),
   2083     HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
   2084     HID_FEATURE(Data_Var_Abs),
   2085     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_FLUX,
   2086                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
   2087     HID_LOGICAL_MIN_8(0),
   2088     HID_LOGICAL_MAX_16(0xFF,0xFF),
   2089     HID_REPORT_SIZE(16),
   2090     HID_REPORT_COUNT(1),
   2091     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   2092     HID_FEATURE(Data_Var_Abs),
   2093     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_FLUX,
   2094                           HID_USAGE_SENSOR_DATA_MOD_MAX),
   2095     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2096     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2097     HID_REPORT_SIZE(16),
   2098     HID_REPORT_COUNT(1),
   2099     HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
   2100     HID_FEATURE(Data_Var_Abs),
   2101     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_FLUX,
   2102                           HID_USAGE_SENSOR_DATA_MOD_MIN),
   2103     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2104     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2105     HID_REPORT_SIZE(16),
   2106     HID_REPORT_COUNT(1),
   2107     HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
   2108     HID_FEATURE(Data_Var_Abs),
   2109 
   2110     //input reports (transmit)
   2111     HID_USAGE_PAGE_SENSOR,
   2112     HID_USAGE_SENSOR_STATE,
   2113     HID_LOGICAL_MIN_8(0),
   2114     HID_LOGICAL_MAX_8(6),
   2115     HID_REPORT_SIZE(8),
   2116     HID_REPORT_COUNT(1),
   2117     HID_COLLECTION(Logical),
   2118     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   2119     HID_USAGE_SENSOR_STATE_READY_SEL,
   2120     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   2121     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   2122     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   2123     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   2124     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   2125     HID_INPUT(Data_Arr_Abs),
   2126     HID_END_COLLECTION,
   2127     HID_USAGE_SENSOR_EVENT,
   2128     HID_LOGICAL_MIN_8(0),
   2129     HID_LOGICAL_MAX_8(5),
   2130     HID_REPORT_SIZE(8),
   2131     HID_REPORT_COUNT(1),
   2132     HID_COLLECTION(Logical),
   2133     HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
   2134     HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
   2135     HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
   2136     HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
   2137     HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
   2138     HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
   2139     HID_INPUT(Data_Arr_Abs),
   2140     HID_END_COLLECTION,
   2141     HID_USAGE_SENSOR_DATA_ORIENTATION_COMPENSATED_MAGNETIC_NORTH,
   2142     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2143     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2144     HID_REPORT_SIZE(16),
   2145     HID_REPORT_COUNT(1),
   2146     HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
   2147     HID_INPUT(Data_Var_Abs),
   2148     HID_USAGE_SENSOR_DATA_ORIENTATION_COMPENSATED_TRUE_NORTH,
   2149     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2150     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2151     HID_REPORT_SIZE(16),
   2152     HID_REPORT_COUNT(1),
   2153     HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
   2154     HID_INPUT(Data_Var_Abs),
   2155     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_NORTH,
   2156     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2157     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2158     HID_REPORT_SIZE(16),
   2159     HID_REPORT_COUNT(1),
   2160     HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
   2161     HID_INPUT(Data_Var_Abs),
   2162     HID_USAGE_SENSOR_DATA_ORIENTATION_TRUE_NORTH,
   2163     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2164     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2165     HID_REPORT_SIZE(16),
   2166     HID_REPORT_COUNT(1),
   2167     HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
   2168     HID_INPUT(Data_Var_Abs),
   2169     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_FLUX_X_AXIS,
   2170     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2171     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2172     HID_REPORT_SIZE(16),
   2173     HID_REPORT_COUNT(1),
   2174     HID_UNIT_EXPONENT(0x0D), // scale default unit to "milliGauss"
   2175     // to provide 3 digits past decimal point
   2176     HID_INPUT(Data_Var_Abs),
   2177     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_FLUX_Y_AXIS,
   2178     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2179     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2180     HID_REPORT_SIZE(16),
   2181     HID_REPORT_COUNT(1),
   2182     HID_UNIT_EXPONENT(0x0D), // scale default unit to "milliGauss"
   2183     // to provide 3 digits past decimal point
   2184     HID_INPUT(Data_Var_Abs),
   2185     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_FLUX_Z_AXIS,
   2186     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2187     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2188     HID_REPORT_SIZE(16),
   2189     HID_REPORT_COUNT(1),
   2190     HID_UNIT_EXPONENT(0x0D), // scale default unit to "milliGauss"
   2191     // to provide 3 digits past decimal point
   2192     HID_INPUT(Data_Var_Abs),
   2193     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY,
   2194     HID_LOGICAL_MIN_8(0),
   2195     HID_LOGICAL_MAX_8(2),
   2196     HID_REPORT_SIZE(8),
   2197     HID_REPORT_COUNT(1),
   2198     HID_COLLECTION(Logical),
   2199     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_LOW,
   2200     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_MEDIUM,
   2201     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_HIGH,
   2202     HID_INPUT(Data_Arr_Abs),
   2203     HID_END_COLLECTION,
   2204 
   2205     HID_END_COLLECTION
   2206 };
   2207 
   2208 
   2209 /**
   2210  * 3D inclinomater example.
   2211  */
   2212 const unsigned char inc3_report_descriptor[] = {
   2213     HID_USAGE_PAGE_SENSOR,
   2214     HID_USAGE_SENSOR_TYPE_ORIENTATION_INCLINOMETER_3D,
   2215     HID_COLLECTION(Physical),
   2216 
   2217     //feature reports (xmit/receive)
   2218     HID_USAGE_PAGE_SENSOR,
   2219     HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
   2220     HID_LOGICAL_MIN_8(0),
   2221     HID_LOGICAL_MAX_8(2),
   2222     HID_REPORT_SIZE(8),
   2223     HID_REPORT_COUNT(1),
   2224     HID_COLLECTION(Logical),
   2225     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
   2226     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
   2227     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
   2228     HID_FEATURE(Data_Arr_Abs),
   2229     HID_END_COLLECTION,
   2230     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
   2231     HID_LOGICAL_MIN_8(0),
   2232     HID_LOGICAL_MAX_8(5),
   2233     HID_REPORT_SIZE(8),
   2234     HID_REPORT_COUNT(1),
   2235     HID_COLLECTION(Logical),
   2236     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
   2237     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
   2238     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
   2239     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
   2240     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
   2241     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
   2242     HID_FEATURE(Data_Arr_Abs),
   2243     HID_END_COLLECTION,
   2244     HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
   2245     HID_LOGICAL_MIN_8(0),
   2246     HID_LOGICAL_MAX_8(5),
   2247     HID_REPORT_SIZE(8),
   2248     HID_REPORT_COUNT(1),
   2249     HID_COLLECTION(Logical),
   2250     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
   2251     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
   2252     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
   2253     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
   2254     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
   2255     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
   2256     HID_FEATURE(Data_Arr_Abs),
   2257     HID_END_COLLECTION,
   2258     HID_USAGE_SENSOR_STATE,
   2259     HID_LOGICAL_MIN_8(0),
   2260     HID_LOGICAL_MAX_8(6),
   2261     HID_REPORT_SIZE(8),
   2262     HID_REPORT_COUNT(1),
   2263     HID_COLLECTION(Logical),
   2264     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   2265     HID_USAGE_SENSOR_STATE_READY_SEL,
   2266     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   2267     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   2268     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   2269     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   2270     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   2271     HID_FEATURE(Data_Arr_Abs),
   2272     HID_END_COLLECTION,
   2273     HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
   2274     HID_LOGICAL_MIN_8(0),
   2275     HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
   2276     HID_REPORT_SIZE(32),
   2277     HID_REPORT_COUNT(1),
   2278     HID_UNIT_EXPONENT(0),
   2279     HID_FEATURE(Data_Var_Abs),
   2280     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_TILT,
   2281                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
   2282     HID_LOGICAL_MIN_8(0),
   2283     HID_LOGICAL_MAX_16(0xFF,0xFF),
   2284     HID_REPORT_SIZE(16),
   2285     HID_REPORT_COUNT(1),
   2286     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   2287     HID_FEATURE(Data_Var_Abs),
   2288     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_TILT,HID_USAGE_SENSOR_DATA_MOD_MAX),
   2289     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2290     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2291     HID_REPORT_SIZE(16),
   2292     HID_REPORT_COUNT(1),
   2293     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   2294     HID_FEATURE(Data_Var_Abs),
   2295     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_TILT,HID_USAGE_SENSOR_DATA_MOD_MIN),
   2296     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2297     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2298     HID_REPORT_SIZE(16),
   2299     HID_REPORT_COUNT(1),
   2300     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   2301     HID_FEATURE(Data_Var_Abs),
   2302 
   2303     //input reports (transmit)
   2304     HID_USAGE_PAGE_SENSOR,
   2305     HID_USAGE_SENSOR_STATE,
   2306     HID_LOGICAL_MIN_8(0),
   2307     HID_LOGICAL_MAX_8(6),
   2308     HID_REPORT_SIZE(8),
   2309     HID_REPORT_COUNT(1),
   2310     HID_COLLECTION(Logical),
   2311     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   2312     HID_USAGE_SENSOR_STATE_READY_SEL,
   2313     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   2314     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   2315     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   2316     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   2317     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   2318     HID_INPUT(Data_Arr_Abs),
   2319     HID_END_COLLECTION,
   2320     HID_USAGE_SENSOR_EVENT,
   2321     HID_LOGICAL_MIN_8(0),
   2322     HID_LOGICAL_MAX_8(5),
   2323     HID_REPORT_SIZE(8),
   2324     HID_REPORT_COUNT(1),
   2325     HID_COLLECTION(Logical),
   2326     HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
   2327     HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
   2328     HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
   2329     HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
   2330     HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
   2331     HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
   2332     HID_INPUT(Data_Arr_Abs),
   2333     HID_END_COLLECTION,
   2334     HID_USAGE_SENSOR_DATA_ORIENTATION_TILT_X,
   2335     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2336     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2337     HID_REPORT_SIZE(16),
   2338     HID_REPORT_COUNT(1),
   2339     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   2340     HID_INPUT(Data_Var_Abs),
   2341     HID_USAGE_SENSOR_DATA_ORIENTATION_TILT_Y,
   2342     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2343     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2344     HID_REPORT_SIZE(16),
   2345     HID_REPORT_COUNT(1),
   2346     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   2347     HID_INPUT(Data_Var_Abs),
   2348     HID_USAGE_SENSOR_DATA_ORIENTATION_TILT_Z,
   2349     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2350     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2351     HID_REPORT_SIZE(16),
   2352     HID_REPORT_COUNT(1),
   2353     HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
   2354     HID_INPUT(Data_Var_Abs),
   2355     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY,
   2356     HID_LOGICAL_MIN_8(0),
   2357     HID_LOGICAL_MAX_8(2),
   2358     HID_REPORT_SIZE(8),
   2359     HID_REPORT_COUNT(1),
   2360     HID_COLLECTION(Logical),
   2361     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_LOW,
   2362     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_MEDIUM,
   2363     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_HIGH,
   2364     HID_INPUT(Data_Arr_Abs),
   2365     HID_END_COLLECTION,
   2366 
   2367     HID_END_COLLECTION
   2368 };
   2369 
   2370 
   2371 /**
   2372  * Device orientation sensor example. Note this maps to rotation vector sensor in android.
   2373  */
   2374 const unsigned char devor_report_descriptor[] = {
   2375     HID_USAGE_PAGE_SENSOR,
   2376     HID_USAGE_SENSOR_TYPE_ORIENTATION_DEVICE_ORIENTATION,
   2377     HID_COLLECTION(Physical),
   2378 
   2379     //feature reports (xmit/receive)
   2380     HID_USAGE_PAGE_SENSOR,
   2381     HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
   2382     HID_LOGICAL_MIN_8(0),
   2383     HID_LOGICAL_MAX_8(2),
   2384     HID_REPORT_SIZE(8),
   2385     HID_REPORT_COUNT(1),
   2386     HID_COLLECTION(Logical),
   2387     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
   2388     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
   2389     HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
   2390     HID_FEATURE(Data_Arr_Abs),
   2391     HID_END_COLLECTION,
   2392     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
   2393     HID_LOGICAL_MIN_8(0),
   2394     HID_LOGICAL_MAX_8(5),
   2395     HID_REPORT_SIZE(8),
   2396     HID_REPORT_COUNT(1),
   2397     HID_COLLECTION(Logical),
   2398     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
   2399     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
   2400     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
   2401     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
   2402     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
   2403     HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
   2404     HID_FEATURE(Data_Arr_Abs),
   2405     HID_END_COLLECTION,
   2406     HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
   2407     HID_LOGICAL_MIN_8(0),
   2408     HID_LOGICAL_MAX_8(5),
   2409     HID_REPORT_SIZE(8),
   2410     HID_REPORT_COUNT(1),
   2411     HID_COLLECTION(Logical),
   2412     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
   2413     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
   2414     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
   2415     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
   2416     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
   2417     HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
   2418     HID_FEATURE(Data_Arr_Abs),
   2419     HID_END_COLLECTION,
   2420     HID_USAGE_SENSOR_STATE,
   2421     HID_LOGICAL_MIN_8(0),
   2422     HID_LOGICAL_MAX_8(6),
   2423     HID_REPORT_SIZE(8),
   2424     HID_REPORT_COUNT(1),
   2425     HID_COLLECTION(Logical),
   2426     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   2427     HID_USAGE_SENSOR_STATE_READY_SEL,
   2428     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   2429     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   2430     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   2431     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   2432     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   2433     HID_FEATURE(Data_Arr_Abs),
   2434     HID_END_COLLECTION,
   2435     HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
   2436     HID_LOGICAL_MIN_8(0),
   2437     HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
   2438     HID_REPORT_SIZE(32),
   2439     HID_REPORT_COUNT(1),
   2440     HID_UNIT_EXPONENT(0),
   2441     HID_FEATURE(Data_Var_Abs),
   2442     HID_USAGE_SENSOR_PROPERTY_CHANGE_SENSITIVITY_ABS,
   2443     HID_LOGICAL_MIN_8(0),
   2444     HID_LOGICAL_MAX_16(0xFF,0xFF),
   2445     HID_REPORT_SIZE(16),
   2446     HID_REPORT_COUNT(1),
   2447     HID_UNIT_EXPONENT(0x0E), // scale default unit "meter" to provide 2 digits past the decimal point
   2448     HID_FEATURE(Data_Var_Abs),
   2449     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_QUATERNION,
   2450                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
   2451     HID_LOGICAL_MIN_8(0),
   2452     HID_LOGICAL_MAX_16(0xFF,0xFF),
   2453     HID_REPORT_SIZE(16),
   2454     HID_REPORT_COUNT(1),
   2455     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_QUATERNION,
   2456                           HID_USAGE_SENSOR_DATA_MOD_MAX),
   2457     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2458     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2459     HID_REPORT_SIZE(16),
   2460     HID_REPORT_COUNT(1),
   2461     HID_UNIT_EXPONENT(0x01),
   2462     HID_FEATURE(Data_Var_Abs),
   2463     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_QUATERNION,
   2464                           HID_USAGE_SENSOR_DATA_MOD_MIN),
   2465     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2466     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2467     HID_REPORT_SIZE(16),
   2468     HID_REPORT_COUNT(1),
   2469     HID_UNIT_EXPONENT(0x01),
   2470     HID_FEATURE(Data_Var_Abs),
   2471 
   2472     //include this if the values are calculated in firmware
   2473     //otherwise, the driver will calculate these values from the Quaternion
   2474     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_ROTATION_MATRIX,
   2475                           HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
   2476     HID_LOGICAL_MIN_8(0),
   2477     HID_LOGICAL_MAX_16(0xFF,0xFF),
   2478     HID_REPORT_SIZE(16),
   2479     HID_REPORT_COUNT(1),
   2480     HID_UNIT_EXPONENT(0x0E),
   2481     HID_FEATURE(Data_Var_Abs),
   2482     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_ROTATION_MATRIX,
   2483                           HID_USAGE_SENSOR_DATA_MOD_MAX),
   2484     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2485     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2486     HID_REPORT_SIZE(16),
   2487     HID_REPORT_COUNT(1),
   2488     HID_UNIT_EXPONENT(0x0E),
   2489     HID_FEATURE(Data_Var_Abs),
   2490     HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_ROTATION_MATRIX,
   2491                           HID_USAGE_SENSOR_DATA_MOD_MIN),
   2492     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2493     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2494     HID_REPORT_SIZE(16),
   2495     HID_REPORT_COUNT(1),
   2496     HID_UNIT_EXPONENT(0x0E),
   2497     HID_FEATURE(Data_Var_Abs),
   2498 
   2499     //input reports (transmit)
   2500     HID_USAGE_PAGE_SENSOR,
   2501     HID_USAGE_SENSOR_STATE,
   2502     HID_LOGICAL_MIN_8(0),
   2503     HID_LOGICAL_MAX_8(6),
   2504     HID_REPORT_SIZE(8),
   2505     HID_REPORT_COUNT(1),
   2506     HID_COLLECTION(Logical),
   2507     HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
   2508     HID_USAGE_SENSOR_STATE_READY_SEL,
   2509     HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
   2510     HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
   2511     HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
   2512     HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
   2513     HID_USAGE_SENSOR_STATE_ERROR_SEL,
   2514     HID_INPUT(Data_Arr_Abs),
   2515     HID_END_COLLECTION,
   2516     HID_USAGE_SENSOR_EVENT,
   2517     HID_LOGICAL_MIN_8(0),
   2518     HID_LOGICAL_MAX_8(5),
   2519     HID_REPORT_SIZE(8),
   2520     HID_REPORT_COUNT(1),
   2521     HID_COLLECTION(Logical),
   2522     HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
   2523     HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
   2524     HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
   2525     HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
   2526     HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
   2527     HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
   2528     HID_INPUT(Data_Arr_Abs),
   2529     HID_END_COLLECTION,
   2530     HID_USAGE_SENSOR_DATA_ORIENTATION_QUATERNION,
   2531     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2532     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2533     HID_REPORT_SIZE(16),
   2534     HID_REPORT_COUNT(4),
   2535     HID_UNIT_EXPONENT(0x0E),
   2536     HID_INPUT(Data_Arr_Abs),
   2537 
   2538     //include this if the values are calculated in firmware
   2539     //otherwise, the driver will calculate these values from the Quaternion
   2540     HID_USAGE_SENSOR_DATA_ORIENTATION_ROTATION_MATRIX,
   2541     HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
   2542     HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
   2543     HID_REPORT_SIZE(16),
   2544     HID_REPORT_COUNT(9),
   2545     HID_UNIT_EXPONENT(0x0F),
   2546     HID_INPUT(Data_Arr_Abs),
   2547 
   2548     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY,
   2549     HID_LOGICAL_MIN_8(0),
   2550     HID_LOGICAL_MAX_8(2),
   2551     HID_REPORT_SIZE(8),
   2552     HID_REPORT_COUNT(1),
   2553     HID_COLLECTION(Logical),
   2554     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_LOW,
   2555     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_MEDIUM,
   2556     HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_HIGH,
   2557     HID_INPUT(Data_Arr_Abs),
   2558     HID_END_COLLECTION,
   2559 
   2560     HID_END_COLLECTION
   2561 };
   2562 } // annoymous namespace
   2563 
   2564 /**
   2565  * Global test vector entry.
   2566  */
   2567 #define TEST_DESCRIPTOR(name) \
   2568     { name ## _report_descriptor, sizeof(name ## _report_descriptor), #name }
   2569 
   2570 const TestHidDescriptor gDescriptorArray[] = {
   2571     TEST_DESCRIPTOR(accel3),
   2572     TEST_DESCRIPTOR(col1),
   2573     TEST_DESCRIPTOR(col2),
   2574     TEST_DESCRIPTOR(col3),
   2575     TEST_DESCRIPTOR(cus1),
   2576     TEST_DESCRIPTOR(cus2),
   2577     TEST_DESCRIPTOR(cus3),
   2578     TEST_DESCRIPTOR(cus4),
   2579     TEST_DESCRIPTOR(pres),
   2580     TEST_DESCRIPTOR(prox),
   2581     TEST_DESCRIPTOR(bar),
   2582     TEST_DESCRIPTOR(humi),
   2583     TEST_DESCRIPTOR(temp),
   2584     TEST_DESCRIPTOR(als),
   2585     TEST_DESCRIPTOR(gyro3),
   2586     TEST_DESCRIPTOR(comp3),
   2587     TEST_DESCRIPTOR(inc3),
   2588     TEST_DESCRIPTOR(devor),
   2589     {nullptr, 0, nullptr} //sentinel
   2590 };
   2591 #undef TEST_DESCRIPTOR
   2592 
   2593 const TestHidDescriptor *findTestDescriptor(const char *name) {
   2594     if (name == nullptr) {
   2595         return nullptr;
   2596     }
   2597 
   2598     for (const TestHidDescriptor *p = gDescriptorArray; ; ++p) {
   2599         if (p->data == nullptr || p->len == 0) {
   2600             break;
   2601         }
   2602         if (strcmp(p->name, name) == 0) {
   2603             return p;
   2604         }
   2605     }
   2606     return nullptr;
   2607 }
   2608