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 行删除
+28 -1
查看文件
@@ -30,6 +30,7 @@ class SimRail:
self.busy_until = 0
self.act = "idle"
self.pending: Optional[str] = None # 序列结束时要做的事
self.chg_until = 0 # 刷机模式截止(模拟时钟 ms),0 = 没开
class SimBoard:
@@ -132,7 +133,9 @@ class SimBoard:
rails.append({"r": r.rail, "pr": r.present, "en": r.en, "vb": r.vb, "set": r.set_mv,
"mv": (r.set_mv if r.en else 0) if ok else None,
"ua": r.ua if ok else None, "pg": r.en if ok else None,
"flt": False if ok else None, "st": r.act, "res": "-"})
"flt": False if ok else None,
"chg": max(0, (r.chg_until - self.now + 999) // 1000) if r.chg_until else 0,
"st": r.act, "res": "-"})
return {"ok": True, "fw": self.fw, "up": self.up_ms, "in": {"mv": 12030, "ua": 1500000},
"rails": rails, "temp": [35000, 36500],
"fan": {"duty": max(300, self.fan_floor), "floor": self.fan_floor, "en": True,
@@ -231,7 +234,31 @@ class SimBoard:
r.en = req["on"]
if not r.en:
r.vb = False
if r.chg_until > self.now:
r.chg_until = 0
self._ev(rail, 21, 0)
return {"ok": True}
if cmd == "flash_mode": # 固件 chgmode.h 的规则:最多 2 路、关着电不许开、关电一并退出
if "add" in req: # 0.1.6 加钟:只给开着的加,剩余截断到 120 分钟
if r.chg_until <= self.now:
return {"ok": False, "err": "state"}
r.chg_until = min(r.chg_until + req["add"] * 60000, self.now + 120 * 60000)
self._ev(rail, 21, 0x80 | req["add"])
return {"ok": True, "left": (r.chg_until - self.now + 999) // 1000}
if not req["on"]:
if r.chg_until > self.now:
self._ev(rail, 21, 0)
r.chg_until = 0
return {"ok": True, "left": 0}
if not r.en:
return {"ok": False, "err": "state"}
active = sum(1 for x in self.rails if x is not r and x.chg_until > self.now)
if active >= 2:
return {"ok": False, "err": "state"}
m = req.get("min", 60)
r.chg_until = self.now + m * 60000
self._ev(rail, 21, m)
return {"ok": True, "left": m * 60}
if cmd == "set_voltage":
r.set_mv = req["mv"]
return {"ok": True, "set": r.set_mv}