Основное (наша работа в этой сессии): - Переименование «subserver» → «homeserver» по всему проекту: основной ESP32-скетч (папка shine_subserver_ui → shine_homeserver_ui, .ino, flash-скрипт, режим burn.sh homeserver-ui), скетч lvgl_nav_minimal_test (ключ homeserver.key:<имя>), spec-доки reference/*, формат PDA (терминология session_type=100 «Homeserver пользователя»), константа SESSION_TYPE_HOMESERVER в JS и Rust (значение 100 не менялось, формат не затронут), pending/future доки, AGENTS.md, DAO-док. Сохранены отдельный lvgl_subserver_touch_test и историческая пометка о рендейме в DERIVATION.md. - Новый источник истины по деривации ключей: Dev_Docs/Keys/DERIVATION.md (Argon2id-секрет из пароля, формула Ed25519(SHA-256(base64(secret)|suffix)), суффиксы root/bch/dev/homeserver.key, Solana-ключ = dev.key). Уточнены роли root (главный/master) и dev (пополняемый кошелёк) в Dev_Docs/Keys/README.md. - UI: убран легаси-путь пустого пароля (derivePasswordSeed и др.), deriveMasterSecretFromPassword бросает ошибку на пустом пароле, register-view блокирует пустой пароль; экран пополнения переведён на канонический device-адрес из preGeneratedKeyBundle (удалён расходящийся deriveWalletFromPassword). Включены также параллельные правки Solana-аудита №3 (были в рабочем дереве, переплетены в lib.rs): - shine_users: defense-in-depth «строгий список аккаунтов» (require!(it.next().is_none())) в init/update economy config и create/update user PDA, плюс описание в doc/programs/shine_users.md; - Dev_Docs/audit/Solana-audit-3-by-Claude-12июня2026.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
95 lines
3.4 KiB
Bash
Executable File
95 lines
3.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
BOARD_DIR="$(cd "${ROOT_DIR}/.." && pwd)"
|
|
DEMO_BASE="${BOARD_DIR}/official-demo/examples/Arduino-v3.3.5"
|
|
MODE="${1:-widgets}"
|
|
PORT="${PORT:-}"
|
|
FQBN="${FQBN:-esp32:esp32:esp32s3:USBMode=hwcdc,CDCOnBoot=cdc,UploadSpeed=921600,CPUFreq=240,FlashMode=dio,FlashSize=16M,PartitionScheme=app3M_fat9M_16MB,PSRAM=opi}"
|
|
BUILD_DIR="${BUILD_DIR:-${ROOT_DIR}/.arduino-build/build-${MODE}}"
|
|
OUT_DIR="${OUT_DIR:-${ROOT_DIR}/.arduino-build/out-${MODE}}"
|
|
|
|
detect_port() {
|
|
local detected
|
|
detected="$(arduino-cli board list 2>/dev/null | awk '/\/dev\/tty(ACM|USB)/ {print $1; exit}')"
|
|
if [[ -n "${detected}" ]]; then
|
|
echo "${detected}"
|
|
return 0
|
|
fi
|
|
|
|
for candidate in /dev/ttyACM* /dev/ttyUSB*; do
|
|
if [[ -e "${candidate}" ]]; then
|
|
echo "${candidate}"
|
|
return 0
|
|
fi
|
|
done
|
|
|
|
return 1
|
|
}
|
|
|
|
case "${MODE}" in
|
|
hello) SKETCH_DIR="${DEMO_BASE}/examples/01_HelloWorld" ;;
|
|
widgets) SKETCH_DIR="${DEMO_BASE}/examples/05_LVGL_Widgets" ;;
|
|
audio) SKETCH_DIR="${DEMO_BASE}/examples/07_ES8311" ;;
|
|
simple) SKETCH_DIR="${ROOT_DIR}/simple_av_test" ;;
|
|
argon2) SKETCH_DIR="${ROOT_DIR}/argon2_sd_test" ;;
|
|
homeserver-ui) SKETCH_DIR="${ROOT_DIR}/shine_homeserver_ui" ;;
|
|
text-test) SKETCH_DIR="${ROOT_DIR}/text_render_test" ;;
|
|
gfx-text-test) SKETCH_DIR="${ROOT_DIR}/test_sketches/gfx_text_render_test" ;;
|
|
gfx-layout-test) SKETCH_DIR="${ROOT_DIR}/test_sketches/gfx_button_layout_test" ;;
|
|
lvgl-basic-test) SKETCH_DIR="${ROOT_DIR}/test_sketches/lvgl_basic_test" ;;
|
|
lvgl-interaction-test) SKETCH_DIR="${ROOT_DIR}/test_sketches/lvgl_interaction_test" ;;
|
|
lvgl-touch-debug-test) SKETCH_DIR="${ROOT_DIR}/test_sketches/lvgl_touch_debug_test" ;;
|
|
lvgl-official-based-test) SKETCH_DIR="${ROOT_DIR}/test_sketches/lvgl_official_based_test" ;;
|
|
lvgl-subserver-touch-test) SKETCH_DIR="${ROOT_DIR}/test_sketches/lvgl_subserver_touch_test" ;;
|
|
lvgl-russian-font-test) SKETCH_DIR="${ROOT_DIR}/test_sketches/lvgl_russian_font_test" ;;
|
|
lvgl-nav-minimal-test) SKETCH_DIR="${ROOT_DIR}/test_sketches/lvgl_nav_minimal_test" ;;
|
|
*)
|
|
echo "Unknown mode: ${MODE}" >&2
|
|
echo "Use one of: hello, widgets, audio, simple, argon2, homeserver-ui, text-test, gfx-text-test, gfx-layout-test, lvgl-basic-test, lvgl-interaction-test, lvgl-touch-debug-test, lvgl-official-based-test, lvgl-subserver-touch-test, lvgl-russian-font-test, lvgl-nav-minimal-test" >&2
|
|
exit 2
|
|
;;
|
|
esac
|
|
|
|
if [[ -z "${PORT}" ]]; then
|
|
if ! PORT="$(detect_port)"; then
|
|
echo "Failed to auto-detect ESP32 port. Set PORT=/dev/ttyACM0 ./burn.sh ${MODE}" >&2
|
|
exit 3
|
|
fi
|
|
fi
|
|
|
|
echo "== Mode: ${MODE}"
|
|
echo "== Sketch: ${SKETCH_DIR}"
|
|
echo "== Port: ${PORT}"
|
|
echo "== FQBN: ${FQBN}"
|
|
|
|
mkdir -p "${BUILD_DIR}" "${OUT_DIR}"
|
|
|
|
compile_args=(
|
|
--fqbn "${FQBN}"
|
|
--build-path "${BUILD_DIR}"
|
|
--output-dir "${OUT_DIR}"
|
|
--library "${DEMO_BASE}/libraries/GFX_Library_for_Arduino"
|
|
--library "${DEMO_BASE}/libraries/SensorLib"
|
|
--library "${DEMO_BASE}/libraries/XPowersLib"
|
|
--library "${DEMO_BASE}/libraries/lvgl"
|
|
--library "${DEMO_BASE}/libraries/Mylibrary"
|
|
"${SKETCH_DIR}"
|
|
)
|
|
|
|
echo "== Compile: fast incremental build"
|
|
if ! arduino-cli compile "${compile_args[@]}"; then
|
|
echo "== Compile: fast build failed, retrying clean build"
|
|
arduino-cli compile --clean "${compile_args[@]}"
|
|
fi
|
|
|
|
arduino-cli upload \
|
|
-p "${PORT}" \
|
|
--fqbn "${FQBN}" \
|
|
--input-dir "${OUT_DIR}" \
|
|
"${SKETCH_DIR}"
|
|
|
|
echo
|
|
echo "== Done."
|