What is real, and what is modelled

MeshBench runs real MeshCore firmware. MeshBench models the air.

That one sentence is the whole design. MeshBench does not simulate the firmware's behaviour: every node is the actual MeshCore application, compiled and running as its own process, keeping its own state, making its own routing decisions. What MeshBench provides is everything the firmware cannot bring with it: the radio spectrum, the terrain, the distances, the noise, and a clock all the nodes share.

REAL MeshCore firmware one process per node its routing and timing flood suppression, CSMA, regions the bytes it transmits and its own serial protocol the radio interface: a linked shim (native) or a modelled SX1262 chip (emulated) MODELLED the channel path loss, terrain, noise, overlap the clock simulated time, one tick for all the world positions, antennas, buildings
Everything above the dashed line is MeshCore's own code, unmodified. Everything below it is MeshBench's model. The boundary sits exactly where a real radio chip sits.

Why the interface sits there#

A simulator that re-implements the protocol tests the re-implementation. By running the real firmware and substituting only the radio, what MeshBench measures is MeshCore's actual behaviour: its flood suppression, its CSMA timing, its region filtering, exactly as they ship. When a packet is not relayed, it is because the real code decided not to relay it.

The interface has two placements, described in Native and emulated:

What happens to a transmission#

The firmware hands bytes to its radio. The channel prices the path to every listener: transmit power, antenna gain in the true direction, free-space loss, terrain diffraction, buildings if loaded, then noise at each receiver. Whether each listener decodes is judged one of two ways:

RF simulation compares them; the RF chain walks the stages both share. Either way, the verdict and its cause land in the event log, which is what every result is read from.

The words, in one place#

The terms below are the project's own, used consistently by the application, the fixtures and the clients.

termmeaning
networkthe nodes on the map and the links between them
scenarioa network plus everything that makes a run repeatable: seed, radio settings, schedule
fixturea scenario shipped as JSON, with assertions; the runnable, testable form
runone execution of a scenario; run.save keeps its results for comparison
seedthe run's randomness; same seed, same scenario, same result (native firmware)
armone variant in an experiment: a firmware version or setting under comparison
regiona transport region a repeater forwards flood traffic for, e.g. sco
scopethe region a packet is sent on; written #sco on the wire, and hashed
kindwhat a node is: simple-repeater, companion, room-server, sdr-observer, emitter
rolethe MeshCore application a node runs: simple_repeater, companion_radio, simple_room_server
nativeMeshCore compiled for this machine, radio shim linked in; deterministic
emulatedthe published board image on an emulated chip; wall-clock time
calculated RFreception decided by link-budget arithmetic against the demodulator floor
waveform RFreception decided by a real demodulator over synthesised samples
boundarythe study area; nodes outside it (plus a margin) are not simulated
demodulator floorthe weakest signal the radio can still decode; everything quieter is noise
marginhow many dB a link clears the demodulator floor by
causewhy a reception failed, recorded per event: below the floor, corrupted by overlap, radio elsewhere
provenancethe caveats stamped into a result: RF mode, realism switches, seed

Two pairs are worth keeping apart because both words appear in the interface: a region is held by a node and decides what it relays; a scope is carried by a packet and decides who relays it. A kind is what a node is on the map; a role is which MeshCore application it boots.

Where to go next#

MeshBench documentation. Built from the running application, not from mock-ups. Screenshots are window-only captures; see CLAUDE.md for the rule that keeps them current. Edit this page.