Files
TeslaRel410/emulator/render-bridge/podrun.sh
T
CydandClaude Fable 5 9c959e6891 BT410 5.3.60: first rendered frame from a running reconstructed mission
emulator/render-bridge/first_mission_frame.png -- arena city, textured
buildings, horizon, 28fps, captured from the GL bridge while our build ran a
live mission with the mech walking.  The skeleton went in with it:
[skl] video\mad.skl -> 26 nodes, 19 objects.

Corrects yesterday's RIO framing.  I called serial1 an unplugged cable.  Wrong
twice: VRio.App is running on this rig (the dev-rig default since 7/17), and
the emulator log recorded real byte counts on that port -- RX overruns of 471,
503, 528 -- which an unconnected pipe cannot produce.  The port was LIVE and
streaming during every crashing run.

So the defect is not that we mishandle a disconnected port, it is that we
mishandle a live RIO stream, which is worse: every production pod has a real
RIO.  The shipped binary on the same rig logs 'lost RIO analog request', keeps
sending characters, and runs the mission; ours logs 'RIO never came back from
test mode!' and dies partway through the load.  The overrun counts say the
guest is not draining the port fast enough.  L4RIO.CPP's handshake is authentic
archive code, but MechRIOMapper (BT/MECHMPPR.CPP) is ours -- that is the thread.

pod_render_norio.conf stays the way to get a running mission today, but it is a
workaround: it disables the cockpit's primary input device.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 23:33:08 -05:00

103 lines
3.6 KiB
Bash

#!/bin/bash
#
# podrun -- stage the current build and start one pod run, keeping the log.
#
# podrun.sh [conf-basename] [tag]
#
# podrun.sh # pod_render_rec.conf, our build
# podrun.sh pod_render_shp # the shipped exe, for A/B
# podrun.sh pod_render_rec noskl
#
# WHY THIS EXISTS
#
# Two traps have each already cost a round of wrong conclusions on this rig:
#
# 1. STALE BINARY. The confs run BTL4REC.EXE out of ALPHA_1/REL410/BT,
# while the build writes build410/btl4opt.exe. Forgetting to copy means
# silently measuring the previous binary. This script always stages and
# always prints the timestamp it staged, so the evidence is in the log.
#
# 2. OVERWRITTEN LOG. serial3 truncates podlog.txt on every launch, so the
# only preserved crash dump on this rig was an accident. Runs are four
# minutes and the defect is intermittent, so a lost log is a lost run.
# Every run is archived to logs/<tag>-<n>.txt when the NEXT one starts.
#
# The rule this rig taught: an intermittent fault needs TWO AGREEING RUNS
# before you believe anything. One run is a story, not evidence.
#
set -e
BR=/c/VWE/TeslaRel410/emulator/render-bridge
IMG=/c/VWE/TeslaRel410/ALPHA_1/REL410/BT
SRC=/c/VWE/TeslaRel410/restoration/build410/btl4opt.exe
CONF=${1:-pod_render_rec}
TAG=${2:-$CONF}
mkdir -p "$BR/logs"
# archive whatever the last run left behind before serial3 truncates it
if [ -s "$BR/podlog.txt" ]; then
N=$(ls "$BR/logs" 2>/dev/null | wc -l)
PREV="$BR/logs/$(printf '%03d' "$N")-prev.txt"
cp "$BR/podlog.txt" "$PREV"
if grep -q "page you don't own" "$PREV"; then
mv "$PREV" "${PREV%-prev.txt}-CRASH.txt"
echo "archived previous run (CRASHED) -> $(basename "${PREV%-prev.txt}-CRASH.txt")"
else
echo "archived previous run -> $(basename "$PREV")"
fi
[ -s "$BR/dosboxlog.txt" ] && cp "$BR/dosboxlog.txt" "$BR/logs/$(printf '%03d' "$N")-dosbox.txt"
fi
if tasklist //FI "IMAGENAME eq dosbox-x.exe" 2>/dev/null | grep -qi dosbox-x; then
echo "killing running dosbox-x"
taskkill //F //IM dosbox-x.exe > /dev/null 2>&1 || true
sleep 2
fi
case "$CONF" in
*shp*)
echo "shipped side -- no staging"
;;
*)
[ -f "$SRC" ] || { echo "no build at $SRC -- run build410.sh link"; exit 1; }
cp -f "$SRC" "$IMG/BTL4REC.EXE"
echo "staged BTL4REC.EXE <- btl4opt.exe $(ls -la "$SRC" | awk '{print $5" bytes "$6" "$7" "$8}')"
;;
esac
#
# HOST-SIDE BOARD ENV. These belong to the VPX device inside DOSBox, not to
# the guest, so they must be exported here. Launching without them does not
# merely disable rendering -- the iserver handshake fails outright with
# "Protocol error : length 65535 too big" and the run dies during boot.
#
WORK="$LOCALAPPDATA/Temp/vwe-pod"
mkdir -p "$WORK"
export VPXLOG="$WORK/vpxresp.txt"
export VPX_RESPOND=1
export VPX_RENDER=1
export VPX_EXPLODE=1
export VPX_DUMPDIR="$WORK"
export VPX_NOMAIN=1
export VPX_CLEAR=0,0,0
export RIO_TAP="$WORK/riotap.txt"
#
# Board stream capture. Without these the run renders but leaves nothing
# to look at afterwards, which on a four-minute rig means re-running just
# to see a frame. FIFOSOCK also lets the render bridge attach live.
#
export VPX_FIFODUMP="$WORK/live.fifodump"
export VPX_FIFOSOCK=8621
rm -f "$BR/podlog.txt"
cd /c/VWE/TeslaRel410/emulator/src/src
#
# Keep the emulator's own stdout/stderr. The game's stdout comes back over
# COM3, but the DPMI host's exception report and any device-side complaint go
# to the emulator, and those were being thrown away.
#
./dosbox-x.exe -conf "$BR/$CONF.conf" > "$BR/dosboxlog.txt" 2>&1 &
echo "launched $CONF (tag=$TAG) -- pid $!"
echo "watch: tail -f $BR/podlog.txt"