/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include "TestHidDescriptor.h"
#include "TestHidSensorSpec.h"
#include <cstring>

/**
 * Example HID sensor descriptors in this file is extracted from published document
 * "HID Sensors Usage" (hid-sensors-usage.docx). They are added for testing of HidParser.
 *
 * It is slightly modified in order to compile.
 */
namespace {
/**
 * Two sensors collection skeleton example.
 */
const unsigned char col1_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_COLLECTION,
    HID_COLLECTION(Application),

    HID_REPORT_ID(1),
    HID_USAGE_PAGE_SENSOR,

    HID_USAGE_SENSOR_TYPE_MOTION_ACCELEROMETER_3D,
    HID_COLLECTION(Physical),

    //Feature Report Descriptor for Sensor Report ID = 1

    //Input Report Descriptor for Sensor Report ID = 1

    HID_END_COLLECTION, //for Report ID = 1

    HID_REPORT_ID(2),
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_MOTION_GYROMETER_3D,
    HID_COLLECTION(Physical),

    //Feature Report Descriptor for Sensor Report ID = 2

    //Input Report Descriptor for Sensor Report ID = 2

    HID_END_COLLECTION, //for Report ID = 2

    //More sensors follow using the same pattern

    HID_END_COLLECTION //Application
};


/**
 * Composite device descriptor example: two sensors with a keyboard and a mouse.
 */
const unsigned char col2_report_descriptor[] = {
    //keyboard
    0x05U, 0x01U,         // USAGE PAGE (Generic Desktop)
    0x09U, 0x06U,         // USAGE (Keyboard)
    0xA1U, 0x01U,         // COLLECTION (Application)

    0x85U, 0x03U,         // REPORT_ID (1)

    0x15U, 0x00U,         //   LOGICAL MINIMUM (0)
    0x25U, 0x01U,         //   LOGICAL MAXIMUM (1)
    0x75U, 0x01U,         //   REPORT SIZE (1)
    0x95U, 0x08U,         //   REPORT COUNT (8)
    0x05U, 0x07U,         //   USAGE PAGE (Keyboard)
    0x19U, 0xE0U,         //   USAGE MINIMUM (Keyboard LeftControl)
    0x29U, 0xE7U,         //   USAGE MAXIMUM (Keyboard Right GUI)
    0x81U, 0x02U,         //   INPUT (Var)

    0x75U, 0x08U,         //   REPORT SIZE (8)
    0x95U, 0x0AU,         //   REPORT COUNT (10)
    0x19U, 0x00U,         //   USAGE MINIMUM (No event)
    0x29U, 0x91U,         //   USAGE MAXIMUM (Keyboard LANG2)
    0x26U, 0xFFU, 0x00U,  //   LOGICAL MAXIMUM (0xFF)
    0x81U, 0x00U,         //   INPUT (Data,Ary,Abs)

    0xC0U,                // END COLLECTION, //keyboard

    // Two sensor collection skeleton example:
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_COLLECTION,
    HID_COLLECTION(Application),

    HID_REPORT_ID(2),
    HID_USAGE_PAGE_SENSOR,

    HID_USAGE_SENSOR_TYPE_MOTION_ACCELEROMETER_3D,
    HID_COLLECTION(Physical),

    //Feature Report Descriptor for Sensor Report ID = 2

    //Input Report Descriptor for Sensor Report ID = 2

    HID_END_COLLECTION, //for Report ID = 2

    HID_REPORT_ID(3),
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_MOTION_GYROMETER_3D,
    HID_COLLECTION(Physical),

    //Feature Report Descriptor for Sensor Report ID = 3

    //Input Report Descriptor for Sensor Report ID = 3

    HID_END_COLLECTION, //for Report ID = 3

    //More sensors follow using the same pattern

    HID_END_COLLECTION, //Sensor collection

    //mouse
    0x05U, 0x01U,         // USAGE PAGE (Generic Desktop)
    0x09U, 0x02U,         // USAGE (Mouse)
    0xA1U, 0x01U,         // COLLECTION (Application)
    0x85U, 0x04U,         // REPORT_ID (4)

    // 5 mouse buttons
    0x05U, 0x09U,         //   USAGE PAGE (Button)
    0x19U, 0x01U,         //   USAGE MINIMUM (Button 1)
    0x29U, 0x05U,         //   USAGE MAXIMUM (Button 5)
    0x15U, 0x00U,         //   LOGICAL MINIMUM (0)
    0x25U, 0x01U,         //   LOGICAL MAXIMUM (1)
    0x95U, 0x05U,         //   REPORT COUNT (5)
    0x75U, 0x01U,         //   REPORT SIZE (1)
    0x81U, 0x02U,         //   INPUT (Data,Var,Abs)

    //  3 unused buttons:
    0x95U, 0x01U,         //   REPORT COUNT (1)
    0x75U, 0x03U,         //   REPORT SIZE (3)
    0x81U, 0x03U,         //   INPUT (Cnst,Var,Abs)

    // mouse (delta x, delta y) position
    0x15U, 0x81U,         //   LOGICAL MINIMUM (-127)
    0x25U, 0x7fU,         //   LOGICAL MAXIMUM (+127)
    0x75U, 0x08U,         //   REPORT SIZE (8)
    0x95U, 0x02U,         //   REPORT COUNT (2)
    0x05U, 0x01U,         //   USAGE PAGE (Generic Desktop)
    0x09U, 0x30U,         //   USAGE(X)
    0x09U, 0x31U,         //   USAGE (Y)
    0x81U, 0x06U,         //   INPUT (Data,Var,Rel)

    0xC0U,                // END COLLECTION //mouse
};


/**
 * Composite device descriptor example: one sensor with a keyboard and a mouse.
 */
const unsigned char col3_report_descriptor[] = {
    //keyboard
    0x05U, 0x01U,         // USAGE PAGE (Generic Desktop)
    0x09U, 0x06U,         // USAGE (Keyboard)
    0xA1U, 0x01U,         // COLLECTION (Application)

    0x85U, 0x03U,         // REPORT_ID (1)

    0x15U, 0x00U,         //   LOGICAL MINIMUM (0)
    0x25U, 0x01U,         //   LOGICAL MAXIMUM (1)
    0x75U, 0x01U,         //   REPORT SIZE (1)
    0x95U, 0x08U,         //   REPORT COUNT (8)
    0x05U, 0x07U,         //   USAGE PAGE (Keyboard)
    0x19U, 0xE0U,         //   USAGE MINIMUM (Keyboard LeftControl)
    0x29U, 0xE7U,         //   USAGE MAXIMUM (Keyboard Right GUI)
    0x81U, 0x02U,         //   INPUT (Var)

    0x75U, 0x08U,         //   REPORT SIZE (8)
    0x95U, 0x0AU,         //   REPORT COUNT (10)
    0x19U, 0x00U,         //   USAGE MINIMUM (No event)
    0x29U, 0x91U,         //   USAGE MAXIMUM (Keyboard LANG2)
    0x26U, 0xFFU, 0x00U,  //   LOGICAL MAXIMUM (0xFF)
    0x81U, 0x00U,         //   INPUT (Data,Ary,Abs)

    0xC0U,                // END COLLECTION, //keyboard

    // One sensor collection skeleton example:
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_COLLECTION,
    HID_COLLECTION(Application),

    HID_REPORT_ID(2),
    HID_USAGE_PAGE_SENSOR,

    HID_USAGE_SENSOR_TYPE_MOTION_GYROMETER_3D,
    HID_COLLECTION(Physical),

    //Feature Report Descriptor for Sensor Report ID = 2

    //Input Report Descriptor for Sensor Report ID = 2

    HID_END_COLLECTION, //for Report ID = 2

    HID_END_COLLECTION, //Sensor collection

    //mouse
    0x05U, 0x01U,         // USAGE PAGE (Generic Desktop)
    0x09U, 0x02U,         // USAGE (Mouse)
    0xA1U, 0x01U,         // COLLECTION (Application)
    0x85U, 0x04U,         // REPORT_ID (3)

    // 5 mouse buttons
    0x05U, 0x09U,         //   USAGE PAGE (Button)
    0x19U, 0x01U,         //   USAGE MINIMUM (Button 1)
    0x29U, 0x05U,         //   USAGE MAXIMUM (Button 5)
    0x15U, 0x00U,         //   LOGICAL MINIMUM (0)
    0x25U, 0x01U,         //   LOGICAL MAXIMUM (1)
    0x95U, 0x05U,         //   REPORT COUNT (5)
    0x75U, 0x01U,         //   REPORT SIZE (1)
    0x81U, 0x02U,         //   INPUT (Data,Var,Abs)

    //  3 unused buttons:
    0x95U, 0x01U,         //   REPORT COUNT (1)
    0x75U, 0x03U,         //   REPORT SIZE (3)
    0x81U, 0x03U,         //   INPUT (Cnst,Var,Abs)

    // mouse (delta x, delta y) position
    0x15U, 0x81U,         //   LOGICAL MINIMUM (-127)
    0x25U, 0x7fU,         //   LOGICAL MAXIMUM (+127)
    0x75U, 0x08U,         //   REPORT SIZE (8)
    0x95U, 0x02U,         //   REPORT COUNT (2)
    0x05U, 0x01U,         //   USAGE PAGE (Generic Desktop)
    0x09U, 0x30U,         //   USAGE(X)
    0x09U, 0x31U,         //   USAGE (Y)
    0x81U, 0x06U,         //   INPUT (Data,Var,Rel)

    0xC0U,                 //   END COLLECTION //mouse
};


/**
 * Simple custom sensor example.
 */
const unsigned char cus1_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,         // USAGE_PAGE (Sensor)
    HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM, // USAGE (Simple Custom)
    HID_COLLECTION(Physical),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value

    HID_END_COLLECTION
};


/**
 * More complex custom sensor example.
 */
const unsigned char cus2_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,         // USAGE_PAGE (Sensor)
    HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM, // USAGE (Simple Custom)
    HID_COLLECTION(Physical),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_DATA_CUSTOM_USAGE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_TYPE_MOTION_SPEEDOMETER
    HID_USAGE_SENSOR_DATA_CUSTOM_BOOLEAN_ARRAY,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_TYPE_MOTION_SPEEDOMETER
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_2,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_3,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_4,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_5,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_6,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value

    HID_END_COLLECTION
};


/**
 * Custom sensor example with features
 */
const unsigned char cus3_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,         // USAGE_PAGE (Sensor)
    HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM, // USAGE (Simple Custom)
    HID_COLLECTION(Physical),

    //feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_CUSTOM,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_CUSTOM,HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_CUSTOM,HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_DATA_CUSTOM_USAGE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_TYPE_MOTION_SPEEDOMETER
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs), // = HID_USAGE_SENSOR_DATA_MOTION_SPEED value

    HID_END_COLLECTION
};


/**
 * Full custom sensor example with feature.
 */
const unsigned char cus4_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,         // USAGE_PAGE (Sensor)
    HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM, // USAGE (Simple Custom)
    HID_COLLECTION(Application),

    //feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_CUSTOM,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_CUSTOM,HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_CUSTOM,HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_DATA_CUSTOM_USAGE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_BOOLEAN_ARRAY,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_2,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_3,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_4,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_5,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_6,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),

#if 1 //define vendor-specific (non-spec) custom datafields
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_7,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_8,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_9,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_10,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_11,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_12,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_13,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_14,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_15,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_16,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_17,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_18,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_19,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_20,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_21,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_22,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_23,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_24,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_25,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_26,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_27,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_28,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale unit to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),
#endif
    HID_END_COLLECTION
};


/**
 * Human presence sensor example.
 */
const unsigned char pres_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_BIOMETRIC_PRESENCE,
    HID_COLLECTION(Physical),

    //feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0),
    HID_FEATURE(Data_Var_Abs),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_DATA_BIOMETRIC_HUMAN_PRESENCE,
    HID_LOGICAL_MIN_8(0), // False
    HID_LOGICAL_MAX_8(1), // True
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs),

    HID_END_COLLECTION
};


/**
 * Proximity sensor example.
 */
const unsigned char prox_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_BIOMETRIC_PROXIMITY,
    HID_COLLECTION(Physical),

    //feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_BIOMETRIC_HUMAN_PROXIMITY_RANGE,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0D), // scale default unit "meter" to "centimeter"
    // to provide 2 digits past decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_BIOMETRIC_HUMAN_PROXIMITY_RANGE,
                          HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0D), // scale default unit "meter" to "centimeter"
    // to provide 2 digits past decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_BIOMETRIC_HUMAN_PROXIMITY_RANGE,
                          HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0D), // scale default unit "meter" to "centimeter"
    // to provide 2 digits past decimal point
    HID_FEATURE(Data_Var_Abs),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_DATA_BIOMETRIC_HUMAN_PROXIMITY_OUT_OF_RANGE,
    HID_LOGICAL_MIN_8(0), // False
    HID_LOGICAL_MAX_8(1), // True
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_BIOMETRIC_HUMAN_PROXIMITY_RANGE,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0D),  // scale default unit "meter" to "centimeter"
    // to provide 2 digits past decimal point
    HID_INPUT(Data_Var_Abs),

    HID_END_COLLECTION
};


/**
 * Barometer sensor example.
 */
const unsigned char bar_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_ENVIRONMENTAL_ATMOSPHERIC_PRESSURE,
    HID_COLLECTION(Physical),

    //feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_ATMOSPHERIC_PRESSURE,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit "Bar" to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_ATMOSPHERIC_PRESSURE,
                          HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit "Bar" to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_ATMOSPHERIC_PRESSURE,
                          HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit "Bar" to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_ATMOSPHERIC_PRESSURE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit "Bar" to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),

    HID_END_COLLECTION
};


/**
 * Humidity sensor example.
 */
const unsigned char humi_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_ENVIRONMENTAL_HUMIDITY,
    HID_COLLECTION(Physical),

    //feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_RELATIVE_HUMIDITY,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0x10,0x27), // 10000 = 0.00 to 100.00 percent with 2 digits past decimal point
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_RELATIVE_HUMIDITY,
                          HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0x10,0x27), // 10000 = 0.00 to 100.00 percent with 2 digits past decimal point
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_RELATIVE_HUMIDITY,
                          HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0x10,0x27), // 10000 = 0.00 to 100.00 percent with 2 digits past decimal point
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_RELATIVE_HUMIDITY,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0x10,0x27), // 10000 = 0.00 to 100.00 percent with 2 digits past decimal point
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit "percent"
    // to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),

    HID_END_COLLECTION
};


/**
 * Temperature sensor example.
 */
const unsigned char temp_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_ENVIRONMENTAL_TEMPERATURE,
    HID_COLLECTION(Physical),

    //feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_TEMPERATURE,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit "Celsius"
    // to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_TEMPERATURE,
                          HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit "Celsius"
    // to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_TEMPERATURE,
                          HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit "Celsius"
    // to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(16),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_TEMPERATURE,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit "Celsius"
    // to provide 2 digits past the decimal point
    HID_INPUT(Data_Var_Abs),

    HID_END_COLLECTION
};


/**
 * Ambient light sensor example.
 */
const unsigned char als_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,         // USAGE_PAGE (Sensor)
    HID_USAGE_SENSOR_TYPE_LIGHT_AMBIENTLIGHT, // USAGE (AmbientLight)
    HID_COLLECTION(Physical),

    //feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_LIGHT_ILLUMINANCE,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_REL_PCT),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0x10,0x27), // 10000 = 0.00 to 100.00 percent with 2 digits past decimal point
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E),  // scale default unit to provide 2 digits past decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_LIGHT_ILLUMINANCE,HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_LIGHT_ILLUMINANCE,HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
    HID_FEATURE(Data_Var_Abs),

    //add this definition if required by the specific application
    HID_USAGE_SENSOR_PROPERTY_RESPONSE_CURVE,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(10), //as required for n pair of values
    HID_UNIT_EXPONENT(0x0), // scale default unit to provide 0 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_DATA_LIGHT_ILLUMINANCE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_LIGHT_COLOR_TEMPERATURE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_UNIT_EXPONENT(0),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_LIGHT_CHROMATICITY_X,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_UNIT_EXPONENT(0x0C), // scale default unit to provide 4 digits past decimal point
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_LIGHT_CHROMATICITY_Y,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_UNIT_EXPONENT(0x0C), // scale default unit to provide 4 digits past decimal point
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs),

    HID_END_COLLECTION
};


/**
 * 3D accelerometer sensor example.
 */
const unsigned char accel3_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_MOTION_ACCELEROMETER_3D,
    HID_COLLECTION(Physical),

    //feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0),
    HID_FEATURE(Data_Var_Abs),

    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E),  // scale default unit Gs to centi-Gs
    // to provide 2 digits past Gs decimal point
    HID_FEATURE(Data_Var_Abs),

    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION,HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E),  // scale default unit Gs to centi-Gs
    // to provide 2 digits past Gs decimal point
    HID_FEATURE(Data_Var_Abs),

    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION,HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E),  // scale default unit Gs to centi-Gs
    // to provide 2 digits past Gs decimal point
    HID_FEATURE(Data_Var_Abs),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_X_AXIS,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E),  // scale default unit Gs to centi-Gs
    // to provide 2 digits past Gs decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Y_AXIS,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E),  // scale default unit Gs to centi-Gs
    // to provide 2 digits past Gs decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Z_AXIS,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E),  // scale default unit Gs to centi-Gs
    // to provide 2 digits past Gs decimal point
    HID_INPUT(Data_Var_Abs),

    //include the following datafield if required to support the “shake” event
    HID_USAGE_SENSOR_DATA_MOTION_STATE,
    HID_LOGICAL_MIN_8(0), // False = Still
    HID_LOGICAL_MAX_8(1), // True = In Motion
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs),

    HID_END_COLLECTION
};


/**
 * 3D gyroscope sensor example.
 */
const unsigned char gyro3_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_MOTION_GYROMETER_3D,
    HID_COLLECTION(Physical),

    //feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY,
                          HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY,
                          HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_FEATURE(Data_Var_Abs),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY_X_AXIS,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY_Y_AXIS,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_MOTION_ANGULAR_VELOCITY_Z_AXIS,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_INPUT(Data_Var_Abs),

    HID_END_COLLECTION
};


/**
 * 3D compass sensor example.
 */
const unsigned char comp3_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_ORIENTATION_COMPASS_3D,
    HID_COLLECTION(Physical),

    //feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_HEADING,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_HEADING,
                          HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_HEADING,
                          HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_FLUX,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_FLUX,
                          HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_FLUX,
                          HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
    HID_FEATURE(Data_Var_Abs),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_DATA_ORIENTATION_COMPENSATED_MAGNETIC_NORTH,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_ORIENTATION_COMPENSATED_TRUE_NORTH,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_NORTH,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_ORIENTATION_TRUE_NORTH,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0F), // scale default unit to provide 1 digit past decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_FLUX_X_AXIS,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0D), // scale default unit to "milliGauss"
    // to provide 3 digits past decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_FLUX_Y_AXIS,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0D), // scale default unit to "milliGauss"
    // to provide 3 digits past decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETIC_FLUX_Z_AXIS,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0D), // scale default unit to "milliGauss"
    // to provide 3 digits past decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_LOW,
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_MEDIUM,
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_HIGH,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,

    HID_END_COLLECTION
};


/**
 * 3D inclinomater example.
 */
const unsigned char inc3_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_ORIENTATION_INCLINOMETER_3D,
    HID_COLLECTION(Physical),

    //feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_TILT,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_TILT,HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_TILT,HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_FEATURE(Data_Var_Abs),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_DATA_ORIENTATION_TILT_X,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_ORIENTATION_TILT_Y,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_ORIENTATION_TILT_Z,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit to provide 2 digits past decimal point
    HID_INPUT(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_LOW,
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_MEDIUM,
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_HIGH,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,

    HID_END_COLLECTION
};


/**
 * Device orientation sensor example. Note this maps to rotation vector sensor in android.
 */
const unsigned char devor_report_descriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_ORIENTATION_DEVICE_ORIENTATION,
    HID_COLLECTION(Physical),

    //feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_SENSOR_CONNECTION_TYPE,  // NAry
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_ATTACHED_SEL,
    HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_EXTERNAL_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_UNDEFINED_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D1_LOW_POWER_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE_SEL,
    HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_FEATURE(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF),
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_PROPERTY_CHANGE_SENSITIVITY_ABS,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E), // scale default unit "meter" to provide 2 digits past the decimal point
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_QUATERNION,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_QUATERNION,
                          HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x01),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_QUATERNION,
                          HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x01),
    HID_FEATURE(Data_Var_Abs),

    //include this if the values are calculated in firmware
    //otherwise, the driver will calculate these values from the Quaternion
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_ROTATION_MATRIX,
                          HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS),
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_16(0xFF,0xFF),
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_ROTATION_MATRIX,
                          HID_USAGE_SENSOR_DATA_MOD_MAX),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E),
    HID_FEATURE(Data_Var_Abs),
    HID_USAGE_SENSOR_DATA(HID_USAGE_SENSOR_DATA_ORIENTATION_ROTATION_MATRIX,
                          HID_USAGE_SENSOR_DATA_MOD_MIN),
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_UNIT_EXPONENT(0x0E),
    HID_FEATURE(Data_Var_Abs),

    //input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(6),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_STATE_UNKNOWN_SEL,
    HID_USAGE_SENSOR_STATE_READY_SEL,
    HID_USAGE_SENSOR_STATE_NOT_AVAILABLE_SEL,
    HID_USAGE_SENSOR_STATE_NO_DATA_SEL,
    HID_USAGE_SENSOR_STATE_INITIALIZING_SEL,
    HID_USAGE_SENSOR_STATE_ACCESS_DENIED_SEL,
    HID_USAGE_SENSOR_STATE_ERROR_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(5),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_EVENT_UNKNOWN_SEL,
    HID_USAGE_SENSOR_EVENT_STATE_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_PROPERTY_CHANGED_SEL,
    HID_USAGE_SENSOR_EVENT_DATA_UPDATED_SEL,
    HID_USAGE_SENSOR_EVENT_POLL_RESPONSE_SEL,
    HID_USAGE_SENSOR_EVENT_CHANGE_SENSITIVITY_SEL,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,
    HID_USAGE_SENSOR_DATA_ORIENTATION_QUATERNION,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(4),
    HID_UNIT_EXPONENT(0x0E),
    HID_INPUT(Data_Arr_Abs),

    //include this if the values are calculated in firmware
    //otherwise, the driver will calculate these values from the Quaternion
    HID_USAGE_SENSOR_DATA_ORIENTATION_ROTATION_MATRIX,
    HID_LOGICAL_MIN_16(0x01,0x80), //    LOGICAL_MINIMUM (-32767)
    HID_LOGICAL_MAX_16(0xFF,0x7F), //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(9),
    HID_UNIT_EXPONENT(0x0F),
    HID_INPUT(Data_Arr_Abs),

    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY,
    HID_LOGICAL_MIN_8(0),
    HID_LOGICAL_MAX_8(2),
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_COLLECTION(Logical),
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_LOW,
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_MEDIUM,
    HID_USAGE_SENSOR_DATA_ORIENTATION_MAGNETOMETER_ACCURACY_HIGH,
    HID_INPUT(Data_Arr_Abs),
    HID_END_COLLECTION,

    HID_END_COLLECTION
};
} // annoymous namespace

/**
 * Global test vector entry.
 */
#define TEST_DESCRIPTOR(name) \
    { name ## _report_descriptor, sizeof(name ## _report_descriptor), #name }

const TestHidDescriptor gDescriptorArray[] = {
    TEST_DESCRIPTOR(accel3),
    TEST_DESCRIPTOR(col1),
    TEST_DESCRIPTOR(col2),
    TEST_DESCRIPTOR(col3),
    TEST_DESCRIPTOR(cus1),
    TEST_DESCRIPTOR(cus2),
    TEST_DESCRIPTOR(cus3),
    TEST_DESCRIPTOR(cus4),
    TEST_DESCRIPTOR(pres),
    TEST_DESCRIPTOR(prox),
    TEST_DESCRIPTOR(bar),
    TEST_DESCRIPTOR(humi),
    TEST_DESCRIPTOR(temp),
    TEST_DESCRIPTOR(als),
    TEST_DESCRIPTOR(gyro3),
    TEST_DESCRIPTOR(comp3),
    TEST_DESCRIPTOR(inc3),
    TEST_DESCRIPTOR(devor),
    {nullptr, 0, nullptr} //sentinel
};
#undef TEST_DESCRIPTOR

const TestHidDescriptor *findTestDescriptor(const char *name) {
    if (name == nullptr) {
        return nullptr;
    }

    for (const TestHidDescriptor *p = gDescriptorArray; ; ++p) {
        if (p->data == nullptr || p->len == 0) {
            break;
        }
        if (strcmp(p->name, name) == 0) {
            return p;
        }
    }
    return nullptr;
}
