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]>
这个提交包含在:
zhou yang
2026-09-29 08:16:48 +08:00
共同撰写人 Claude Opus 5.5
父节点 9fb5bba367
当前提交 86d9e2a7d4
共修改 8 个文件,包含 777 行新增和 637 行删除
+21 -1
查看文件
@@ -17,7 +17,9 @@
<span :class="{ on: r.en }">直供{{ r.en ? '开' : '关' }}</span>
<span :class="{ on: r.vb }">USB{{ r.vb ? '通' : '断' }}</span>
<span :class="{ on: r.pg, bad: r.en && r.pg === false }">PG</span>
<span :class="{ bad: r.flt }" v-if="r.flt">FLT</span>
<span v-if="r.flt && r.chg > 0" title="刷机模式下手机充电器把电池端顶高,eFuse 进入反向阻断,FLT 随之拉低:正常指示,不是故障">反向阻断</span>
<span :class="{ bad: r.flt }" v-else-if="r.flt">FLT</span>
<span class="chg" v-if="r.chg > 0" :title="'刷机模式:USB 通着时允许手机充电、不断 USB(固件 0.1.5)'">刷机 {{ Math.ceil(r.chg / 60) }} 分</span>
</div>
<div class="ar" @click.stop>
@@ -39,6 +41,8 @@
<el-dropdown-item command="recovery">进 Recovery(音量上 + 电源)</el-dropdown-item>
<el-dropdown-item command="edl">进 EDL / 9008</el-dropdown-item>
<el-dropdown-item command="vbus" divided>{{ r?.vb ? '断开 USB' : '接通 USB' }}</el-dropdown-item>
<el-dropdown-item command="flash">{{ r?.chg > 0 ? '退出刷机模式' : '刷机模式(1 小时)…' }}</el-dropdown-item>
<el-dropdown-item v-if="r?.chg > 0" command="flash_add">刷机模式加钟 30 分钟</el-dropdown-item>
<el-dropdown-item command="power">{{ r?.en ? '断电(保持关闭)' : '上电' }}</el-dropdown-item>
<el-dropdown-item command="volt">调电压…</el-dropdown-item>
</el-dropdown-menu>
@@ -104,10 +108,25 @@ function more(c) {
case 'edl': return run('进 EDL', { cmd: 'edl' }, true)
case 'vbus': return run(on.vb ? '断开 USB' : '接通 USB', { cmd: 'vbus', on: !on.vb }, on.vb)
case 'power': return run(on.en ? '断电' : '上电', { cmd: 'power', on: !on.en }, on.en)
case 'flash': return flashMode(!(on.chg > 0))
case 'flash_add': return run('刷机模式加钟 30 分钟', { cmd: 'flash_mode', add: 30 }) // 板子截断到剩余 120 分钟
case 'volt': mv.value = on.set || 3900; voltOpen.value = true
}
}
// 固件 0.1.5 刷机模式:窗口内 USB 通着也允许手机充电(节点被充电器顶到 ~4.4 V 不断 USB),
// 超过 4.45 V / 反灌 / 欠压照样保护;最多同时 2 路(板子回 state);1 小时到期自动恢复。
async function flashMode(on) {
if (!on) return run('退出刷机模式', { cmd: 'flash_mode', on: false })
try {
await ElMessageBox.confirm(
`${who()} 进入刷机模式 1 小时?期间 USB 接通时允许手机充电、不会因为电压被顶高而断 USB,` +
'电池端会停在约 4.4 V。最多同时 2 路;到期自动恢复。开完再「接通 USB」。',
'刷机模式', { type: 'warning', confirmButtonText: '进入' })
} catch { return }
return run('刷机模式', { cmd: 'flash_mode', on: true, min: 60 })
}
const voltOpen = ref(false)
const mv = ref(3900)
async function setVolt() {
@@ -147,6 +166,7 @@ async function saveAuto(v) {
.flags span { font-size: 12px; padding: 0 6px; border-radius: 4px; border: 1px solid var(--line); color: var(--muted); }
.flags span.on { color: var(--ink); border-color: var(--ink-2); }
.flags span.bad { color: var(--st-bad); border-color: var(--st-bad); }
.flags span.chg { color: var(--st-warn); border-color: currentColor; }
.ar { display: flex; align-items: center; gap: 6px; }
.acts { display: flex; gap: 6px; flex-wrap: wrap; margin-top: auto; }
.acts .el-button + .el-button { margin-left: 0; }
+1 -1
查看文件
@@ -90,7 +90,7 @@ import { mA, V, W, C, ago, fmtTime, railsMw, railHealth, LEVEL_COLOR, RECOVERY_Z
// 与 backend/prrack/protocol.py 的 EVENT_TYPES / EVENT_SEVERE 同一张表(数字来自固件 evlog.h)
const EV = ['', '板子上电', '事件丢失', '过压关路', '欠压关路', '反灌断 VBUS', '顶高断 VBUS', 'eFuse 故障',
'PG 变化', 'I²C 失联', '过温降载', '风扇停转', '重启序列', '命令被拒', 'mux 失联全断', '刀片不在位', 'PD 限功率',
'上电等不到 PG', '固件升级', '开机重按', '刀片不应答关路']
'上电等不到 PG', '固件升级', '开机重按', '刀片不应答关路', '刷机模式']
const SEVERE = new Set([3, 4, 5, 6, 7, 9, 11, 14, 17, 20])
// 开机重按(19)只有 arg bit7「最终没开起来」才算严重
const isSevere = ev => SEVERE.has(ev[3]) || (ev[3] === 19 && (ev[4] & 0x80) !== 0)
+3
查看文件
@@ -43,6 +43,9 @@ export function railHealth(board, r) {
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: '读不到' }