Skip to content

rf-primer: time-distribution chapter + chain animation; land the bf-constellation GIF#250

Merged
josephnef merged 3 commits into
masterfrom
primer-timesync-bf-constellation
Jul 11, 2026
Merged

rf-primer: time-distribution chapter + chain animation; land the bf-constellation GIF#250
josephnef merged 3 commits into
masterfrom
primer-timesync-bf-constellation

Conversation

@josephnef

Copy link
Copy Markdown
Collaborator

Docs + animations, two threads:

rf-primer §10 — "One clock for many radios"

A zero-background walk through the time-sync machinery, in the primer's picture-book voice:

  • why crystals disagree (ppm → milliseconds within minutes) and what breaks
  • the core reframe: sync is a timestamping problem — software notes wobble by hundreds of µs; the whole game is hardware taking the notes at the wire/antenna
  • the chain, link by link: PTP over Ethernet (PHY timestamps, the PHC as "GPS over the LAN") → the Wi-Fi TSF servoed to the wire (~290 ns, its own 1 µs floor) → hardware beacons (stamped at the antenna, latched at arrival, both in silicon → ~0.3 µs station lock from listening alone) → the TBTT pin (why the schedule needs its own actuator, and why it must not jump the clock it serves — ~1 µs held)
  • the honest end-to-end budget and links into time-distribution.md for every number

New animation (tools/timesync_chain_gif.pydocs/img/timesync_chain.gif, house monitor style): a four-act loop over three clock lanes — free-running drift, PTP pulses pulling the AP comb onto the wire grid, beacons dragging the station in (with a ghosted software-stamp scatter as the counter-example), and the pin snapping the beacon flags onto the disciplined grid while all three counters converge. A red→amber→green residual sparkline runs underneath. Chosen from a brainstorm of four concepts; the runners-up (software-vs-hardware histogram, the "pin slides the flag vs cuts the tape" close-up) are folded in as act-3's ghost scatter and act-4's pin moment.

The strayed beamforming constellation lands

tools/bf_constellation_gif.pydocs/img/bf_constellation.gif finds its natural home in docs/beamforming-self-sounding.md, immediately after the SU report-decode section it visualizes: per-subcarrier h_B/h_A on the complex plane (unit circle = TX antennas balanced, arc = the channel's frequency signature, per-tone sweep readout), with a caption tying it to the decode math and noting what a multipath channel would do to the arc.

Doc-only + tools; ctest 17/17.

🤖 Generated with Claude Code

josephnef and others added 3 commits July 11, 2026 10:48
…lation GIF

docs/rf-primer.md gains section 10, "One clock for many radios" — a
zero-background explanation of the time-sync machinery: why crystals
disagree (ppm), why sync is a timestamping problem (software notes
wobble by hundreds of us; the game is hardware taking the notes), and
the devourer chain link by link — PTP over Ethernet (PHY timestamps,
the PHC), the Wi-Fi TSF servoed to the wire (~290 ns), hardware beacons
stamped at the antenna and latched at arrival (~0.3 us station lock),
and the TBTT pin (~1 us held schedule, clock trace unbroken). With the
honest end-to-end budget and links into time-distribution.md.

New animation in the house monitor style (tools/timesync_chain_gif.py
-> docs/img/timesync_chain.gif): a four-act loop over three clock lanes
(grandmaster / AP / station) — free-running drift, PTP sync pulses
pulling the AP comb onto the wire grid, beacons dragging the station in
(with a ghosted software-stamp scatter for contrast), and the TBTT pin
snapping the beacon flags onto the disciplined grid while all three
counters converge; a red->amber->green residual sparkline runs
underneath.

Also lands the strayed beamforming constellation animation
(tools/bf_constellation_gif.py -> docs/img/bf_constellation.gif) in its
natural home: docs/beamforming-self-sounding.md, right after the SU
report decode it visualizes — per-subcarrier h_B/h_A on the complex
plane (unit circle = antennas balanced, arc = the channel signature,
sweeping per-tone readout), with a caption tying it to the decode math.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Rework the animation so the AP and STATION lanes open up to the silicon
path that makes the radio hop work: the AP's TSF COUNTER (the register
the wire servo disciplines) feeding the TBTT COMPARE block
(TSF % interval == off -> fire), the RSVD PAGE beacon whose TS field is
visibly written at egress as the frame passes to the antenna, and on
the station side the tsfl LATCH freezing the local TSF at arrival,
feeding the (beacon TS, tsfl) pairs into the fit. Act 4 now shows the
pin as what it is in hardware: the comparator's offset walking to zero
while the TSF counter runs unbroken. Canvas 920x700.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@josephnef

Copy link
Copy Markdown
Collaborator Author

Reworked the animation per feedback: the AP and STATION lanes now open up to the Wi-Fi MAC internals on the radio hop — TSF COUNTER → TBTT COMPARE (TSF % interval == off → fire) → RSVD PAGE beacon with the TS field visibly written at egress → antenna, and station-side the tsfl LATCH freezing the local clock at arrival, feeding the (beacon TS, tsfl) pairs into the fit. Act 4 shows the pin as the hardware sees it: the comparator offset walking to zero while the TSF counter runs unbroken (all three lane counters end up reading the same second). Canvas grew to 920×700; primer caption updated.

@josephnef josephnef merged commit 143d36c into master Jul 11, 2026
15 checks passed
@josephnef josephnef deleted the primer-timesync-bf-constellation branch July 11, 2026 08:02
josephnef added a commit that referenced this pull request Jul 11, 2026
…er, roaming robot UEs (+ animation) (#251)

Conceptual map of what the time-distribution primitives (#242#250)
build at facility scale — three applications, LTE analogies explicit,
every per-link claim linked to its bench numbers.

## `docs/multi-ap-cellular.md`

1. **ICIC over the existing Ethernet backhaul.** The classic Wi-Fi
obstacle — cells that can't agree on *when* — is gone: the shared clock
makes a slot boundary a real network-wide instant with µs-grade guards.
Coordination rides the same wire as PTP; centralized and peer (X2-style)
scheduler shapes; orthogonality in time, frequency (~ms retune), or a
reuse pattern — a policy, not a driver feature.

2. **Make-before-break handover.** The ~100 ms roam decomposed and
dissolved: no time re-acquisition (the network clock is valid across
cells), no discovery scan (passive neighbor beacons + ms retune in idle
slots), **network-side decision** (every AP hardware-timestamps and
RSSI-tags every uplink it hears — LTE measurement reports without client
cooperation), handover = a schedule-ownership update between two slots.
Honest residue named: security-context motion + the ms retune, both
inside a slot guard.

3. **Robots as roaming UEs.** Camp / scheduled DL+UL slots / per-AP TA
loop tracking motion / handover as above — ending on the point that
matters for robotics: **determinism becomes a schedule property, not a
contention statistic.**

A boundary paragraph keeps the doc honest as it ages: per-link
primitives are bench-proven with numbers in the linked docs; the
multi-cell layer is ordinary distributed software on the wired side —
nothing blocked on the radio.

## The animation

`tools/warehouse_cellular_gif.py` → `docs/img/warehouse_cellular.gif`
(house monitor style): a floor plan with two overlapping cells and a
driving robot, stacked over the network-wide slot ruler. Three acts:
uncoordinated collisions in the overlap → the scheduler splitting the
grid orthogonally over the backhaul → the robot crossing cells with RSSI
crossover, `>> HO: robot → B` on the bus, and its DL/UL slots recoloring
between one slot and the next — against the ghost bar *"ordinary Wi-Fi
roam: ~100 ms dead"* vs **"handover gap here: 0 slots"**.

Cross-linked from `time-distribution.md` and the rf-primer's
where-to-next. Doc + tools only; `ctest` 17/17.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
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.

1 participant