Viertes Analog-Profil neben den SM2135EH-Lampen: PWM-Kanaele R=PB13 (ch1), G=PB16 (ch2), B=PB15 (ch3) bei 800 Hz, PIN-belegt aus der Original-Firmware (qcl_build_config_lamp.h, HARDWARE_MOBL_LED_SHIELD). Kein CW/WW-Zweig: ct_min == ct_max ist das Erkennungszeichen fuer 'weiss = RGB-Mischung', nl_color.c gibt in diesem Fall alle drei Farbkanalgleich. Neues Bauziel in allen Skripten; test_release zaehlt Dateizahlen jetzt aus TARGETS statt hart 8/16.
78 lines
3.3 KiB
Bash
Executable File
78 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Baut Firmwareabzuege OHNE einkompilierte WLAN-Zugangsdaten: die Lampen starten damit
|
|
# im Onboarding-AP (ninlight-<mac4>), statt sich in ein fremdes WLAN einzuwaehlen.
|
|
#
|
|
# Aufruf: tools/build_nocreds.sh [ziel ...] (ohne Argumente: alle Ziele)
|
|
#
|
|
# Ergebnis: je Ziel ein Build-Verzeichnis unter $NINLIGHT_NOCREDS_BUILD_REL (Vorgabe
|
|
# "build-nocreds", relativ zum Repo-Wurzelverzeichnis) mit den ueblichen Artefakten
|
|
# (ninlight_<ziel>_gz.img, ninlight_<ziel>_ota.img, ...). Bewusst NICHT build/: die
|
|
# dortigen Abzuege sind die des Entwicklers - mit seinem WLAN - und bleiben unangetastet.
|
|
#
|
|
# Dieses Skript ist ausdruecklich zum Wiederverwenden da: tools/release.sh baut damit das
|
|
# Auslieferungsarchiv, und die Migrationsstation wird damit die Wahl "Lampe startet im
|
|
# Onboarding-AP" bedienen. Deshalb steht die Logik hier und nicht in release.sh.
|
|
#
|
|
# Umgebungsvariablen:
|
|
# NINLIGHT_DOCKER Build-Vorspann (Vorgabe tools/docker.sh); Tests stubben ihn
|
|
# NINLIGHT_NOCREDS_BUILD_REL Ausgabeverzeichnis relativ zur Repo-Wurzel
|
|
set -euo pipefail
|
|
|
|
ROOT=$(cd "$(dirname "$0")/.." && pwd)
|
|
DOCKER=${NINLIGHT_DOCKER:-$ROOT/tools/docker.sh}
|
|
BUILD_REL=${NINLIGHT_NOCREDS_BUILD_REL:-build-nocreds}
|
|
|
|
DEVICES=(evk e27_rgb e14_rgb gu10_rgb e27_cw e14_cw gu10_cw g95_cw ledshield_rgb)
|
|
if [ $# -gt 0 ]; then
|
|
TARGETS=("$@")
|
|
else
|
|
TARGETS=("${DEVICES[@]}")
|
|
fi
|
|
for t in "${TARGETS[@]}"; do
|
|
ok=0
|
|
for d in "${DEVICES[@]}"; do [ "$t" = "$d" ] && ok=1; done
|
|
[ "$ok" -eq 1 ] || { echo "Fehler: unbekanntes Ziel '$t' (bekannt: ${DEVICES[*]})" >&2; exit 1; }
|
|
done
|
|
|
|
# config.local.cmake wird in CMakeLists.txt mit gewoehnlichem set() eingebunden und
|
|
# SCHLAEGT damit jedes -D auf der Kommandozeile. Ein Bau ohne Zugangsdaten ist deshalb
|
|
# nur moeglich, wenn die Datei fuer die Dauer des Baus beiseite liegt. In ihr stehen die
|
|
# echte SSID, das WLAN-Passwort und das API-Token - sie muss auch dann zurueckkommen,
|
|
# wenn der Bau abbricht oder jemand Strg-C drueckt. Darum ein trap auf EXIT UND auf
|
|
# INT/TERM (EXIT allein laeuft bei einem Signal zwar auch, aber der Exit-Code soll das
|
|
# Signal widerspiegeln, statt als Erfolg durchzugehen).
|
|
LOCAL="$ROOT/config.local.cmake"
|
|
STASH_DIR=""
|
|
restore_local() {
|
|
[ -n "$STASH_DIR" ] || return 0
|
|
if [ -f "$STASH_DIR/config.local.cmake" ]; then
|
|
cp -p "$STASH_DIR/config.local.cmake" "$LOCAL" || {
|
|
echo "ACHTUNG: config.local.cmake konnte nicht zurueckgelegt werden - Kopie liegt unter $STASH_DIR" >&2
|
|
STASH_DIR=""
|
|
return 1
|
|
}
|
|
fi
|
|
rm -rf "$STASH_DIR"
|
|
STASH_DIR=""
|
|
}
|
|
if [ -f "$LOCAL" ]; then
|
|
STASH_DIR=$(mktemp -d)
|
|
cp -p "$LOCAL" "$STASH_DIR/config.local.cmake"
|
|
trap 'restore_local' EXIT
|
|
trap 'restore_local; trap - INT; kill -INT $$' INT
|
|
trap 'restore_local; exit 143' TERM
|
|
rm -f "$LOCAL"
|
|
echo "config.local.cmake liegt fuer diesen Bau beiseite (keine WLAN-Zugangsdaten im Abzug)"
|
|
fi
|
|
|
|
for t in "${TARGETS[@]}"; do
|
|
echo "== $t (ohne Zugangsdaten)"
|
|
# Relative Pfade, weil der Bau ueblicherweise im Container laeuft, der das Repo unter
|
|
# /work einhaengt - absolute Hostpfade gaebe es dort nicht.
|
|
"$DOCKER" cmake -S . -B "$BUILD_REL/$t" -G Ninja \
|
|
-DCMAKE_TOOLCHAIN_FILE=cmake/arm-none-eabi.cmake -DNINLIGHT_DEVICE="$t" >/dev/null
|
|
"$DOCKER" cmake --build "$BUILD_REL/$t"
|
|
done
|
|
|
|
echo "fertig - Abzuege ohne Zugangsdaten unter $ROOT/$BUILD_REL"
|