AprilNEA / AprilNEA/OpenLogi

[Device]: keyboard k380 inverted fn_lock behaviour

Open
#1,377 0 comments 0 reactions 0 assignees View on GitHub
area: hidpp needs: triage
Dominant language
Rust
Stars
21k
Forks
675
Avg merge
2d 5h
Merged PRs (30d)
172

Description

### Pre-flight checklist

- [x] I quit **Logi Options+** before testing.
- [x] I searched existing issues for my device.

### Device model

k380

### Connection

Bluetooth (direct, no receiver)

### What's the problem?

Device is detected but a feature doesn't work

### `openlogi list` output

```text
(no agent reachable — reading hardware directly; macOS judges this process's Input Monitoring grant, not the agent's)
2026-09-13T03:54:10.207607Z DEBUG openlogi_hid::transport: logitech HID node name= pid=b035 usage_page=0x0001 usage_id=0x0002 matched=false
2026-09-13T03:54:10.208059Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:10.208228Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0xff00 usage_id=0x0002 matched=true
2026-09-13T03:54:10.208359Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0xff00 usage_id=0x0001 matched=false
2026-09-13T03:54:10.208506Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x0001 usage_id=0x0006 matched=false
2026-09-13T03:54:10.208643Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0xff00 usage_id=0x0002 matched=true
2026-09-13T03:54:10.208773Z DEBUG openlogi_hid::transport: logitech HID node name= pid=b035 usage_page=0xff43 usage_id=0x0202 matched=true
2026-09-13T03:54:10.208906Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x000d usage_id=0x0005 matched=false
2026-09-13T03:54:10.209030Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0002 matched=false
2026-09-13T03:54:10.209158Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:10.209276Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0080 matched=false
2026-09-13T03:54:10.209385Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0013 matched=false
2026-09-13T03:54:10.209504Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:10.209610Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:10.209723Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0006 matched=false
2026-09-13T03:54:10.209893Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x0001 usage_id=0x0080 matched=false
2026-09-13T03:54:10.210011Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0xff00 usage_id=0x0001 matched=false
2026-09-13T03:54:10.210237Z DEBUG openlogi_device::inventory: HID++ candidate interfaces count=3
2026-09-13T03:54:10.331722Z DEBUG openlogi_hid::transport::windows: paired Windows HID++ short collection name=USB Receiver pid=c548
2026-09-13T03:54:10.332025Z DEBUG openlogi_hid::transport::windows: opened Windows HID++ composite channel name=USB Receiver pid=c548 supports_short=true supports_long=true
2026-09-13T03:54:10.453590Z DEBUG openlogi_hid::transport::windows: paired Windows HID++ short collection name=Multi-Device Keyboard K380 pid=b342
2026-09-13T03:54:10.453762Z DEBUG openlogi_hid::transport::windows: opened Windows HID++ composite channel name=Multi-Device Keyboard K380 pid=b342 supports_short=true supports_long=true
2026-09-13T03:54:10.573664Z DEBUG openlogi_hid::transport::windows: opened Windows HID++ composite channel name= pid=b035 supports_short=false supports_long=true
2026-09-13T03:54:10.580736Z DEBUG openlogi_device::inventory::probe: receiver reports pairing count pairing_count=Some(1)
2026-09-13T03:54:11.778629Z DEBUG openlogi_device::inventory::probe: BT-direct / wired device recognised os_name= name=MX Master 3S For Business
2026-09-13T03:54:12.099120Z DEBUG openlogi_device::inventory::probe: drained device-arrival events events=1
2026-09-13T03:54:12.101752Z DEBUG openlogi_device::inventory::probe: slot empty or unreadable slot=1 error=Protocol(RegisterAccess(UnknownDevice))
2026-09-13T03:54:12.110752Z DEBUG openlogi_device::inventory::probe: paired slot slot=2 online=false wpid=Some(45109) bolt_kind=Mouse has_event=true codename=Some("MX Master 3S ")
2026-09-13T03:54:12.112724Z DEBUG openlogi_device::inventory::probe: slot empty or unreadable slot=3 error=Protocol(RegisterAccess(UnknownDevice))
2026-09-13T03:54:12.115773Z DEBUG openlogi_device::inventory::probe: slot empty or unreadable slot=4 error=Protocol(RegisterAccess(UnknownDevice))
2026-09-13T03:54:12.118731Z DEBUG openlogi_device::inventory::probe: slot empty or unreadable slot=5 error=Protocol(RegisterAccess(UnknownDevice))
2026-09-13T03:54:12.121721Z DEBUG openlogi_device::inventory::probe: slot empty or unreadable slot=6 error=Protocol(RegisterAccess(UnknownDevice))
2026-09-13T03:54:12.575049Z DEBUG openlogi_device::inventory::probe: BT-direct / wired device recognised os_name=Multi-Device Keyboard K380 name=Bluetooth Multi-Device Keyboard K380
Logi Bolt Receiver (96D60DE087670547, vid=046d pid=c548)
└─ slot 2 ○ MX Master 3S (mouse, wpid=b035, battery=—)

Multi-Device Keyboard K380 (—, vid=046d pid=b342)
└─ slot 255 ● Bluetooth Multi-Device Keyboard K380 (keyboard, wpid=?, battery=90% full (discharging))
model_ids=[b342,0000,0000] ext=00 serial=— unit_id=e4000000 transports=bt

(—, vid=046d pid=b035)
└─ slot 255 ● MX Master 3S For Business (mouse, wpid=?, battery=100% full (discharging))
model_ids=[b035,0000,0000] ext=00 serial=2443ZB503308 unit_id=83bba759 transports=btle
```

### `openlogi diag features` output

```text
openlogi diag features
2026-09-13T03:54:38.314570Z DEBUG openlogi_hid::transport: logitech HID node name= pid=b035 usage_page=0x0001 usage_id=0x0002 matched=false
2026-09-13T03:54:38.314808Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:38.314990Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0xff00 usage_id=0x0002 matched=true
2026-09-13T03:54:38.315135Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0xff00 usage_id=0x0001 matched=false
2026-09-13T03:54:38.315293Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x0001 usage_id=0x0006 matched=false
2026-09-13T03:54:38.315435Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0xff00 usage_id=0x0002 matched=true
2026-09-13T03:54:38.315566Z DEBUG openlogi_hid::transport: logitech HID node name= pid=b035 usage_page=0xff43 usage_id=0x0202 matched=true
2026-09-13T03:54:38.315692Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x000d usage_id=0x0005 matched=false
2026-09-13T03:54:38.315829Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0002 matched=false
2026-09-13T03:54:38.315952Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:38.316065Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0080 matched=false
2026-09-13T03:54:38.316185Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0013 matched=false
2026-09-13T03:54:38.316307Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:38.316424Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:38.316541Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0006 matched=false
2026-09-13T03:54:38.316652Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x0001 usage_id=0x0080 matched=false
2026-09-13T03:54:38.316762Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0xff00 usage_id=0x0001 matched=false
2026-09-13T03:54:38.317030Z DEBUG openlogi_device::inventory: HID++ candidate interfaces count=3
2026-09-13T03:54:38.438585Z DEBUG openlogi_hid::transport::windows: paired Windows HID++ short collection name=USB Receiver pid=c548
2026-09-13T03:54:38.438758Z DEBUG openlogi_hid::transport::windows: opened Windows HID++ composite channel name=USB Receiver pid=c548 supports_short=true supports_long=true
2026-09-13T03:54:38.566530Z DEBUG openlogi_hid::transport::windows: paired Windows HID++ short collection name=Multi-Device Keyboard K380 pid=b342
2026-09-13T03:54:38.566697Z DEBUG openlogi_hid::transport::windows: opened Windows HID++ composite channel name=Multi-Device Keyboard K380 pid=b342 supports_short=true supports_long=true
2026-09-13T03:54:38.690378Z DEBUG openlogi_hid::transport::windows: opened Windows HID++ composite channel name= pid=b035 supports_short=false supports_long=true
2026-09-13T03:54:38.697007Z DEBUG openlogi_device::inventory::probe: receiver reports pairing count pairing_count=Some(1)
2026-09-13T03:54:40.111792Z DEBUG openlogi_device::inventory::probe: BT-direct / wired device recognised os_name= name=MX Master 3S For Business
2026-09-13T03:54:40.217380Z DEBUG openlogi_device::inventory::probe: drained device-arrival events events=1
2026-09-13T03:54:40.220760Z DEBUG openlogi_device::inventory::probe: slot empty or unreadable slot=1 error=Protocol(RegisterAccess(UnknownDevice))
2026-09-13T03:54:40.229863Z DEBUG openlogi_device::inventory::probe: paired slot slot=2 online=false wpid=Some(45109) bolt_kind=Mouse has_event=true codename=Some("MX Master 3S ")
2026-09-13T03:54:40.231734Z DEBUG openlogi_device::inventory::probe: slot empty or unreadable slot=3 error=Protocol(RegisterAccess(UnknownDevice))
2026-09-13T03:54:40.234737Z DEBUG openlogi_device::inventory::probe: slot empty or unreadable slot=4 error=Protocol(RegisterAccess(UnknownDevice))
2026-09-13T03:54:40.237740Z DEBUG openlogi_device::inventory::probe: slot empty or unreadable slot=5 error=Protocol(RegisterAccess(UnknownDevice))
2026-09-13T03:54:40.240719Z DEBUG openlogi_device::inventory::probe: slot empty or unreadable slot=6 error=Protocol(RegisterAccess(UnknownDevice))
2026-09-13T03:54:40.576944Z DEBUG openlogi_device::inventory::probe: BT-direct / wired device recognised os_name=Multi-Device Keyboard K380 name=Bluetooth Multi-Device Keyboard K380
device: Bluetooth Multi-Device Keyboard K380 (direct 046d:b342)
2026-09-13T03:54:40.698496Z DEBUG openlogi_hid::transport: logitech HID node name= pid=b035 usage_page=0x0001 usage_id=0x0002 matched=false
2026-09-13T03:54:40.698652Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:40.698800Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0xff00 usage_id=0x0002 matched=true
2026-09-13T03:54:40.698930Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0xff00 usage_id=0x0001 matched=false
2026-09-13T03:54:40.699060Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x0001 usage_id=0x0006 matched=false
2026-09-13T03:54:40.699189Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0xff00 usage_id=0x0002 matched=true
2026-09-13T03:54:40.699805Z DEBUG openlogi_hid::transport: logitech HID node name= pid=b035 usage_page=0xff43 usage_id=0x0202 matched=true
2026-09-13T03:54:40.700009Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x000d usage_id=0x0005 matched=false
2026-09-13T03:54:40.700247Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0002 matched=false
2026-09-13T03:54:40.700377Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:40.700501Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0080 matched=false
2026-09-13T03:54:40.700628Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0013 matched=false
2026-09-13T03:54:40.700759Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:40.700893Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:40.701016Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0006 matched=false
2026-09-13T03:54:40.701138Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x0001 usage_id=0x0080 matched=false
2026-09-13T03:54:40.701261Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0xff00 usage_id=0x0001 matched=false
2026-09-13T03:54:40.823551Z DEBUG openlogi_hid::transport::windows: paired Windows HID++ short collection name=Multi-Device Keyboard K380 pid=b342
2026-09-13T03:54:40.823694Z DEBUG openlogi_hid::transport::windows: opened Windows HID++ composite channel name=Multi-Device Keyboard K380 pid=b342 supports_short=true supports_long=true
idx id ver flags
0 0x0000 v1
1 0x0001 v1
2 0x0003 v1
3 0x0005 v0
4 0x0007 v0
5 0x0020 v0
6 0x1000 v0
7 0x1814 v1
8 0x1815 v0
9 0x1b04 v0
10 0x1e00 v0 hidden
11 0x40a2 v0
12 0x4220 v0
13 0x4521 v0
14 0x4531 v0
(15 feature entries)

2026-09-13T03:54:42.639457Z DEBUG openlogi_hid::transport: logitech HID node name= pid=b035 usage_page=0x0001 usage_id=0x0002 matched=false
2026-09-13T03:54:42.639632Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:42.639796Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0xff00 usage_id=0x0002 matched=true
2026-09-13T03:54:42.639933Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0xff00 usage_id=0x0001 matched=false
2026-09-13T03:54:42.640071Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x0001 usage_id=0x0006 matched=false
2026-09-13T03:54:42.640718Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0xff00 usage_id=0x0002 matched=true
2026-09-13T03:54:42.640871Z DEBUG openlogi_hid::transport: logitech HID node name= pid=b035 usage_page=0xff43 usage_id=0x0202 matched=true
2026-09-13T03:54:42.641011Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x000d usage_id=0x0005 matched=false
2026-09-13T03:54:42.641177Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0002 matched=false
2026-09-13T03:54:42.641299Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:42.641424Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0080 matched=false
2026-09-13T03:54:42.641546Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0013 matched=false
2026-09-13T03:54:42.641813Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:42.641951Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:42.642210Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0006 matched=false
2026-09-13T03:54:42.642328Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x0001 usage_id=0x0080 matched=false
2026-09-13T03:54:42.642446Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0xff00 usage_id=0x0001 matched=false
2026-09-13T03:54:42.761578Z DEBUG openlogi_hid::transport::windows: paired Windows HID++ short collection name=Multi-Device Keyboard K380 pid=b342
2026-09-13T03:54:42.761777Z DEBUG openlogi_hid::transport::windows: opened Windows HID++ composite channel name=Multi-Device Keyboard K380 pid=b342 supports_short=true supports_long=true
fw 0: MainApplication RBK42.01_B0017 pid=b342 extra=c18dbfdd00
fw 1: Hardware HW 00.01_B0000 pid=0000

device: MX Master 3S For Business (direct 046d:b035)
2026-09-13T03:54:43.535818Z DEBUG openlogi_hid::transport: logitech HID node name= pid=b035 usage_page=0x0001 usage_id=0x0002 matched=false
2026-09-13T03:54:43.535960Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:43.536085Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0xff00 usage_id=0x0002 matched=true
2026-09-13T03:54:43.536210Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0xff00 usage_id=0x0001 matched=false
2026-09-13T03:54:43.536333Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x0001 usage_id=0x0006 matched=false
2026-09-13T03:54:43.536497Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0xff00 usage_id=0x0002 matched=true
2026-09-13T03:54:43.536632Z DEBUG openlogi_hid::transport: logitech HID node name= pid=b035 usage_page=0xff43 usage_id=0x0202 matched=true
2026-09-13T03:54:43.536768Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x000d usage_id=0x0005 matched=false
2026-09-13T03:54:43.536885Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0002 matched=false
2026-09-13T03:54:43.537005Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:43.537116Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0080 matched=false
2026-09-13T03:54:43.537293Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0013 matched=false
2026-09-13T03:54:43.537409Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:43.537521Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:43.537629Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0006 matched=false
2026-09-13T03:54:43.537747Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x0001 usage_id=0x0080 matched=false
2026-09-13T03:54:43.537859Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0xff00 usage_id=0x0001 matched=false
2026-09-13T03:54:43.658652Z DEBUG openlogi_hid::transport::windows: opened Windows HID++ composite channel name= pid=b035 supports_short=false supports_long=true
idx id ver flags
0 0x0000 v2
1 0x0001 v2
2 0x0003 v4
3 0x0005 v0
4 0x1d4b v0
5 0x0020 v0
6 0x0021 v1
7 0x0007 v0
8 0x1004 v3
9 0x1b04 v5
10 0x1814 v1
11 0x1815 v2
12 0x2250 v1
13 0x2201 v2
14 0x2110 v0
15 0x2121 v1
16 0x2150 v0
17 0x2251 v0
18 0x00c3 v0
19 0x1802 v0 hidden,engineering,manufacturing-deactivatable
20 0x1803 v0 hidden,engineering,manufacturing-deactivatable
21 0x1806 v8 hidden,engineering,manufacturing-deactivatable
22 0x1816 v0 hidden,engineering,manufacturing-deactivatable
23 0x1805 v0 hidden,engineering
24 0x1830 v0 hidden,engineering,manufacturing-deactivatable
25 0x1891 v7 hidden,engineering,compliance-deactivatable
26 0x18a1 v0 hidden,engineering,manufacturing-deactivatable
27 0x1e00 v0 hidden
28 0x1e02 v0 hidden,engineering
29 0x1602 v0
30 0x1eb0 v0 hidden,engineering,manufacturing-deactivatable
31 0x1861 v1 hidden,engineering,manufacturing-deactivatable
32 0x9300 v0 hidden,engineering,manufacturing-deactivatable
33 0x9001 v0 hidden,engineering,manufacturing-deactivatable
34 0x1e22 v0 hidden,engineering,manufacturing-deactivatable
35 0x9205 v0 hidden,engineering,manufacturing-deactivatable
(36 feature entries)

2026-09-13T03:54:44.562463Z DEBUG openlogi_hid::transport: logitech HID node name= pid=b035 usage_page=0x0001 usage_id=0x0002 matched=false
2026-09-13T03:54:44.562621Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:44.562741Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0xff00 usage_id=0x0002 matched=true
2026-09-13T03:54:44.562867Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0xff00 usage_id=0x0001 matched=false
2026-09-13T03:54:44.562988Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x0001 usage_id=0x0006 matched=false
2026-09-13T03:54:44.563251Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0xff00 usage_id=0x0002 matched=true
2026-09-13T03:54:44.563453Z DEBUG openlogi_hid::transport: logitech HID node name= pid=b035 usage_page=0xff43 usage_id=0x0202 matched=true
2026-09-13T03:54:44.563620Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x000d usage_id=0x0005 matched=false
2026-09-13T03:54:44.563779Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0002 matched=false
2026-09-13T03:54:44.563912Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:44.564041Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0080 matched=false
2026-09-13T03:54:44.564166Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0013 matched=false
2026-09-13T03:54:44.564286Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:44.564401Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x000c usage_id=0x0001 matched=false
2026-09-13T03:54:44.564535Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0x0001 usage_id=0x0006 matched=false
2026-09-13T03:54:44.564656Z DEBUG openlogi_hid::transport: logitech HID node name=Multi-Device Keyboard K380 pid=b342 usage_page=0x0001 usage_id=0x0080 matched=false
2026-09-13T03:54:44.564770Z DEBUG openlogi_hid::transport: logitech HID node name=USB Receiver pid=c548 usage_page=0xff00 usage_id=0x0001 matched=false
2026-09-13T03:54:44.687612Z DEBUG openlogi_hid::transport::windows: opened Windows HID++ composite channel name= pid=b035 supports_short=false supports_long=true
fw 0: Bootloader BL169.01_B0006 pid=b035 extra=a534b5f600
fw 1: MainApplication RBM22.01_B0006 pid=b035 [active] extra=a534b5f600
fw 2: Softdevice 00.00_B0126 pid=0000
```

### Details

## `fn_lock` sets the opposite state on Logitech K380 (pid `0xb342`)

### Summary

For the Logitech K380 (Multi-Device Keyboard K380, USB PID `046d:b342`, connected directly over Bluetooth Classic, no receiver), setting `fn_lock = true` in `config.toml` actually turns Fn-lock **off** (media/shortcut row becomes primary), and `fn_lock = false` turns it **on** (F1–F12 become primary). The write itself succeeds (`openlogi_agent_core::hardware`/`openlogi_device::write::fn_lock` both log a successful write, no protocol error), so this isn't a connectivity or feature-discovery problem — it's the meaning of the state bit that's inverted for this model.

### Environment

- OpenLogi v0.8.3 (release build)
- Windows, Bluetooth Classic direct connection (no Bolt/Unifying receiver)
- Device: `Multi-Device Keyboard K380`, vid `046d`, pid `b342`
- `diag features` output for this device includes `0x40a2 v0` (`FnInversionWithDefaultState`) but **not** `0x40a3` — so the single-host fallback path in `openlogi-device/src/write/fn_lock.rs` is the one being used.

### Steps to reproduce

1. Pair a K380 directly over Bluetooth (not through a receiver).
2. Add to `config.toml`:
```toml
[devices."unit:"]
fn_lock = true
```
3. Restart the OpenLogi app + agent, or reconnect the keyboard.
4. Press an F-key (e.g. F5) without holding Fn.

**Expected:** F5 sends a plain F5 keystroke.
**Actual:** F5 triggers its printed shortcut function (e.g. task switching), i.e. Fn-lock is off — the opposite of what was configured.

Setting `fn_lock = false` instead produces the opposite (also inverted) result: F-keys become primary.

### Root cause (verified against real hardware)

`FnInversionState::from(bool)` in `crates/openlogi-hidpp/src/feature/fn_inversion.rs`:

```rust
impl From for FnInversionState {
fn from(value: bool) -> Self {
if value { Self::On } else { Self::Off }
}
}
```

and the doc comment on `crates/openlogi-device/src/write/fn_lock.rs`:

> "Fn-lock on" means the F-row sends plain F1–F12 without holding Fn (`FnInversionState::On`)

This mapping (`On = 1` → F1–F12 primary) does **not** hold for the K380. I confirmed this directly against the hardware with a standalone HID++ short-message client (bypassing OpenLogi entirely, same feature index/function/params `openlogi-device` sends):

- Sending `SetGlobalFnInversion(state=0x00)` on feature `0x40a2` → F1–F12 become primary (Fn-lock **on**).
- Sending `SetGlobalFnInversion(state=0x01)` → media/shortcut row becomes primary again (Fn-lock **off**).

So for this model, `0x40a2`'s state byte is inverted relative to what `FnInversionState::On = 1` assumes.

(Side note, possibly relevant: this device never answered a HID++ request with a report on the same Windows HID collection when queried from a minimal standalone client — every `GET`/read attempt timed out, while `SET` (fire-and-forget) worked. That's a quirk of this specific Bluetooth-direct connection.)

### Suggested fix

Given this is model-specific firmware behavior rather than a general protocol bug, I'd avoid changing `FnInversionState`'s general meaning (that would just move the inversion to other models where `On = 1` is correct — e.g. presumably whichever board established that convention in the first place). Instead:

1. Add a small quirk lookup keyed by product/model ID (`pid = 0xb342` at least; possibly the whole K380 family if others share the behavior — I don't have other units to test) that flips the boolean passed into `FnInversionState::from(...)` in `set_fn_lock_on_channel` (`crates/openlogi-device/src/write/fn_lock.rs`).
2. `DeviceRoute` (`crates/openlogi-device/src/channel/route.rs`) already carries `product_id` in at least one of its variants, so the pid should be available at the point `set_fn_lock_on_channel`/`set_fn_lock` is called without needing to plumb new data through.
3. Happy to help narrow down whether this affects the K380 family broadly vs. just this specific firmware revision (mine reports `MainApplication RBK42.01_B0017`), but I only have this one unit to test against.

I can open a PR for the quirk-table approach if that direction sounds right to a maintainer — wanted to check before doing so, since I don't have a second device to confirm the fix doesn't regress other K380 units on different firmware.

### Additional (separate, possibly unrelated) observation

While investigating this I also noticed the same physical K380 sometimes shows up as **two** device cards in the GUI — one online (`unit:e4000000`, connection "direct") and one offline "ghost" (`unit:64000000`, connection "unknown", no top-level config block, no `links`). Not sure yet whether it's related to the above or a separate identity/dedup issue — happy to file it separately with a repro if useful, since I don't want to conflate two things in one issue.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reproducing the K380 behavior over direct Bluetooth and inspect the output from `openlogi diag features`. Trace the device feature handling for `fn_lock`; done means the reported and applied fn-lock state matches the keyboard's actual behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
embedded-iot
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
58/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.