Skip to content

Add Yaesu FTM-510DR support via microSD (#151) - #152

Merged
ww8l merged 2 commits into
mainfrom
issue-151-yaesu-ftm510dr
Nov 3, 2026
Merged

ww8l merged 2 commits into
mainfrom
issue-151-yaesu-ftm510dr

Conversation

@ww8l

@ww8l ww8l commented Nov 3, 2026

Copy link
Copy Markdown
Owner

Closes #151.

Programs the Yaesu FTM-510DR from its microSD card: the app patches the radio's own ALL backup, FTM510D/BACKUP/CLNFTM510D.dat, and the radio loads it back with Setup Menu 107 BACKUP → READ FROM SD → ALL. Memories and settings both, no cable, no third-party software.

What's in it

  • Container + memory encoder (radios/yaesu_ftm510/sd_image.rs). The file turned out to be the FTM-300's layout under its own magic (AH089$), so it reuses the FTM-300's record encoder behind the 510's own container: RX 108–550 MHz, 8.33 kHz airband points refused until measured on this radio. The only change to FTM-300 code is two helpers made pub(crate).
  • 284 settings fields in 29 sections (settings.rs + generated table and ftm510_settings_schema.json): Setup Menu items, band skip, DTMF memories, mic and function keys, and the APRS setup down to digi paths, message and status texts, ringer calls, units and SmartBeaconing. Two field kinds the FTM-300 never needed: S-DX is spread over three bits in three bytes, and a few settings are written to both bands' bytes.
  • Wiring: driver, registry, seed row, README row, card finder, settings-read command, api.ts, CARD_SETTINGS_READERS, MEDIA_WRITES.

How it was measured

Yaesu's own programmer, ADMS-18, opens and saves the card file, so the settings campaign ran unattended in a Windows VM: 14 bit-signature passes, one-field isolation saves, and token / radio-button / grid passes. Option labels are ADMS-18's own text.

Verification

  • Encoder gate: all 20 records the radio itself wrote re-encode byte for byte.
  • Settings self-check: decoding the 14 ADMS-18 pass files with the generated table agrees with what ADMS-18 displayed, 2001 / 2001. Every value of every field round-trips without touching another byte; the factory-fresh radio decodes to the manual's printed defaults.
  • App pipeline: a 62-channel codeplug through the real export path against the dev database — 61 written (the D-STAR one excluded by name), nothing outside the memory tables moved.
  • Hardware ladder, on Tim's radio — all five pass: identity load; one renamed memory (no checksum is checked on load; the FTM-300 name-length rule holds); a 61-memory codeplug; an 11-edge band probe across 108–550 MHz; settings (LCD, beep, Sub Band Mute ON = raw 3 — CHIRP's FTM-300 reading is inverted — and S-DX AUTO, shown as AUTO-A).
  • Tested by Tim in the dev app. npm run ci green locally.

Withheld, with reasons in the generator

Manual lat/lon (one sample, odd encoding), the reply callsign (wildcard padding rule unclear), WIRES-X preset frequencies (no frequency field type in the form), My Symbol 4's character (12 of 14 samples), and the FACTORY RESET function-key option. CLOCK TYPE, PR FREQUENCY and TRACK SELECT are not in ADMS-18 at all.

🤖 Generated with Claude Code

ww8l and others added 2 commits November 3, 2026 08:51
The FTM-510's ALL backup (FTM510D/BACKUP/CLNFTM510D.dat, magic AH089$)
turned out to be the FTM-300's layout, so the memory encoder reuses the
FTM-300's record encoder behind the 510's own container: RX 108-550 MHz,
8.33 kHz airband points refused until measured on this radio. Gate: all
20 records the radio wrote re-encode byte for byte.

284 settings fields, generated with the form schema from one spec off an
ADMS-18 measurement campaign (bit-signature passes, one-field isolation,
token, radio-button and grid passes). Decoding the 14 ADMS pass files with
the table agrees with what ADMS displayed, 2001/2001. Five fields are
withheld (lat/lon, reply callsign, WIRES-X presets, My Symbol 4 character,
FACTORY RESET function key).

Not yet verified on the radio: checksum, name-length rule, Sub Band Mute,
S-DX — the hardware ladder is next.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
All five steps passed on Tim's radio, loaded with 107 BACKUP -> READ FROM SD
from files placed beside the radio's own as CLNFTM510D01-05: identity, one
renamed memory (no checksum checked on load; the FTM-300 name-length rule
holds), a 61-memory codeplug from the app's pipeline, an 11-edge band probe
across 108-550 MHz, and four settings including Sub Band Mute ON = 3 and
S-DX AUTO across its three scattered bits.

ladder.rs is the throwaway harness that built the files, #[ignore]d and
env-gated like the gate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ww8l
ww8l merged commit 94979e4 into main Nov 3, 2026
5 of 6 checks passed
@ww8l
ww8l deleted the issue-151-yaesu-ftm510dr branch November 3, 2026 23:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add support for the Yaesu FTM-510dr

1 participant