Variabiliteit¶
DRIE ASSEN · 508 BUILDS · WAAROM TELLEN OP NAAM FOUT GAAT
Uit één codebase komen 508 verschillende buildtargets. Dit hoofdstuk beschrijft hoe dat werkt: langs welke assen MeshCore varieert, welk deel van de theoretisch mogelijke combinaties daadwerkelijk bestaat, en waarom je de aantallen niet kunt aflezen aan de namen van de targets.
[!NOTE] Bron. Deze pagina is geverifieerd tegen de firmware zelf:
MeshCorev1.16.0, commit03b6ef4, 28 juli 2026 — de rootplatformio.inien alle 79variants/*/platformio.ini. Alle aantallen komen uittools/design-overview.py.
Drie assen¶
MeshCore varieert langs drie onafhankelijke assen. Een buildtarget is een punt in die ruimte: één rol, één platformfamilie, één bord.
| As | Waarden | Vastgelegd door |
|---|---|---|
| Rol | 6 | Welke applicatiedirectory wordt meegecompileerd |
| Platformfamilie | 4 | Welke platformmacro is gedefinieerd |
| Bord | 79 varianten | Welk variantbestand het target definieert |
Daarnaast zijn er aanvullende buildopties die los van de assen staan: welke radiochip, welk schermtype, of er een brug is, of er sensoren zijn, en of logging aan staat.
De aantallen¶
ini-bestanden gelezen 80 (1 root + 79 varianten)
secties totaal 616
[env:...]-secties 508
basissecties 108
Van de 508 targets compileren er 507 één applicatie; het 508e is het testtarget dat op de ontwikkelmachine draait.
| Rol | Targets | Variantdirectory's |
|---|---|---|
| Companion radio | 174 | 76 |
| Repeater | 136 | 75 |
| KISS-modem | 80 | 74 |
| Room server | 73 | 65 |
| Terminal chat | 26 | 24 |
| Sensor | 18 | 16 |
| Platformfamilie | Targets |
|---|---|
| ESP32 | 270 |
| nRF52 | 199 |
| RP2040 | 22 |
| STM32 | 16 |
En de kruistabel, die laat zien dat de assen niet volledig onafhankelijk zijn:
| Rol | ESP32 | nRF52 | RP2040 | STM32 |
|---|---|---|---|---|
| Companion radio | 91 | 75 | 4 | 4 |
| Repeater | 83 | 42 | 6 | 5 |
| KISS-modem | 36 | 36 | 4 | 4 |
| Room server | 34 | 35 | 4 | 0 |
| Terminal chat | 17 | 5 | 4 | 0 |
| Sensor | 9 | 6 | 0 | 3 |
Drie cellen staan op nul. Er is geen room server en geen terminal chat op STM32, en geen sensor op RP2040. Dat is geen technische onmogelijkheid maar een keuze: niemand heeft die combinatie nodig gehad.
Niet alle combinaties worden ondersteund¶
Zes rollen op negenenzeventig borden zou 474 combinaties opleveren. Er zijn er 507. Dat is geen tegenspraak maar het gevolg van de aanvullende buildopties: dezelfde rol op hetzelfde bord bestaat meermaals, in varianten met en zonder brug, met verschillende schermen of met een andere zendtransport.
Tegelijk is de configuratiematrix niet volledig gevuld. Lang niet elk bord kent alle zes de rollen. De companion radio bestaat op 76 van de 79 borden, de sensor op 16.
| Aanvullende buildopties | Targets |
|---|---|
| GPS ingeschakeld | 323 |
| Scherm aanwezig | 309 |
| ESP-NOW brug | 33 |
| RS232 brug | 13 |
| Debug-uitvoer aan | 36 |
| Pakketlogging aan | 10 |
Klassen kiezen tijdens het compileren¶
De aanvullende buildopties werken via één mechanisme: het buildsysteem geeft een klassenaam door als macro, en de code gebruikt die naam alsof hij er altijd al stond. Zo kiest een variantbestand welke radio en welk scherm er in de binary komen, zonder dat de applicatie ervan weet.
| Macro | Verschillende waarden | Targets die hem zetten |
|---|---|---|
RADIO_CLASS |
5 | 501 |
WRAPPER_CLASS |
5 | 501 |
DISPLAY_CLASS |
11 | 309 |
De vijf radiowaarden dekken vijf chipfamilies. Er is een zesde implementatie in de broncode aanwezig die door geen enkel target wordt gekozen; hij is beschikbaar voor wie hem in een eigen variant nodig heeft.
Zeven targets zetten geen RADIO_CLASS. Vijf daarvan zijn ESP-NOW-varianten
die geen LoRa-radio gebruiken, en het zesde is het testtarget. Het zevende is
een fout; zie hieronder.
Waarom tellen op naam fout gaat¶
Dit is de belangrijkste waarschuwing van dit hoofdstuk, en de reden dat er een script bij zit.
De naam van een [env:...]-sectie is vrije tekst. Hij zegt niets af over wat
er wordt gecompileerd. Drie manieren waarop de naam misleidt:
De naam noemt de rol niet. Generic_ESPNOW_room_svr compileert de room
server, maar wie op _room_server zoekt vindt hem niet. Er zijn ook targets
met _repeatr en _Repeater in de naam.
De naam noemt een rol die er niet is. Omgekeerd is een naam die op
_repeater eindigt geen bewijs dat de repeater erin zit.
De rol staat niet in de sectie zelf. 28 van de 508 targets noemen nergens
in hun eigen tekst een applicatiedirectory. Ze erven die via extends of via
een tekstverwijzing naar een andere sectie. Een zoekopdracht op het bestand
ziet ze niet.
De juiste methode is: de sectie volledig oplossen — extends volgen en
tekstverwijzingen uitvouwen — en dan kijken welke applicatiedirectory in het
bronfilter wordt ingesloten. tools/design-overview.py doet dat:
python3 tools/design-overview.py /pad/naar/MeshCore --targets simple_room_server
Ter controle: die aanroep levert 73 targets in 65 variantdirectory's, hetzelfde
getal als tools/room-server-overview.py langs een andere weg vindt.
Twee valkuilen bij het tellen¶
Tel secties, geen regels. Een naïeve zoekopdracht op examples/ telt
regels en overdrijft de companion radio met een factor drie, omdat die
applicatie zijn bronfilter over meerdere regels verdeelt.
Negeer uitgecommentarieerde macro's. Zoek je met een tekstzoekopdracht naar
MESH_DEBUG, dan vind je er 387. Werkelijk ingeschakeld is hij in 36 targets;
in de rest staat de regel uitgeschakeld in het bestand als voorbeeld. Hetzelfde
geldt voor pakketlogging: 385 vermeldingen, 10 daadwerkelijk aan.
Drie variantbestanden met andere regeleinden¶
variants/minewsemi_me25ls01, variants/nibble_screen_connect en
variants/wio_wm1110 gebruiken Windows-regeleinden. Wie de bestanden regel
voor regel leest zonder te normaliseren, houdt een onzichtbaar teken over aan
het eind van elke waarde. De ouder mét dat teken en de ouder zonder tellen dan
als twee verschillende secties, en de helft van de overervingsketen valt weg.
Het script normaliseert de regeleinden voordat het iets anders doet.
Eén target dat niet kan compileren¶
Generic_E22_kiss_modem erft van de basissectie Generic_E22 en neemt daarmee
ook het bronfilter over dat variants/generic-e22/ insluit. In dat bestand
staat:
variants/generic-e22/target.cpp r.8-13
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi);
Maar noch het target, noch de basissectie, noch een van de bovenliggende
secties definieert RADIO_CLASS. De zusjes van dit target doen dat wel — elk
kiest per target tussen de SX1262- en de SX1268-uitvoering — maar de
KISS-modemvariant is overgeslagen. Dit target is daarmee het enige van de 508
dat niet vertaalt.