固件 0.1.1-c5:硬重启后自动开机、MQTT 发布死锁、欠压放宽到 −250 mV

- 硬重启等到 PG 后长按电源键 5 s(新状态 hr-boot):电池端上电的小米8
  停在关机态,原来的 power_cycle 等于关机。ACT_KEY_MS_ON 2000 → 5000
  (实测 2 s 松手即掉电)。NO_PG 时不按。
- 修死锁:执行器持 s_mtx 等 esp-mqtt 的 api_lock,esp-mqtt 任务持 api_lock
  分发 DISCONNECTED 时等 s_mtx。热点一断 USB/WiFi 全失联、按键可能松不开。
  执行器现在只往 s_outbox 拷贝,由 t_link 交给 esp-mqtt。
- SR-5 欠压一侧 −100 → −250 mV(T_SAFETY_UNDER_MV),过压仍 +100 mV:
  带屏开机峰值 2.1 A 时实测 −115 mV 被误关。需求 SR-5 / SW-2 / SW-5 / 验收表同步。

板 B 上板:power_cycle → hr-boot → 手机开机,最低 3778 mV / 2.12 A 不再跳闸。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
zhou yang
2026-09-28 01:13:58 +08:00
共同撰写人 Claude Opus 5.5
父节点 afc5e81299
当前提交 1f6862ac38
共修改 10 个文件,包含 211 行新增和 47 行删除
+15 -3
查看文件
@@ -122,8 +122,18 @@ static uint32_t state_step(act_rail_t *r, int rail, uint32_t now)
case ACT_ST_HR_PG: {
bool pg = false;
if (pg_now(rail, &pg) && pg) {
finish(r, ACT_RES_OK, now);
return ACT_IDLE_WAIT_MS;
/* 电好了 ⇒ 长按电源键开机(ACT_HR_BOOT_KEY_MS 的注释)。
和 KEY 序列一样:先记 release_mask 再看写没写成 —— 写失败时器件里那个字节
是未知的,照样走 CLEANUP 把它显式清一遍。 */
const uint8_t mask = key_out_mask(ACT_KEYS_PWR);
r->release_mask = mask;
r->hold_ms = ACT_HR_BOOT_KEY_MS;
if (out_write(rail, mask, mask) != HAL_OK) {
finish(r, ACT_RES_IO, now); /* 电是开着的,只是没按上键 */
return ACT_CLEANUP_RETRY_MS;
}
enter(r, ACT_ST_HR_BOOT, now);
return ACT_HR_BOOT_KEY_MS;
}
if (el >= ACT_HR_PG_TIMEOUT_MS) {
/* ⚠️ 电**继续开着**。见 ACT_RES_NO_PG 的注释:把「看不见」当成
@@ -135,6 +145,7 @@ static uint32_t state_step(act_rail_t *r, int rail, uint32_t now)
return left < ACT_HR_PG_POLL_MS ? left : ACT_HR_PG_POLL_MS;
}
case ACT_ST_HR_BOOT:
case ACT_ST_KEY_HOLD:
if (el < r->hold_ms) {
return r->hold_ms - el;
@@ -232,7 +243,7 @@ hal_err_t t_actuator_hard_reset(int rail)
return err; /* 序列没开始 */
}
r->seq = ACT_SEQ_HARD_RESET;
r->release_mask = 0; /* 硬重启在链上没按下任何东西 */
r->release_mask = 0; /* 断电这一段没按任何东西;开机那一下在 HR_PG 里才记 */
r->result = ACT_RES_NONE;
enter(r, ACT_ST_HR_OFF, hal_time_now_ms());
return HAL_OK;
@@ -356,6 +367,7 @@ const char *t_actuator_state_str(act_state_t st)
case ACT_ST_HR_OFF: return "hr-off";
case ACT_ST_HR_RAMP: return "hr-ramp";
case ACT_ST_HR_PG: return "hr-pg";
case ACT_ST_HR_BOOT: return "hr-boot";
case ACT_ST_KEY_HOLD: return "key-hold";
case ACT_ST_EDL_SHORT: return "edl-short";
case ACT_ST_EDL_ENUM: return "edl-enum";