/* CH224A 运行期轮询(0.1.17):把充电器**此刻**给的 PD 档位放进遥测(status 的 `pd`)。 为什么不够用启动那一次(bringup.c 的 `pd_up()`):多口充电器在别的口插拔时会重新分配功率、 重发 Source_Capabilities,20 V 档的电流上限当场就变(板 B 实测过 5 A → 3.25 A → 3 A), 而 20 V 不一定掉、板子不一定重启 —— 只在启动读一次,面板上看到的就是旧档位。 做的事只有读:`0x09`(协议状态)和 `0x50`(档位电流)。**不写任何寄存器**(ch224a.h 那个框)。 读到的档位和上一次记进日志的不一样(连续两拍一致才算数,免得协商中途的瞬时值刷日志) ⇒ 记一条 `LOG_EV_PD_LIMIT`,arg = 2(运行中换档)。 ⚠️ 和 bringup 一样只**报**不**动**:逼近上限的降载(§8.3)还没人做(HANDOFF)。 ---- 线程 ---------------------------------------------------------------- `pdmon_poll()` 只在**巡检任务**里调,排在 `t_safety_step()` 之后、每 50 圈(1 s)一次, 一次 ≈ 选主干 + 两个单字节读。status 跨任务读快照,遥测无害(cmd.h 同一条)。 ⚠️ 别挪到别的任务去:2026-10-06 板 B 实测放在热管理任务里时,它持锁的那一下正好撞上 巡检的下一拍,`skipped` 每秒整整涨 1(每秒有一圈五路都没读)。巡检自己读就没有人跟它抢。 */ #ifndef PDMON_H #define PDMON_H #include #include #ifdef __cplusplus extern "C" { #endif /* `LOG_EV_PD_LIMIT` 的 arg:0 = 启动时读到,1 = 启动时读不到 / 读到 0、按保守值(bringup.c), 2 = 运行中档位变了。⚠️ 冻结(上位机 protocol.py)。 */ #define PDMON_EV_ARG_CHANGED 2u typedef struct { bool ok; /* 上一拍读到了;false 时下面两个是最后一次读到的值 */ uint8_t status; /* 0x09 原值 */ uint32_t ma; /* 0x50 换算成 mA(没协商上 PD 时是 0) */ uint32_t polls; uint32_t errors; } pdmon_snap_t; /* `boot_ma` = 启动时读到的档位(`bringup_report_t.pd_ma`,读不到是 0):换档事件拿它当基线。 */ void pdmon_init(uint32_t boot_ma); /* 读一拍。先试上次应答的那条支路,不应答再试另一条(主干 / mux 通道 5,bringup.c `pd_up()` 的注释)。 */ void pdmon_poll(void); void pdmon_get(pdmon_snap_t *out); #ifdef __cplusplus } #endif #endif /* PDMON_H */