Add portal web simulator, SPI bridges, and Pico firmware updates.

Bring the five-panel hex portal online with a browser 3D/schematic preview, Pi SPI backends, and renamed multi-panel Pico UDP firmware.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-30 14:54:51 +12:00
parent d5cab2efdf
commit 5094c7bcee
78 changed files with 62251 additions and 832 deletions

View File

@@ -1,116 +0,0 @@
#!/usr/bin/env bash
# Build and upload portal panel firmware over USB.
#
# Usage:
# ./scripts/panel_deploy.sh
# ./scripts/panel_deploy.sh --build-only
# ./scripts/panel_deploy.sh --upload-only
#
# Options:
# --build-only Build, do not upload
# --upload-only Upload existing build, skip compile
# --panel-id N Pass -DPANEL_ID_BUILD=N to cmake
# --no-dhcp Pass -DPORTAL_USE_DHCP=OFF to cmake
# --num-leds N Pass -DNUM_LEDS_BUILD=N to cmake
#
# Environment:
# PICO_SDK_PATH Path to pico-sdk (default: ~/pico/pico-sdk)
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
BUILD_DIR="${ROOT}/firmware/panel/build"
PICO_SDK_PATH="${PICO_SDK_PATH:-${HOME}/pico/pico-sdk}"
JOBS="$(nproc)"
DO_BUILD=1
DO_UPLOAD=1
CMAKE_EXTRA=()
die() {
echo "Error: $*" >&2
exit 1
}
usage() {
sed -n '2,16p' "$0" | sed 's/^# \{0,1\}//'
exit "${1:-0}"
}
while (($# > 0)); do
case "$1" in
--build-only)
DO_UPLOAD=0
shift
;;
--upload-only)
DO_BUILD=0
shift
;;
--panel-id)
[[ $# -ge 2 ]] || die "--panel-id requires a number"
CMAKE_EXTRA+=("-DPANEL_ID_BUILD=${2}")
shift 2
;;
--no-dhcp)
CMAKE_EXTRA+=("-DPORTAL_USE_DHCP=OFF")
shift
;;
--num-leds)
[[ $# -ge 2 ]] || die "--num-leds requires a number"
CMAKE_EXTRA+=("-DNUM_LEDS_BUILD=${2}")
shift 2
;;
-h|--help)
usage 0
;;
*)
die "unknown option: $1 (try --help)"
;;
esac
done
build_firmware() {
[[ -d "${PICO_SDK_PATH}" ]] || die "pico-sdk not found at ${PICO_SDK_PATH} (set PICO_SDK_PATH)"
command -v cmake >/dev/null || die "cmake is required"
command -v make >/dev/null || die "make is required"
export PICO_SDK_PATH
mkdir -p "${BUILD_DIR}"
echo "==> Building panel firmware in ${BUILD_DIR}"
if [[ ! -f "${BUILD_DIR}/CMakeCache.txt" ]]; then
cmake -S "${ROOT}/firmware/panel" -B "${BUILD_DIR}" "${CMAKE_EXTRA[@]}"
elif ((${#CMAKE_EXTRA[@]} > 0)); then
cmake -S "${ROOT}/firmware/panel" -B "${BUILD_DIR}" "${CMAKE_EXTRA[@]}"
fi
cmake --build "${BUILD_DIR}" -j "${JOBS}"
[[ -f "${BUILD_DIR}/panel.uf2" ]] || die "build did not produce panel.uf2"
echo "==> Build OK: ${BUILD_DIR}/panel.uf2"
}
upload_usb() {
command -v picotool >/dev/null || die "picotool not found (install from https://github.com/raspberrypi/picotool)"
if picotool version 2>&1 | grep -q 'without USB support'; then
die "picotool was built without USB support; rebuild with libusb-1.0-0-dev installed"
fi
echo "==> Uploading over USB"
if ! picotool load -x -f "${BUILD_DIR}/panel.uf2" 2>&1 | tee /tmp/picotool_load.log; then
die "picotool load failed"
fi
if ! grep -q 'Loading into Flash' /tmp/picotool_load.log; then
die "picotool did not flash (hold BOOTSEL, plug USB, retry)"
fi
echo "==> USB upload OK"
}
if ((DO_BUILD)); then
build_firmware
fi
if ((DO_UPLOAD)); then
[[ -f "${BUILD_DIR}/panel.uf2" ]] || die "panel.uf2 not found; run without --upload-only first"
upload_usb
fi