Compare commits

..
3 Commits
Author SHA1 Message Date
swaits 81130108b7 feat: add ELECROW ThinkNode-M2 board support
ESP32-S3 Meshtastic handset with SH1106 OLED. Flashes via the
CP2102 bridge, so this board is download-only like heltec_v3_uart —
Web Serial is unreliable through the bridge. The existing
`download-only` branch of EspFlashFlow surfaces the CP2102 warning
plus a .bin download and espflash CLI instructions, so no new
component code is needed.

ESP32-S3 grid in BoardSelector goes from sm:grid-cols-3 to
sm:grid-cols-2 lg:grid-cols-4 to accommodate the fourth ESP board.
Homepage Supported Boards grid drops from lg:grid-cols-5 to
lg:grid-cols-3 (3x2 layout) — six 200-px cards in one row was tight.
2026-04-11 22:51:45 -06:00
swaitsandClaude Opus 4.6 9889f05df6 style: sort board families alphabetically (ESP, nRF, RP)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 16:50:02 -06:00
swaitsandClaude Opus 4.6 033c4595cd feat: add Waveshare RP2040-LoRa board support
New RP2040 board family in board selector, homepage grid, and UF2
download flow (RPI-RP2 drive name, correct probe-rs chip).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 16:41:11 -06:00
5 changed files with 55 additions and 5 deletions

No files matched your search

+20 -2
View File
@@ -10,6 +10,7 @@
let { selected, onselect }: Props = $props(); let { selected, onselect }: Props = $props();
const espBoards = boards.filter((b) => b.family === "esp32s3"); const espBoards = boards.filter((b) => b.family === "esp32s3");
const rpBoards = boards.filter((b) => b.family === "rp2040");
const nrfBoards = boards.filter((b) => b.family === "nrf52840"); const nrfBoards = boards.filter((b) => b.family === "nrf52840");
function badgeText(board: BoardDef): string { function badgeText(board: BoardDef): string {
@@ -39,7 +40,7 @@
<h3 class="font-mono text-sm text-text-muted mb-3 uppercase tracking-wider">Select Board</h3> <h3 class="font-mono text-sm text-text-muted mb-3 uppercase tracking-wider">Select Board</h3>
<p class="text-xs text-text-dim mb-2 font-mono">ESP32-S3</p> <p class="text-xs text-text-dim mb-2 font-mono">ESP32-S3</p>
<div class="grid grid-cols-1 sm:grid-cols-3 gap-3 mb-4"> <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3 mb-4">
{#each espBoards as board} {#each espBoards as board}
<button <button
class="text-left bg-bg-card border p-4 rounded transition-all cursor-pointer class="text-left bg-bg-card border p-4 rounded transition-all cursor-pointer
@@ -56,7 +57,7 @@
</div> </div>
<p class="text-xs text-text-dim mb-2 font-mono">nRF52840</p> <p class="text-xs text-text-dim mb-2 font-mono">nRF52840</p>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-3"> <div class="grid grid-cols-1 sm:grid-cols-2 gap-3 mb-4">
{#each nrfBoards as board} {#each nrfBoards as board}
<button <button
class="text-left bg-bg-card border p-4 rounded transition-all cursor-pointer class="text-left bg-bg-card border p-4 rounded transition-all cursor-pointer
@@ -71,4 +72,21 @@
</button> </button>
{/each} {/each}
</div> </div>
<p class="text-xs text-text-dim mb-2 font-mono">RP2040</p>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-3">
{#each rpBoards as board}
<button
class="text-left bg-bg-card border p-4 rounded transition-all cursor-pointer
{selected?.id === board.id
? 'border-accent shadow-[0_0_12px_oklch(from_var(--color-accent)_l_c_h_/_0.15)]'
: 'border-border hover:border-border-bright'}"
onclick={() => onselect(board)}
>
<div class="font-mono font-medium text-text text-sm">{board.name}</div>
<div class="text-xs text-text-muted mt-1">{board.mcu} &middot; {board.radio}</div>
<div class="text-xs {badgeColor(board)} mt-2 font-mono">{badgeText(board)}</div>
</button>
{/each}
</div>
</div> </div>
+3 -1
View File
@@ -19,6 +19,8 @@
? "RAK4631" ? "RAK4631"
: board.id === "wio_tracker_l1" : board.id === "wio_tracker_l1"
? "WIO-L1" ? "WIO-L1"
: board.id === "waveshare_rp2040_lora"
? "RPI-RP2"
: "UF2BOOT", : "UF2BOOT",
); );
@@ -99,7 +101,7 @@
If you have a debug probe (J-Link, DAPLink), you can flash the .elf directly: If you have a debug probe (J-Link, DAPLink), you can flash the .elf directly:
</p> </p>
<pre class="font-mono text-xs text-accent bg-bg-elevated p-3 rounded overflow-x-auto">cargo install probe-rs-tools <pre class="font-mono text-xs text-accent bg-bg-elevated p-3 rounded overflow-x-auto">cargo install probe-rs-tools
probe-rs run --chip nRF52840_xxAA donglora-{board.id}-v{release.version}.elf</pre> probe-rs run --chip {board.family === "rp2040" ? "rp2040" : "nRF52840_xxAA"} donglora-{board.id}-v{release.version}.elf</pre>
</div> </div>
</div> </div>
</div> </div>
+20
View File
@@ -1,6 +1,17 @@
import type { BoardDef } from "./types"; import type { BoardDef } from "./types";
export const boards: BoardDef[] = [ export const boards: BoardDef[] = [
{
id: "elecrow_thinknode_m2",
name: "ELECROW ThinkNode-M2",
mcu: "ESP32-S3",
radio: "SX1262",
family: "esp32s3",
flashMethod: "download-only",
assetPattern: "donglora-elecrow_thinknode_m2-v{version}.bin",
notes:
"Elecrow Meshtastic handset with SH1106 OLED. Uses CP2102 USB-to-UART bridge — download the .bin and flash with espflash CLI.",
},
{ {
id: "heltec_v3", id: "heltec_v3",
name: "Heltec V3", name: "Heltec V3",
@@ -49,6 +60,15 @@ export const boards: BoardDef[] = [
flashMethod: "uf2", flashMethod: "uf2",
assetPattern: "donglora-wio_tracker_l1-v{version}.uf2", assetPattern: "donglora-wio_tracker_l1-v{version}.uf2",
}, },
{
id: "waveshare_rp2040_lora",
name: "Waveshare RP2040-LoRa",
mcu: "RP2040",
radio: "SX1262",
family: "rp2040",
flashMethod: "uf2",
assetPattern: "donglora-waveshare_rp2040_lora-v{version}.uf2",
},
]; ];
export function getAssetName(board: BoardDef, version: string): string { export function getAssetName(board: BoardDef, version: string): string {
+1 -1
View File
@@ -1,4 +1,4 @@
export type BoardFamily = "esp32s3" | "nrf52840"; export type BoardFamily = "esp32s3" | "nrf52840" | "rp2040";
export type FlashMethod = "web-serial" | "uf2" | "download-only"; export type FlashMethod = "web-serial" | "uf2" | "download-only";
export interface BoardDef { export interface BoardDef {
+11 -1
View File
@@ -223,7 +223,12 @@ your code ──► client lib ──┘</pre>
<!-- Supported Boards --> <!-- Supported Boards -->
<section class="py-12"> <section class="py-12">
<h2 class="font-mono text-2xl font-bold mb-6 text-text">Supported Boards</h2> <h2 class="font-mono text-2xl font-bold mb-6 text-text">Supported Boards</h2>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4"> <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
<div class="bg-bg-card border border-border p-5 rounded">
<h3 class="font-mono font-medium text-text mb-2">ELECROW ThinkNode-M2</h3>
<p class="text-sm text-text-muted">ESP32-S3 &middot; SX1262</p>
<p class="text-xs text-warn mt-2 font-mono">CLI Only</p>
</div>
<div class="bg-bg-card border border-border p-5 rounded"> <div class="bg-bg-card border border-border p-5 rounded">
<h3 class="font-mono font-medium text-text mb-2">Heltec V3</h3> <h3 class="font-mono font-medium text-text mb-2">Heltec V3</h3>
<p class="text-sm text-text-muted">ESP32-S3 &middot; SX1262</p> <p class="text-sm text-text-muted">ESP32-S3 &middot; SX1262</p>
@@ -244,6 +249,11 @@ your code ──► client lib ──┘</pre>
<p class="text-sm text-text-muted">nRF52840 &middot; SX1262</p> <p class="text-sm text-text-muted">nRF52840 &middot; SX1262</p>
<p class="text-xs text-info mt-2 font-mono">UF2 Download</p> <p class="text-xs text-info mt-2 font-mono">UF2 Download</p>
</div> </div>
<div class="bg-bg-card border border-border p-5 rounded">
<h3 class="font-mono font-medium text-text mb-2">Waveshare RP2040-LoRa</h3>
<p class="text-sm text-text-muted">RP2040 &middot; SX1262</p>
<p class="text-xs text-info mt-2 font-mono">UF2 Download</p>
</div>
</div> </div>
</section> </section>