fix(launcher): 开机亮度停100竞态 (agent-230) — settings未读到前不盲写100, 挂起+读到后补应用; launcher aa6c95a4→8ebae666; 宿主4场景PASS
This commit is contained in:
1 parent
c7d02e66e9
commit
f34818037f
8 files changed
+135
-2
No files matched your search
@@ -17,18 +17,33 @@ int meow_auto_slept = 0; /* M2.17:当前是否「超时自动息屏」置
|
||||
/* brightness save/restore (defined below, used by run_menu) */
|
||||
int saved_brightness = -1;
|
||||
|
||||
/* M2.86:亮度「待补应用」挂起标志。launcher 被 sysui 在 S70 早拉起,早于 /usr/data(UBIFS) 就绪,
|
||||
* settings_load 读到的是纯默认值(display.brightness=101→clamp 100);此时 apply_user_brightness
|
||||
* 若照写 100 即「开机遇 100 满亮」。修:设置未真正读到盘上时挂起,待 run_menu 轮询 settings_load
|
||||
* 成功(meow_settings_loaded()==1)后补应用真实用户亮度。 */
|
||||
int meow_brightness_pending = 0;
|
||||
|
||||
|
||||
/* M2.53:MeowOS 主屏接管时把亮度强制压回用户设置值(display.brightness,经
|
||||
* meow_settings_brightness_clamped() —— 下限 brightness_min 默认 1、上限 100),
|
||||
* 覆盖 HibyOS 播放器写入 sysfs 的背光下限(16/25)。仅应在「MeowOS 真正接管画面」
|
||||
* (播放器已死、主屏常驻,即 run_menu 的 had_player==0)时调用;播放器会话期间的
|
||||
* 覆盖菜单(had_player==1)不去抢亮度——尊重播放器背光(§红线)。 */
|
||||
* 覆盖菜单(had_player==1)不去抢亮度——尊重播放器背光(§红线)。
|
||||
* M2.86:设置未读到(meow_settings_loaded()==0,S70 早启动 /usr/data 未就绪)时不盲目写 100 ——
|
||||
* 挂起 meow_brightness_pending,待设置就绪后由 settings_load()(run_menu 每 2s 重试)补应用。 */
|
||||
void apply_user_brightness(void)
|
||||
{
|
||||
if (!meow_settings_loaded()) {
|
||||
if (!meow_brightness_pending)
|
||||
logmsg("apply user brightness: settings unloaded, defer (not forcing 100)");
|
||||
meow_brightness_pending = 1;
|
||||
return;
|
||||
}
|
||||
int v = meow_settings_brightness_clamped();
|
||||
if (v <= 0) v = 60; /* 防御:clamp 后不可能 ≤0,仅兜底 */
|
||||
write_brightness(v);
|
||||
g_sys.brightness = v;
|
||||
meow_brightness_pending = 0;
|
||||
logmsg("apply user brightness (MeowOS takeover) -> %d", v);
|
||||
}
|
||||
|
||||
|
||||
@@ -960,6 +960,12 @@ static void run_menu(struct app apps[MAX_APPS], int napps, int state,
|
||||
if (meow_mode && (long)(t - t0) - meow_last_poll >= 2000) {
|
||||
meow_last_poll = (long)(t - t0);
|
||||
ensure_wifi();
|
||||
/* M2.86 开机亮度竞态:launcher 被 sysui 在 S70 早拉起,/usr/data(UBIFS) 未就绪 →
|
||||
* 首次 settings_load 读到纯默认值(display.brightness=101→clamp 100),apply_user_brightness
|
||||
* 已挂起 meow_brightness_pending(不盲目写 100)。每 2s 重试 settings_load 直到读到
|
||||
* settings.conf;settings_load 内置在「未读到→已读到」转换时补应用真实用户亮度。 */
|
||||
if (meow_brightness_pending && !meow_settings_loaded())
|
||||
settings_load();
|
||||
if (!sd_device_present()) {
|
||||
/* 卡被拔出:设备节点消失 → 无卡态。停止扫描;留 state=1(NO STORAGE CARD)。
|
||||
* 若此前是正常态,切到无卡并重绘。不杀正在跑的应用(其由 D 的监测处理)。 */
|
||||
|
||||
@@ -558,6 +558,7 @@ long sys_mem_available_kb(void);
|
||||
extern uint32_t menu_bg;
|
||||
extern int menu_opened_blank;
|
||||
extern int meow_auto_slept;
|
||||
extern int meow_brightness_pending; /* M2.86:亮度待补应用挂起(apply_user_brightness 在设置未读到时不写,置 1) */
|
||||
extern int meow_mode;
|
||||
extern int meow_saved_brightness;
|
||||
extern int meow_screen_on;
|
||||
|
||||
Binary file not shown.
@@ -59,6 +59,9 @@ static meow_settings_listener g_listeners[MEOW_SET_MAX_LISTENERS];
|
||||
static int g_nlisteners = 0;
|
||||
static int g_inited = 0;
|
||||
static int g_broadcasting = 0; /* 防 listener 递归 set */
|
||||
static int g_loaded_from_file = 0; /* M2.86:settings.conf 是否真正从盘读到(区分「默认值激活」
|
||||
* 因 /usr/data 未就绪 fopen 失败 vs 文件已读但键缺失→默认) */
|
||||
static int g_no_file_logged = 0; /* M2.86:本次「未读到」连续段是否已打过 no-file 日志(防重启重试刷屏) */
|
||||
|
||||
/* ---- 默认值表:与 SYSTEM_SETTINGS.md §1 逐键一致(新增设置照附录扩展)---- */
|
||||
static const meow_setting_def g_defs[] = {
|
||||
@@ -243,6 +246,15 @@ int meow_settings_brightness_clamped(void)
|
||||
return clamp_brightness(v);
|
||||
}
|
||||
|
||||
/* M2.86:settings.conf 是否真正从盘上读到过(最近一次 meow_settings_init 是否成功打开了文件)。
|
||||
* 0=S70 早启动 /usr/data 未就绪 fopen 失败 → 当前全为默认值(display.brightness 101→将被 clamp 到 100),
|
||||
* 此时调用方(尤其 apply_user_brightness)不应把默认值当作用户设定写入,应挂起待设置就绪。
|
||||
* 1=文件已读到:键缺失则走各自默认(属「已知」态),用户设定可信。 */
|
||||
int meow_settings_loaded(void)
|
||||
{
|
||||
return g_loaded_from_file;
|
||||
}
|
||||
|
||||
/* ---- 按类型把字符串值 apply 到 cur(读文件/导入时用;含 clamp/校验)---- */
|
||||
static void apply_value(meow_setting *s, const char *v)
|
||||
{
|
||||
@@ -332,12 +344,24 @@ int meow_settings_init(void)
|
||||
strncpy(g_sets[i].cur, g_sets[i].def, sizeof g_sets[i].cur - 1);
|
||||
g_sets[i].dirty = 0;
|
||||
}
|
||||
/* M2.86:每次重载先把「已读到盘上」置 0;成功打开才置 1。
|
||||
* 区分「settings.conf 被读到(键缺失→默认)」与「完全没读到(/usr/data 未就绪 → 纯默认)」,后者
|
||||
* 调用方(apply_user_brightness)不得把默认值当作用户设定盲目写盘(尤其 display.brightness 101→clamp
|
||||
* 100 会误把开机亮度压到满亮)。 */
|
||||
g_loaded_from_file = 0;
|
||||
FILE *f = fopen(MEOW_SETTINGS_FILE, "r");
|
||||
if (!f) {
|
||||
sset_log("no %s, defaults active", MEOW_SETTINGS_FILE);
|
||||
/* M2.86:S70 早启动 /usr/data(UBIFS) 未就绪时 fopen 失败是常态,且 run_menu 每 2s 重试
|
||||
* settings_load —— 只在本次「未读到」连续段首次打日志,避免每 2s 刷一行「no file」。 */
|
||||
if (!g_no_file_logged) {
|
||||
sset_log("no %s, defaults active", MEOW_SETTINGS_FILE);
|
||||
g_no_file_logged = 1;
|
||||
}
|
||||
g_inited = 1;
|
||||
return MEOW_OK;
|
||||
}
|
||||
g_loaded_from_file = 1; /* 文件已打开待读:即便 0 行也视为「已读到」→ 键缺失走默认而非「未知」 */
|
||||
g_no_file_logged = 0; /* 段复位:下次失败(若发生)重新计一句话 */
|
||||
char buf[768];
|
||||
while (fgets(buf, sizeof buf, f)) {
|
||||
char *eq = strchr(buf, '=');
|
||||
|
||||
@@ -76,6 +76,12 @@ int meow_settings_get_bool(const char *key, int *out); /* 0/1 */
|
||||
* settings 未初始化/键缺失时回退默认 101 再 clamp(→100);纯函数,宿主机可直接测。 */
|
||||
int meow_settings_brightness_clamped(void);
|
||||
|
||||
/* M2.86:settings.conf 是否真正从盘上读到过(最近一次 meow_settings_init 成功打开文件)。
|
||||
* 0 = S70 早启动 /usr/data 未就绪 fopen 失败 → 当前全为默认值(display.brightness 101→clamp 100),
|
||||
* 调用方(尤其 apply_user_brightness)不得把默认值当作用户设定写入,应挂起待设置就绪再补应用;
|
||||
* 1 = 文件已读到:键缺失走各自默认(属「已知」态),用户设定可信。 */
|
||||
int meow_settings_loaded(void);
|
||||
|
||||
int meow_settings_set_int (const char *key, int v); /* clamp 到取值域 */
|
||||
int meow_settings_set_str (const char *key, const char *v);/* 长度截断 MEOW_SET_MAX_LEN */
|
||||
int meow_settings_set_enum(const char *key, int idx); /* 校验枚举合法,越界拒绝 */
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
/* test_settings_brightness.c — M2.86 宿主测试:settings.conf「未读到」vs「已读到」的亮度语义。
|
||||
*
|
||||
* 直接 #include "meow_settings.c"(同 TU 平移其 static 常量/函数,与 test_notif_tf.c 把
|
||||
* meow_notif.c 平移进 TU 的既有模式一致);编译期用 -DMEOW_SETTINGS_FILE 覆盖存储路径
|
||||
* (meow_settings.c 注释即声明该宏可编译期覆盖,宿主可直接测)。
|
||||
*
|
||||
* 验证的核心(开机亮度停在 100 的根因修复):
|
||||
* 1) meow_settings_loaded()==0:settings.conf 不可读(S70 早启动 /usr/data 未就绪)→
|
||||
* apply_user_brightness 必须据此挂起,而不是把 display.brightness 默认 101→clamp 100 盲目写盘。
|
||||
* 2) meow_settings_loaded()==1:文件读到 → 用户设定/键缺失默认可信。
|
||||
* 3) meow_settings_brightness_clamped() 的回退语义:文件缺失时确实回退 100(危险值),
|
||||
* 但此时 loaded()==0 才是调用方要不要写盘的判据。
|
||||
*/
|
||||
#include "meow_settings.c"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
const char *conf = MEOW_SETTINGS_FILE; /* 编译期覆盖的路径(需为可写临时文件路径) */
|
||||
FILE *f;
|
||||
|
||||
/* 场景 A:/usr/data 未就绪 → 文件不存在 → loaded==0,clamp 回退 100(危险值,但 loaded==0 提示调用方挂起) */
|
||||
unlink(conf);
|
||||
assert(meow_settings_init() == MEOW_OK);
|
||||
assert(meow_settings_loaded() == 0);
|
||||
int v = meow_settings_brightness_clamped();
|
||||
assert(v == 100);
|
||||
printf("[A] file absent : loaded=%d brightness_clamped=%d (expect 0 / 100)\n",
|
||||
meow_settings_loaded(), v);
|
||||
|
||||
/* 场景 B:文件存在且用户设 60 → loaded==1,clamp 60(用户设定可信) */
|
||||
f = fopen(conf, "w");
|
||||
assert(f);
|
||||
fprintf(f, "# meow-settings 1\ndisplay.brightness=60\ndisplay.brightness_min=1\n");
|
||||
fclose(f);
|
||||
assert(meow_settings_init() == MEOW_OK);
|
||||
assert(meow_settings_loaded() == 1);
|
||||
v = meow_settings_brightness_clamped();
|
||||
assert(v == 60);
|
||||
printf("[B] file =60 : loaded=%d brightness_clamped=%d (expect 1 / 60)\n",
|
||||
meow_settings_loaded(), v);
|
||||
|
||||
/* 场景 C:文件存在但键缺失(仅注释/头)→ loaded==1,默认 101→clamp 100(「已读到→键缺失走默认」) */
|
||||
f = fopen(conf, "w");
|
||||
assert(f);
|
||||
fprintf(f, "# meow-settings 1\n");
|
||||
fclose(f);
|
||||
assert(meow_settings_init() == MEOW_OK);
|
||||
assert(meow_settings_loaded() == 1);
|
||||
v = meow_settings_brightness_clamped();
|
||||
assert(v == 100);
|
||||
printf("[C] file no key : loaded=%d brightness_clamped=%d (expect 1 / 100)\n",
|
||||
meow_settings_loaded(), v);
|
||||
|
||||
/* 场景 D:文件存在但持久值 101 → clamp 到 100(防闪屏上限,M2.39) */
|
||||
f = fopen(conf, "w");
|
||||
assert(f);
|
||||
fprintf(f, "display.brightness=101\ndisplay.brightness_min=1\n");
|
||||
fclose(f);
|
||||
assert(meow_settings_init() == MEOW_OK);
|
||||
assert(meow_settings_loaded() == 1);
|
||||
v = meow_settings_brightness_clamped();
|
||||
assert(v == 100);
|
||||
printf("[D] file =101 : loaded=%d brightness_clamped=%d (expect 1 / 100)\n",
|
||||
meow_settings_loaded(), v);
|
||||
|
||||
unlink(conf);
|
||||
printf("ALL PASS\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -640,6 +640,14 @@ void settings_load(void)
|
||||
settings_cache_registered = 1;
|
||||
}
|
||||
settings_sync_cache_from_backend();
|
||||
/* M2.86 开机亮度竞态:launcher S70 早启动 /usr/data 未就绪 → 首次 init 读到的是纯默认值
|
||||
* (display.brightness=101→clamp 100),apply_user_brightness 已挂起 meow_brightness_pending。
|
||||
* 此处 settings 一旦真正从盘上读到(meow_settings_loaded()==1)即补应用真实用户亮度。
|
||||
* 幂等:正常路径(已读到、无挂起)恒为 no-op;仅「未读到→已读到」转换时触发一次。 */
|
||||
if (meow_settings_loaded() && meow_brightness_pending) {
|
||||
apply_user_brightness();
|
||||
logmsg("deferred user brightness applied after settings ready");
|
||||
}
|
||||
logmsg("settings: vol=%d(max=%d,step=%d) refresh=%d(always_max=%d) off=%ds mode=%s",
|
||||
settings_volume, settings_volume_max, settings_volume_step,
|
||||
refresh_rate_cfg, refresh_always_max, screen_off_timeout,
|
||||
|
||||
Reference in new issue
Block a user