feat(powermgr): 期3 policy 生效 + 标定工具 + 模型单键 setter + events 说明

- policy:IPC 0xD2/0xD3 GET/SET(SET 动作级鉴权=root+系统身份,SO_PEERCRED→pid→exe→classify,同 svc_power)
  + CLI `meow_power policy show|set`。策略项 profile 四档(performance/balanced/powersave/ultra)
  + 低电阈值(power.low_pct/critical_pct 读 settings.conf) + 亮度上限(power.brightness_cap)
  + 息屏上限(power.screen_timeout_cap)。**默认全关**(profile=balanced 无操作=现状, cap=0 不生效,
  只能用户手动开)。生效方式: powermgr 不直接写系统——只写 settings.conf power.* 键(原子),
  launcher/sysui 期4 消费; 本服务绝不 poke 背光/息屏/wlan0/bt。低电/极低阈值改从 settings.conf
  读, 事件检测即时生效。
- calibrate:`meow_power calibrate start <场景>|stop|list`——守护内 2s 节拍采样 电流(mp2731
  current_now)+亮度+CPU+wifi/bt 状态+电量%变化,写 TF MeowOS/logs/power_calib_<epoch>.csv
  (无卡降级 /tmp,逐行 fflush),用户实验中 start/stop 两命令即可。
- model:`meow_power model set <key> <mw>` 读改写单键+原子写(tmp+rename),守护每拍重载 conf。
- events:App 前后台切换——launcher MSG_ACT_FOCUS 为单向 app→launcher 上报,powermgr 侧无导出点
  可接,诚实标注「期4 接 launcher」扩展,本期不编造该事件(延续期2 口径)。
- 验证:宿主+qemu 全量 76/76 PASS(期1/2 全过+新增 policy/calibrate/model-set 用例),mipsel
  静态交叉 0 warning,二进制 151516B(<200KB 阈值)。md5 1ef2f8afc07acc7aa09dee9f7149aba8。
This commit is contained in:
AskaEth committed 2026-09-02 16:25:51 +08:00
1 parent 8a43f17653
commit 5663acfbb9
4 files changed
+875 -34

No files matched your search

+66 -4
View File
@@ -42,10 +42,15 @@ EOF
echo "cpu 100 0 100 800 0 0 0 0 0 0" > "$T/proc_stat"
echo meow > "$T/boot_mode"
mkdir -p "$T/logs" # 标定 CSV 落点(MEOW_LOG_DIR)
cat > "$T/settings.conf" <<'SEOF'
# meow-settings 1 (测试桩:policy power.* 键落点)
SEOF
ENVS="MEOW_PS_DIR=$PS MEOW_BL_DIR=$BL MEOW_NET_DIR=$NET MEOW_RFKILL_DIR=$RF MEOW_BT_DIR=$BT
MEOW_NETDEV=$T/netdev MEOW_PROC_STAT=$T/proc_stat MEOW_BOOT_MODE=$T/boot_mode
MEOW_PM_MODEL=$T/model.conf MEOW_AUDIO_SOCK=$T/no_audio.sock MEOW_PM_SOCK=$T/pm.sock
MEOW_PM_NO_HCICONFIG=1"
MEOW_PM_MODEL=$T/model.conf MEOW_SETTINGS_FILE=$T/settings.conf MEOW_LOG_DIR=$T/logs
MEOW_AUDIO_SOCK=$T/no_audio.sock MEOW_PM_SOCK=$T/pm.sock
MEOW_PM_NO_HCICONFIG=1 MEOW_PM_AUTH_TEST=1"
ln -sf "$(readlink -f "$BIN")" "$T/meow_power" # argv[0] 双形态
# ---- T1: 守护直读(无守护 → 降级直读) ----
@@ -143,8 +148,65 @@ ck T9a "history:" "$OUT"
ck T9b "采样点" "$OUT"
ck T9c "est_mW" "$OUT"
echo "$OUT" | grep -q "守护不可达" && { FAIL=$((FAIL+1)); echo "FAIL T9d 应走守护"; } || { PASS=$((PASS+1)); echo "PASS T9d via-daemon"; }
OUT=$(env $ENVS $Q "$T/meow_power" policy 2>&1)
ck T9e "期 3" "$OUT"
# ---- T9e: 期 3 policy show(默认全关:profile=balanced / cap=0 / enact=off)----
OUT=$(env $ENVS $Q "$T/meow_power" policy show 2>&1)
ck T9e "profile=balanced low_pct=15 critical_pct=5" "$OUT"
ck T9e2 "brightness_cap=0 screen_timeout_cap=0 enact=off" "$OUT"
ck T9e3 "默认全关" "$OUT"
# ---- T9f: 期 3 policy set profile powersave(写入 settings.conf;enact=on)----
OUT=$(env $ENVS $Q "$T/meow_power" policy set profile powersave 2>&1)
ck T9f "policy set profile=powersave" "$OUT"
OUT=$(env $ENVS $Q "$T/meow_power" policy show 2>&1)
ck T9f2 "profile=powersave" "$OUT"
ck T9f3 "enact=on" "$OUT"
grep -q "power.profile=powersave" "$T/settings.conf" && { PASS=$((PASS+1)); echo "PASS T9f4 settings 键"; } || { FAIL=$((FAIL+1)); echo "FAIL T9f4: $(cat "$T/settings.conf")"; }
# ---- T9g: 期 3 低电阈值读 settings.conf(power.low_pct=20 生效于事件判定)----
env $ENVS $Q "$T/meow_power" policy set low-pct 20 >/dev/null 2>&1
echo 19 > "$PS/battery/capacity" # 从 93 跳到 19 < 20 → 低电事件(阈值 20%)
sleep 4 # 等守护节拍采样
OUT=$(env $ENVS $Q "$T/meow_power" policy show 2>&1)
ck T9g "low_pct=20" "$OUT"
OUT=$(env $ENVS $Q "$T/meow_power" events 2>&1)
ck T9g2 "阈值 20%" "$OUT"
echo 93 > "$PS/battery/capacity" # 恢复
env $ENVS $Q "$T/meow_power" policy set low-pct 15 >/dev/null 2>&1
env $ENVS $Q "$T/meow_power" policy set profile balanced >/dev/null 2>&1
# ---- T9h: 期 3 policy set bri-cap(0-101 越界拒绝)----
OUT=$(env $ENVS $Q "$T/meow_power" policy set bri-cap 88 2>&1)
ck T9h "policy set bri-cap=88" "$OUT"
OUT=$(env $ENVS $Q "$T/meow_power" policy set bri-cap 255 2>&1)
ck T9h2 "0-101" "$OUT"
env $ENVS $Q "$T/meow_power" policy set bri-cap 0 >/dev/null 2>&1
# ---- T9i: 期 3 标定工具 calibrate start/stop/list 出 CSV ----
OUT=$(env $ENVS $Q "$T/meow_power" calibrate start 纯亮屏 2>&1)
ck T9i "calibrate 已启动" "$OUT"
ck T9i2 "power_calib_" "$OUT"
sleep 5 # 等 2s×2 拍
OUT=$(env $ENVS $Q "$T/meow_power" calibrate stop 2>&1)
ck T9i3 "calibrate 已停止" "$OUT"
ck T9i4 "rows=" "$OUT"
CSV=$(ls "$T/logs"/power_calib_*.csv 2>/dev/null | head -1)
if [ -n "$CSV" ]; then PASS=$((PASS+1)); echo "PASS T9i5 csv exists ($CSV)"; else FAIL=$((FAIL+1)); echo "FAIL T9i5 CSV 未生成"; fi
[ -n "$CSV" ] && grep -q "ts,cap_pct,vol_mv,current_ua,charge_mw,brightness_pct,cpu_util_pct,wifi_state,bt_state" "$CSV" && { PASS=$((PASS+1)); echo "PASS T9i6 csv header"; } || { FAIL=$((FAIL+1)); echo "FAIL T9i6 csv header"; }
[ -n "$CSV" ] && grep -q "scene=纯亮屏" "$CSV" && { PASS=$((PASS+1)); echo "PASS T9i7 csv scene"; } || { FAIL=$((FAIL+1)); echo "FAIL T9i7 csv scene"; }
OUT=$(env $ENVS $Q "$T/meow_power" calibrate list 2>&1)
ck T9i8 "power_calib_" "$OUT"
# ---- T9j: 期 3 模型单键 setter model set <key> <mw>(守护每拍重载生效)----
OUT=$(env $ENVS $Q "$T/meow_power" model set baseline_mw 999 2>&1)
ck T9j "model set baseline_mw=999" "$OUT"
OUT=$(env $ENVS $Q "$T/meow_power" model 2>/dev/null)
ck T9j2 "baseline_mw=999" "$OUT"
sleep 2 # 等守护重载 model
OUT=$(env $ENVS $Q "$T/meow_power" estimate 2>/dev/null)
ck T9j3 "baseline=999" "$OUT" # 守护侧 estimate 用新系数
OUT=$(env $ENVS $Q "$T/meow_power" model set bad_key 5 2>&1)
ck T9j4 "未知键" "$OUT"
env $ENVS $Q "$T/meow_power" model set baseline_mw 300 >/dev/null 2>&1
# ---- T10: meow_powermgr 名直调子命令也走 CLI ----
OUT=$(env $ENVS $Q "$BIN" model 2>/dev/null)