From b3063239f7e43dab120246f8de9a07bb4f119e96 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Mon, 7 Sep 2026 21:56:48 -0700 Subject: [PATCH] fix(e2e): deterministic in-range node scenario + log receiver decisions The sim now observes TX from both nodes (current client fixed observation) but nothing is ever delivered to the other node. Suspect: random placement leaving nodes out of range, or the receiver decision. Provide a --from-file scenario with nodes spaced 10 m apart (guaranteed adjacency) and print the transmitter -> receivers decision per TX in the sim log. --- scripts/meshtasticator_e2e/run_e2e.sh | 34 ++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/scripts/meshtasticator_e2e/run_e2e.sh b/scripts/meshtasticator_e2e/run_e2e.sh index 2a5a034..df34a94 100755 --- a/scripts/meshtasticator_e2e/run_e2e.sh +++ b/scripts/meshtasticator_e2e/run_e2e.sh @@ -93,7 +93,31 @@ start_forwards() { } SIM_LOG="$REPO_ROOT/meshtasticator-sim.log" -SIM_ARGS=("$NODES" -v) # -v: meshtastic/debug logging for RF diagnostics +# Deterministic topology: random placement may leave nodes out of range +# (nothing was ever delivered between nodes). Provide a --from-file scenario +# with all nodes within ~10 m of each other so RF adjacency is guaranteed. +NODE_CONF_DIR="$SIM_DIR/out" +mkdir -p "$NODE_CONF_DIR" +"$VENV/bin/python" - "$NODE_CONF_DIR/nodeConfig.yaml" "$NODES" <<'PY' +import sys +from pathlib import Path + +path, count = sys.argv[1], int(sys.argv[2]) +conf = {} +for i in range(count): + x = float((i - (count - 1) / 2) * 10.0) # 10 m spacing around the origin + conf[i] = { + "x": x, "y": 0.0, "z": 1.0, + "isRouter": False, "isRepeater": False, "isClientMute": False, + "hopLimit": 3, "antennaGain": 0, "neighborInfo": False, + } +Path(path).write_text( + "".join(f"{k}:\n" + "".join(f" {ck}: {cv}\n" for ck, cv in v.items()) + for k, v in conf.items()) +) +print(f"wrote deterministic node scenario ({count} nodes) to {path}") +PY +SIM_ARGS=("--from-file" -v) # node count/positions come from nodeConfig.yaml if [ "$MODE" = native ]; then [ -n "$PROGRAM" ] && [ -d "$PROGRAM" ] || { echo "--mode native needs --program " >&2; exit 2; } SIM_ARGS+=(-p "$PROGRAM") @@ -159,6 +183,14 @@ new = old + ( assert old in src, "simulator subscription moved in the pinned meshtasticator" src = src.replace(old, new, 1) +old = ' rxs, rssis, snrs = self.calc_receivers(transmitter, receivers)' +new = old + ( + '\n print(f"[sim] TX node={transmitter.nodeid} candidates={[n.nodeid for n in receivers]} ' + 'rxs={[n.nodeid for n in rxs]} rssis={rssis}")' +) +assert old in src, "calc_receivers call moved in the pinned meshtasticator" +src = src.replace(old, new, 1) + interactive.write_text(src) print("patched lib/interactive.py (RF instrumentation)") PY