fix(led): swap WiFi(play)/LAN(wifi+eth), LAN carrier via CLAWD_ETH_IFACE, faster alarm

- WifiLed drives play; LanLed drives wifi+eth pair (matches panel silkscreen)
- hasLanCableCarrier(): CLAWD_ETH_IFACE-only carrier when set (reliable unplug)
- LAN poll 1s; config.activated persisted for immediate setApps on boot/reconnect
- setApps double vfdOn alarm after 50ms for slow OpenVFD
- Clear activated + setSetup on credential errors
- install.sh env comment for CLAWD_ETH_IFACE

Made-with: Cursor
This commit is contained in:
stswangzhiping
2026-03-28 21:50:56 +08:00
parent 347b19a0c9
commit 8f5a8ec896
5 changed files with 50 additions and 12 deletions
+14 -11
View File
@@ -2,15 +2,15 @@
const fs = require('fs');
const log = require('./logger');
const { hasWiredCarrier } = require('./network');
const { hasLanCableCarrier } = require('./network');
/**
* OpenVFD 图标:/sys/class/leds/openvfd/led_on|led_off(写入图标名)。
*
* 映射:
* wifi + eth 同亮/同灭 → 产品 WiFi 灯
* 映射(与面板丝印一致:play=WiFi 状态,wifi+eth=有线链路)
* play → 产品 WiFi 灯(配网逻辑 on/off/blink
* wifi + eth 同亮/同灭 → LAN(有线插拔,见 hasLanCableCarrier / CLAWD_ETH_IFACE
* alarm → pwrSETUP=灭 / APPS=亮)
* play → lan(有线 carrier
* BT → 无 sysfs,仅日志
*
* 数码管(AP/Conn/时间等):仍仅 debug 输出,不接 sysfs。
@@ -19,7 +19,7 @@ const { hasWiredCarrier } = require('./network');
*/
const BLINK_INTERVAL_MS = 500;
const LAN_POLL_MS = 3000;
const LAN_POLL_MS = 1000;
const VFD_BASE = process.env.CLAWD_OPENVFD_PATH || '/sys/class/leds/openvfd';
@@ -100,8 +100,9 @@ class WifiLed {
_write(val) {
const on = !!val;
log.debug('led', `[vfd] WiFiwifi+eth<= ${on ? 1 : 0}`);
vfdWifiPair(on);
log.debug('led', `[vfd] WiFiplay<= ${on ? 1 : 0}`);
if (on) vfdOn('play');
else vfdOff('play');
}
}
@@ -231,6 +232,8 @@ class StatusLed {
setApps() {
vfdOn('alarm');
// 部分 OpenVFD 驱动单次写入生效慢,短延迟再写一次
setTimeout(() => vfdOn('alarm'), 50);
log.debug('led', '[vfd] alarmpwr<= 1');
log.info('led', '状态灯 → APPS(已激活)');
}
@@ -257,20 +260,20 @@ class LanLed {
clearInterval(this._timer);
this._timer = null;
}
vfdOff('play');
vfdWifiPair(false);
this._current = null;
}
_sync() {
const up = hasWiredCarrier();
const up = hasLanCableCarrier();
if (up) {
if (this._current !== 'on') {
vfdOn('play');
vfdWifiPair(true);
this._current = 'on';
log.info('led', 'LAN(有线 carrier)→ 亮');
}
} else if (this._current !== 'off') {
vfdOff('play');
vfdWifiPair(false);
this._current = 'off';
log.info('led', 'LAN(有线 carrier)→ 灭');
}