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]>
这个提交包含在:
@@ -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; }
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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: '读不到' }
|
||||
|
||||
在新工单中引用
屏蔽一个用户