Files
MeowOS-For-R3P2/patch_v2/meow_launcherd/test_np_keys.c
T
AskaEth 7c7d891570 feat: M6.44+M6.45 收编 — 真机 0.8.45 现场保全(reader章节/key_router按键路由/WiFi连接修复/ncm bench+IME修复)
脏工作区现场收编:devdocs/local/m6_44_45_dirty_tracked.patch(46 个已跟踪文本文件,
+3090/-585, 已对 M6.43 基线干净适配) + m6_44_45_untracked_src.tar.gz 中 patch_v2/ 下
13 个新增源文件, 合成单个提交, 内容与容器工作树(R3ProII/patch_v2)逐字节一致。

- reader 章节: 新增 core/rdchapter.{h,c} — TXT 章节规范解析器, 扫描 512KB 码位对齐段文件
  逐段流式识别标题行(行首缩进≤4/显示宽≤40/行内标点≤1 三重约束防误判), 输出标题+全书字符
  偏移+段号/段内偏移+阿拉伯章号(中文数字归一), 首章前内容归"卷首"; book/reader/rdenc/
  rdlayout/settings 接入章节跳转与进度锚点, 附 chapter_smoke/turn_repro/build_turn_repro.sh
- key_router 按键路由: 新增 meow_launcherd/key_router.{h,c} — launcher-UI 页物理键统一路由
  (P1 仅音量键), 把读取边沿+防抖+长按 held+ramp 推进从 5 个会话收敛为进程内单开;
  各页每圈 key_router_pump() 取防抖后边沿, 动作(调音量/光标导航)仍由调用页决定,
  保留 run_menu 的 meow_mode 分支; App 前台 volume_page 武装时边沿抑制;
  main_menu/now_playing/notif_center/settings_page/subpage 接入, 附 test_key_router_vol/test_np_keys
- WiFi 连接修复: meow_netmgrd connect 有界等待 wpa_state=COMPLETED(普通 10s/隐藏网络 15s,
  env 可调)修设置页连接无响应; list_networks/scan_results 的 \xNN 转义还原始字节, 修中文 SSID
  永不命中致新建同名 open 记录顶影; launcher netmgr_ipc 配读超时; 附 test_wifi_connect(桩
  wpa_cli 驱动 static wifi_connect_ex), test_netmgrd.sh 补用例; wifi_page 同步
- ncm bench: 新增 bench/lyric_sim.c、bench/plpage_sim.c, vol_sync_sim 与 ncm core/app 同步
- SDK IME 修复: shift 大小写、K_ENTER 只提交不关、阻塞 IME 循环喂 on_tick 不被遮挡、
  IME 打开 ~200ms TAP 冷却窗吞 stray-TAP; 附 sdk/test_ime_fix.c
- 同期: meow_audiod 音量异步 ACK 线程(代际防 fd/槽复用竞态)、watchdog 音量收编(首选 audiod
  权威, settings.conf 覆盖路径)、panel 文件搜索(F1-④)与蓝牙只读详情(F1-③)、各类 build 脚本同步

范围红线: third_party/legado-E-main 原开发者未跟踪, 本次不入库(保留 devdocs/local tar 参考);
二进制不入库(后续重编); devdocs/ 不入库。59 文件全部在 patch_v2/ 下, 无 third_party/devdocs。
验证: git apply --check 干净; 59 文件 md5 与容器 patch_v2 逐一比对 59/59 一致(含
key_router.c/rdchapter.c/meow_ui_ime.c/test_wifi_connect.c 抽查); 可执行位保守
(check_lgpl_release.sh 100755, build_turn_repro.sh 100644 与容器一致)。
2026-11-04 20:02:28 +08:00

115 lines
5.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* test_np_keys.c — 宿主单测:Now Playing 播放页/歌词页物理键分发(Task C)。
*
* 背景(真机现象):桌面播放页与歌词页上,音量键 + 播放键「完全无反应」。
* 根因(now_playing.c):run_now_playing() 原先只接播放键(164)与电源键,未接音量键
* (114/115),导致播放页/歌词页(同一循环,与页无关)调不了音量。
*
* 本测复现 run_now_playing() 的按键动作应用(np_apply_key_actions):音量键走
* settings_volume_adj(±step)、播放键走 meow_media_playctl(按会话当前态 1=播放 2=暂停)。
* 断言:
* K1 音量减边沿 → settings_volume_adj(-step);
* K2 音量加边沿 → settings_volume_adj(+step);
* K3 播放键边沿 + 会话正在播放 → meow_media_playctl(2,0)(暂停);
* K4 播放键边沿 + 会话已暂停 → meow_media_playctl(1,0)(播放);
* K5 播放键边沿 + 无会话 → 不下发(空态不误报);
* K6 无任何边沿 → 两个回调都不触发;
* K7 音量/播放边沿都会更新 last_input(自动息屏计时复位)。
*
* 编译(在 patch_v2/meow_launcherd 下):
* gcc -Wall -Wextra -I../sdk -I. -ffunction-sections -fdata-sections \
* -Wl,--gc-sections -DMEOW_NP_KEYS_TEST \
* test_np_keys.c -o test_np_keys
* ./test_np_keys
* 说明:now_playing.c 用 #include 同 TU 平移(惯例同 test_vol_ramp_jack);-ffunction-sections
* + --gc-sections 只保留 np_apply_key_actions 及其依赖,其余(渲染/控件/绘制)被回收,
* 故仅需桩 settings_volume_adj/settings_volume_step/meow_media_playctl/now_ms/logmsg。
*/
#include "now_playing.c" /* 同 TU #include:拿到 static np_apply_key_actions */
#include <stdio.h>
#include <string.h>
static int g_fails = 0;
#define CHECK(cond, name) do { \
if (cond) printf(" PASS %s\n", name); \
else { printf(" FAIL %s (%s:%d)\n", name, __FILE__, __LINE__); g_fails++; } } while (0)
/* ---- 桩:np_apply_key_actions 依赖的 launcher 外部符号 ---- */
int settings_volume_step = 5;
static int g_adj_count = 0, g_adj_delta = 0;
void settings_volume_adj(int delta) { g_adj_count++; g_adj_delta = delta; }
static int g_playctl_count = 0;
static uint32_t g_playctl_cmd = 0;
static int64_t g_playctl_seek = 0;
int meow_media_playctl(uint32_t cmd, int64_t seek_ms)
{ g_playctl_count++; g_playctl_cmd = cmd; g_playctl_seek = seek_ms; return 0; }
static unsigned long long g_now = 100000;
unsigned long long now_ms(void) { return g_now; }
void logmsg(const char *fmt, ...) { (void)fmt; }
/* 会话(meow_media_session_t 来自 meow_media.h,含 state 字段) */
static meow_media_session_t g_s;
static void reset_callbacks(void)
{
g_adj_count = 0; g_adj_delta = 0;
g_playctl_count = 0; g_playctl_cmd = 0; g_playctl_seek = 0;
}
int main(void)
{
memset(&g_s, 0, sizeof g_s);
unsigned long long last_input = 0;
/* K1 音量减边沿 → settings_volume_adj(-step) */
reset_callbacks(); last_input = 0; g_now = 100000;
np_apply_key_actions(1, 0, 0, &g_s, &last_input);
CHECK(g_adj_count == 1 && g_adj_delta == -settings_volume_step,
"K1 vol-down edge -> settings_volume_adj(-step)");
CHECK(last_input == g_now, "K7a vol-down updates last_input");
/* K2 音量加边沿 → settings_volume_adj(+step) */
reset_callbacks(); last_input = 0; g_now = 100050;
np_apply_key_actions(0, 1, 0, &g_s, &last_input);
CHECK(g_adj_count == 1 && g_adj_delta == +settings_volume_step,
"K2 vol-up edge -> settings_volume_adj(+step)");
CHECK(last_input == g_now, "K7b vol-up updates last_input");
/* K3 播放键边沿 + 正在播放 → MSG_PLAYCTL(2,0) 暂停 */
g_s.state = MEOW_MEDIA_PLAYING;
reset_callbacks();
np_apply_key_actions(0, 0, 1, &g_s, &last_input);
CHECK(g_playctl_count == 1 && g_playctl_cmd == 2 && g_playctl_seek == 0,
"K3 play edge (playing) -> playctl pause(2)");
/* K4 播放键边沿 + 已暂停 → MSG_PLAYCTL(1,0) 播放 */
g_s.state = MEOW_MEDIA_PAUSED;
reset_callbacks();
np_apply_key_actions(0, 0, 1, &g_s, &last_input);
CHECK(g_playctl_count == 1 && g_playctl_cmd == 1 && g_playctl_seek == 0,
"K4 play edge (paused) -> playctl play(1)");
/* K5 播放键边沿 + 无会话 → 不下发(并仍复位 last_input) */
reset_callbacks(); last_input = 0; g_now = 100100;
np_apply_key_actions(0, 0, 1, NULL, &last_input);
CHECK(g_playctl_count == 0, "K5 play edge (no session) -> no playctl");
CHECK(last_input == g_now, "K7c play edge updates last_input (no session)");
/* K6 无任何边沿 → 两个回调都不触发 */
reset_callbacks(); last_input = 0;
np_apply_key_actions(0, 0, 0, &g_s, &last_input);
CHECK(g_adj_count == 0 && g_playctl_count == 0, "K6 no edge -> no callbacks");
/* K7 音量递减时播放键不同时触发(音量边沿优先,播放单独判) */
g_s.state = MEOW_MEDIA_PLAYING;
reset_callbacks();
np_apply_key_actions(1, 0, 1, &g_s, &last_input);
CHECK(g_adj_count == 1 && g_playctl_count == 1,
"K8 vol-down + play_edge both fire (independent)");
printf("\nRESULT: %s (%d fails)\n", g_fails ? "FAIL" : "ALL PASS", g_fails);
return g_fails ? 1 : 0;
}