feat: VFD display shows AP when disconnected, time when connected
Made-with: Cursor
This commit is contained in:
32
lib/led.js
32
lib/led.js
@@ -86,6 +86,37 @@ class WifiLed {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── VFD 显示屏 ────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
const DISPLAY_PATH = '/sys/devices/platform/openvfd/attr/led';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VFD 显示屏控制。
|
||||||
|
* #m3 <text> 手动模式,显示指定文字
|
||||||
|
* #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 状态灯 ───────────────────────────────────────────────────────
|
// ── SETUP / APPS 状态灯 ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -125,3 +156,4 @@ class StatusLed {
|
|||||||
// 全局单例,整个进程共用
|
// 全局单例,整个进程共用
|
||||||
module.exports = new WifiLed();
|
module.exports = new WifiLed();
|
||||||
module.exports.status = new StatusLed();
|
module.exports.status = new StatusLed();
|
||||||
|
module.exports.display = new Display();
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ class ProvisionManager extends EventEmitter {
|
|||||||
|
|
||||||
async start() {
|
async start() {
|
||||||
led.off(); // 初始状态:灭灯
|
led.off(); // 初始状态:灭灯
|
||||||
|
led.display.showAP(); // 默认显示 AP(等网络就绪后切换到时间)
|
||||||
|
|
||||||
// WiFi 已连接 → 直接进入 STA 模式
|
// WiFi 已连接 → 直接进入 STA 模式
|
||||||
if (isWifiStaConnected()) {
|
if (isWifiStaConnected()) {
|
||||||
@@ -71,6 +72,7 @@ class ProvisionManager extends EventEmitter {
|
|||||||
if (hasInternet()) {
|
if (hasInternet()) {
|
||||||
// WiFi 灯只在 STA 模式下亮(有线有网而 WiFi 在 AP 模式时不亮)
|
// WiFi 灯只在 STA 模式下亮(有线有网而 WiFi 在 AP 模式时不亮)
|
||||||
if (this._state === 'sta') led.on();
|
if (this._state === 'sta') led.on();
|
||||||
|
led.display.showTime(); // 网络就绪 → 显示时间
|
||||||
this.emit('network-ready');
|
this.emit('network-ready');
|
||||||
} else {
|
} else {
|
||||||
log.warn('provision', 'hasInternet() 返回 false,LED 保持熄灭');
|
log.warn('provision', 'hasInternet() 返回 false,LED 保持熄灭');
|
||||||
@@ -109,6 +111,7 @@ class ProvisionManager extends EventEmitter {
|
|||||||
if (this._state === 'ap') return;
|
if (this._state === 'ap') return;
|
||||||
|
|
||||||
led.off(); // AP 模式:WiFi 未连接,灭灯
|
led.off(); // AP 模式:WiFi 未连接,灭灯
|
||||||
|
led.display.showAP(); // 显示屏切换到 "AP "
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// AP 模式下无法扫描 WiFi,必须在开 AP 之前扫描并缓存
|
// AP 模式下无法扫描 WiFi,必须在开 AP 之前扫描并缓存
|
||||||
@@ -154,6 +157,7 @@ class ProvisionManager extends EventEmitter {
|
|||||||
this._state = 'sta';
|
this._state = 'sta';
|
||||||
log.info('provision', `WiFi 已连接: ${ssid}`);
|
log.info('provision', `WiFi 已连接: ${ssid}`);
|
||||||
led.on(); // 连接成功 → 常亮
|
led.on(); // 连接成功 → 常亮
|
||||||
|
led.display.showTime(); // 显示屏切换到时间
|
||||||
this.emit('network-ready');
|
this.emit('network-ready');
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -188,11 +192,13 @@ class ProvisionManager extends EventEmitter {
|
|||||||
if (this._state === 'sta') {
|
if (this._state === 'sta') {
|
||||||
if (hasInternet()) {
|
if (hasInternet()) {
|
||||||
led.on();
|
led.on();
|
||||||
|
led.display.showTime();
|
||||||
} else {
|
} else {
|
||||||
led.off(); // WiFi 已连接但无互联网
|
led.off(); // WiFi 已连接但无互联网
|
||||||
|
led.display.showAP(); // 无互联网时显示 AP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// AP 模式下 led 已在 _enterAP() 中熄灭,无需重复操作
|
// AP 模式下 led/display 已在 _enterAP() 中设置,无需重复操作
|
||||||
}, MONITOR_INTERVAL_MS);
|
}, MONITOR_INTERVAL_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user