Iridium wave 2: native ring-alert/broadcast decode core#29
Conversation
New xng-mode-iridium crate, wired into the runtime, console, asf-2.0 protocol (IridiumBody, field 16), and the scanner plan (simplex ring-alert + messaging channels). Layer 2 ported from BSD-2 iridium-toolkit (attributed): access codes, symbol-pair deinterleavers (2-way/3-way), BCH(31,21) blocks with even parity and 1-2 bit repair (polys 1207/1897), FILL removal, frame classification, and the full IRA ring-alert field layout (satellite, beam, ECEF position -> lat/lon/alt, paging TMSIs). PHY facts from gr-iridium/iridium-sniffer (GPL, facts only; iridium-sniffer's ARCHITECTURE.md documents the whole pipeline incl. the IDA/SBD->ACARS chain for the wideband follow-up). The demodulator is original: 250 kHz channel (10 sps), power-boxcar burst gate, tone-DFT coarse CFO, the coherent UW fit (joint timing/phase/CFO over the 12 known UW symbols - the same technique that fixed VDL2/HFDL acquisition), DQPSK with dqpsk_map=[0,2,3,1] and a decision-directed phase trim. One war story: the DD residual must round against the signed constellation index or a symbol at -pi slews the PLL by -2pi. Validation: a generated ring-alert frame decodes BIT-IDENTICALLY in iridium-toolkit's bitsparser.py (run as an offline oracle) and in this crate; the vector is vendored in tests. RF loopback covers the full chain with CFO and noise. Interop note recorded: gr-iridium RAW lines are symbol-bit-swapped (RWA: is the normalized form). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Caution Review failedPull request was closed or merged during review 📝 WalkthroughWalkthroughThis PR adds native Iridium satellite signal decoding to xng, comprising a new ChangesIridium Signal Decoding and Integration
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4e18f88b0a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if ndivide(RINGALERT_BCH_POLY, &b1[..31]) == 0 | ||
| && ndivide(RINGALERT_BCH_POLY, &b2[..31]) == 0 | ||
| && ndivide(RINGALERT_BCH_POLY, &b3[..31]) == 0 |
There was a problem hiding this comment.
Allow BCH repair before classifying ring alerts
For ring-alert bursts with any correctable bit flip in the first three BCH blocks, this exact zero-syndrome check returns Unknown, so decode_bits never reaches ecc_blocks where bch_repair is supposed to fix up to two bit errors. In real RF captures those BCH corrections are expected, so otherwise recoverable IRA frames are dropped instead of decoded; classify should tolerate/repair the candidate blocks on clones before deciding they are not RA.
Useful? React with 👍 / 👎.
Wave 2 begins. New
xng-mode-iridiumcrate decoding Iridium ring-alert (IRA) and broadcast frames on the fixed simplex channels — satellite id, beam, live ECEF→lat/lon/alt positions, and paging TMSIs — wired end-to-end: runtime, console (IRIDIUM ring-alert sat=75 beam=21 pos=48.14,169.44 pages=2), asf-2.0 protocol (newIridiumBody), and the scanner plan.Sources (per the repo's sourcing policy)
dqpsk_map=[0,2,3,1], burst limits. iridium-sniffer's ARCHITECTURE.md (thanks for the pointer — it's the best single pipeline reference) also documents the IDA/SBD→ACARS chain for the wideband follow-up.Validation — oracle-grade
A generated ring-alert frame decodes bit-identically in iridium-toolkit's
bitsparser.py(run offline as the reference oracle) and in this crate:IRA: sat:075 beam:21 xyz=(-1411,+0263,+1602) pos=(+48.14/+169.44) alt=2248 RAI:33 ?01 bc_sb:22 P02: PAGE(tmsi:cafed00d…) {OK}— every field agrees. The vector is vendored in tests, alongside an RF loopback through the full chain (CFO + noise). Interop note: gr-iridiumRAW:lines carry each symbol's bits swapped;RWA:is the normalized form.Scope and next
v1 targets the fixed simplex channels (ring alert 1626.270833 MHz — bursts every few seconds worldwide, decodable with one DDC channel). The wave-2 follow-ups documented in docs/notes/IRIDIUM.md: wideband burst hunting across the full band (gr-iridium-style channelizer), IDA/SBD→ACARS, and an off-air L-band capture validation.
🤖 Generated with Claude Code
Summary by CodeRabbit
Release Notes
New Features
Documentation