ESP32: временно отключить PIN-вход в subserver UI

This commit is contained in:
AidarKC 2026-06-08 12:29:47 +04:00
parent b9185e761b
commit 66975862f7
4 changed files with 21 additions and 14 deletions

View File

@ -1,12 +1,12 @@
# ESP32 UI-прототип сабсервера SHiNE # ESP32 UI-прототип сабсервера SHiNE
- краткое описание фичи: - краткое описание фичи:
для `Waveshare ESP32-S3-Touch-AMOLED-2.16` добавлен новый интерактивный UI-скетч сабсервера `SHiNE` с хранением данных в `NVS`, PIN-блокировкой, настройками `Wi-Fi`, настройками серверов, кошельком, экраном `QR/URI`, живой Solana-регистрацией и экраном входящих запросов. В текущей версии `Wi-Fi` подключается реально, адреса `API/RPC/WS` проверяются реально, баланс кошелька читается из `Solana RPC`, а регистрация отправляет `create_user_pda` в `shine_users`. для `Waveshare ESP32-S3-Touch-AMOLED-2.16` добавлен новый интерактивный UI-скетч сабсервера `SHiNE` с хранением данных в `NVS`, настройками `Wi-Fi`, настройками серверов, кошельком, экраном `QR/URI`, живой Solana-регистрацией и экраном входящих запросов. Логика PIN в коде сохранена, но вход по PIN во временной сборке отключён, чтобы не блокировать проверку остальных экранов. В текущей версии `Wi-Fi` подключается реально, адреса `API/RPC/WS` проверяются реально, баланс кошелька читается из `Solana RPC`, а регистрация отправляет `create_user_pda` в `shine_users`.
- что именно проверять: - что именно проверять:
1. Прошить режим `subserver-ui` и дождаться старта экрана блокировки. 1. Прошить режим `subserver-ui` и дождаться открытия главного экрана без PIN.
2. Проверить, что русский текст в заголовках, кнопках и статусах отображается корректно, без кракозябр и замены на английский. 2. Проверить, что русский текст в заголовках, кнопках и статусах отображается корректно, без кракозябр и замены на английский.
3. Ввести PIN `1234` и убедиться, что открывается главный экран. 3. Открыть `Настройки` и убедиться, что показывается пометка о временно отключённом входе по PIN.
4. Открыть `Подключение -> Wi-Fi`, ввести `SSID` и пароль, нажать `Проверить`, дождаться реального подключения, затем перезагрузить устройство и проверить, что значения сохранились. 4. Открыть `Подключение -> Wi-Fi`, ввести `SSID` и пароль, нажать `Проверить`, дождаться реального подключения, затем перезагрузить устройство и проверить, что значения сохранились.
5. Открыть `Подключение -> Серверы`, проверить или изменить `API/RPC/WS`, нажать `Проверить` и убедиться, что показываются реальные статусы доступности, затем перезагрузить устройство и проверить сохранение значений. 5. Открыть `Подключение -> Серверы`, проверить или изменить `API/RPC/WS`, нажать `Проверить` и убедиться, что показываются реальные статусы доступности, затем перезагрузить устройство и проверить сохранение значений.
6. Открыть `Аккаунт`, ввести логин, имя сабсервера и нажать `Сгенерировать`; проверить, что появились секрет и адрес кошелька, а после перезагрузки они не исчезают. 6. Открыть `Аккаунт`, ввести логин, имя сабсервера и нажать `Сгенерировать`; проверить, что появились секрет и адрес кошелька, а после перезагрузки они не исчезают.
@ -16,7 +16,7 @@
10. Выполнить регистрацию и убедиться, что статус меняется на `Сабсервер активен`, онлайн-статус становится активным, а на экране появляются краткие отпечатки `PDA/TX`. 10. Выполнить регистрацию и убедиться, что статус меняется на `Сабсервер активен`, онлайн-статус становится активным, а на экране появляются краткие отпечатки `PDA/TX`.
11. После регистрации проверить через `Solana`/UI проекта, что `user_pda` для этого логина реально создана и соответствует `device`-адресу устройства. 11. После регистрации проверить через `Solana`/UI проекта, что `user_pda` для этого логина реально создана и соответствует `device`-адресу устройства.
12. Открыть `Запросы`, поочерёдно открыть оба демонстрационных запроса и проверить, что кнопки `Разрешить` и `Отклонить` меняют их статус. 12. Открыть `Запросы`, поочерёдно открыть оба демонстрационных запроса и проверить, что кнопки `Разрешить` и `Отклонить` меняют их статус.
13. Открыть `Настройки`, сменить PIN, затем заблокировать/перезагрузить устройство и проверить вход с новым PIN. 13. При необходимости открыть `Настройки -> Сменить PIN` и убедиться, что новый PIN сохраняется, хотя вход по PIN временно не используется на старте.
14. Выполнить `Полный сброс` и убедиться, что все поля, секрет, баланс, онлайн и регистрация очищаются. 14. Выполнить `Полный сброс` и убедиться, что все поля, секрет, баланс, онлайн и регистрация очищаются.
- ожидаемый результат: - ожидаемый результат:

View File

@ -26,7 +26,7 @@
- проверка обязательных условий перед регистрацией; - проверка обязательных условий перед регистрацией;
- живая on-chain регистрация серверного `user_pda` в `shine_users` через `device key` устройства; - живая on-chain регистрация серверного `user_pda` в `shine_users` через `device key` устройства;
- прототип входящих запросов с подтверждением и отклонением; - прототип входящих запросов с подтверждением и отклонением;
- PIN-блокировка; - PIN-блокировка (в текущей временной сборке вход по PIN отключён, устройство открывает `HOME` сразу после старта);
- базовые настройки, статус и главный экран; - базовые настройки, статус и главный экран;
- сохранение `PDA` и `tx signature` после успешной регистрации. - сохранение `PDA` и `tx signature` после успешной регистрации.
@ -117,8 +117,8 @@
Назначение: Назначение:
- блокировка устройства после запуска; - экран блокировки предусмотрен в UI, но в текущей временной сборке после запуска пропускается;
- вход по PIN. - вход по PIN временно отключён для отладки остальных экранов.
Отображается: Отображается:
@ -131,7 +131,8 @@
Поведение: Поведение:
- если PIN введён верно, открывается `HOME`; - если PIN введён верно, открывается `HOME`;
- если PIN неверный, показывается ошибка `Неверный PIN`. - если PIN неверный, показывается ошибка `Неверный PIN`;
- в текущей временной сборке этот экран не показывается автоматически при старте.
## Экран HOME ## Экран HOME
@ -424,7 +425,7 @@ QR должен быть сканируемым, а не декоративны
Ожидаемый путь пользователя: Ожидаемый путь пользователя:
1. разблокировать устройство PIN-кодом; 1. открыть устройство сразу после старта; экран PIN временно не требуется;
2. открыть `Подключение -> Wi-Fi`; 2. открыть `Подключение -> Wi-Fi`;
3. ввести `SSID` и пароль, нажать `Проверить`; 3. ввести `SSID` и пароль, нажать `Проверить`;
4. открыть `Подключение -> Серверы`; 4. открыть `Подключение -> Серверы`;
@ -466,7 +467,7 @@ QR должен быть сканируемым, а не декоративны
Минимально нужно проверить: Минимально нужно проверить:
1. устройство загружается и показывает экран блокировки; 1. устройство загружается и сразу открывает `HOME`; экран блокировки временно отключён;
2. русский текст отображается без кракозябр; 2. русский текст отображается без кракозябр;
3. ввод по экранной клавиатуре работает; 3. ввод по экранной клавиатуре работает;
4. после перезагрузки сохранённые поля остаются в памяти; 4. после перезагрузки сохранённые поля остаются в памяти;

View File

@ -200,7 +200,7 @@ struct RuntimeNetState {
int32_t rssi; int32_t rssi;
}; };
static ScreenId gScreen = SCR_LOCK; static ScreenId gScreen = SCR_HOME;
static ScreenId gPrevScreen = SCR_HOME; static ScreenId gPrevScreen = SCR_HOME;
static EditTarget gEditTarget = EDIT_NONE; static EditTarget gEditTarget = EDIT_NONE;
static ConfirmTarget gConfirmTarget = CONFIRM_NONE; static ConfirmTarget gConfirmTarget = CONFIRM_NONE;
@ -252,6 +252,7 @@ static const uint8_t kBlockTypeServerProfile = 30;
static const uint8_t kBlockTypeAccessServers = 40; static const uint8_t kBlockTypeAccessServers = 40;
static const uint8_t kBlockTypeSessions = 50; static const uint8_t kBlockTypeSessions = 50;
static const uint8_t kBlockTypeTrustedState = 70; static const uint8_t kBlockTypeTrustedState = 70;
static const bool kPinLockEnabled = false;
static const char *KB_ALPHA[4] = { static const char *KB_ALPHA[4] = {
"qwertyuiop", "qwertyuiop",
@ -1901,7 +1902,7 @@ static void drawSettingsScreen() {
drawTopBar("Настройки"); drawTopBar("Настройки");
drawPanel(20, 92, 440, 176, C_PANEL, C_BORDER, 16); drawPanel(20, 92, 440, 176, C_PANEL, C_BORDER, 16);
drawText(36, 122, "PIN: " + repeatChar('*', gData.pin.length()), C_TEXT); drawText(36, 122, "PIN: " + repeatChar('*', gData.pin.length()), C_TEXT);
drawText(36, 152, "Онлайн после старта: " + boolText(gData.online), C_TEXT); drawText(36, 152, String("Вход по PIN: ") + (kPinLockEnabled ? "активен" : "временно отключён"), kPinLockEnabled ? C_TEXT : C_WARN);
drawText(36, 182, "Русский UI: активен", C_ACCENT); drawText(36, 182, "Русский UI: активен", C_ACCENT);
drawWrappedText(36, 214, 48, 16, "Русский текст рисуется через UTF-8 и кириллический U8g2-шрифт. Это обязательная часть прототипа.", C_MUTE, (const uint8_t *)FONT_SMALL); drawWrappedText(36, 214, 48, 16, "Русский текст рисуется через UTF-8 и кириллический U8g2-шрифт. Это обязательная часть прототипа.", C_MUTE, (const uint8_t *)FONT_SMALL);
addButton(20, 286, 212, 48, ACT_CHANGE_PIN, "Сменить PIN"); addButton(20, 286, 212, 48, ACT_CHANGE_PIN, "Сменить PIN");
@ -2432,6 +2433,11 @@ void setup() {
gPrefs.begin("shine-ui", false); gPrefs.begin("shine-ui", false);
loadData(); loadData();
if (!kPinLockEnabled) {
gScreen = SCR_HOME;
gPrevScreen = SCR_HOME;
gLockBuffer = "";
}
syncWifiRuntimeState(); syncWifiRuntimeState();
if (WiFi.status() != WL_CONNECTED) { if (WiFi.status() != WL_CONNECTED) {
gData.online = false; gData.online = false;

View File

@ -1,2 +1,2 @@
client.version=1.2.138 client.version=1.2.139
server.version=1.2.130 server.version=1.2.131