83 lines
2.4 KiB
Bash
Executable File
83 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
IFS=$'\n\t'
|
|
|
|
# --- Settings ----------------------------------------------------------------
|
|
LOGFILE="vna_protocol.bin" # will be normalized to absolute path
|
|
DEVICE="/dev/ttyACM0"
|
|
REAL_DEV="${DEVICE}.real"
|
|
VIRT_DEV="/tmp/vna_log" # PTY endpoint for the app (peer created by socat)
|
|
|
|
# Normalize LOGFILE and ensure directory exists
|
|
if command -v realpath >/dev/null 2>&1; then
|
|
LOGFILE="$(realpath -m -- "$LOGFILE")"
|
|
else
|
|
LOGFILE="$(cd "$(dirname "$LOGFILE")" && pwd -P)/$(basename "$LOGFILE")"
|
|
fi
|
|
mkdir -p "$(dirname "$LOGFILE")"
|
|
|
|
BRIDGE="./bridge_logger.py"
|
|
|
|
# --- Helpers -----------------------------------------------------------------
|
|
restore_device() {
|
|
[[ -e "$VIRT_DEV" || -L "$VIRT_DEV" ]] && rm -f "$VIRT_DEV" || true
|
|
if [[ -e "$DEVICE" && ! -c "$DEVICE" ]]; then rm -f "$DEVICE" || true; fi
|
|
if [[ -e "$REAL_DEV" ]]; then sudo mv -f "$REAL_DEV" "$DEVICE" || true; fi
|
|
if [[ -e "$REAL_DEV" && -c "$DEVICE" ]]; then rm -f "$REAL_DEV" || true; fi
|
|
}
|
|
|
|
kill_descendants() {
|
|
pkill -TERM -P $$ 2>/dev/null || true
|
|
sleep 0.1
|
|
pkill -KILL -P $$ 2>/dev/null || true
|
|
}
|
|
|
|
|
|
# --- Cleanup -----------------------------------------------------------------
|
|
CLEANED=0
|
|
cleanup() {
|
|
(( CLEANED )) && return 0
|
|
CLEANED=1
|
|
set +e
|
|
echo; echo "Stopping logger..."
|
|
restore_device
|
|
kill_descendants
|
|
echo "Log saved to: $LOGFILE"
|
|
echo "Cleanup complete."
|
|
}
|
|
trap cleanup EXIT INT TERM HUP QUIT
|
|
|
|
echo "== Preparing direction-switch protocol logging =="
|
|
echo "Binary log file: $LOGFILE"
|
|
|
|
# Fix leftovers from previous run (if any)
|
|
if [[ -e "$REAL_DEV" ]]; then
|
|
echo "Found leftover $REAL_DEV — restoring..."
|
|
restore_device
|
|
fi
|
|
|
|
# Safety checks
|
|
[[ -e "$DEVICE" ]] || { echo "Error: device $DEVICE not found."; exit 1; }
|
|
[[ -c "$DEVICE" ]] || { echo "Error: $DEVICE is not a character device."; exit 1; }
|
|
|
|
# Park the real device and create a PTY pair for the application
|
|
sudo mv "$DEVICE" "$REAL_DEV"
|
|
socat -d -d pty,raw,echo=0,link="$DEVICE",mode=666 \
|
|
pty,raw,echo=0,link="$VIRT_DEV" &
|
|
sleep 1
|
|
|
|
# Configure the real serial device (adjust if needed)
|
|
stty -F "$REAL_DEV" 115200 cs8 -cstopb -parenb -ixon -ixoff -crtscts raw -echo
|
|
|
|
# Initialize the binary log with a magic header (if empty)
|
|
if [[ ! -s "$LOGFILE" ]]; then
|
|
printf 'VNALOG1\n' > "$LOGFILE"
|
|
fi
|
|
|
|
# Run the bridge+logger (single process handles both directions + logging)
|
|
"$BRIDGE" "$VIRT_DEV" "$REAL_DEV" "$LOGFILE" &
|
|
|
|
echo "Logging active. Press Ctrl+C to stop."
|
|
wait
|