diff --git a/exercises/204_established_identities/scripts/load_only.sh b/exercises/204_established_identities/scripts/load_only.sh new file mode 100755 index 0000000..dca0fc9 --- /dev/null +++ b/exercises/204_established_identities/scripts/load_only.sh @@ -0,0 +1,184 @@ +#!/bin/bash +# +# 20260602 ChatGPT +# $Id$ +# $HeadURL$ +# +# Example command lines: +# +# ./load_only.sh --tbeams "CY" +# ./load_only.sh --tbeams "DAN" +# ./load_only.sh --tbeams "BOB" +# ./load_only.sh --tbeams "BOB CY DAN" +# ./load_only.sh --tbeams "bob,cy,dan" +# +# If pio/platformio is not in PATH: +# +# ./load_only.sh --pio-bin "$HOME/pioenv/bin/platformio" --tbeams "DAN" +# + +set -euo pipefail + +EXERCISE="/usr/local/src/microreticulum/microReticulumTbeam/exercises/204_established_identities" +REMOTE_HOST="ryzdesk" +TBEAMS_RAW="" +PIO_BIN="" + +usage() { + cat <<'EOF' +Usage: + ./load_only.sh --tbeams "CY" + ./load_only.sh --tbeams "BOB CY DAN" + ./load_only.sh --tbeams "bob,cy,dan" + +Required: + --tbeams One or more of: AMY BOB CY DAN ED FLO GUY + +Optional: + --pio-bin Full path to pio/platformio executable + --exercise PlatformIO project directory + --remote Remote build host, default: ryzdesk +EOF +} + +while [ "$#" -gt 0 ] +do + case "$1" in + --tbeams) + shift + [ "$#" -gt 0 ] || { echo "ERROR: --tbeams requires a value" >&2; exit 1; } + TBEAMS_RAW="$1" + ;; + --pio-bin) + shift + [ "$#" -gt 0 ] || { echo "ERROR: --pio-bin requires a value" >&2; exit 1; } + PIO_BIN="$1" + ;; + --exercise) + shift + [ "$#" -gt 0 ] || { echo "ERROR: --exercise requires a value" >&2; exit 1; } + EXERCISE="$1" + ;; + --remote) + shift + [ "$#" -gt 0 ] || { echo "ERROR: --remote requires a value" >&2; exit 1; } + REMOTE_HOST="$1" + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "ERROR: unknown option: $1" >&2 + usage >&2 + exit 1 + ;; + esac + shift +done + +if [ -z "$TBEAMS_RAW" ]; then + echo "ERROR: missing required option --tbeams" >&2 + usage >&2 + exit 1 +fi + +if [ ! -d "$EXERCISE" ]; then + echo "ERROR: EXERCISE directory not found: $EXERCISE" >&2 + exit 1 +fi + +if [ ! -f "$EXERCISE/platformio.ini" ]; then + echo "ERROR: platformio.ini not found under: $EXERCISE" >&2 + exit 1 +fi + +if [ -n "$PIO_BIN" ]; then + if [ ! -x "$PIO_BIN" ]; then + echo "ERROR: --pio-bin is not executable: $PIO_BIN" >&2 + exit 1 + fi +else + if command -v pio >/dev/null 2>&1; then + PIO_BIN="$(command -v pio)" + elif command -v platformio >/dev/null 2>&1; then + PIO_BIN="$(command -v platformio)" + else + echo "ERROR: cannot find pio or platformio in PATH" >&2 + echo " Try: --pio-bin \"\$HOME/pioenv/bin/platformio\"" >&2 + exit 1 + fi +fi + +echo "EXERCISE: $EXERCISE" +echo "REMOTE_HOST: $REMOTE_HOST" +echo "PIO_BIN: $PIO_BIN" +echo + +# +# Accept either: +# "BOB CY DAN" +# "bob,cy,dan" +# +TBEAMS_NORMALIZED="$(echo "$TBEAMS_RAW" | tr ',' ' ')" + +for env_raw in $TBEAMS_NORMALIZED +do + env="$(echo "$env_raw" | tr '[:upper:]' '[:lower:]')" + ENV="$(echo "$env" | tr '[:lower:]' '[:upper:]')" + + case "$env" in + amy|bob|cy|dan|ed|flo|guy) + ;; + *) + echo "ERROR: invalid T-Beam name: $env_raw" >&2 + echo " Allowed names: AMY BOB CY DAN ED FLO GUY" >&2 + exit 1 + ;; + esac + + dev="/dev/ttyt${ENV}" + remote_build_dir="${EXERCISE}/.pio/build/${env}" + local_build_dir="${EXERCISE}/.pio/build/${env}" + + if [ ! -e "$dev" ]; then + echo "ERROR: expected device not found for $ENV: $dev" >&2 + exit 1 + fi + + if ! ssh "$REMOTE_HOST" "test -d '$remote_build_dir'"; then + echo "ERROR: remote build directory missing on ${REMOTE_HOST}: $remote_build_dir" >&2 + exit 1 + fi + + if [ ! -d "$local_build_dir" ]; then + echo "Creating missing local build directory: $local_build_dir" + mkdir -p "$local_build_dir" || { + echo "ERROR: failed to create $local_build_dir" >&2 + exit 1 + } + fi + + echo "===== copy built artifact tree for $env from $REMOTE_HOST =====" + rsync -a \ + "${REMOTE_HOST}:${remote_build_dir}/" \ + "${local_build_dir}/" + + if [ ! -f "${local_build_dir}/firmware.bin" ] && + [ ! -f "${local_build_dir}/firmware.elf" ]; then + echo "ERROR: copied build tree does not appear to contain firmware output:" >&2 + echo " $local_build_dir" >&2 + exit 1 + fi + + echo "===== loader-only upload $ENV on $dev =====" + "$PIO_BIN" run \ + -d "$EXERCISE" \ + -e "$env" \ + -t nobuild \ + -t upload \ + --upload-port "$dev" + + echo "===== finished loader-only upload for $ENV =====" + echo +done