文件
phonerail/rack/frontend/src/util.js
T
zhou yang和Claude Opus 5.5 86d9e2a7d4 rack:刷机模式界面与事件;事件 21 新增 254「断电自动退出」
- 单板页「更多 → 刷机模式(1 小时)/ 加钟 30 分钟」,chg>0 时蓝色「刷机模式 · 充电中」、FLT 显示为「反向阻断」
- 协议白名单 flash_mode;事件 21 命名:开 / 手动关 / 到期 / 加钟 / 断电自动退出
- ⚠️ 254 带 0x80 位,必须先于「加钟」判断,否则显示成「加钟 126 分钟」

48 例全绿,已部署。

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-29 08:16:48 +08:00

68 行
3.4 KiB
JavaScript
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
// 显示用的小工具:单位换算、每一路的健康状态。
export const mA = ua => (ua == null ? '—' : (ua / 1000).toFixed(ua >= 100000 || ua <= -100000 ? 0 : 1))
export const V = mv => (mv == null ? '—' : (mv / 1000).toFixed(3))
export const C = mc => (mc == null ? '—' : (mc / 1000).toFixed(1))
// 功率 = 电压 × 电流:mV × µA = nW,显示成 W(两位小数,手机主板一般零点几到十几瓦)
export const mW = (mv, ua) => (mv == null || ua == null ? null : mv * ua / 1e6)
export const W = (mv, ua) => (mv == null || ua == null ? '—' : (mv * ua / 1e9).toFixed(2))
// 五路主板合计功率(mW):只算读得到的路;一路都读不到回 null
export function railsMw(rails) {
let s = null
for (const r of rails || []) if (r?.mv != null && r?.ua != null) s = (s ?? 0) + r.mv * r.ua / 1e6
return s
}
export function ago(ts) {
if (!ts) return '从未'
const s = Math.round((Date.now() - ts) / 1000)
if (s < 60) return `${s} 秒前`
if (s < 3600) return `${Math.round(s / 60)} 分钟前`
if (s < 86400) return `${Math.round(s / 3600)} 小时前`
return `${Math.round(s / 86400)} 天前`
}
export function fmtTime(ts) {
if (!ts) return ''
const d = new Date(ts)
const p = n => String(n).padStart(2, '0')
return `${d.getMonth() + 1}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`
}
// 执行器状态(firmware t_actuator_state_str)
export const ACT_ZH = {
idle: '空闲', 'hr-off': '断电中', 'hr-ramp': '上电中', 'hr-pg': '等 PG',
'key-hold': '按键中', 'edl-short': '进 EDL', 'edl-enum': '等枚举', cleanup: '收尾',
}
// 一路的健康状态 → { level, text }。level 决定颜色:
// ok 绿 / busy 蓝 / warn 橙 / bad 红 / off 深灰 / empty 浅灰 / lost 灰(通信中断)
export function railHealth(board, r) {
if (!board || board.stale || !board.online) return { level: 'lost', text: '通信中断' }
if (!r) return { level: 'lost', text: '无数据' }
if (!r.pr) return { level: 'empty', text: '空槽' }
if (r.st && r.st !== 'idle') return { level: 'busy', text: ACT_ZH[r.st] || r.st }
if (!r.en) return { level: 'off', text: '已断电' }
// 固件 ≥0.1.5 刷机模式:手机充电器把节点顶高时 eFuse(TPS25940A)进入反向阻断,FLT 随之拉低 ——
// 2026-09-28 台架实测与 RCB 同进同退,是正常指示,不是故障。模式外的 FLT 仍按故障标红。
if (r.chg > 0) return { level: 'busy', text: r.flt ? '刷机模式 · 充电中' : '刷机模式' }
if (r.flt) return { level: 'bad', text: 'eFuse 故障' }
if (r.pg === false) return { level: 'bad', text: 'PG 丢失' }
if (r.mv == null || r.ua == null) return { level: 'warn', text: '读不到' }
return { level: 'ok', text: '运行' }
}
// 状态色引用 theme.css 的变量:亮 / 暗两套,切换时自动跟着变。只用来表示状态,旁边一定有文字。
export const LEVEL_COLOR = {
ok: 'var(--st-ok)', busy: 'var(--st-busy)', warn: 'var(--st-warn)', bad: 'var(--st-bad)',
off: 'var(--st-off)', empty: 'var(--st-empty)', lost: 'var(--st-lost)',
}
export const RECOVERY_ZH = {
idle: '正常', soft: '已长按电源', hard: '已断电重启', gave_up: '已放弃(需人工)',
}
export const REASON_ZH = {
flat: '电流平直(疑似卡死)', low: '电流过低(疑似关机)', recovered: '已恢复',
rate_limit: '一小时内动作过多', manual_reset: '人工复位',
}