联网选择交互改方案B:倒计时内按键可反复切换选中项,重复按当前项立即确认,超时生效当前项

This commit is contained in:
helei 2026-09-20 09:42:56 +08:00
parent 7cfb659699
commit 3cd34e6a2b
2 changed files with 19 additions and 12 deletions

View File

@ -63,7 +63,8 @@ static volatile uint8_t s_oled_boot_page = 0; /*
/*==== 开机联网方式选择(V1.7.1 新板按键): 10s 倒计时 ==== /*==== 开机联网方式选择(V1.7.1 新板按键): 10s 倒计时 ====
* KEY1(PC6)=4G KEY2(PC7)=WiFi固定热点 KEY3(PB14)=SmartConfig , =; * KEY1(PC6)=4G KEY2(PC7)=WiFi固定热点 KEY3(PB14)=SmartConfig , =;
* = EEPROM ( 4G); EEPROM(130); * =(), =, =;
* = EEPROM ( 4G); EEPROM(130);
* , */ * , */
/* 按键扫描: 返回 0=无 1~3=键号; 连续 2 次(约100ms)确认消抖 */ /* 按键扫描: 返回 0=无 1~3=键号; 连续 2 次(约100ms)确认消抖 */
@ -102,13 +103,12 @@ static uint8_t net_mode_select(void)
/* 第 3 行: 模式名从最左起 + 秒数紧随其后(不带"上次"前缀, 长模式名才放得下); /* 第 3 行: 模式名从最左起 + 秒数紧随其后(不带"上次"前缀, 长模式名才放得下);
* , ( IC, ) */ * , ( IC, ) */
const char *label = names[mode]; const char *label = names[mode]; /* 选中项, 按键切换时跟随更新 */
oled_locate(3, 0); oled_print_line(label); oled_locate(3, 0); oled_print_line(label);
uint8_t num_col8 = (uint8_t)((oled_text_w(label) + 7) / 8); uint8_t num_col8 = (uint8_t)((oled_text_w(label) + 7) / 8);
uint32_t start = HAL_GetTick(); uint32_t start = HAL_GetTick();
int last_sec = -1; int last_sec = -1;
int key = 0;
for (;;) { for (;;) {
uint32_t elapsed = HAL_GetTick() - start; uint32_t elapsed = HAL_GetTick() - start;
int remain = (int)(10000u - elapsed) / 1000; int remain = (int)(10000u - elapsed) / 1000;
@ -121,19 +121,25 @@ static uint8_t net_mode_select(void)
oled_print(num); oled_print(num);
oled_print(" "); /* 清掉长尾 */ oled_print(" "); /* 清掉长尾 */
} }
key = key_scan_once(); int key = key_scan_once();
if (key) break; if (key) {
uint8_t cand = (uint8_t)(key - 1); /* 键1->0(4G) 键2->1(WiFi固定) 键3->2(配网) */
if (cand == mode) break; /* 重复按当前项 = 立即确认 */
mode = cand; /* 切换选中项, 倒计时继续 */
log_info("> NET: 联网方式切换为 %s", names[mode]);
label = names[mode];
oled_locate(3, 0); oled_print_line(label); /* 换模式才重写整行 */
num_col8 = (uint8_t)((oled_text_w(label) + 7) / 8);
last_sec = -1; /* 强制立即刷新秒数 */
}
if (elapsed >= 10000u) break; if (elapsed >= 10000u) break;
bg_delay(50); bg_delay(50);
} }
if (key) { if (mode != saved) {
mode = (uint8_t)(key - 1); /* 键1->0(4G) 键2->1(WiFi固定) 键3->2(配网) */ eepromWriteData(EEPROM_NETMODE_ADDR, &mode, 1); /* 记忆本次选择 */
if (mode != saved) {
eepromWriteData(EEPROM_NETMODE_ADDR, &mode, 1); /* 记忆本次选择 */
}
} }
log_info("> NET: 联网方式选择: %s (%s)", names[mode], key ? "按键选定" : "超时默认"); log_info("> NET: 联网方式确定: %s", names[mode]);
oled_locate(3, 0); oled_print_line("已选:"); oled_locate(3, 0); oled_print_line("已选:");
oled_print((char *)names[mode]); oled_print((char *)names[mode]);
bg_delay(800); bg_delay(800);

View File

@ -22,7 +22,8 @@
命令链路最终无应答即判离线并应答平台 `ext relay board offline`,下次命令自动重新探测恢复; 命令链路最终无应答即判离线并应答平台 `ext relay board offline`,下次命令自动重新探测恢复;
断电恢复触发点不变(离线→上线比对 EEPROM 逐路补发) 断电恢复触发点不变(离线→上线比对 EEPROM 逐路补发)
- **联网方式改为开机按键手动选择**(废除自动切换):欢迎页后 10s 倒计时KEY1(PC6)=4G / - **联网方式改为开机按键手动选择**(废除自动切换):欢迎页后 10s 倒计时KEY1(PC6)=4G /
KEY2(PC7)=WiFi 固定热点 / KEY3(PB14)=SmartConfig 配网;超时未按 = EEPROM 记忆的上次选择(首次默认 4G KEY2(PC7)=WiFi 固定热点 / KEY3(PB14)=SmartConfig 配网;倒计时内按不同键**可反复切换选中项**
**重复按当前项=立即确认**,超时=当前选中项生效;初始选中项=EEPROM 记忆的上次选择(首次默认 4G
选择变化才写 EEPROM偏移 130复用原联网方式记忆字节**选定后锁定通道,连不上原地重试, 选择变化才写 EEPROM偏移 130复用原联网方式记忆字节**选定后锁定通道,连不上原地重试,
不再 4G↔WiFi 自动回退**4G 无卡/无信号、WiFi 连不上均为每 10s 重试); 不再 4G↔WiFi 自动回退**4G 无卡/无信号、WiFi 连不上均为每 10s 重试);
WiFi 侧按模式限制连接方式:固定模式只连固定热点,配网模式只走已存 AP+SmartConfig WiFi 侧按模式限制连接方式:固定模式只连固定热点,配网模式只走已存 AP+SmartConfig