Site: the devlog, the blog's roro9stack posts in the site's style; Devlog replaces Blog in the navigation
Site / build (pull_request) Successful in 9s

Seven posts imported into site/content/devlog/ with their text unchanged,
links between them pointing to /devlog/, and shortcodes (sign, cast, steps,
asides, folded sections, diagrams, captions) restyled in the site's palette.
The 17 inline SVG diagrams carried <style> blocks and style attributes the
site's Content-Security-Policy refuses: their rules moved to
devlog-diagrams.css, and a diagram's minimum width is a class. An Atom feed
at /devlog/atom.xml.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
This commit is contained in:
2026-10-06 20:51:33 +02:00
co-authored by Claude Sonnet 5.5
parent 2729f2e218
commit 6e54658ba4
61 changed files with 2832 additions and 4 deletions
@@ -0,0 +1,68 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 760 300" role="img" aria-label="Who touches the radio. The main loop runs the keys, the App and the Status Bar; it only posts requests to the radio task: listen, preset, sweep, probe. The radio task owns the SX1262 on the Cap and is the only code that talks to it, over SPI under the same bus lock the SD card uses. The radio's DIO1 interrupt only wakes the radio task. Received packets go into a ring of 32, under a lock, which the main loop reads to draw them and to append them to a Capture. The Cap's I/O expander at I2C address 0x43 is touched only by the main loop, which owns the I2C bus with the keyboard: its pin P0 connects the antenna, and without it the receiver is deaf at -112 dBm. The storage task writes the Capture to the SD card, on the same SPI bus as the radio.">
<defs>
<marker id="rx-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="currentColor"/></marker>
<marker id="rx-arrow-hot" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path class="f-accent" d="M0,0 L10,5 L0,10 z"/></marker>
</defs>
<g font-family="JetBrains Mono, ui-monospace, monospace" fill="currentColor">
<rect class="rx-panel" x="16" y="20" width="200" height="100" rx="8"/>
<text x="28" y="44" font-size="12" font-weight="600">Main loop</text>
<text x="28" y="64" font-size="10" class="rx-dim">keys, the App,</text>
<text x="28" y="78" font-size="10" class="rx-dim">the Status Bar;</text>
<text x="28" y="92" font-size="10" class="rx-dim">Capture: ring to pcap</text>
<text x="28" y="106" font-size="10" class="rx-dim">never touches the radio</text>
<rect class="rx-hot" x="290" y="20" width="230" height="100" rx="8"/>
<text x="302" y="44" font-size="12" font-weight="600">Radio task</text>
<text x="302" y="64" font-size="10" class="rx-dim">the only code that talks</text>
<text x="302" y="78" font-size="10" class="rx-dim">to the SX1262; packets to a</text>
<text x="302" y="92" font-size="10" class="rx-dim">ring of 32, noise every 0.5 s</text>
<text class="f-red" x="302" y="106" font-size="10">no transmit function</text>
<rect class="rx-box" x="590" y="20" width="154" height="100" rx="8"/>
<text x="602" y="44" font-size="12" font-weight="600">SX1262</text>
<text x="602" y="64" font-size="10" class="rx-dim">on the Cap,</text>
<text x="602" y="78" font-size="10" class="rx-dim">869.525 MHz,</text>
<text x="602" y="92" font-size="10" class="rx-dim">TCXO 1.8 V</text>
<!-- main loop <-> radio task -->
<path class="rx-line" d="M216,52 L286,52" marker-end="url(#rx-arrow)"/>
<text x="222" y="46" font-size="9" class="rx-dim">requests</text>
<path class="rx-line" d="M288,92 L218,92" marker-end="url(#rx-arrow)"/>
<text x="226" y="106" font-size="9" class="rx-dim">packets</text>
<!-- radio task <-> SX1262 -->
<path class="rx-line-hot" d="M520,52 L586,52" marker-start="url(#rx-arrow-hot)" marker-end="url(#rx-arrow-hot)"/>
<text class="f-accent" x="536" y="46" font-size="9">SPI</text>
<path class="rx-line" d="M588,96 L524,96" marker-end="url(#rx-arrow)"/>
<text x="530" y="110" font-size="9" class="rx-dim">DIO1:</text>
<text x="530" y="121" font-size="9" class="rx-dim">wake up</text>
<!-- the expander, I2C, main loop only -->
<rect class="rx-box" x="16" y="190" width="200" height="90" rx="8"/>
<text x="28" y="212" font-size="11" font-weight="600">Cap I/O expander</text>
<text x="28" y="230" font-size="10" class="rx-dim">PI4IOE5V6408 at 0x43</text>
<text class="f-green" x="28" y="246" font-size="10">P0 high: antenna on</text>
<text class="f-red" x="28" y="262" font-size="10">P0 low: deaf, -112 dBm</text>
<path class="rx-line" d="M116,122 L116,186" marker-end="url(#rx-arrow)"/>
<text x="124" y="152" font-size="9" class="rx-dim">I2C, shared with</text>
<text x="124" y="164" font-size="9" class="rx-dim">the keyboard</text>
<!-- storage task and the card -->
<rect class="rx-box" x="290" y="190" width="230" height="90" rx="8"/>
<text x="302" y="212" font-size="11" font-weight="600">Storage task</text>
<text x="302" y="230" font-size="10" class="rx-dim">every card access,</text>
<text x="302" y="246" font-size="10" class="rx-dim">Captures as pcap</text>
<path class="rx-line" d="M200,122 L300,186" marker-end="url(#rx-arrow)"/>
<text x="232" y="174" font-size="9" class="rx-dim">records</text>
<rect class="rx-box" x="590" y="190" width="154" height="90" rx="8"/>
<text x="602" y="212" font-size="11" font-weight="600">SD card</text>
<path class="rx-line" d="M520,236 L586,236" marker-start="url(#rx-arrow)" marker-end="url(#rx-arrow)"/>
<text x="536" y="230" font-size="9" class="rx-dim">SPI</text>
<!-- one bus, one lock -->
<path class="rx-bus" d="M578,56 L578,232"/>
<text class="f-yellow" x="584" y="156" font-size="10">one SPI bus,</text>
<text class="f-yellow" x="584" y="170" font-size="10">one lock</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB