rack:单板页 Hub 行与拓扑图、单路操作拆成 RailOps;开机按键改 5 s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
@@ -39,8 +39,17 @@ EVENT_TYPES: Dict[int, Tuple[str, str]] = {
|
||||
19: ("BOOT_CHECK", "开机重按"), # 0.1.2:arg bit0~3 = 按了几次,bit7 = 最终没开起来(电源键弹片接触不良)
|
||||
20: ("BLADE_MUTE", "刀片不应答关路"), # 0.1.4:eFuse 开着、本路 INA226 + PCA9555 连续 200 ms 都不应答
|
||||
21: ("CHG_MODE", "刷机模式"), # 0.1.5:arg 1~120 = 开(分钟),0 = 手动关,255 = 到期;0.1.6:0x80|分钟 = 加钟;0.1.13:254 = 断电自动退出
|
||||
22: ("HUB", "Hub 启停"), # 0.1.14:arg 0 = 休眠、1 = 唤醒、0x10|模式 = 改模式;mV 列 = 唤醒理由(HUB_WHY)
|
||||
}
|
||||
|
||||
# LOG_EV_HUB 的 arg 与理由(firmware/main/hubctl.h)。⚠️ 冻结。
|
||||
HUB_EV_OFF, HUB_EV_ON, HUB_EV_MODE = 0, 1, 0x10
|
||||
HUB_MODES = ("auto", "on") # hub_mode_t 的下标
|
||||
HUB_MODE_NAMES = {"auto": "按需", "on": "常开"}
|
||||
HUB_WHY_NAMES = {0: "休眠", 1: "常开", 2: "有手机开着 VBUS", 3: "刷机模式", 4: "执行器在跑序列",
|
||||
5: "手动保持", 6: "MQTT 断线", 7: "空闲倒计时"}
|
||||
HUB_HOLD_MAX_MIN = 240
|
||||
|
||||
# LOG_EV_CHG_MODE 的 arg(firmware/main/chgmode.h)。⚠️ 冻结。
|
||||
CHG_EV_OFF, CHG_EV_EXPIRED, CHG_EV_EXTEND = 0, 255, 0x80
|
||||
CHG_EV_DROPPED = 254 # 0.1.13:这一路断了电(刀片拔走 / 安全判据关路),自动退出。⚠️ 带 0x80 位,要先于「加钟」判
|
||||
@@ -59,7 +68,7 @@ BOOT_CHECK_FAILED = 0x80 # LOG_EV_BOOT_CHECK 的 arg bit7
|
||||
# cmd_id_t(firmware/main/cmd.h),CMD_REJECT 事件的 arg 就是它。
|
||||
CMD_NAMES = {1: "status", 2: "set_voltage", 3: "power_cycle", 4: "key", 5: "edl", 6: "vbus",
|
||||
7: "fan", 8: "events", 9: "power", 10: "wifi", 11: "mqtt", 12: "net",
|
||||
13: "ota", 14: "flash_mode"}
|
||||
13: "ota", 14: "flash_mode", 15: "hub"}
|
||||
|
||||
KEYS = ("pwr", "vup", "vdn")
|
||||
KEY_MAX_MS = 15000
|
||||
@@ -128,6 +137,22 @@ def build_command(req: dict) -> dict:
|
||||
raise CmdError("刷机模式时长必须是 1~%d 分钟" % FLASH_MODE_MAX_MIN)
|
||||
out["min"] = m
|
||||
return out
|
||||
if cmd == "hub":
|
||||
# 0.1.14 Hub 按需启停(整板命令):mode = auto / on(板子存 NVS);min = 保持 1~240 分钟,
|
||||
# 0 = 取消保持并结束空闲倒计时(没别的理由就马上休眠)。两个都可以给,至少给一个。
|
||||
out = {"cmd": cmd}
|
||||
if req.get("mode") is not None:
|
||||
if req["mode"] not in HUB_MODES:
|
||||
raise CmdError("Hub 模式只能是 auto / on")
|
||||
out["mode"] = req["mode"]
|
||||
if req.get("min") is not None:
|
||||
m = req["min"]
|
||||
if not isinstance(m, int) or isinstance(m, bool) or not 0 <= m <= HUB_HOLD_MAX_MIN:
|
||||
raise CmdError("Hub 保持时长必须是 0~%d 分钟" % HUB_HOLD_MAX_MIN)
|
||||
out["min"] = m
|
||||
if len(out) == 1:
|
||||
raise CmdError("hub 至少要给 mode 或 min")
|
||||
return out
|
||||
if cmd == "fan":
|
||||
duty = req.get("duty")
|
||||
if not isinstance(duty, int) or isinstance(duty, bool) or not 0 <= duty <= 1000:
|
||||
|
||||
在新工单中引用
屏蔽一个用户