NZSmartie / PyHIDParser

A HID descriptor parser written in Python 3
MIT License
23 stars 5 forks source link

Add support for Named Arrays #10

Open NZSmartie opened 8 years ago

NZSmartie commented 8 years ago

I didn't put enough thought into how to handle selector usages inside of a named array collection.

For example, this is pulled from HID Usage Table Review Request 39b

// ...
HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE, // NAry
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,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS_WAKE,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS_WAKE,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_THRESHOLD_EVENTS_WAKE,
    HID_FEATURE(Data_Arr_Abs),
HID_END_COLLECTION,
// ...

Which effectively translates to a enum that maps from the values 0 to 5. Something like:

class ReportingState(Enum):
  NO_EVENTS = 0
  ALL_EVENTS = 1
  THRESHOLD_EVENTS = 2
  NO_EVENTS_WAKE = 3
  ALL_EVENTS_WAKE = 4
  THRESHOLD_EVENTS_WAKE = 5
}

An idea is to generate a Enum subclass at runtime that maps from the logical min/max range to the usage names.

NZSmartie commented 8 years ago

The logical collection that is associated with the Named Array usage, should be accessed like a Report object.

Example:

state = ReportingState.ALL_EVENTS
descriptor.reports[0].features.sensor.property_reporting_state.value = state