Commit graph

14 commits

Author SHA1 Message Date
Marcus Kida
e145a1188d Channels: on-radio add/delete from the Channel quick menu
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>
2026-07-10 11:11:48 +02:00
Marcus Kida
dd1cc0ccdf Release 0.3.0: fix Screen Dim label voice-prompt crash
The menu label 'Screen Dim' is a raw literal, and the shared menu code voices
labels through voicePromptsAppendLanguageString(), which derives the prompt
index from the pointer's offset within the language table and crashed on a
foreign pointer (v0.2.0 fixed only the value, not the label). That helper now
ignores pointers outside the language table.

Bump version to 0.3.0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 16:29:21 +02:00
Marcus Kida
1c59622a77 Release 0.2.0: fix Display Options crash with voice prompts on
Screen Dim passed a plain literal ('100%'/'50%'/...) to
voicePromptsAppendLanguageString(), which derives the prompt index from the
string's offset within the language table; a foreign pointer produced a garbage
index and crashed (only with voice on). Route the value through
voicePromptsAppendString() instead. Also move the 3-bit dim level's high bit off
legacy option bit 2 to bit 29 and clamp the level against the option arrays.

Bump version to 0.2.0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 15:41:59 +02:00
Marcus Kida
734b861917 7-segment frequency: inactive segments off, fix MHz colour, +1px RX/TX gap
- 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>
2026-07-07 15:30:23 +02:00
Marcus Kida
7f5f3ab06f Screen dimming: add a 15% idle-dim level
Add SCREEN_DIM_15 (Off / 100 / 50 / 30 / 15). The value now needs 3 bits, so
repurpose the spare BIT_UNUSED_2 as BIT_SCREEN_DIM_2; existing codeplugs (bit 2
clear) keep their level, no reset.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 08:16:04 +02:00
Marcus Kida
facf5f6a6d Add FreeTRX version and show it in Firmware Info (v0.1.0)
- New freetrxVersion.h with semver (MAJOR/MINOR/PATCH + string), currently 0.1.0.
- Firmware Info top line now shows "FreeTRX v0.1.0"; the git commit ID line is
  unchanged. The version is also announced via voice prompt.
- CHANGELOG: promote the accumulated changes to a 0.1.0 section.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 18:34:10 +02:00
Marcus Kida
f67bb2fade Mute: toggle audio mute with SK2 short-tap, with LED + header indicator
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>
2026-07-06 15:41:29 +02:00
Marcus Kida
fe9b8d4e10 add menu icons 2026-07-06 14:41:43 +02:00
Marcus Kida
13ecc08267 Layout: increase content top padding to clear the S-meter labels
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>
2026-07-06 14:10:37 +02:00
Marcus Kida
70089d370f Frequency display: 7-segment "LED" font with dimmed inactive segments
Render the VFO/Channel frequency (and the SK1-held frequency view, which share
uiUtilityDisplayFrequency) as 7-segment "LED" digits instead of the normal font,
on colour displays.

- HX8353E_display.c: displayDrawFrequencySevenSeg() draws each digit's 7 segments
  as filled rectangles; lit segments use the theme frequency colour, inactive
  segments a dimmed (~3/8 intensity, same hue) version, giving the classic LED
  look with faintly-visible "off" segments. The decimal point takes half a cell.
- Digits are 12 px wide (wider than the 8 px font) to fill the space toward the
  "MHz" label; height follows the existing single/double-height frequency layout.
- Monochrome displays keep the normal font.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 13:34:35 +02:00
Marcus Kida
43c59a7c67 Screen dimming: dim backlight to a fraction of brightness when idle
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>
2026-07-06 12:56:33 +02:00
Marcus Kida
89c0b8fa60 Layout: add 4px padding below the S-meter before the top info strip
Shift the contact/TG, CTCSS/DCS and squelch info lines down by a tunable
DISPLAY_MAIN_CONTENT_TOP_PAD (4px) on MD-UV380/DM1701, so they no longer sit
flush against the new S-meter label row. Frequency and everything below are
unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 12:56:33 +02:00
Marcus Kida
0867742901 Fix DMR hang: call AMBE codec via C function pointers, not inline asm
The radio hard-froze (needs battery pull) the instant it processed an incoming
DMR frame — repeater reply, or noise on a DMR channel. FM and DMR TX-without-a-
listening-repeater were fine. Cause: codec_interface.c invoked the AMBE codec
through hand-written inline assembler with no operands and no clobber list,
branching (BL) to an absolute address. That code's correctness depends entirely
on a specific compiler's register allocation; modern GNU toolchains (both ARM
GCC 10 and 14) miscompile it, corrupting state on the first codec call.

Port the official R20260504 (git ebd7100) rework: replace all five inline-asm
calls (2x decode, 2x encode, 1x ECC) with C function-pointer calls. Each call
reproduces the exact register/stack layout the assembler set up (AAPCS: args
1-4 -> r0-r3, args 5+ -> stack) and sets the Thumb bit on the target address.
Also drop the trailing semicolons from the AMBE_* address macros in codec.h so
they can be used in C expressions.

Builds cleanly with the GCC 14.2 Docker toolchain (no STM32CubeIDE needed) and
DMR RX/TX now works on the radio.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 11:14:06 +02:00
Marcus Kida
01467e5913 Initial Commit 2026-07-06 08:45:33 +02:00