Skip to content

Tags: fishloa/lyngdorf

Tags

v1.4.9

Toggle v1.4.9's commit message
Bump to 1.4.9

v1.4.8

Toggle v1.4.8's commit message
Document the tag-triggered release process in CLAUDE.md

v1.4.7

Toggle v1.4.7's commit message
Bump to 1.4.7

v1.4.6

Toggle v1.4.6's commit message
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.5

Toggle v1.4.5's commit message
Bump to 1.4.5

v1.4.4

Toggle v1.4.4's commit message
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

Toggle v1.4.3's commit message
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

Toggle v1.4.2's commit message
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

Toggle v1.4.1's commit message
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

Toggle v1.4.0's commit message
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