固件 0.1.4-c5:整片刀片不应答(INA226 + PCA9555 同时 NAK 200 ms)⇒ 关这一路

- t_safety:eFuse 开着、本路两颗都 NAK 连续 10 圈 ⇒ abort + 关 eFuse,新事件 20 BLADE_MUTE;
  只关 eFuse,不再写刚 NAK 过的 PCA9555。只有一颗不答应仍按 §10.10 盲跑、保持供电
- 起因:板 B 第 2 槽 PRSNT2# 卡低,刀片挪走后空槽 eFuse 开了约 4 h,原判据一条没响
- 需求 §10.10 加一行 + 表后第 3 条;rack 事件 20 命名并标红
- 宿主机 26 ctest 全绿(test_t_safety_rules +4 例)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
zhou yang
2026-09-28 09:07:39 +08:00
共同撰写人 Claude Opus 5.5
父节点 ef91daf07d
当前提交 385d2f9c47
共修改 11 个文件,包含 1275 行新增和 1105 行删除
+7 -3
查看文件
@@ -87,7 +87,8 @@ static void test_flash_format_is_frozen(void)
TEST_ASSERT_EQUAL_INT(17, LOG_EV_PG_TIMEOUT); /* A15 */
TEST_ASSERT_EQUAL_INT(18, LOG_EV_OTA); /* C2 */
TEST_ASSERT_EQUAL_INT(19, LOG_EV_BOOT_CHECK); /* 0.1.2 开机校验 */
TEST_ASSERT_EQUAL_INT(20, LOG_EV_COUNT);
TEST_ASSERT_EQUAL_INT(20, LOG_EV_BLADE_MUTE); /* 0.1.4 刀片不应答 */
TEST_ASSERT_EQUAL_INT(21, LOG_EV_COUNT);
}
/* §10.7 的「必记事件」有八类,A10 只产生其中两类。剩下的号先占住,
@@ -129,6 +130,7 @@ static void test_the_safety_mapping_is_explicit(void)
TEST_ASSERT_EQUAL_INT(LOG_EV_UNDER_VOLT, evlog_from_safety(SAFETY_EV_UNDER_VOLT));
TEST_ASSERT_EQUAL_INT(LOG_EV_REVERSE, evlog_from_safety(SAFETY_EV_REVERSE));
TEST_ASSERT_EQUAL_INT(LOG_EV_PUSHED_UP, evlog_from_safety(SAFETY_EV_PUSHED_UP));
TEST_ASSERT_EQUAL_INT(LOG_EV_BLADE_MUTE, evlog_from_safety(SAFETY_EV_BLADE_MUTE));
TEST_ASSERT_EQUAL_INT(LOG_EV_NONE, evlog_from_safety(SAFETY_EV_NONE));
TEST_ASSERT_EQUAL_INT(LOG_EV_NONE, evlog_from_safety(200)); /* 认不出的不许瞎猜 */
@@ -161,6 +163,7 @@ static void test_the_safety_mapping_is_a_table_not_an_offset(void)
TEST_ASSERT_EQUAL_INT(4, SAFETY_EV_PUSHED_UP);
TEST_ASSERT_EQUAL_INT(5, SAFETY_EV_MUX_LOST);
TEST_ASSERT_EQUAL_INT(6, SAFETY_EV_SLOT_EMPTY);
TEST_ASSERT_EQUAL_INT(7, SAFETY_EV_BLADE_MUTE);
/* 逐对:safety 号 → flash 号,两边都是裸数字。 */
TEST_ASSERT_EQUAL_INT(0, (int)evlog_from_safety(0)); /* NONE */
@@ -170,6 +173,7 @@ static void test_the_safety_mapping_is_a_table_not_an_offset(void)
TEST_ASSERT_EQUAL_INT(6, (int)evlog_from_safety(4)); /* PUSHED_UP */
TEST_ASSERT_EQUAL_INT(14, (int)evlog_from_safety(5)); /* MUX_LOST */
TEST_ASSERT_EQUAL_INT(15, (int)evlog_from_safety(6)); /* SLOT_EMPTY */
TEST_ASSERT_EQUAL_INT(20, (int)evlog_from_safety(7)); /* BLADE_MUTE(0.1.4) */
/* 而且这张表**在数学上不可能**是一个偏移:前四对差 2,后两对差 9。
写死这一条,是为了让「改成偏移」这件事在用例名上就说得清楚,
@@ -178,8 +182,8 @@ static void test_the_safety_mapping_is_a_table_not_an_offset(void)
TEST_ASSERT_EQUAL_INT(9, (int)evlog_from_safety(5) - (int)SAFETY_EV_MUX_LOST);
/* 越过表尾的号一律 NONE。偏移写法在这里会算出一个**越界但合法**的
`log_ev_t`(7 → 记成 eFuse 故障,200 → 记成 202 这种根本没有的号)。 */
TEST_ASSERT_EQUAL_INT(0, (int)evlog_from_safety(7));
`log_ev_t`(8 → 记成 PG 变化,200 → 记成 202 这种根本没有的号)。 */
TEST_ASSERT_EQUAL_INT(0, (int)evlog_from_safety(8));
TEST_ASSERT_EQUAL_INT(0, (int)evlog_from_safety(200));
TEST_ASSERT_EQUAL_INT(0, (int)evlog_from_safety(255));
}