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>
103 lines
3.6 KiB
Bash
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"
|