Platformrealisatie¶
OPSLAG · BORDKLASSEN · ASYMMETRIE · VIER FAMILIES
Vier platformfamilies, één codebase. Dit hoofdstuk beschrijft waar die vier uit elkaar lopen en hoe de firmware dat opvangt. De scherpste scheidslijn ligt niet bij de radio of het scherm maar bij het bestandssysteem, en de manier waarop die keuze wordt gemaakt verraadt iets over hoe de ondersteuning is gegroeid.
[!NOTE] Bron. Deze pagina is geverifieerd tegen de firmware zelf:
MeshCorev1.16.0, commit03b6ef4, 28 juli 2026 —src/helpers/IdentityStore.h,src/helpers/ESP32Board.h,src/helpers/NRF52Board.h,src/helpers/stm32/STM32Board.hen de bordklassen invariants/.
Opslag is de scheidslijn¶
Welke bestandssysteemlaag een build gebruikt, wordt met een macro gekozen. De vier families vallen daarbij in twee kampen.
src/helpers/IdentityStore.h r.3-11
#if defined(ESP32) || defined(RP2040_PLATFORM)
#include <FS.h>
#define FILESYSTEM fs::FS
#elif defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
#include <Adafruit_LittleFS.h>
#define FILESYSTEM Adafruit_LittleFS
using namespace Adafruit_LittleFS_Namespace;
#endif
ESP32 en RP2040 krijgen fs::FS, de Arduino-abstractie boven een
bestandssysteem. nRF52 en STM32 krijgen Adafruit_LittleFS, een aparte
implementatie met een eigen namespace. Geen enkele component vanaf
IdentityStore naar boven merkt nog verschil tussen beide bestandssystemen:
alles werkt met FILESYSTEM.
De asymmetrie in de test zelf¶
Let op hoe de vier families in dat fragment worden herkend. Drie ervan aan hun
eigen *_PLATFORM-macro, één niet:
| Familie | Herkend aan | Van wie is die macro |
|---|---|---|
| ESP32 | ESP32 |
Arduino-ESP32-core |
| RP2040 | RP2040_PLATFORM |
MeshCore |
| nRF52 | NRF52_PLATFORM |
MeshCore |
| STM32 | STM32_PLATFORM |
MeshCore |
MeshCore definieert wél een ESP32_PLATFORM, maar die wordt in de hele
broncodestructuur nergens gelezen — niet in src/, niet in examples/, niet
in variants/. Hij bestaat en doet niets, omdat ESP32-code de core-macro
ESP32 gebruikt die er toch al is. Zie Compile-time
configuratie.
Dat is geen fout: het werkt. Maar het betekent wel dat wie een vijfde familie zou toevoegen, niet één patroon aantreft om na te volgen maar twee.
Bordklassen per familie¶
Het bordcontract mesh::MainBoard (src/MeshCore.h r.45) legt vast wat elk
bord moet kunnen: batterijspanning geven, herstarten, slapen, de opstartreden
melden. Drie families implementeren dat met een gedeelde klasse waar de
variantklassen van erven. De vierde niet.
| Familie | Gedeelde bordklasse | Afgeleiden in src/ |
Targets |
|---|---|---|---|
| ESP32 | ESP32Board |
MeshadventurerBoard, TBeamBoard |
270 |
| nRF52 | NRF52Board |
NRF52BoardDCDC |
199 |
| STM32 | STM32Board |
geen | 16 |
| RP2040 | geen | vier losse in variants/ |
22 |
De vier RP2040-bordklassen — RAK11310Board, PicoWBoard, WaveshareBoard
en XiaoRP2040Board — erven rechtstreeks van mesh::MainBoard en schrijven
dus elk zelf uit wat de andere families van hun gedeelde ouder krijgen. Bij 22
targets is dat te overzien; het is de reden dat er geen RP2040Board is
gekomen.
Hoeveel code er per familie gedeeld wordt¶
| Bestand | Regels |
|---|---|
src/helpers/ESP32Board.h |
186 |
src/helpers/ESP32Board.cpp |
47 |
src/helpers/NRF52Board.h |
78 |
src/helpers/NRF52Board.cpp |
366 |
src/helpers/stm32/STM32Board.h |
44 |
De verhouding is omgekeerd aan wat je zou verwachten. nRF52 draagt minder targets dan ESP32 maar heeft bijna acht keer zoveel implementatiecode: 366 regels tegen 47. Dat zit in het energiebeheer. De nRF52-borden schakelen tussen een DC/DC-omzetter en een lineaire regelaar, lezen de batterij via een ADC met eigen referentiespanning, en beheren de slaapstand zelf. ESP32Board laat het meeste daarvan aan de Arduino-core over.
STM32 komt met 44 regels in één header toe en heeft geen .cpp. Er zijn 16
targets, alle op dezelfde SoC-familie, met dezelfde radio erop — er valt weinig
te variëren.
Wat een familie verder deelt¶
Naast de bordklasse hebben ESP32, nRF52 en STM32 een eigen map onder
src/helpers/. Wat daarin staat, is geen platformverschil maar een
mogelijkheid die de andere families niet hebben:
| Map | Klassen | Waarom alleen daar |
|---|---|---|
esp32/ |
ESPNOWRadio, SerialBLEInterface, SerialWifiInterface, TBeamBoard |
ESP32 heeft BLE, WiFi én ESP-NOW |
nrf52/ |
SerialBLEInterface |
nRF52 heeft alleen BLE |
stm32/ |
STM32Board |
STM32 heeft geen van beide |
RP2040 heeft geen map. Een RP2040-node praat over USB-serieel met de telefoon-app, niet over BLE of WiFi.
De klok als tegenvoorbeeld¶
Niet elke abstractie splitst per familie. Het klokcontract mesh::RTCClock
(src/MeshCore.h r.80) wordt op drie manieren geïmplementeerd, en die drie
snijden dwars door de families heen:
| Implementatie | Plek | Wanneer |
|---|---|---|
ESP32RTCClock |
src/helpers/ESP32Board.h r.160 |
ESP32 met interne RTC |
AutoDiscoverRTCClock |
src/helpers/AutoDiscoverRTCClock.h r.7 |
Bord met een RTC-chip op I²C |
VolatileRTCClock |
src/helpers/ArduinoHelpers.h r.6 |
Bord zonder RTC |
AutoDiscoverRTCClock zoekt bij het opstarten op de I²C-bus naar een bekende
RTC-chip en valt terug op een vluchtige klok als hij niets vindt. Dat is een
hardwareverschil dat niets met de platformfamilie te maken heeft: dezelfde
ESP32-familie bevat borden mét en zonder RTC-chip.