from hidparser.UsagePage import Usage, UsageType, UsagePage


#TODO Support modifiers as defined in HUTRR39b
# data type usage switches -- we use them as modifiers for sensor properties & data fields
# to create thresholds, for example.
# NOTE: the usage tables actually define these as two bytes, but in order
# to get the define macros to work so these are ‘or-ed’ these are defined
# here as only one byte.
# HID_USAGE_SENSOR_DATA_MOD_NONE = 0x00 # US
# HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS = 0x10 # US
# HID_USAGE_SENSOR_DATA_MOD_MAX = 0x20 # US
# HID_USAGE_SENSOR_DATA_MOD_MIN = 0x30 # US
# HID_USAGE_SENSOR_DATA_MOD_ACCURACY = 0x40 # US
# HID_USAGE_SENSOR_DATA_MOD_RESOLUTION = 0x50 # US
# HID_USAGE_SENSOR_DATA_MOD_THRESHOLD_HIGH = 0x60 # US
#
# HID_USAGE_SENSOR_DATA_MOD_THRESHOLD_LOW = 0x70 # US
# HID_USAGE_SENSOR_DATA_MOD_CALIBRATION_OFFSET = 0x80 # US
# HID_USAGE_SENSOR_DATA_MOD_CALIBRATION_MULTIPLIER = 0x90 # US
# HID_USAGE_SENSOR_DATA_MOD_REPORT_INTERVAL = 0xA0 # US
# HID_USAGE_SENSOR_DATA_MOD_FREQUENCY_MAX = 0xB0 # US
# HID_USAGE_SENSOR_DATA_MOD_PERIOD_MAX = 0xC0 # US
# HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_RANGE_PCT = 0xD0 # US
# HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_REL_PCT = 0xE0 # US
# HID_USAGE_SENSOR_DATA_MOD_VENDOR_RESERVED = 0xF0 # US

class Sensor(UsagePage):
    @classmethod
    def _get_usage_page_index(cls):
        return 0x20

    # sensor category usages
    SENSOR = Usage(0x01, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    # sensor category biometric
    BIOMETRIC = Usage(0x10, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    BIOMETRIC_PRESENCE = Usage(0x11, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    BIOMETRIC_PROXIMITY = Usage(0x12, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    BIOMETRIC_TOUCH = Usage(0x13, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    # sensor category electrical
    ELECTRICAL = Usage(0x20, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ELECTRICAL_CAPACITANCE = Usage(0x21, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ELECTRICAL_CURRENT = Usage(0x22, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ELECTRICAL_POWER = Usage(0x23, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ELECTRICAL_INDUCTANCE = Usage(0x24, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ELECTRICAL_RESISTANCE = Usage(0x25, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ELECTRICAL_VOLTAGE = Usage(0x26, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ELECTRICAL_POTENTIOMETER = Usage(0x27, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ELECTRICAL_FREQUENCY = Usage(0x28, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ELECTRICAL_PERIOD = Usage(0x29, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    # sensor category environmental
    ENVIRONMENTAL = Usage(0x30, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ENVIRONMENTAL_ATMOSPHERIC_PRESSURE = Usage(0x31, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ENVIRONMENTAL_HUMIDITY = Usage(0x32, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ENVIRONMENTAL_TEMPERATURE = Usage(0x33, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ENVIRONMENTAL_WIND_DIRECTION = Usage(0x34, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ENVIRONMENTAL_WIND_SPEED = Usage(0x35, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    # sensor category light
    LIGHT = Usage(0x40, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    LIGHT_AMBIENTLIGHT = Usage(0x41, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    LIGHT_CONSUMER_INFRARED = Usage(0x42, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    # sensor category location
    LOCATION = Usage(0x50, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    LOCATION_BROADCAST = Usage(0x51, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    LOCATION_DEAD_RECKONING = Usage(0x52, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    LOCATION_GPS = Usage(0x53, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    LOCATION_LOOKUP = Usage(0x54, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    LOCATION_OTHER = Usage(0x55, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    LOCATION_STATIC = Usage(0x56, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    LOCATION_TRIANGULATION = Usage(0x57, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    # sensor category mechanical
    MECHANICAL = Usage(0x60, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MECHANICAL_BOOLEAN_SWITCH = Usage(0x61, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MECHANICAL_BOOLEAN_SWITCH_ARRAY = Usage(0x62, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MECHANICAL_MULTIVALUE_SWITCH = Usage(0x63, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MECHANICAL_FORCE = Usage(0x64, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MECHANICAL_PRESSURE = Usage(0x65, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MECHANICAL_STRAIN = Usage(0x66, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])

    MECHANICAL_SCALE_WEIGHT = Usage(0x67, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MECHANICAL_VIBRATOR = Usage(0x68, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MECHANICAL_HALL_EFFECT_SWITCH = Usage(0x69, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    # sensor category motion
    MOTION = Usage(0x70, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MOTION_ACCELEROMETER_1D = Usage(0x71, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MOTION_ACCELEROMETER_2D = Usage(0x72, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MOTION_ACCELEROMETER_3D = Usage(0x73, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MOTION_GYROMETER_1D = Usage(0x74, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MOTION_GYROMETER_2D = Usage(0x75, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MOTION_GYROMETER_3D = Usage(0x76, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MOTION_MOTION_DETECTOR = Usage(0x77, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MOTION_SPEEDOMETER = Usage(0x78, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MOTION_ACCELEROMETER = Usage(0x79, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    MOTION_GYROMETER = Usage(0x7A, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    # sensor category orientation
    ORIENTATION = Usage(0x80, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ORIENTATION_COMPASS_1D = Usage(0x81, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ORIENTATION_COMPASS_2D = Usage(0x82, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ORIENTATION_COMPASS_3D = Usage(0x83, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ORIENTATION_INCLINOMETER_1D = Usage(0x84, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ORIENTATION_INCLINOMETER_2D = Usage(0x85, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ORIENTATION_INCLINOMETER_3D = Usage(0x86, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ORIENTATION_DISTANCE_1D = Usage(0x87, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ORIENTATION_DISTANCE_2D = Usage(0x88, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ORIENTATION_DISTANCE_3D = Usage(0x89, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ORIENTATION_DEVICE_ORIENTATION = Usage(0x8A, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ORIENTATION_COMPASS = Usage(0x8B, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ORIENTATION_INCLINOMETER = Usage(0x8C, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    ORIENTATION_DISTANCE = Usage(0x8D, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    # sensor category scanner
    SCANNER = Usage(0x90, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    SCANNER_BARCODE = Usage(0x91, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    SCANNER_RFID = Usage(0x92, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    SCANNER_NFC = Usage(0x93, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    # sensor category time
    TIME = Usage(0xA0, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    TIME_ALARM = Usage(0xA1, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    TIME_RTC = Usage(0xA2, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    # sensor category other
    OTHER = Usage(0xE0, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    OTHER_CUSTOM = Usage(0xE1, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    OTHER_GENERIC = Usage(0xE2, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])
    OTHER_GENERIC_ENUMERATOR = Usage(0xE3, [UsageType.COLLECTION_APPLICATION, UsageType.COLLECTION_PHYSICAL])

    # state usages
    STATE = Usage(0x0201, UsageType.COLLECTION_NAMED_ARRAY)
    # state selectors
    STATE_UNKNOWN = Usage(0x0800, UsageType.DATA_SELECTOR)
    STATE_READY = Usage(0x0801, UsageType.DATA_SELECTOR)
    STATE_NOT_AVAILABLE = Usage(0x0802, UsageType.DATA_SELECTOR)
    STATE_NO_DATA = Usage(0x0803, UsageType.DATA_SELECTOR)
    STATE_INITIALIZING = Usage(0x0804, UsageType.DATA_SELECTOR)
    STATE_ACCESS_DENIED = Usage(0x0805, UsageType.DATA_SELECTOR)
    STATE_ERROR = Usage(0x0806, UsageType.DATA_SELECTOR)
    # event usages
    EVENT = Usage(0x0202, UsageType.COLLECTION_NAMED_ARRAY)
    # event selectors
    EVENT_UNKNOWN = Usage(0x0810, UsageType.DATA_SELECTOR)
    EVENT_STATE_CHANGED = Usage(0x0811, UsageType.DATA_SELECTOR)
    EVENT_PROPERTY_CHANGED = Usage(0x0812, UsageType.DATA_SELECTOR)
    EVENT_DATA_UPDATED = Usage(0x0813, UsageType.DATA_SELECTOR)
    EVENT_POLL_RESPONSE = Usage(0x0814, UsageType.DATA_SELECTOR)
    EVENT_CHANGE_SENSITIVITY = Usage(0x0815, UsageType.DATA_SELECTOR)
    EVENT_MAX_REACHED = Usage(0x0816, UsageType.DATA_SELECTOR)
    EVENT_MIN_REACHED = Usage(0x0817, UsageType.DATA_SELECTOR)
    EVENT_HIGH_THRESHOLD_CROSS_UPWARD = Usage(0x0818, UsageType.DATA_SELECTOR)
    EVENT_HIGH_THESHOLD_CROSS_ABOVE = EVENT_HIGH_THRESHOLD_CROSS_UPWARD
    EVENT_HIGH_THRESHOLD_CROSS_DOWNWARD = Usage(0x0819, UsageType.DATA_SELECTOR)
    EVENT_HIGH_THRESHOLD_CROSS_BELOW = EVENT_HIGH_THRESHOLD_CROSS_DOWNWARD
    EVENT_LOW_THRESHOLD_CROSS_UPWARD = Usage(0x081A, UsageType.DATA_SELECTOR)
    EVENT_LOW_THRESHOLD_CROSS_ABOVE = EVENT_LOW_THRESHOLD_CROSS_UPWARD
    EVENT_LOW_THRESHOLD_CROSS_DOWNWARD = Usage(0x081B, UsageType.DATA_SELECTOR)
    EVENT_LOW_THRESHOLD_CROSS_BELOW = EVENT_LOW_THRESHOLD_CROSS_DOWNWARD
    EVENT_ZERO_THRESHOLD_CROSS_UPWARD = Usage(0x081C, UsageType.DATA_SELECTOR)
    EVENT_ZERO_THRESHOLD_CROSS_ABOVE = EVENT_ZERO_THRESHOLD_CROSS_UPWARD
    EVENT_ZERO_THRESHOLD_CROSS_DOWNWARD = Usage(0x081D, UsageType.DATA_SELECTOR)
    EVENT_ZERO_THRESHOLD_CROSS_BELOW = EVENT_ZERO_THRESHOLD_CROSS_DOWNWARD
    EVENT_PERIOD_EXCEEDED = Usage(0x081E, UsageType.DATA_SELECTOR)
    EVENT_FREQUENCY_EXCEEDED = Usage(0x081F, UsageType.DATA_SELECTOR)
    EVENT_COMPLEX_TRIGGER = Usage(0x0820, UsageType.DATA_SELECTOR)
    # property usages (get/set feature report)
    PROPERTY = Usage(0x0300, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_FRIENDLY_NAME = Usage(0x0301, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_PERSISTENT_UNIQUE_ID = Usage(0x0302, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_SENSOR_STATUS = Usage(0x0303, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_MINIMUM_REPORT_INTERVAL = Usage(0x0304, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_SENSOR_MANUFACTURER = Usage(0x0305, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_SENSOR_MODEL = Usage(0x0306, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_SENSOR_SERIAL_NUMBER = Usage(0x0307, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_SENSOR_DESCRIPTION = Usage(0x0308, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_SENSOR_CONNECTION_TYPE = Usage(0x0309, UsageType.COLLECTION_NAMED_ARRAY)
    # begin connection type selectors
    PROPERTY_CONNECTION_TYPE_PC_INTEGRATED = Usage(0x0830, UsageType.DATA_SELECTOR)
    PROPERTY_CONNECTION_TYPE_PC_ATTACHED = Usage(0x0831, UsageType.DATA_SELECTOR)
    PROPERTY_CONNECTION_TYPE_PC_EXTERNAL = Usage(0x0832, UsageType.DATA_SELECTOR)
    # end connection type selectors
    PROPERTY_SENSOR_DEVICE_PATH = Usage(0x030A, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_HARDWARE_REVISION = Usage(0x030B, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_FIRMWARE_VERSION = Usage(0x030C, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_RELEASE_DATE = Usage(0x030D, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_REPORT_INTERVAL = Usage(0x030E, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_CHANGE_SENSITIVITY_ABS = Usage(0x030F, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_CHANGE_SENSITIVITY_RANGE_PCT = Usage(0x0310, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_CHANGE_SENSITIVITY_REL_PCT = Usage(0x0311, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_ACCURACY = Usage(0x0312, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_RESOLUTION = Usage(0x0313, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_RANGE_MAXIMUM = Usage(0x0314, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_RANGE_MINIMUM = Usage(0x0315, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_REPORTING_STATE = Usage(0x0316, UsageType.COLLECTION_NAMED_ARRAY)
    # begin reporting state selectors
    PROPERTY_REPORTING_STATE_NO_EVENTS = Usage(0x0840, UsageType.DATA_SELECTOR)
    HID_USAGE_REPORTING_STATE_ON_NONE = PROPERTY_REPORTING_STATE_NO_EVENTS
    PROPERTY_REPORTING_STATE_ALL_EVENTS = Usage(0x0841, UsageType.DATA_SELECTOR)
    HID_USAGE_REPORTING_STATE_ON_ALL = PROPERTY_REPORTING_STATE_ALL_EVENTS
    PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS = Usage(0x0842, UsageType.DATA_SELECTOR)
    HID_USAGE_REPORTING_STATE_ON_THRESHOLD = PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS
    PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE = Usage(0x0843, UsageType.DATA_SELECTOR)
    PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE = Usage(0x0844, UsageType.DATA_SELECTOR)
    PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE = Usage(0x0845, UsageType.DATA_SELECTOR)
    # end reporting state selectors
    PROPERTY_SAMPLING_RATE = Usage(0x0317, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_RESPONSE_CURVE = Usage(0x0318, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_POWER_STATE = Usage(0x0319, UsageType.COLLECTION_NAMED_ARRAY)
    # begin power state selectors
    PROPERTY_POWER_STATE_UNDEFINED = Usage(0x0850, UsageType.DATA_SELECTOR)
    PROPERTY_POWER_STATE_D0_FULL_POWER = Usage(0x0851, UsageType.DATA_SELECTOR)
    PROPERTY_POWER_STATE_D1_LOW_POWER = Usage(0x0852, UsageType.DATA_SELECTOR)

    PROPERTY_POWER_STATE_D2_STANDBY_WITH_WAKE = Usage(0x0853, UsageType.DATA_SELECTOR)
    PROPERTY_POWER_STATE_D3_SLEEP_WITH_WAKE = Usage(0x0854, UsageType.DATA_SELECTOR)
    PROPERTY_POWER_STATE_D4_POWER_OFF = Usage(0x0855, UsageType.DATA_SELECTOR)
    # end power state selectors
    # data type location
    # data field usages (input report
    DATA_LOCATION = Usage(0x0400, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_DESIRED_ACCURACY = Usage(0x0401, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_ALTITUDE_ANTENNA_SEALEVEL = Usage(0x0402, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_DIFFERENTIAL_REFERENCE_STATION_ID = Usage(0x0403, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_ALTITIDE_ELIPSOID_ERROR = Usage(0x0404, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_ALTITIDE_ELIPSOID = Usage(0x0405, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_ALTITUDE_SEALEVEL_ERROR = Usage(0x0406, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_ALTITUDE_SEALEVEL = Usage(0x0407, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_DGPS_DATA_AGE = Usage(0x0408, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_ERROR_RADIUS = Usage(0x0409, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_FIX_QUALITY = Usage(0x040A, UsageType.COLLECTION_NAMED_ARRAY)
    # begin fix quality selectors
    DATA_FIX_QUALITY_NO_FIX = Usage(0x0870, UsageType.DATA_SELECTOR)
    DATA_FIX_QUALITY_GPS = Usage(0x0871, UsageType.DATA_SELECTOR)
    DATA_FIX_QUALITY_DGPS = Usage(0x0872, UsageType.DATA_SELECTOR)
    # end fix quality selectors
    DATA_LOCATION_FIX_TYPE = Usage(0x040B, UsageType.COLLECTION_NAMED_ARRAY)
    # begin fix type selectors
    DATA_FIX_TYPE_NO_FIX = Usage(0x0880, UsageType.DATA_SELECTOR)
    DATA_FIX_TYPE_GPS_SPS_MODE_FIX_VALID = Usage(0x0881, UsageType.DATA_SELECTOR)
    DATA_FIX_TYPE_DGPS_SPS_MODE_FIX_VALID = Usage(0x0882, UsageType.DATA_SELECTOR)
    DATA_FIX_TYPE_GPS_PPS_MODE_FIX_VALID = Usage(0x0883, UsageType.DATA_SELECTOR)
    DATA_FIX_TYPE_REAL_TIME_KINEMATIC = Usage(0x0884, UsageType.DATA_SELECTOR)
    DATA_FIX_TYPE_FLOAT_RTK = Usage(0x0885, UsageType.DATA_SELECTOR)
    DATA_FIX_TYPE_ESTIMATED_DEAD_RECKONING = Usage(0x0886, UsageType.DATA_SELECTOR)
    DATA_FIX_TYPE_MANUAL_INPUT_MODE = Usage(0x0887, UsageType.DATA_SELECTOR)
    DATA_FIX_TYPE_SIMULATOR_MODE = Usage(0x0888, UsageType.DATA_SELECTOR)
    # end fix type selectors
    DATA_LOCATION_GEOIDAL_SEPARATION = Usage(0x040C, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_GPS_OPERATION_MODE = Usage(0x040D, UsageType.COLLECTION_NAMED_ARRAY)
    # begin gps operation mode selectors
    DATA_GPS_OP_MODE_MANUAL = Usage(0x0890, UsageType.DATA_SELECTOR)
    DATA_GPS_OP_MODE_AUTOMATIC = Usage(0x0891, UsageType.DATA_SELECTOR)
    # end gps operation mode selectors
    DATA_LOCATION_GPS_SELECTION_MODE = Usage(0x040E, UsageType.COLLECTION_NAMED_ARRAY)
    # begin gps selection mode selectors
    DATA_GPS_SEL_MODE_AUTONOMOUS = Usage(0x08A0, UsageType.DATA_SELECTOR)
    DATA_GPS_SEL_MODE_DGPS = Usage(0x08A1, UsageType.DATA_SELECTOR)
    DATA_GPS_SEL_MODE_ESTIMATED_DEAD_RECKONING = Usage(0x08A2, UsageType.DATA_SELECTOR)
    DATA_GPS_SEL_MODE_MANUAL_INPUT = Usage(0x08A3, UsageType.DATA_SELECTOR)
    DATA_GPS_SEL_MODE_SIMULATOR = Usage(0x08A4, UsageType.DATA_SELECTOR)
    DATA_GPS_SEL_MODE_DATA_NOT_VALID = Usage(0x08A5, UsageType.DATA_SELECTOR)
    # end gps selection mode selectors
    DATA_LOCATION_GPS_STATUS = Usage(0x040F, UsageType.COLLECTION_NAMED_ARRAY)
    # begin gps status selectors
    DATA_GPS_STATUS_DATA_VALID = Usage(0x08B0, UsageType.DATA_SELECTOR)
    DATA_GPS_STATUS_DATA_NOT_VALID = Usage(0x08B1, UsageType.DATA_SELECTOR)
    # end gps status selectors
    DATA_LOCATION_POSITION_DILUTION_OF_PRECISION = Usage(0x0410, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_HORIZONTAL_DILUTION_OF_PRECISION = Usage(0x0411, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_VERTICAL_DILUTION_OF_PRECISION = Usage(0x0412, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_LATITUDE = Usage(0x0413, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_LONGITUDE = Usage(0x0414, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_TRUE_HEADING = Usage(0x0415, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_MAGNETIC_HEADING = Usage(0x0416, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_MAGNETIC_VARIATION = Usage(0x0417, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_SPEED = Usage(0x0418, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_SATELLITES_IN_VIEW = Usage(0x0419, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_SATELLITES_IN_VIEW_AZIMUTH = Usage(0x041A, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_SATELLITES_IN_VIEW_ELEVATION = Usage(0x041B, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_SATELLITES_IN_VIEW_ID = Usage(0x041C, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_SATELLITES_IN_VIEW_PRNs = Usage(0x041D, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_SATELLITES_IN_VIEW_STN_RATIO = Usage(0x041E, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_SATELLITES_USED_COUNT = Usage(0x041F, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_SATELLITES_USED_PRNs = Usage(0x0420, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_NMEA_SENTENCE = Usage(0x0421, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_ADDRESS_LINE_1 = Usage(0x0422, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_ADDRESS_LINE_2 = Usage(0x0423, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_CITY = Usage(0x0424, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_STATE_OR_PROVINCE = Usage(0x0425, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_COUNTRY_OR_REGION = Usage(0x0426, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LOCATION_POSTAL_CODE = Usage(0x0427, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # property usages (get/set feature report)
    PROPERTY_LOCATION = Usage(0x042A, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_LOCATION_DESIRED_ACCURACY = Usage(0x042B, UsageType.COLLECTION_NAMED_ARRAY)
    # begin location desired accuracy selectors
    DESIRED_ACCURACY_DEFAULT = Usage(0x0860, UsageType.DATA_SELECTOR)
    DESIRED_ACCURACY_HIGH = Usage(0x0861, UsageType.DATA_SELECTOR)
    DESIRED_ACCURACY_MEDIUM = Usage(0x0862, UsageType.DATA_SELECTOR)
    DESIRED_ACCURACY_LOW = Usage(0x0863, UsageType.DATA_SELECTOR)
    # end location desired accuracy selectors
    # data type environmental
    # data field usages (input report)
    DATA_ENVIRONMENTAL = Usage(0x0430, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ENVIRONMENTAL_ATMOSPHERIC_PRESSURE = Usage(0x0431, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ENVIRONMENTAL_REFERENCE_PRESSURE = Usage(0x0432, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ENVIRONMENTAL_RELATIVE_HUMIDITY = Usage(0x0433, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ENVIRONMENTAL_TEMPERATURE = Usage(0x0434, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ENVIRONMENTAL_WIND_DIRECTION = Usage(0x0435, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ENVIRONMENTAL_WIND_SPEED = Usage(0x0436, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # property usages (get/set feature report)
    PROPERTY_ENVIRONMENTAL = Usage(0x0440, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_ENVIRONMENTAL_REFERENCE_PRESSURE = Usage(0x0441, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # data type motion
    # data field usages (input report)
    DATA_MOTION = Usage(0x0450, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_STATE = Usage(0x0451, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_ACCELERATION = Usage(0x0452, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_ACCELERATION_X_AXIS = Usage(0x0453, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_ACCELERATION_Y_AXIS = Usage(0x0454, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_ACCELERATION_Z_AXIS = Usage(0x0455, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_ANGULAR_VELOCITY = Usage(0x0456, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_ANGULAR_VELOCITY_X_AXIS = Usage(0x0457, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_ANGULAR_VELOCITY_Y_AXIS = Usage(0x0458, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_ANGULAR_VELOCITY_Z_AXIS = Usage(0x0459, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_ANGULAR_POSITION = Usage(0x045A, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_ANGULAR_POSITION_X_AXIS = Usage(0x045B, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_ANGULAR_POSITION_Y_AXIS = Usage(0x045C, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_ANGULAR_POSITION_Z_AXIS = Usage(0x045D, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_SPEED = Usage(0x045E, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MOTION_INTENSITY = Usage(0x045F, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # data type orientation
    # data field usages (input report)
    DATA_ORIENTATION = Usage(0x0470, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_MAGNETIC_HEADING = Usage(0x0471, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_MAGNETIC_HEADING_X = Usage(0x0472, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_MAGNETIC_HEADING_Y = Usage(0x0473, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_MAGNETIC_HEADING_Z = Usage(0x0474, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_COMPENSATED_MAGNETIC_NORTH = Usage(0x0475, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_COMPENSATED_TRUE_NORTH = Usage(0x0476, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_MAGNETIC_NORTH = Usage(0x0477, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_TRUE_NORTH = Usage(0x0478, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_DISTANCE = Usage(0x0479, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_DISTANCE_X = Usage(0x047A, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_DISTANCE_Y = Usage(0x047B, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_DISTANCE_Z = Usage(0x047C, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_DISTANCE_OUT_OF_RANGE = Usage(0x047D, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_TILT = Usage(0x047E, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_TILT_X = Usage(0x047F, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_TILT_Y = Usage(0x0480, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_TILT_Z = Usage(0x0481, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_ROTATION_MATRIX = Usage(0x0482, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_QUATERNION = Usage(0x0483, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_MAGNETIC_FLUX = Usage(0x0484, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_MAGNETIC_FLUX_X_AXIS = Usage(0x0485, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_MAGNETIC_FLUX_Y_AXIS = Usage(0x0486, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ORIENTATION_MAGNETIC_FLUX_Z_AXIS = Usage(0x0487, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # data type mechanical
    # data field usages (input report)
    DATA_MECHANICAL = Usage(0x0490, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MECHANICAL_BOOLEAN_SWITCH_STATE = Usage(0x0491, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MECHANICAL_BOOLEAN_SWITCH_ARRAY_STATES = Usage(0x0492, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MECHANICAL_MULTIVALUE_SWITCH_VALUE = Usage(0x0493, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MECHANICAL_FORCE = Usage(0x0494, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MECHANICAL_ABSOLUTE_PRESSURE = Usage(0x0495, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MECHANICAL_GAUGE_PRESSURE = Usage(0x0496, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MECHANICAL_STRAIN = Usage(0x0497, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MECHANICAL_WEIGHT = Usage(0x0498, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # property usages (get/set feature report)
    PROPERTY_MECHANICAL = Usage(0x04A0, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_MECHANICAL_VIBRATION_STATE = Usage(0x04A1, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MECHANICAL_VIBRATION_SPEED_FORWARD = Usage(0x04A2, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_MECHANICAL_VIBRATION_SPEED_BACKWARD = Usage(0x04A3, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # data type biometric
    # data field usages (input report)
    DATA_BIOMETRIC = Usage(0x04B0, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_BIOMETRIC_HUMAN_PRESENCE = Usage(0x04B1, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_BIOMETRIC_HUMAN_PROXIMITY_RANGE = Usage(0x04B2, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_BIOMETRIC_HUMAN_PROXIMITY_OUT_OF_RANGE = Usage(0x04B3, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_BIOMETRIC_HUMAN_TOUCH_STATE = Usage(0x04B4, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # data type light sensor
    # data field usages (input report)
    DATA_LIGHT = Usage(0x04D0, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LIGHT_ILLUMINANCE = Usage(0x04D1, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LIGHT_COLOR_TEMPERATURE = Usage(0x04D2, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LIGHT_CHROMATICITY = Usage(0x04D3, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LIGHT_CHROMATICITY_X = Usage(0x04D4, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LIGHT_CHROMATICITY_Y = Usage(0x04D5, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_LIGHT_CONSUMER_IR_SENTENCE_RECEIVE = Usage(0x04D6, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # property usages (get/set feature report)
    PROPERTY_LIGHT = Usage(0x04E0, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_LIGHT_CONSUMER_IR_SENTENCE_SEND = Usage(0x04E1, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # data type scanner
    # data field usages (input report)
    DATA_SCANNER = Usage(0x04F0, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_SCANNER_RFID_TAG = Usage(0x04F1, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_SCANNER_NFC_SENTENCE_RECEIVE = Usage(0x04F2, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # property usages (get/set feature report)
    PROPERTY_SCANNER = Usage(0x04F8, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_SCANNER_NFC_SENTENCE_SEND = Usage(0x04F9, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # data type electrical
    # data field usages (input report)
    DATA_ELECTRICAL = Usage(0x0500, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ELECTRICAL_CAPACITANCE = Usage(0x0501, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ELECTRICAL_CURRENT = Usage(0x0502, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ELECTRICAL_POWER = Usage(0x0503, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ELECTRICAL_INDUCTANCE = Usage(0x0504, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ELECTRICAL_RESISTANCE = Usage(0x0505, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ELECTRICAL_VOLTAGE = Usage(0x0506, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ELECTRICAL_FREQUENCY = Usage(0x0507, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ELECTRICAL_PERIOD = Usage(0x0508, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ELECTRICAL_PERCENT_OF_RANGE = Usage(0x0509, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # data type time
    # data field usages (input report)
    DATA_TIME = Usage(0x0520, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_TIME_YEAR = Usage(0x0521, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_TIME_MONTH = Usage(0x0522, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_TIME_DAY = Usage(0x0523, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_TIME_DAY_OF_WEEK = Usage(0x0524, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_TIME_HOUR = Usage(0x0525, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_TIME_MINUTE = Usage(0x0526, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_TIME_SECOND = Usage(0x0527, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_TIME_MILLISECOND = Usage(0x0528, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_TIME_TIMESTAMP = Usage(0x0529, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_TIME_JULIAN_DAY_OF_YEAR = Usage(0x052A, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # property usages (get/set feature report)
    PROPERTY_TIME = Usage(0x0530, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_TIME_TIME_ZONE_OFFSET_FROM_UTC = Usage(0x0531, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_TIME_TIME_ZONE_NAME = Usage(0x0532, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_TIME_DAYLIGHT_SAVINGS_TIME_OBSERVED = Usage(0x0533, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_TIME_TIME_TRIM_ADJUSTMENT = Usage(0x0534, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_TIME_ARM_ALARM = Usage(0x0535, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # data type custom
    # data field usages (input report)
    DATA_CUSTOM = Usage(0x0540, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_CUSTOM_USAGE = Usage(0x0541, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_CUSTOM_BOOLEAN_ARRAY = Usage(0x0542, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_CUSTOM_VALUE = Usage(0x0543, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_CUSTOM_VALUE_1 = Usage(0x0544, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_CUSTOM_VALUE_2 = Usage(0x0545, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_CUSTOM_VALUE_3 = Usage(0x0546, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_CUSTOM_VALUE_4 = Usage(0x0547, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_CUSTOM_VALUE_5 = Usage(0x0548, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_CUSTOM_VALUE_6 = Usage(0x0549, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # data type generic
    # data field usages (input report)
    DATA_GENERIC = Usage(0x0560, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_GUID_OR_PROPERTYKEY = Usage(0x0561, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_CATEGORY_GUID = Usage(0x0562, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_TYPE_GUID = Usage(0x0563, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_EVENT_PROPERTYKEY = Usage(0x0564, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_PROPERTY_PROPERTYKEY = Usage(0x0565, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_DATAFIELD_PROPERTYKEY = Usage(0x0566, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_EVENT = Usage(0x0567, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_PROPERTY = Usage(0x0568, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_DATAFIELD = Usage(0x0569, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ENUMERATOR_TABLE_ROW_INDEX = Usage(0x056A, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_ENUMERATOR_TABLE_ROW_COUNT = Usage(0x056B, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_GUID_OR_PROPERTYKEY_KIND = Usage(0x056C, UsageType.COLLECTION_NAMED_ARRAY)
    # begin GorPK kind selectors
    GORPK_KIND_CATEGORY = Usage(0x08D0, UsageType.DATA_SELECTOR)
    GORPK_KIND_TYPE = Usage(0x08D1, UsageType.DATA_SELECTOR)
    GORPK_KIND_EVENT = Usage(0x08D2, UsageType.DATA_SELECTOR)
    GORPK_KIND_PROPERTY = Usage(0x08D3, UsageType.DATA_SELECTOR)
    GORPK_KIND_DATAFIELD = Usage(0x08D4, UsageType.DATA_SELECTOR)
    # end GorPK kind selectors
    DATA_GENERIC_GUID = Usage(0x056D, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_PROPERTYKEY = Usage(0x056E, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_TOP_LEVEL_COLLECTION_ID = Usage(0x056F, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_REPORT_ID = Usage(0x0570, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_REPORT_ITEM_POSITION_INDEX = Usage(0x0571, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_FIRMWARE_VARTYPE = Usage(0x0572, UsageType.COLLECTION_NAMED_ARRAY)
    # begin firmware vartype selectors
    FIRMWARE_VARTYPE_VT_NULL = Usage(0x0900, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_BOOL = Usage(0x0901, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_UI1 = Usage(0x0902, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_I1 = Usage(0x0903, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_UI2 = Usage(0x0904, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_I2 = Usage(0x0905, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_UI4 = Usage(0x0906, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_I4 = Usage(0x0907, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_UI8 = Usage(0x0908, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_I8 = Usage(0x0909, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_R4 = Usage(0x090A, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_R8 = Usage(0x090B, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_WSTR = Usage(0x090C, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_STR = Usage(0x090D, UsageType.DATA_SELECTOR)

    FIRMWARE_VARTYPE_VT_CLSID = Usage(0x090E, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_VECTOR_VT_UI1 = Usage(0x090F, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16E0 = Usage(0x0910, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16E1 = Usage(0x0911, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16E2 = Usage(0x0912, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16E3 = Usage(0x0913, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16E4 = Usage(0x0914, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16E5 = Usage(0x0915, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16E6 = Usage(0x0916, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16E7 = Usage(0x0917, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16E8 = Usage(0x0918, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16E9 = Usage(0x0919, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16EA = Usage(0x091A, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16EB = Usage(0x091B, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16EC = Usage(0x091C, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16ED = Usage(0x091D, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16EE = Usage(0x091E, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F16EF = Usage(0x091F, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32E0 = Usage(0x0920, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32E1 = Usage(0x0921, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32E2 = Usage(0x0922, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32E3 = Usage(0x0923, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32E4 = Usage(0x0924, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32E5 = Usage(0x0925, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32E6 = Usage(0x0926, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32E7 = Usage(0x0927, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32E8 = Usage(0x0928, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32E9 = Usage(0x0929, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32EA = Usage(0x092A, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32EB = Usage(0x092B, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32EC = Usage(0x092C, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32ED = Usage(0x092D, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32EE = Usage(0x092E, UsageType.DATA_SELECTOR)
    FIRMWARE_VARTYPE_VT_F32EF = Usage(0x092F, UsageType.DATA_SELECTOR)
    # end firmware vartype selectors
    DATA_GENERIC_UNIT_OF_MEASURE = Usage(0x0573, UsageType.COLLECTION_NAMED_ARRAY)
    # begin unit of measure selectors
    GENERIC_UNIT_NOT_SPECIFIED = Usage(0x0940, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_LUX = Usage(0x0941, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_DEGREES_KELVIN = Usage(0x0942, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_DEGREES_CELSIUS = Usage(0x0943, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_PASCAL = Usage(0x0944, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_NEWTON = Usage(0x0945, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_METERS_PER_SECOND = Usage(0x0946, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_KILOGRAM = Usage(0x0947, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_METER = Usage(0x0948, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_METERS_PER_SEC_SQRD = Usage(0x0949, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_FARAD = Usage(0x094A, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_AMPERE = Usage(0x094B, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_WATT = Usage(0x094C, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_HENRY = Usage(0x094D, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_OHM = Usage(0x094E, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_VOLT = Usage(0x094F, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_HERTZ = Usage(0x0950, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_BAR = Usage(0x0951, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_DEGREES_ANTI_CLOCKWISE = Usage(0x0952, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_DEGREES_CLOCKWISE = Usage(0x0953, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_DEGREES = Usage(0x0954, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_DEGREES_PER_SECOND = Usage(0x0955, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_DEGREES_PER_SEC_SQRD = Usage(0x0956, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_KNOT = Usage(0x0957, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_PERCENT = Usage(0x0958, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_SECOND = Usage(0x0959, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_MILLISECOND = Usage(0x095A, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_G = Usage(0x095B, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_BYTES = Usage(0x095C, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_MILLIGAUSS = Usage(0x095D, UsageType.DATA_SELECTOR)
    GENERIC_UNIT_BITS = Usage(0x095E, UsageType.DATA_SELECTOR)
    # end unit of measure selectors
    DATA_GENERIC_UNIT_EXPONENT = Usage(0x0574, UsageType.COLLECTION_NAMED_ARRAY)
    # begin unit exponent selectors
    GENERIC_EXPONENT_0 = Usage(0x0970, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_1 = Usage(0x0971, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_2 = Usage(0x0972, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_3 = Usage(0x0973, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_4 = Usage(0x0974, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_5 = Usage(0x0975, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_6 = Usage(0x0976, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_7 = Usage(0x0977, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_8 = Usage(0x0978, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_9 = Usage(0x0979, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_A = Usage(0x097A, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_B = Usage(0x097B, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_C = Usage(0x097C, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_D = Usage(0x097D, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_E = Usage(0x097E, UsageType.DATA_SELECTOR)
    GENERIC_EXPONENT_F = Usage(0x097F, UsageType.DATA_SELECTOR)
    # end unit exponent selectors
    DATA_GENERIC_REPORT_SIZE = Usage(0x0575, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    DATA_GENERIC_REPORT_COUNT = Usage(0x0576, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    # property usages (get/set feature report)
    PROPERTY_GENERIC = Usage(0x0580, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_ENUMERATOR_TABLE_ROW_INDEX = Usage(0x0581, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
    PROPERTY_ENUMERATOR_TABLE_ROW_COUNT = Usage(0x0582, [UsageType.DATA_STATIC_VALUE, UsageType.DATA_DYNAMIC_VALUE])
