feat: add WiFi LED indicator (openvfd b5)
Made-with: Cursor
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user