From 9da4cd0aa1f509c88fb330885d174a8a3d875216 Mon Sep 17 00:00:00 2001 From: stswangzhiping <59632378+stswangzhiping@users.noreply.github.com> Date: Wed, 18 Mar 2026 21:10:14 +0800 Subject: [PATCH] feat: VFD display shows AP when disconnected, time when connected Made-with: Cursor --- lib/led.js | 36 ++++++++++++++++++++++++++++++++++-- lib/provisioning.js | 18 ++++++++++++------ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/lib/led.js b/lib/led.js index bef52be..f72c0d0 100644 --- a/lib/led.js +++ b/lib/led.js @@ -86,6 +86,37 @@ class WifiLed { } } +// ── VFD 显示屏 ──────────────────────────────────────────────────────────────── + +const DISPLAY_PATH = '/sys/devices/platform/openvfd/attr/led'; + +/** + * VFD 显示屏控制。 + * #m3 手动模式,显示指定文字 + * #s1 系统时钟模式,显示当前时间 + */ +class Display { + /** 网络断开 / AP 模式 → 显示 "AP " */ + showAP() { + this._write('#m3 AP '); + log.info('display', '显示屏 → AP'); + } + + /** 网络已连接 → 显示时间 */ + showTime() { + this._write('#s1'); + log.info('display', '显示屏 → 时间'); + } + + _write(val) { + try { + fs.writeFileSync(DISPLAY_PATH, val); + } catch (e) { + log.warn('display', `写入失败 (${DISPLAY_PATH}): ${e.message}`); + } + } +} + // ── SETUP / APPS 状态灯 ─────────────────────────────────────────────────────── /** @@ -123,5 +154,6 @@ class StatusLed { } // 全局单例,整个进程共用 -module.exports = new WifiLed(); -module.exports.status = new StatusLed(); +module.exports = new WifiLed(); +module.exports.status = new StatusLed(); +module.exports.display = new Display(); diff --git a/lib/provisioning.js b/lib/provisioning.js index 40e78dd..17a1dba 100644 --- a/lib/provisioning.js +++ b/lib/provisioning.js @@ -32,7 +32,8 @@ class ProvisionManager extends EventEmitter { } async start() { - led.off(); // 初始状态:灭灯 + led.off(); // 初始状态:灭灯 + led.display.showAP(); // 默认显示 AP(等网络就绪后切换到时间) // WiFi 已连接 → 直接进入 STA 模式 if (isWifiStaConnected()) { @@ -71,6 +72,7 @@ class ProvisionManager extends EventEmitter { if (hasInternet()) { // WiFi 灯只在 STA 模式下亮(有线有网而 WiFi 在 AP 模式时不亮) if (this._state === 'sta') led.on(); + led.display.showTime(); // 网络就绪 → 显示时间 this.emit('network-ready'); } else { log.warn('provision', 'hasInternet() 返回 false,LED 保持熄灭'); @@ -108,7 +110,8 @@ class ProvisionManager extends EventEmitter { _enterAP() { if (this._state === 'ap') return; - led.off(); // AP 模式:WiFi 未连接,灭灯 + led.off(); // AP 模式:WiFi 未连接,灭灯 + led.display.showAP(); // 显示屏切换到 "AP " try { // AP 模式下无法扫描 WiFi,必须在开 AP 之前扫描并缓存 @@ -150,10 +153,11 @@ class ProvisionManager extends EventEmitter { const result = connectWifi(ssid, password); - if (result.success) { + if (result.success) { this._state = 'sta'; log.info('provision', `WiFi 已连接: ${ssid}`); - led.on(); // 连接成功 → 常亮 + led.on(); // 连接成功 → 常亮 + led.display.showTime(); // 显示屏切换到时间 this.emit('network-ready'); return result; } @@ -188,11 +192,13 @@ class ProvisionManager extends EventEmitter { if (this._state === 'sta') { if (hasInternet()) { led.on(); + led.display.showTime(); } else { - led.off(); // WiFi 已连接但无互联网 + led.off(); // WiFi 已连接但无互联网 + led.display.showAP(); // 无互联网时显示 AP } } - // AP 模式下 led 已在 _enterAP() 中熄灭,无需重复操作 + // AP 模式下 led/display 已在 _enterAP() 中设置,无需重复操作 }, MONITOR_INTERVAL_MS); }