Tags: fishloa/lyngdorf
Tags
Expose has_bass_trim_feature()/has_treble_trim_feature() on LyngdorfM… …odel Separate from has_bass_trim_step_feature()/has_treble_trim_step_feature() (added last commit): TDAI-2170 has neither bass nor treble trim control at all, not merely un-steppable ones - change_trim_treble/trim_bass genuinely can't work for it (unlike TDAI-1120/3400, which have both but can't step either). Callers need to distinguish "no such control" from "can set but not step" before touching trim_bass/trim_treble.
v1.4.4 Both found and fixed by @Pharkie testing 1.4.3 against a real TDAI-1120: 1. Name truncation on ')' (#22): _process_event took the first ')' in a message as its parameter's closing paren. On TDAI's comma-packed name shape (!SRCNAME(0,"Digital 1 (Coax)")), that ')' belongs to the name, not the parameter - four of fourteen real sources came back clipped. Fixed with a quote-aware scan for the closing paren. 2. RoomPerfect position and voicing names never populated on TDAI-1120/3400 (#23): !RP?/!VOI? reply with a bare index and no name; the name-bearing replies are keyed under RPNAME/VOINAME instead, same shape as SRCNAME. room_perfect_position and voicing stayed None as a result. Fixed by mapping the two messages and adding dedicated callbacks, mirroring the SRCNAME fix in 1.4.3. No public API changes. Confirmed against a real MP-60 that source, room_perfect_position, voicing, and their available_* lists are unaffected.
v1.4.3 Fix TDAI-2170 sources/RP positions/voicings never populating (PR #19): Unlike every other model, TDAI-2170 has no count+enumeration burst for sources, RoomPerfect positions, or voicings (no SRCLIST/RPLIST/VOILIST). Each is a fixed, hardware-defined set of entries, and the device only reports a bitmask (SRCENABLED/RPSTATUS/VOIENABLED) of which are currently enabled/present - !SRC(n)/!RP(n)/!VOI(n) all reply with a bare index and no name either. Added ModelConfig.fixed_sources/fixed_voicings (parallel to the existing but previously-dead room_perfect_positions field), three new bitmask Msg mappings for TDAI-2170 only, a shared Receiver._populate_fixed_list bitmask parser, and three thin "resolve an index against the fixed table" callbacks. No public API changes. Confirmed against a real MP-60 that source/ room_perfect_position/voicing and their available_* lists are unaffected. Spec-derived from docs/tdai-2170.md; not yet verified against real TDAI-2170 hardware.
v1.4.2 Fix TDAI-1120/3400 source names never populating (PR #18): !SRC? on these models replies with a bare index only (!SRC(n)) - the name-bearing replies are keyed under a separate SRCNAME message, and pack index and name comma-separated inside one set of parens (!SRCNAME(a,"Name")) rather than trailing the parens like MP's !SRC(a)"Name". Added Msg.SOURCE_NAME and a dedicated parser for this shape; MP/P take the unchanged code path (confirmed against a real MP-60). No public API changes. TDAI-2170 remains a known gap: its source list is driven by a SRCENABLED bitmask over a fixed hardware input table, not a count+enumeration burst like every other model - needs separate work.
v1.4.1 Fix TDAI state handling (PR #17, @Pharkie): - CRLF message framing: the TDAI family terminates replies with CR LF, but the protocol parser split on CR alone, leaving a stray LF at the head of the next message. That failed the leading-"!" check and the message was dropped in silence - so only the first reply of any burst ever got parsed. This affected every TDAI model. - Power state: the TDAI family reports power as `!PWR(ON)` / `!PWR(OFF)` (words), not the MP/P families' `!POWER(1)` / `!POWER(0)` (digits). Power always read as off on a TDAI regardless of actual state. - Mute state: the TDAI family reports mute as a parameter on MUTE (`!MUTE(ON)` / `!MUTE(OFF)`), not as distinct MUTEON/MUTEOFF messages. Mute state never updated on a TDAI. Verified against a real TDAI-1120. MP-60 regression coverage (existing and new) confirmed unaffected.
v1.4.0 - Fix async_connect() crash on Zone B / video / surround callback registration for models missing those features (issue #16) - Correct TDAI-3400 protocol (dropped fabricated I-prefixed commands) - Correct TDAI-2170 protocol (distinct, more limited command set) - Fix setup command burst pacing (real MP-60 was dropping replies) - Add P100/P200/P300 support - Add lyngdorf.diagnostics: safe read-only device capability probe - Add LyngdorfModel.supports_message()/.capabilities