feat: add WiFi LED indicator (openvfd b5)

Made-with: Cursor
This commit is contained in:
stswangzhiping
2026-03-18 19:47:20 +08:00
parent d66558c9de
commit 875e69a454
2 changed files with 111 additions and 3 deletions

View File

@@ -5,6 +5,7 @@ const log = require('./logger');
const { hasInternet, hasSavedWifiConnection, isWifiStaConnected, scanWifi, startAP, stopAP, connectWifi, AP_IP } = require('./network');
const { DnsHijack } = require('./dns-hijack');
const { CaptiveServer } = require('./captive-server');
const led = require('./led');
const MONITOR_INTERVAL_MS = 30_000;
const BOOT_WAIT_MAX_MS = 20_000; // 等待 NM 自动连接的最大时间
@@ -31,6 +32,8 @@ class ProvisionManager extends EventEmitter {
}
async start() {
led.off(); // 初始状态:灭灯
// WiFi 已连接 → 直接进入 STA 模式
if (isWifiStaConnected()) {
this._state = 'sta';
@@ -43,6 +46,7 @@ class ProvisionManager extends EventEmitter {
// 有已保存的 WiFi 配置 → 等 NM 自动连接(重启场景)
if (hasSavedWifiConnection()) {
log.info('provision', '发现已保存的 WiFi 配置,等待 NetworkManager 自动连接...');
led.blink(); // 等待自动重连期间闪烁
const connected = await this._waitForWifiConnect();
if (connected) {
this._state = 'sta';
@@ -64,7 +68,10 @@ class ProvisionManager extends EventEmitter {
}
_emitNetworkReady() {
if (hasInternet()) this.emit('network-ready');
if (hasInternet()) {
led.on(); // 网络畅通 → 常亮
this.emit('network-ready');
}
}
/**
@@ -90,6 +97,7 @@ class ProvisionManager extends EventEmitter {
this._stopMonitor();
this._stopAll();
this._state = 'idle';
led.destroy(); // 停止时关灯、释放闪烁定时器
}
// ── 进入 AP 模式 ─────────────────────────────────────────────────────────
@@ -97,6 +105,8 @@ class ProvisionManager extends EventEmitter {
_enterAP() {
if (this._state === 'ap') return;
led.off(); // AP 模式WiFi 未连接,灭灯
try {
// AP 模式下无法扫描 WiFi必须在开 AP 之前扫描并缓存
log.info('provision', '扫描周边 WiFi...');
@@ -131,6 +141,7 @@ class ProvisionManager extends EventEmitter {
this._state = 'connecting';
log.info('provision', `用户请求连接 WiFi: ${ssid}`);
led.blink(); // 正在连接 → 闪烁
this._stopAPServices();
@@ -139,12 +150,13 @@ class ProvisionManager extends EventEmitter {
if (result.success) {
this._state = 'sta';
log.info('provision', `WiFi 已连接: ${ssid}`);
led.on(); // 连接成功 → 常亮
this.emit('network-ready');
return result;
}
log.warn('provision', `WiFi 连接失败: ${result.error},重新启动 AP`);
this._enterAP();
this._enterAP(); // _enterAP 内部会调用 led.off()
return result;
}
@@ -158,7 +170,8 @@ class ProvisionManager extends EventEmitter {
if (this._state === 'sta' && !wifiUp) {
log.warn('provision', 'WiFi 连接已断开,重新启动 AP');
this._enterAP();
this._enterAP(); // 内部调用 led.off()
return;
}
if (this._state === 'ap' && wifiUp) {
@@ -167,6 +180,15 @@ class ProvisionManager extends EventEmitter {
this._state = 'sta';
this.emit('network-ready');
}
// STA 模式下持续监测互联网连通性,实时更新 LED
if (this._state === 'sta') {
if (hasInternet()) {
led.on();
} else {
led.off(); // WiFi 已连接但无互联网
}
}
}, MONITOR_INTERVAL_MS);
}