memlnaut-nisps/scripts/firmware-common.sh

95 lines
2.4 KiB
Bash
Raw Normal View History

2026-04-15 17:32:32 +02:00
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
SKETCH_PATH="${MEMLNAUT_FIRMWARE_SKETCH:-$REPO_ROOT/MEMLNaut-NISPS.ino}"
SKETCH_NAME="$(basename "$SKETCH_PATH")"
BUILD_DIR="${MEMLNAUT_FIRMWARE_BUILD_DIR:-/tmp/memlnaut-firmware-build}"
UF2_PATH_DEFAULT="${MEMLNAUT_FIRMWARE_UF2:-$BUILD_DIR/${SKETCH_NAME}.uf2}"
FQBN="${MEMLNAUT_FIRMWARE_FQBN:-rp2040:rp2040:solderparty_rp2350_stamp_xl:opt=Optimize3}"
CXX20_BUILD_PROPERTY="${MEMLNAUT_FIRMWARE_CXX20_PROPERTY:-compiler.cpp.extra_flags=-std=gnu++20}"
ensure_arduino_cli() {
if ! command -v arduino-cli >/dev/null 2>&1; then
echo "error: arduino-cli is not installed or not on PATH" >&2
exit 1
fi
}
ensure_git() {
if ! command -v git >/dev/null 2>&1; then
echo "error: git is not installed or not on PATH" >&2
exit 1
fi
}
ensure_submodules_ready() {
ensure_git
local status
status="$(git -C "$REPO_ROOT" submodule status --recursive)"
if grep -qE '^[+-]' <<<"$status"; then
echo "error: submodules are not initialized or not at the recorded revision" >&2
echo "run: git submodule update --init --recursive" >&2
exit 1
fi
}
resolve_path() {
local path="$1"
if [[ "$path" = /* ]]; then
printf '%s\n' "$path"
else
printf '%s\n' "$(pwd)/$path"
fi
}
find_boot_mount() {
local candidates=(
"/run/media/${USER}/RP2350"
"/run/media/${USER}/RPI-RP2"
"/media/${USER}/RP2350"
"/media/${USER}/RPI-RP2"
"/mnt/RP2350"
"/mnt/RPI-RP2"
)
local candidate
for candidate in "${candidates[@]}"; do
if [[ -d "$candidate" ]]; then
printf '%s\n' "$candidate"
return 0
fi
done
local base
for base in "/run/media/${USER}" "/media/${USER}" "/mnt"; do
[[ -d "$base" ]] || continue
candidate="$(find "$base" -maxdepth 2 -type f -name INFO_UF2.TXT -printf '%h\n' 2>/dev/null | head -n 1 || true)"
if [[ -n "$candidate" ]]; then
printf '%s\n' "$candidate"
return 0
fi
done
return 1
}
assert_boot_mount() {
local mountpoint="$1"
if [[ ! -d "$mountpoint" ]]; then
echo "error: bootloader mount does not exist: $mountpoint" >&2
exit 1
fi
if [[ ! -f "$mountpoint/INFO_UF2.TXT" && ! -f "$mountpoint/INDEX.HTM" ]]; then
echo "error: $mountpoint does not look like an RP2040/RP2350 UF2 boot volume" >&2
exit 1
fi
}