diff --git a/justfile b/justfile index bf4509b..3db2e43 100644 --- a/justfile +++ b/justfile @@ -80,148 +80,47 @@ factory-setup: echo " Run: just BOARD_HOST=$IP setup" # ───────────────────────────────────────────────────────── -# DEPLOY +# DEPLOY (git-based: commit+push locally, just deploy on board) # ───────────────────────────────────────────────────────── -# Copy Pd patch to board -deploy-patch: - #!/usr/bin/env bash - set -e - SCP_OPTS="{{SSH_OPTS}}" - echo "[DEPLOY] Patching to {{BOARD_USER}}@{{BOARD_HOST}}:{{PD_DIR}}" - ssh $SCP_OPTS "{{BOARD_USER}}@{{BOARD_HOST}}" "mkdir -p {{PD_DIR}}" - scp $SCP_OPTS pd/synth.pd "{{BOARD_USER}}@{{BOARD_HOST}}:{{PD_DIR}}/" +REPO_DIR := "/home/" + BOARD_USER + "/uno-q-audio-synth" +REPO_URL := "https://git.notsosm.art/david/uno-q-audio-synth.git" -# Copy system config files + scripts to board -deploy-system: - #!/usr/bin/env bash - set -e - SCP_OPTS="{{SSH_OPTS}}" - echo "[DEPLOY] System config to {{BOARD_USER}}@{{BOARD_HOST}}" - for script in configure-usb-audio.sh configure-usb-host.sh detect-usb-role.sh detect-i2s-device.sh on-usb-role-change.sh; do - scp $SCP_OPTS "system/$script" "{{BOARD_USER}}@{{BOARD_HOST}}:{{SYSTEM_DIR}}/bin/" - done - ssh $SCP_OPTS "{{BOARD_USER}}@{{BOARD_HOST}}" 'echo "{{BOARD_PASS}}" | sudo -S chmod +x {{SYSTEM_DIR}}/bin/configure-usb-*.sh {{SYSTEM_DIR}}/bin/detect-*.sh {{SYSTEM_DIR}}/bin/on-usb-role-change.sh' - scp $SCP_OPTS system/asound.conf "{{BOARD_USER}}@{{BOARD_HOST}}:/tmp/" - scp $SCP_OPTS system/asound-i2s.conf "{{BOARD_USER}}@{{BOARD_HOST}}:/tmp/" - ssh $SCP_OPTS "{{BOARD_USER}}@{{BOARD_HOST}}" 'echo "{{BOARD_PASS}}" | sudo -S mv /tmp/asound.conf /etc/asound.conf && echo "{{BOARD_PASS}}" | sudo -S mv /tmp/asound-i2s.conf /etc/asound-i2s.conf' - scp $SCP_OPTS scripts/start-synth.sh "{{BOARD_USER}}@{{BOARD_HOST}}:{{SYSTEM_DIR}}/bin/" - ssh $SCP_OPTS "{{BOARD_USER}}@{{BOARD_HOST}}" 'echo "{{BOARD_PASS}}" | sudo -S chmod +x {{SYSTEM_DIR}}/bin/start-synth.sh' +# First-time install: clone repo + install services + fix UCM +install: + @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\ + rm -rf {{REPO_DIR}} 2>/dev/null; \ + git clone {{REPO_URL}} {{REPO_DIR}} && \ + echo '[OK] Repo cloned to {{REPO_DIR}}'" + @echo "[OK] Repo installed. Run: just deploy" -# Deploy everything -deploy: deploy-patch deploy-system - @echo "[OK] All files deployed" +# Deploy: push local commits + git pull on board +deploy: + @git push origin HEAD 2>&1 + @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\ + cd {{REPO_DIR}} && git pull && echo '[OK] Deployed'" -# Deploy midi-bridge script and service to board -deploy-midi-bridge: - #!/usr/bin/env bash - set -e - SCP_OPTS="{{SSH_OPTS}}" - echo "[DEPLOY] midi-bridge to {{BOARD_USER}}@{{BOARD_HOST}}" - scp $SCP_OPTS scripts/midi-bridge.py "{{BOARD_USER}}@{{BOARD_HOST}}:/tmp/" - ssh $SCP_OPTS "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo mv /tmp/midi-bridge.py {{SYSTEM_DIR}}/bin/ && sudo chmod +x {{SYSTEM_DIR}}/bin/midi-bridge.py" - scp $SCP_OPTS system/midi-bridge.service "{{BOARD_USER}}@{{BOARD_HOST}}:/tmp/" - ssh $SCP_OPTS "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo mv /tmp/midi-bridge.service /etc/systemd/system/ && sudo systemctl daemon-reload" - echo "[OK] midi-bridge deployed" +# Start synth (onboard audio) +synth-onboard: + @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\ + sudo killall pd 2>/dev/null; sleep 0.5; \ + echo '{{BOARD_PASS}}' | sudo -S sed -i '/RX HPH Mode/d' /usr/share/alsa/ucm2/codecs/qcom-lpass/rx-macro/HeadphoneEnableSeq.conf 2>/dev/null; \ + nohup {{REPO_DIR}}/scripts/start-synth.sh --onboard > /tmp/synth.log 2>&1 & \ + sleep 2; \ + pgrep -x pd >/dev/null && echo '[OK] Synth running (onboard)' || echo '[FAIL] Check /tmp/synth.log'" -# Deploy LED matrix visualization script and service -deploy-led-matrix-viz: - #!/usr/bin/env bash - set -e - SCP_OPTS="{{SSH_OPTS}}" - echo "[DEPLOY] led-matrix-viz to {{BOARD_USER}}@{{BOARD_HOST}}" - scp $SCP_OPTS scripts/led-matrix-viz.py "{{BOARD_USER}}@{{BOARD_HOST}}:/tmp/" - ssh $SCP_OPTS "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo mv /tmp/led-matrix-viz.py {{SYSTEM_DIR}}/bin/ && sudo chmod +x {{SYSTEM_DIR}}/bin/led-matrix-viz.py" - scp $SCP_OPTS system/led-matrix-viz.service "{{BOARD_USER}}@{{BOARD_HOST}}:/tmp/" - ssh $SCP_OPTS "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo mv /tmp/led-matrix-viz.service /etc/systemd/system/ && sudo systemctl daemon-reload" - echo "[OK] led-matrix-viz deployed" - -# Deploy everything (patch + system + midi-bridge + led-matrix-viz) -deploy-all: deploy deploy-midi-bridge deploy-led-matrix-viz - @echo "[OK] All files and scripts deployed" +# Stop synth +synth-stop: + @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo killall pd 2>/dev/null; echo '[OK] Stopped'" # Enable midi-bridge service enable-midi-bridge: @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo systemctl enable midi-bridge && echo '[OK] midi-bridge enabled'" -# Enable led-matrix-viz service -enable-led-matrix-viz: - @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo systemctl enable led-matrix-viz && echo '[OK] led-matrix-viz enabled'" - -# Start & enable host mode services (midi-bridge + led-matrix-viz) -enable-host-mode: deploy-midi-bridge deploy-led-matrix-viz - @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\ - sudo systemctl enable midi-bridge led-matrix-viz && \ - sudo systemctl start midi-bridge led-matrix-viz && \ - echo '[OK] Host mode services enabled and started'" - -# Install all systemd services -install-services: - #!/usr/bin/env bash - set -e - SCP_OPTS="{{SSH_OPTS}}" - echo "[INSTALL] Services on {{BOARD_USER}}@{{BOARD_HOST}}" - for svc in usb-role-detect usb-gadget-audio pd-synth-auto pd-synth detect-i2s-device pd-synth-i2s; do - scp $SCP_OPTS "system/${svc}.service" "{{BOARD_USER}}@{{BOARD_HOST}}:/tmp/" - done - scp $SCP_OPTS system/99-usb-role.rules "{{BOARD_USER}}@{{BOARD_HOST}}:/tmp/" - ssh $SCP_OPTS "{{BOARD_USER}}@{{BOARD_HOST}}" "\ - for svc in usb-role-detect usb-gadget-audio pd-synth-auto pd-synth detect-i2s-device pd-synth-i2s; do \ - sudo mv /tmp/\${svc}.service /etc/systemd/system/; \ - done && \ - sudo mv /tmp/99-usb-role.rules /etc/udev/rules.d/ && \ - sudo udevadm control --reload-rules && \ - sudo systemctl daemon-reload" - -# Enable auto-detect mode (default — works for both gadget and host) -enable-auto: install-services - @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\ - sudo systemctl disable usb-gadget-audio pd-synth detect-i2s-device pd-synth-i2s 2>/dev/null; \ - sudo systemctl enable usb-role-detect pd-synth-auto && \ - echo '[OK] Auto-detect mode enabled — reboot to apply'" - -# Enable fixed USB gadget mode (always acts as peripheral) -enable-gadget: install-services - @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\ - sudo systemctl disable usb-role-detect pd-synth-auto detect-i2s-device pd-synth-i2s 2>/dev/null; \ - sudo systemctl enable usb-gadget-audio pd-synth && \ - echo '[OK] USB gadget mode enabled — reboot to apply'" - -# Enable fixed I2S DAC mode -enable-i2s: install-services - @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\ - sudo systemctl disable usb-role-detect pd-synth-auto usb-gadget-audio pd-synth 2>/dev/null; \ - sudo systemctl enable detect-i2s-device pd-synth-i2s && \ - sudo cp /etc/asound-i2s.conf /etc/asound.conf && \ - echo '[OK] I2S DAC mode enabled — reboot to apply'" - -# Start Pd (auto-detect or whichever service is enabled) -start: - @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\ - sudo systemctl start pd-synth-auto 2>/dev/null || \ - sudo systemctl start pd-synth 2>/dev/null || \ - sudo systemctl start pd-synth-i2s 2>/dev/null || \ - echo '[ERROR] No Pd service found'" - -# Stop Pd -stop: - @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo killall pd 2>/dev/null; echo '[OK] Pd stopped'" - -# Restart Pd -restart: stop start - # Reboot board reboot: @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "echo '{{BOARD_PASS}}' | sudo -S reboot" -# Run Pd manually in auto-detect mode (for testing) -run-remote: - #!/usr/bin/env bash - set -e - SCP_OPTS="{{SSH_OPTS}}" - echo "[RUN] Starting Pd on {{BOARD_USER}}@{{BOARD_HOST}} (auto-detect)" - ssh $SCP_OPTS -t "{{BOARD_USER}}@{{BOARD_HOST}}" "killall pd 2>/dev/null; sudo {{SYSTEM_DIR}}/bin/start-synth.sh --auto --verbose" - # Fix UCM bug: removes nonexistent "RX HPH Mode" control # that prevents PipeWire from enabling the Headphones UCM device. # Must run once after OS updates or first install. @@ -266,37 +165,23 @@ diag-led: deploy-diag: @scp {{SSH_OPTS}} scripts/diag.sh "{{BOARD_USER}}@{{BOARD_HOST}}:{{SYSTEM_DIR}}/bin/diag.sh" -# Show system status (quick — uses diag.sh on board) +# Show system status (quick) status: - @scp {{SSH_OPTS}} -q scripts/diag.sh "{{BOARD_USER}}@{{BOARD_HOST}}:/tmp/diag.sh" && \ - ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "echo '{{BOARD_PASS}}' | sudo -S bash /tmp/diag.sh 2>/dev/null" | head -60 - -# Test MIDI input (list ALSA sequencer ports) -midi-test: - @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "aconnect -i -o -l" - -# Quick deploy and restart cycle -cycle: deploy-patch - @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo killall -s TERM pd 2>/dev/null; sleep 2; echo '[OK] Pd restarted with new patch'" - -# Tail Pd logs (auto-detect mode) -log: @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\ - for svc in pd-synth-auto pd-synth pd-synth-i2s; do \ - if systemctl is-active \$svc &>/dev/null; then \ - sudo journalctl -u \$svc -f -n 50; \ - exit 0; \ - fi; \ - done; \ - echo '[ERROR] No Pd service is running'" + cd {{REPO_DIR}} && git log --oneline -1; \ + echo '---'; pgrep -a pd 2>/dev/null || echo 'Pd: not running'; \ + echo '---'; cat /proc/asound/cards" -# Configure USB gadget manually -init-usb-audio: - @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo configure-usb-audio.sh start" +# Full deploy + restart synth +cycle: deploy synth-stop synth-onboard -# Full setup: deploy + enable auto-detect + reboot -setup: deploy enable-auto - @echo "[SETUP] Deployed and auto-detect enabled. Run 'just reboot' to start." +# Tail synth logs (last 50 lines) +log: + @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "tail -50 /tmp/synth.log" + +# Full setup: install repo on board + fix UCM + start synth +setup: install fix-ucm synth-onboard + @echo "[SETUP] Done. Synth is running on onboard audio." # ───────────────────────────────────────────────────────── # LOCAL TESTING (on your computer) @@ -416,39 +301,12 @@ midi-route: # Full diagnostic dump of the board diag: - #!/usr/bin/env bash - set -e - SCP_OPTS="{{SSH_OPTS}}" - HOST="{{BOARD_USER}}@{{BOARD_HOST}}" - - echo "==============================" - echo " Uno Q Audio Synth Diagnostics" - echo "==============================" - - # Push and run the diagnostic script on the board - scp $SCP_OPTS scripts/diag.sh "$HOST:/tmp/diag.sh" >/dev/null - ssh $SCP_OPTS "$HOST" "echo '{{BOARD_PASS}}' | sudo -S bash /tmp/diag.sh" - - echo "" - echo "--- USB bus (host-side) ---" - if command -v lsusb &>/dev/null; then - lsusb -d 2341:006a 2>/dev/null | awk '{print " " $0}' || echo " (no Uno Q device on host bus)" - lsusb -d 2341:006a -t 2>/dev/null | awk '{print " " $0}' - else - echo " (lsusb not available on host)" - fi - - echo "--- Host ALSA ---" - echo " Audio:" - aplay -l 2>/dev/null | grep -i "synth\|uno" | awk '{print " " $0}' || echo " (not found on host)" - echo " MIDI:" - aconnect -l 2>/dev/null | grep -i "synth\|uno\|midi" | awk '{print " " $0}' || echo " (not found on host)" - amidi -l 2>/dev/null | grep -i "synth\|uno" | awk '{print " " $0}' || echo " (not found on host)" - - echo "" - echo "==============================" - echo " Diagnostics Complete" - echo "==============================" + @ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\ + echo '=== Git ==='; cd {{REPO_DIR}} && git log --oneline -3; \ + echo '=== Pd ==='; pgrep -a pd 2>/dev/null || echo '(not running)'; \ + echo '=== Audio ==='; cat /proc/asound/cards; \ + echo '=== PipeWire ==='; wpctl status 2>&1 | head -10; \ + echo '=== USB ==='; lsusb 2>/dev/null" # Show kernel module info for custom modules modinfo: