Replace the 'Power Off' / 73 message on colour displays with a shut-off
animation that collapses the current screen towards the middle (vertical
squeeze to a line, then horizontal collapse to a centre dot) like an old CRT.
Snapshots the live framebuffer into the (idle) notification offscreen buffer
so no extra RAM is needed; runs blocking with vTaskDelay between frames.
Mono displays keep the existing message. Docs updated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- New SMS recipient picker: GREEN in the compose recipient field opens a list
of private-call DMR contacts; selecting one fills the destination (using the
contact's plain DMR ID) and moves to the message text. Manual ID entry still
works (DOWN advances to the text field).
- Menu -> Contacts now defaults to a combined 'Contacts' view of all contact
types instead of the group-only filter; HASH still cycles the per-type
filters. Per-type code paths are unchanged.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Full messaging support, implemented fresh in three layers:
- dmrDataProtocol: pure short-data codec (CSBK preamble, data/response
headers, IP/UDP/TMS payload, ETSI CRCs) validated against on-air
captures by a host-side test suite. Transmits Motorola TMS (UDP 4007),
receives TMS and Anytone/"DMR standard" (UDP 5016).
- smsCore/smsStorage: TX queue with wait-for-channel and delivery
confirmation (response PDU / ACK, resend prompt on timeout), ISR-side
block assembly with layout auto-detection (confirmed/unconfirmed,
rate-1/2 and full 18-byte rate-3/4 blocks), delivery reports to
senders that request them, and a checksummed message store in SPI
flash at 0xC00000 (inbox + sent, 8 each; 8 quick texts).
- UI: Messages hub (main menu or long-press GREEN), keypad compose with
multi-tap (160 chars), inbox/sent/view with reply-resend-delete,
quick-text picker/editor, options (Wait for ACK, My ID only), and an
incoming-message popup with chime. Strings in all 20 languages.
The HR-C6000 does the BPTC/FEC; the driver streams 12-byte logical
bursts through the existing TX state machine (repeater wake included),
locks out PTT during a send, and leaves hotspot mode untouched.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Remove the 16x16 main-menu icon bitmaps, menuIconForMenuNumber(),
menuSetNextEntryIconByMenuNum() and the icon drawing + text offset in
menuDisplayEntry(). Top-level menu entries render as plain text as before.
Docs updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add delete_channel and keep_one_channel to the language table (after mute) and
fill all 20 language files (13 translated, English fallback for the rest), with
correct single-byte ISO-8859 accents. Wire them into the Delete Channel label,
confirmation and last-channel guard. The new strings land on empty voice-table
slots, so they play as silence (no crash, no .vpr regeneration).
flash.sh now always rebuilds the .gla language packs so edits to the language
files are actually picked up (previously a stale pack was re-flashed).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add two codeplug primitives - codeplugAllChannelsIndexSetUnused() (frees a
channel slot: clears the in-use bitmap bit, persists the header, fixes counts)
and codeplugZoneRemoveChannelFromZoneAndSave() (removes a channel from a zone's
list) - and wire two new Channel quick-menu items:
- 'new channel': allocates the first free slot, writes a blank 145.500 FM
channel, adds it to the current zone, reloads the zone and opens Channel
Details to edit it.
- 'Delete Channel': confirmation, then scrubs the channel from every real zone
before freeing the slot. Guards against deleting the last channel and honours
the read-only/APRS lock.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Inactive segments now render in the background colour (off) instead of dimmed.
- The 7-seg renderer left the foreground on the last segment drawn (now the
background colour), which hid MHz; re-apply the frequency theme colour before
drawing MHz so it reappears and matches the digits.
- Move the TX frequency line down 1px for a little more RX/TX separation.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a one-tap audio mute on the VFO and Channel screens:
- SK2 short-tap toggles mute via the built-in audioAmpMute()/audioAmpIsMuted().
The tap is only consumed by the existing "set TX TG to incoming" behaviour
while a DMR QSO is on screen, so mute works everywhere else.
- Header: a bold "M" is shown just left of the battery while muted (the
firmware's built-in strike-through over the mode text also still shows).
- LED: flashes red for 0.5s every 2s while muted (main loop), overriding the
normal RX/TX LED.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bump DISPLAY_MAIN_CONTENT_TOP_PAD 4 -> 8 so the DMR RX talkgroup/talker (and the
FM contact / CTCSS / squelch info sharing that strip) no longer crowds the S-meter
label row. Contact moves from y=28 to y=32, leaving a clear gap below the labels.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add an optional "Screen Dim" setting (Display Options) that, in Auto backlight
mode, dims the screen to a fraction of the configured brightness after the
backlight timeout instead of going to the off level. Any activity restores full
brightness.
- Setting values: Off / 100% / 50% / 30%, stored in two spare option bits
(no settingsStruct change, no version bump; existing codeplugs default to Off).
- display.c: displayGetIdleBacklightPercentage() computes the idle level.
- applicationMain.c: the idle-timeout tick dims to that level; an incoming
signal (hasSignal) re-triggers full brightness so RX keeps the screen lit.
TX already forces full brightness.
- menuDisplayOptions.c: new entry with a hardcoded English label (no language
files touched).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>