- sdk/meow_time32: 抽出可独立链接的 o32 time32 取时/睡眠设施(不依赖 meow_ui.a, watchdog 等独立静态组件可直接链;可选 -DMEOW_TIME32_LIBC_OVERRIDES 接管 libc 入口) - watchdog: now_ms/usleep 改走 time32(修复 held 变天文数字→每次单击都弹菜单); 阈值读 power.longpress_menu_ms/forceoff_ms(缺省 3000/8000),删除 PWR_TOGGLE_MS==PWR_MENU_MS;新增 wd_power.h 纯判定 + 宿主行为矩阵测试 - launcher: App 前台电源菜单补齐 §10.5(notif 全抑制 + 帧恢复 + SIGCONT 排空 + 标记翻回前台);show_power_menu 恢复进入前背景帧(关闭后不再停留菜单画面); 重绘挪到首轮按键采样之后;activity 标记排空窗 + 会话入口清理 + manual_off 去闩锁 - lock_screen: 电源改按下边沿 + 进场 300ms 才熄屏;电源熄屏退出也恢复底层帧; launcher 在 SIGCONT 前写 /tmp/meow_app_repaint,SDK present 消费并 dirty_full - power_menu: 菜单内强关接 power.forceoff_ms(按 longpress 抵扣),日志不再谎称 8s - 重编 meow_ui.a 并重链 meow_launcherd/ncm/files/hello/reader(picbrowser 无源码) - fw_content.conf: 同步 launcherd/watchdog 新 md5;顺带修正 M35 遗留的 nyai 失效钉值 Host: test_wd_fw 66/66、test_overlay_gate 40/40、test_meow_time64/time/repaint PASS。 真机未验证(设备关机);未刷机、未写设备。
94 lines
3.5 KiB
C
94 lines
3.5 KiB
C
/* test_meow_time.c — 宿主单测:SDK 时钟换算(meow_ui_time.c / meow_time_ms_from_parts)。
|
||
*
|
||
* 背景(M11):mipsel 真机上 meow_ui_time_ms() 曾返回「低 32 位=秒×1000、高 32 位随机」,
|
||
* 根因是 zig musl 头(time_t 64 位)与 libc 实现(o32 time32 取数)ABI 不一致,见
|
||
* sdk/CLOCK_ABI.md。修复后取数统一走 meow_time_ms_from_parts(sec, nsec),本测试把
|
||
* 换算边界(毫秒进位/截断/大秒数)与「真时钟单调且前进」固定在宿主上。
|
||
*
|
||
* 编译(patch_v2/sdk 目录下):
|
||
* gcc -Os -Wall -Wextra -I. -Iinclude -c meow_ui_time.c -o /tmp/meow_ui_time.o
|
||
* gcc -Os -Wall -Wextra -I. -Iinclude -c meow_time32.c -o /tmp/meow_time32.o
|
||
* gcc -Os -Wall -Wextra -I. -Iinclude test_meow_time.c /tmp/meow_ui_time.o /tmp/meow_time32.o \
|
||
* -o test_meow_time
|
||
* 运行:./test_meow_time (exit 0=PASS / 1=FAIL)
|
||
*/
|
||
#include <stdint.h>
|
||
#include <stdio.h>
|
||
#include <time.h>
|
||
|
||
#include "meow_ui.h"
|
||
#include "meow_ui_internal.h"
|
||
|
||
static int g_fail = 0;
|
||
|
||
static void eq_ms(const char *name, int64_t sec, int64_t nsec, uint64_t want)
|
||
{
|
||
uint64_t got = meow_time_ms_from_parts(sec, nsec);
|
||
if (got != want) {
|
||
printf("FAIL %s: sec=%lld nsec=%lld got=%llu want=%llu\n",
|
||
name, (long long)sec, (long long)nsec,
|
||
(unsigned long long)got, (unsigned long long)want);
|
||
g_fail = 1;
|
||
} else {
|
||
printf("ok %s = %llu\n", name, (unsigned long long)got);
|
||
}
|
||
}
|
||
|
||
int main(void)
|
||
{
|
||
/* ---- 1) 换算边界:毫秒 = sec*1000 + nsec/1e6(整除截断) ---- */
|
||
eq_ms("零", 0, 0, 0);
|
||
eq_ms("1s", 1, 0, 1000);
|
||
eq_ms("999999ns 截断", 0, 999999, 0);
|
||
eq_ms("1ms 进位", 0, 1000000, 1);
|
||
eq_ms("1ns 截断", 0, 1, 0);
|
||
eq_ms("开机 1135.008s", 1135, 8000000, 1135008);
|
||
eq_ms("开机 1204.999999999s", 1204, 999999999, 1204999);
|
||
eq_ms("接近 2038", 2147483647, 999999999, 2147483647999ULL);
|
||
|
||
/* ---- 2) 真时钟:非零、单调不减、量级合理(不上溢成「高 32 随机」) ---- */
|
||
uint64_t prev = meow_ui_time_ms();
|
||
if (prev == 0) {
|
||
printf("FAIL 时钟返回 0(clock_gettime 失败?)\n");
|
||
g_fail = 1;
|
||
}
|
||
if (prev >= (1ULL << 40)) {
|
||
printf("FAIL 时钟量级异常(>=2^40 ms):%llu\n", (unsigned long long)prev);
|
||
g_fail = 1;
|
||
}
|
||
/* 40s 量级以内取值 = 开机时长(宿主 monotonic),并要求前进 */
|
||
int advanced = 0;
|
||
for (int i = 0; i < 200000 && !advanced; i++) {
|
||
uint64_t now = meow_ui_time_ms();
|
||
if (now < prev) {
|
||
printf("FAIL 单调倒退:%llu -> %llu\n",
|
||
(unsigned long long)prev, (unsigned long long)now);
|
||
g_fail = 1;
|
||
break;
|
||
}
|
||
advanced = now > prev;
|
||
prev = now;
|
||
}
|
||
if (!advanced) {
|
||
printf("FAIL 时钟未前进(200000 次采样内无变化)\n");
|
||
g_fail = 1;
|
||
} else {
|
||
printf("ok 时钟前进且单调\n");
|
||
}
|
||
|
||
/* ---- 3) 动画常用差值:两次取样的差 = 毫秒(不能是 0 恒等/整千) ---- */
|
||
uint64_t t0 = meow_ui_time_ms();
|
||
while (meow_ui_time_ms() == t0) { }
|
||
uint64_t t1 = meow_ui_time_ms();
|
||
if (t1 <= t0 || t1 - t0 > 5000) {
|
||
printf("FAIL 取样差值异常:%llu -> %llu\n",
|
||
(unsigned long long)t0, (unsigned long long)t1);
|
||
g_fail = 1;
|
||
} else {
|
||
printf("ok 取样差值 %llu ms\n", (unsigned long long)(t1 - t0));
|
||
}
|
||
|
||
printf(g_fail ? "== FAIL ==\n" : "== PASS ==\n");
|
||
return g_fail;
|
||
}
|