A ~1s background watcher on DeviceRepo samples a cheap FIDO HID presence
fingerprint (vid:pid:serial, by enumeration only — it never opens the
device, so it can't contend with an in-flight read or write) and triggers
a refresh whenever the key is plugged, unplugged or swapped. Every screen
then reflects the current device without the manual Refresh button. The
watcher skips a tick while a refresh/write is in flight and stops cleanly
when the repo is dropped.
Several Configuration-screen fields were blank, wrong, or silently
overwrote a working device on save when talking to RS-Key firmware:
- CONFIG_READ over CTAPHID 0x41 answers with a CBOR `{1: blob}` map, but
the client fed the raw CBOR bytes downstream. The PHY read only worked
by accident for records under 24 bytes and broke once a product name
pushed it over; the LED read never worked. Decode the map and return
the inner record.
- Parse the LED status block at the correct stride ((len-1)/4) in one
shared helper, fixing the CCID path that read a 17-byte block as a
legacy 9-byte one (colour shown as the effect id).
- Read hardware LED (GPIO/brightness/driver) and touch-timeout as
optionals: an absent phy tag now means "firmware default" (blank
field) and is not written back, so a virgin phy is no longer clobbered
with GPIO=0 / driver=Pico / brightness=0 on the next Apply. A value is
written only when the user sets one.
- Hide the "Supported Curves" card for RS-Key: its firmware ignores the
phy ENABLED_CURVES tag (curve support is compile-time), so the toggles
were a no-op that also wrote a meaningless tag on save.
- Preserve each status' LED effect/speed on a colour write (read-modify-
write), reject over-long product names, read the enabled USB apps over
the 0xC2 vendor command, and fall back to the USB product string when
the phy record carries no product override.
macOS holds FIDO-usage-page (0xF1D0) HID devices exclusively, so hidapi's
default open fails with 0xE00002C5 ("exclusive access and device already
open") and the entire FIDO transport is unreachable. GetInfo, the VID/PID
seed and hardware-config-over-FIDO then silently fall back to rescue-only,
leaving the Configuration screen blank on an otherwise healthy key.
Enable hidapi's `macos-shared-device` feature so opens go through
hid_darwin_set_open_exclusive(0). No-op on Linux/Windows; hidapi 2.6
explicitly allows several concurrent HidApi contexts.