justfile: git-based deploy, streamlined recipes
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user