systemd services: midi-bridge, pd-synth-onboard, led-matrix-viz + install script
This commit is contained in:
+21
-18
@@ -1,27 +1,30 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# install.sh — Install system dependencies on the Uno Q
|
# install-services.sh — Deploy systemd services to board
|
||||||
# Run this on the board: ssh arduino@uno-q.local 'bash -s' < install.sh
|
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
echo "[INSTALL] Updating packages..."
|
REPO="/home/arduino/uno-q-audio-synth"
|
||||||
sudo apt update -qq
|
SERVICES=(midi-bridge pd-synth-onboard led-matrix-viz)
|
||||||
|
|
||||||
echo "[INSTALL] Installing Pure Data..."
|
for svc in "${SERVICES[@]}"; do
|
||||||
sudo apt install -y -qq puredata alsa-utils
|
sudo cp "$REPO/system/$svc.service" /etc/systemd/system/
|
||||||
|
done
|
||||||
|
|
||||||
echo "[INSTALL] Installing USB gadget config..."
|
# Fix UCM bug (must survive OS updates)
|
||||||
sudo cp system/configure-usb-audio.sh /usr/local/bin/
|
FILE=/usr/share/alsa/ucm2/codecs/qcom-lpass/rx-macro/HeadphoneEnableSeq.conf
|
||||||
sudo chmod +x /usr/local/bin/configure-usb-audio.sh
|
if grep -q "RX HPH Mode" "$FILE" 2>/dev/null; then
|
||||||
sudo cp system/asound.conf /etc/asound.conf
|
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
|
sudo systemctl daemon-reload
|
||||||
|
|
||||||
echo "[INSTALL] Enabling services..."
|
# Stop/mask old conflicting services
|
||||||
sudo systemctl enable usb-gadget-audio
|
sudo systemctl stop pd-synth pd-synth-auto pd-synth-i2s 2>/dev/null || true
|
||||||
sudo systemctl enable pd-synth
|
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"
|
||||||
|
|||||||
@@ -91,27 +91,46 @@ install:
|
|||||||
@ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\
|
@ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\
|
||||||
rm -rf {{REPO_DIR}} 2>/dev/null; \
|
rm -rf {{REPO_DIR}} 2>/dev/null; \
|
||||||
git clone {{REPO_URL}} {{REPO_DIR}} && \
|
git clone {{REPO_URL}} {{REPO_DIR}} && \
|
||||||
echo '[OK] Repo cloned to {{REPO_DIR}}'"
|
echo '[OK] Repo cloned' && \
|
||||||
@echo "[OK] Repo installed. Run: just deploy"
|
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:
|
deploy:
|
||||||
@git push origin HEAD 2>&1
|
@git push origin HEAD 2>&1
|
||||||
@ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\
|
@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)
|
# Start synth (onboard audio)
|
||||||
synth-onboard:
|
synth-onboard:
|
||||||
@ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "\
|
@ssh {{SSH_OPTS}} "{{BOARD_USER}}@{{BOARD_HOST}}" "sudo systemctl start pd-synth-onboard && echo '[OK] Synth started'"
|
||||||
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'"
|
|
||||||
|
|
||||||
# Stop synth
|
# Stop synth
|
||||||
synth-stop:
|
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 service
|
||||||
enable-midi-bridge:
|
enable-midi-bridge:
|
||||||
@@ -165,13 +184,6 @@ diag-led:
|
|||||||
deploy-diag:
|
deploy-diag:
|
||||||
@scp {{SSH_OPTS}} scripts/diag.sh "{{BOARD_USER}}@{{BOARD_HOST}}:{{SYSTEM_DIR}}/bin/diag.sh"
|
@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
|
# Full deploy + restart synth
|
||||||
cycle: deploy synth-stop synth-onboard
|
cycle: deploy synth-stop synth-onboard
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user