replay-session.sh: a recorded session's frames through the decoder, live to displays
/ crosscheck (push) Successful in 1s
/ crosscheck (push) Successful in 1s
Frames go onto vcan_replay (the recorder never sees them); the decoder service stands aside for the replay and comes back however it ends. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
This commit is contained in:
@@ -30,6 +30,8 @@ scripts/deploy-native.sh BIN # build BIN on the development Orin,
|
|||||||
# Redeploy after any contracts signals.json change
|
# Redeploy after any contracts signals.json change
|
||||||
yukart-decoder --list # the signals it decodes, and where
|
yukart-decoder --list # the signals it decodes, and where
|
||||||
zstdcat can-*.log.zst | yukart-decoder --replay # what it would publish for a recording
|
zstdcat can-*.log.zst | yukart-decoder --replay # what it would publish for a recording
|
||||||
|
scripts/replay-session.sh SESSION_DIR [SKIP_S] # on the Orin: replay a session's frames through a
|
||||||
|
# decoder on vcan_replay, live to displays; never recorded
|
||||||
yukart-obd-poller --elm ADDR --once # on the Orin, service stopped: adapter, protocol,
|
yukart-obd-poller --elm ADDR --once # on the Orin, service stopped: adapter, protocol,
|
||||||
# supported PIDs and one value each
|
# supported PIDs and one value each
|
||||||
yukart-gnss --once # the next fix as JSON, no broker
|
yukart-gnss --once # the next fix as JSON, no broker
|
||||||
|
|||||||
Executable
+41
@@ -0,0 +1,41 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Replay a recorded session's CAN frames through the decoder, so displays react as
|
||||||
|
# if the car were live. Runs on the car Orin (sudo: vcan and the decoder service).
|
||||||
|
#
|
||||||
|
# usage: scripts/replay-session.sh SESSION_DIR [SKIP_S]
|
||||||
|
# SESSION_DIR e.g. /var/lib/yukart/recordings/000001-20261013T170050
|
||||||
|
# SKIP_S seconds of the recording to skip first (default 0)
|
||||||
|
#
|
||||||
|
# Frames go onto a virtual interface, vcan_replay, never can_pcan: the recorder only
|
||||||
|
# watches can_pcan, so a replay is never recorded as a drive. The decoder service is
|
||||||
|
# stopped for the replay (one MQTT client id) and a decoder runs on vcan_replay instead;
|
||||||
|
# however the replay ends (finished, Ctrl-C, killed), the service comes back and the
|
||||||
|
# interface goes. Values carry the replay's own timing; nothing marks them as replayed.
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SESSION="${1:?usage: replay-session.sh SESSION_DIR [SKIP_S]}"
|
||||||
|
SKIP="${2:-0}"
|
||||||
|
IF=vcan_replay
|
||||||
|
ls "$SESSION"/can-*.log* >/dev/null
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
[ -n "${DEC:-}" ] && kill "$DEC" 2>/dev/null || true
|
||||||
|
sudo ip link del "$IF" 2>/dev/null || true
|
||||||
|
sudo systemctl start yukart-decoder
|
||||||
|
echo "replay: done; yukart-decoder back on can_pcan"
|
||||||
|
}
|
||||||
|
trap cleanup EXIT INT TERM
|
||||||
|
|
||||||
|
sudo modprobe vcan
|
||||||
|
sudo ip link add "$IF" type vcan 2>/dev/null || true
|
||||||
|
sudo ip link set "$IF" up
|
||||||
|
sudo systemctl stop yukart-decoder
|
||||||
|
/usr/local/bin/yukart-decoder --can "$IF" &
|
||||||
|
DEC=$!
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
echo "replay: $SESSION from +${SKIP} s onto $IF"
|
||||||
|
# candump -L lines: "(1791878450.945008) can_pcan 139#...". Skip by the first frame's time.
|
||||||
|
zstdcat -f "$SESSION"/can-*.log* 2>/dev/null \
|
||||||
|
| awk -v skip="$SKIP" '{ t = substr($1, 2, length($1) - 2) + 0; if (NR == 1) t0 = t; if (t - t0 >= skip) print }' \
|
||||||
|
| canplayer "$IF=can_pcan"
|
||||||
Reference in New Issue
Block a user