Files
bf-infra/docs/tp25-runde.sh

85 lines
4.0 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# TP25 — eine komplette Runde. Ein Befehl, ohne Claude.
#
# bash docs/tp25-runde.sh # Verzeichnis wird nach Datum/Uhrzeit benannt
# bash docs/tp25-runde.sh ap2-hoehe # eigener Name
#
# Startet die Klick-Konsole (Port 3031) und die Messung, sagt die Adresse fuer das Telefon
# an und raeumt beim Beenden auf. Zum Beenden: Ctrl-C in diesem Fenster.
#
# 🔴 Der Grund fuer dieses Skript: die beiden Einzelteile hatten als Standard-Laufverzeichnis
# einen Pfad in ein Sitzungs-Scratchpad. Wer sie ohne die passende Umgebungsvariable
# startete, mass in ein totes Verzeichnis -- und merkte es erst bei der Auswertung.
# Hier wird das Verzeichnis EINMAL bestimmt und an beide durchgereicht.
set -uo pipefail
HERE="$(cd "$(dirname "$0")/.." && pwd)"
cd "$HERE"
NAME="${1:-$(date +%Y%m%d-%H%M)}"
export TP6_RUN_DIR="$HERE/docs/messdaten/tp25-runde-$NAME"
export TP25_PHONE_IP="${TP25_PHONE_IP:-10.40.10.178}" # S22 -- wird gepingt
export TP25_PHONE_MAC="${TP25_PHONE_MAC:-2A:0D:B0:5D:AD:A7}"
export TP25_IPHONE_MAC="${TP25_IPHONE_MAC:-F2:62:4C:E1:AF:09}"
mkdir -p "$TP6_RUN_DIR"
# Konsole: nur starten, wenn der Port frei ist -- eine zweite Instanz wuerde sofort sterben
# und die Marker der ersten waeren weg.
KONSOLE=""
if lsof -nP -iTCP:3031 -sTCP:LISTEN >/dev/null 2>&1; then
echo "Konsole laeuft bereits auf 3031 -- wird weiterverwendet."
else
python3 docs/tp6-marker/server.py > "$TP6_RUN_DIR/konsole.log" 2>&1 &
KONSOLE=$!
sleep 2
fi
# 🔴 Gegen-AP-Automatik gleich einschalten. Sie war bisher ein Klick auf der Konsole -- und
# wer ihn vergisst, geht die ganze Runde mit beiden Telefonen auf DEMSELBEN AP und merkt
# es erst bei der Auswertung (im Test am 2026-08-22 genau so passiert). Abschalten geht
# weiter jederzeit ueber den Knopf.
curl -s -X POST --max-time 10 "http://127.0.0.1:3031/auto?an=1" >/dev/null 2>&1 \
&& echo "Gegen-AP-Automatik: EIN" \
|| echo "⚠️ Automatik konnte nicht eingeschaltet werden -- auf der Konsole nachholen!"
echo
echo "════════════════════════════════════════════════════════════"
echo " Konsole am Telefon oeffnen:"
# 🔴 Adresse vom Interface lesen, nicht hartkodieren (Fehler vom 2026-08-22: die angesagte
# IP gehoerte einem Geraet, das seit 22 h nicht mehr im Netz war).
ifconfig | awk '/^[a-z0-9]+:/{i=substr($1,1,length($1)-1)}
/inet /{if ($2 !~ /^127\.|^169\.254\./) printf " http://%s:3031/ (%s)\n", $2, i}'
echo
echo " 1) Auf dem Telefon einmal irgendwo tippen -> schaltet den Signalton frei"
echo " 2) Gegen-AP-Automatik laeuft bereits -> S22 folgt dem iPhone spiegelverkehrt"
echo " 3) Losgehen. Doppelton = beide angemeldet -> Raum antippen, weiter"
echo
echo " Lauf: $TP6_RUN_DIR"
echo "════════════════════════════════════════════════════════════"
echo
aufraeumen() {
echo
echo "Runde beendet. Aufraeumen …"
# 🔴 REIHENFOLGE: erst die Konsole toeten, dann den Pin loesen. Andersherum ist es ein
# Wettlauf, den man verliert -- die Automatik der noch laufenden Konsole sieht den
# geloesten Pin und setzt ihn binnen zwei Sekunden wieder. Am 2026-08-22 meldete der
# Aufraeumer brav "AP-Pin geloest", und danach standen die Regeln trotzdem am Core:
# das Telefon waere nach jeder Runde gepinnt geblieben.
[[ -n "$KONSOLE" ]] && kill "$KONSOLE" 2>/dev/null && echo " Konsole beendet."
# Muster bewusst ohne -e/-p: es gab beide Varianten, und die enge Fassung liess den
# Sampler stehen.
pkill -f 'sshpass.*10.40.99.1' 2>/dev/null
pkill -f 'tp6-monitor-core.sh' 2>/dev/null
sleep 1
bash docs/tp25-pin-s22.sh off >/dev/null 2>&1 && echo " AP-Pin geloest."
echo
echo "Auswertung:"
echo " python3 docs/tp25-gehweg-auswertung.py --dir $TP6_RUN_DIR"
}
trap aufraeumen EXIT
bash docs/tp25-walk-messung.sh