#!/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