ESP32: временно отключить PIN-вход в subserver UI
This commit is contained in:
parent
b9185e761b
commit
66975862f7
@ -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. Выполнить `Полный сброс` и убедиться, что все поля, секрет, баланс, онлайн и регистрация очищаются.
|
||||||
|
|
||||||
- ожидаемый результат:
|
- ожидаемый результат:
|
||||||
|
|||||||
@ -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. после перезагрузки сохранённые поля остаются в памяти;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
client.version=1.2.138
|
client.version=1.2.139
|
||||||
server.version=1.2.130
|
server.version=1.2.131
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user