rack:单板页 Hub 行与拓扑图、单路操作拆成 RailOps;开机按键改 5 s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
@@ -51,6 +51,7 @@ class SimBoard:
|
||||
self.ota = {"st": "idle", "got": 0, "size": 0, "err": None, "pend": False, "bad": None}
|
||||
self.ota_req: Optional[dict] = None
|
||||
self.ota_rate = 400000 # 每次 tick 下载多少字节(真板 ≈125 KB/s)
|
||||
self.hub = {"on": True, "mode": "auto", "why": "idle", "hold": 0, "idle": 600} # 0.1.14,只回显不计时
|
||||
bus.on_message = self._on_message
|
||||
self._ev(0, 1, 0) # BOOT
|
||||
|
||||
@@ -141,6 +142,7 @@ class SimBoard:
|
||||
"fan": {"duty": max(300, self.fan_floor), "floor": self.fan_floor, "en": True,
|
||||
"rpm": [3300, 3280], "stall": [False, False]}, "derate": False,
|
||||
"safety": {"cycles": self.up_ms // 20, "skipped": 0, "i2c_err": 0, "events": 0},
|
||||
"hub": dict(self.hub),
|
||||
"ota": dict(self.ota), "ev_next": len(self.events), "ev_pending": 0,
|
||||
"cmd": {"lines": len(self.received), "dups": 0, "rej": 0}}
|
||||
|
||||
@@ -183,6 +185,29 @@ class SimBoard:
|
||||
return {"ok": True, "floor": self.fan_floor}
|
||||
if req.get("seq") is None:
|
||||
return {"ok": False, "err": "no_seq"}
|
||||
if cmd == "hub": # 0.1.14:固件 hubctl.h 的命令形状;不模拟倒计时
|
||||
h = self.hub
|
||||
if "mode" in req:
|
||||
if req["mode"] not in ("auto", "on"):
|
||||
return {"ok": False, "err": "arg"}
|
||||
if req["mode"] != h["mode"]:
|
||||
self._ev(0, 22, 0x10 | ("auto", "on").index(req["mode"]))
|
||||
h["mode"] = req["mode"]
|
||||
if "min" in req:
|
||||
if not 0 <= req["min"] <= 240:
|
||||
return {"ok": False, "err": "range"}
|
||||
h["hold"] = req["min"] * 60
|
||||
if req["min"] == 0:
|
||||
h["idle"] = 0
|
||||
if "mode" not in req and "min" not in req:
|
||||
return {"ok": False, "err": "arg"}
|
||||
want = h["mode"] == "on" or h["hold"] > 0 or h["idle"] > 0 or any(r.vb for r in self.rails)
|
||||
if want != h["on"]:
|
||||
self._ev(0, 22, 1 if want else 0, 5 if want else 0)
|
||||
h["on"] = want
|
||||
h["why"] = ("mode" if h["mode"] == "on" else "vbus" if any(r.vb for r in self.rails) else
|
||||
"hold" if h["hold"] else "idle" if h["idle"] else "off") if want else "off"
|
||||
return {"ok": True, "hub": dict(h)}
|
||||
if cmd == "ota":
|
||||
if not (isinstance(req.get("url"), str) and req["url"].startswith("http://")
|
||||
and len(req["url"]) <= 64 and isinstance(req.get("sha256"), str)
|
||||
|
||||
在新工单中引用
屏蔽一个用户