Field testing revealed cross-contamination between function calls on the same sub-device feature. A late-arriving MessageEvent for GetRGBZoneInfo (function 1) was being accepted as the response to a subsequent GetHostModeState (function 7) on the same feature (0x0620), because _is_bridge_response_for only matched on sub_feat_idx. Evidence from tester log: HeadsetRGBHostMode.write: before=b'\x08\x01\x02\x03\x04\x05\x06\x07\x08...' The "before" read of GetHostModeState returned what is clearly a GetRGBZoneInfo response (count=8, zones=[1..8]) queued from earlier. The device echoes our exact sub-device function byte (function<<4 | sw_id) in the response. Plumb that expected value from centurion_bridge_request through _is_bridge_response_for and reject any response whose sub_func_sw doesn't match. Also validate orig_func_sw for error responses. Also removes the zone_id==0 filter in HeadsetRGBColor._zone_ids — with proper response matching the device should now consistently report real zone IDs (G522 has 8 zones at IDs 1-8 per the delayed response capture), and filtering is no longer needed. |
||
|---|---|---|
| .. | ||
| hid_parser | ||
| hidapi | ||
| keysyms | ||
| logitech_receiver | ||
| solaar | ||