TALKER_ALIAS_TEXT_FORMAT now accepts a comma-separated list (e.g. "utf8,iso8").
encode_talker_alias_emblc emits the TA blocks in each requested encoding back to
back, and rewrite_embed_lc cycles through them, so radios of different vendors
each pick up the format they support in turn.
Rationale: in field testing, Motorola only displayed format 2 (UTF-8) and Hytera
only format 1 (ISO-8859-1) -- mutually exclusive in a single TA. Sending both
("utf8,iso8") makes the alias show on both at once. Confirmed on real Motorola
and Hytera radios.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds encode_iso8 (format 1 / ISO-8859-1) and encode_7bit (format 0) alongside
the existing UTF-8 (format 2) encoder, selectable via a new GLOBAL/per-system
TALKER_ALIAS_TEXT_FORMAT key (default 'utf8', so existing behaviour is
unchanged). ISO-8 is rendered by radios that do not display UTF-8 Talker Alias
(notably many Hytera models, which show UTF-8 TA blank/garbled while Motorola
shows it fine); 7-bit is the exact inverse of decode_ta()'s 7-bit path for the
oldest radios. Round-trip validated (encode_ta_buffer -> decode_ta) for all
three formats, including ISO-8859-1 accents.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* talker_alias.py: replace dmr_utils3.bptc.encode_emblc with a spec-correct
in-module _encode_emblc. The library version has a transcription bug in burst
D (uses _binlc[24] twice instead of _binlc[25]) that flips one bit of byte 2
of every embedded LC. Harmless for the group voice LC (that bit lands in
Service Options) but for Talker Alias byte 2 is the header (format/length) of
block 0 and the first text char of blocks 1-3, so it corrupts the alias and
consumes the embedded-LC error-correction budget. Validated bit-for-bit
against the known-good real DMR bursts shipped in dmr_utils3.decode.
* talker_alias.py: add load_ta_profiles() and expose {city}/{state}/{country}
to TALKER_ALIAS_FORMAT.
* bridge_master.py: build _TA_PROFILES from the full subscriber file (callsign +
fname/surname/city/...) with callsign-only fallback, so inject-mode templates
like "{callsign} {fname} {city}" work (previously only {callsign} was
populated, leaving {fname} empty).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>