add prometheus exporter + test suite
- prometheus-exporter.py: stdlib-only HTTP metrics on :9090/metrics - Exposes: ALSA status, hw_ptr rate, service health, mixer controls - MIDI counters: notes_on, notes_off, errors - test-unit.py: 10-test suite covering full MIDI→Pd→Audio pipeline - test-tone.pd, test-midi-log.pd: minimal debug patches - systemd service for exporter - install.sh/deploy updated to include exporter
This commit is contained in:
Executable
+61
@@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env bash
|
||||
# test-e2e.sh — End-to-end: send MIDI note → Pd → audio output
|
||||
# Usage: ./scripts/test-e2e.sh [board_ip] [note] [duration]
|
||||
set -euo pipefail
|
||||
|
||||
BOARD="${1:-192.168.9.167}"
|
||||
NOTE="${2:-60}"
|
||||
DURATION="${3:-3}"
|
||||
SSH_KEY="/home/david/.ssh/unoq_deploy_key"
|
||||
SSH_OPTS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i $SSH_KEY"
|
||||
|
||||
echo "=== End-to-End Test: MIDI → Pd → Audio ==="
|
||||
echo "Board: $BOARD"
|
||||
echo "Note: $NOTE, Duration: ${DURATION}s"
|
||||
|
||||
# 1. Check Pd is running
|
||||
echo ""
|
||||
echo "--- Step 1: Verify Pd is running ---"
|
||||
PID=$(ssh $SSH_OPTS "arduino@$BOARD" "pgrep -f 'pd.*synth.pd' | head -1 || true")
|
||||
if [ -z "$PID" ]; then
|
||||
echo "[FAIL] Pd is not running!"
|
||||
exit 1
|
||||
fi
|
||||
echo "[OK] Pd running (PID: $PID)"
|
||||
|
||||
# 2. Check audio device status before
|
||||
echo ""
|
||||
echo "--- Step 2: ALSA status before MIDI ---"
|
||||
ssh $SSH_OPTS "arduino@$BOARD" "cat /proc/asound/card0/pcm0p/sub0/status 2>/dev/null || echo 'No status'"
|
||||
|
||||
# 3. Send MIDI note-on
|
||||
echo ""
|
||||
echo "--- Step 3: Send MIDI note-on ---"
|
||||
python3 -c "import socket; s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM); s.sendto(b'midi 144 $NOTE 100;', ('$BOARD', 8081)); s.close()"
|
||||
echo "[OK] Note-on sent"
|
||||
|
||||
# 4. Monitor audio device during note
|
||||
echo ""
|
||||
echo "--- Step 4: Monitor ALSA during note (${DURATION}s) ---"
|
||||
for i in $(seq 1 "$DURATION"); do
|
||||
STATUS=$(ssh $SSH_OPTS "arduino@$BOARD" "cat /proc/asound/card0/pcm0p/sub0/status 2>/dev/null | head -1 || echo 'unknown'")
|
||||
echo " [${i}/${DURATION}s] $STATUS"
|
||||
sleep 1
|
||||
done
|
||||
|
||||
# 5. Send note-off
|
||||
echo ""
|
||||
echo "--- Step 5: Send MIDI note-off ---"
|
||||
python3 -c "import socket; s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM); s.sendto(b'midi 128 $NOTE 0;', ('$BOARD', 8081)); s.close()"
|
||||
echo "[OK] Note-off sent"
|
||||
|
||||
# 6. Check ALSA after
|
||||
sleep 0.5
|
||||
echo ""
|
||||
echo "--- Step 6: ALSA status after note-off ---"
|
||||
ssh $SSH_OPTS "arduino@$BOARD" "cat /proc/asound/card0/pcm0p/sub0/status 2>/dev/null || echo 'No status'"
|
||||
|
||||
echo ""
|
||||
echo "=== E2E Test Complete ==="
|
||||
echo "If ALSA showed 'RUNNING' during step 4, the MIDI→Pd→Audio pipeline works."
|
||||
echo "Connect headphones to JMISC: GND=35, HPH_L=36, HPH_R=38"
|
||||
Reference in New Issue
Block a user