systemd services: midi-bridge, pd-synth-onboard, led-matrix-viz + install script

This commit is contained in:
2026-06-24 01:36:36 -07:00
parent f919af3d8b
commit 242c74236f
3 changed files with 70 additions and 36 deletions
+21 -18
View File
@@ -1,27 +1,30 @@
#!/bin/bash
# install.sh — Install system dependencies on the Uno Q
# Run this on the board: ssh arduino@uno-q.local 'bash -s' < install.sh
# install-services.sh — Deploy systemd services to board
set -euo pipefail
echo "[INSTALL] Updating packages..."
sudo apt update -qq
REPO="/home/arduino/uno-q-audio-synth"
SERVICES=(midi-bridge pd-synth-onboard led-matrix-viz)
echo "[INSTALL] Installing Pure Data..."
sudo apt install -y -qq puredata alsa-utils
for svc in "${SERVICES[@]}"; do
sudo cp "$REPO/system/$svc.service" /etc/systemd/system/
done
echo "[INSTALL] Installing USB gadget config..."
sudo cp system/configure-usb-audio.sh /usr/local/bin/
sudo chmod +x /usr/local/bin/configure-usb-audio.sh
sudo cp system/asound.conf /etc/asound.conf
# Fix UCM bug (must survive OS updates)
FILE=/usr/share/alsa/ucm2/codecs/qcom-lpass/rx-macro/HeadphoneEnableSeq.conf
if grep -q "RX HPH Mode" "$FILE" 2>/dev/null; then
sudo sed -i '/RX HPH Mode/d' "$FILE"
echo "[OK] UCM HeadphoneEnableSeq patched"
fi
echo "[INSTALL] Installing systemd services..."
sudo cp system/usb-gadget-audio.service /etc/systemd/system/
sudo cp system/pd-synth.service /etc/systemd/system/
sudo systemctl daemon-reload
echo "[INSTALL] Enabling services..."
sudo systemctl enable usb-gadget-audio
sudo systemctl enable pd-synth
# Stop/mask old conflicting services
sudo systemctl stop pd-synth pd-synth-auto pd-synth-i2s 2>/dev/null || true
sudo systemctl disable pd-synth pd-synth-auto pd-synth-i2s 2>/dev/null || true
sudo systemctl mask pd-synth pd-synth-auto pd-synth-i2s 2>/dev/null || true
echo "[INSTALL] Done. Reboot with: sudo reboot"
for svc in "${SERVICES[@]}"; do
sudo systemctl enable "$svc"
done
echo "[OK] Services installed and enabled"
+30 -18
View File
@@ -91,27 +91,46 @@ 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"
echo '[OK] Repo cloned' && \
chmod +x {{REPO_DIR}}/scripts/*.py {{REPO_DIR}}/scripts/*.sh && \
bash {{REPO_DIR}}/install.sh && \
echo '[OK] Services installed'"
@echo "[OK] Run: just deploy"
# Deploy: push local commits + git pull on board
# Deploy + reload services after git pull
deploy:
@git push origin HEAD 2>&1
@ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\
cd {{REPO_DIR}} && git pull && echo '[OK] Deployed'"
cd {{REPO_DIR}} && git pull && \
chmod +x scripts/*.py scripts/*.sh 2>/dev/null; \
echo '{{BOARD_PASS}}' | sudo -S systemctl daemon-reload && \
echo '{{BOARD_PASS}}' | sudo -S systemctl restart midi-bridge pd-synth-onboard led-matrix-viz && \
echo '[OK] Deployed + restarted'"
# 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'"
@ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo systemctl start pd-synth-onboard && echo '[OK] Synth started'"
# Stop synth
synth-stop:
@ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo killall pd 2>/dev/null; echo '[OK] Stopped'"
@ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo systemctl stop pd-synth-onboard && echo '[OK] Stopped'"
# Restart all services
synth-restart:
@ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\
sudo systemctl restart midi-bridge pd-synth-onboard led-matrix-viz && \
echo '[OK] All services restarted'"
# Show service status
status:
@ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\
echo '=== Pd ==='; pgrep -a pd | grep -v watchdog | grep -v kswapd || echo '(not running)'; \
echo '=== Services ==='; \
for svc in midi-bridge pd-synth-onboard led-matrix-viz; do \
echo -n \" \$svc: \"; systemctl is-active \$svc 2>/dev/null || echo 'inactive'; \
done; \
echo '=== Audio ==='; cat /proc/asound/cards; \
echo '=== Git ==='; cd {{REPO_DIR}} && git log --oneline -1"
# Enable midi-bridge service
enable-midi-bridge:
@@ -165,13 +184,6 @@ diag-led:
deploy-diag:
@scp {{SSH_OPTS}} scripts/diag.sh "{{BOARD_USER}}@{{BOARD_HOST}}:{{SYSTEM_DIR}}/bin/diag.sh"
# Show system status (quick)
status:
@ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\
cd {{REPO_DIR}} && git log --oneline -1; \
echo '---'; pgrep -a pd 2>/dev/null || echo 'Pd: not running'; \
echo '---'; cat /proc/asound/cards"
# Full deploy + restart synth
cycle: deploy synth-stop synth-onboard
+19
View File
@@ -0,0 +1,19 @@
[Unit]
Description=Pure Data Synth (Onboard PMIC Audio)
After=multi-user.target
Wants=midi-bridge.service
[Service]
Type=simple
User=arduino
ExecStartPre=/bin/sh -c 'systemctl --user stop pipewire.socket pipewire.service wireplumber 2>/dev/null; sleep 0.5'
ExecStart=/home/arduino/uno-q-audio-synth/scripts/start-synth.sh --onboard
ExecStop=/usr/bin/killall pd
WorkingDirectory=/home/arduino/uno-q-audio-synth
Restart=on-failure
RestartSec=3
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target