// 常亮屏刷新定时器(用于压测模式,每50分钟刷新一次,避免1小时超时)
void StartAlwaysOnRefreshTimer();
void StopAlwaysOnRefreshTimer();
+
+ /** 息屏时间档位:0=30秒(默认) 1=5分钟 2=10分钟 3=30分钟 4=常亮(不息屏);KV 仅存 screen_timeout_sec */
+ static constexpr int SCREEN_KEEPON_LEVEL_30S = 0;
+ static constexpr int SCREEN_KEEPON_LEVEL_5MIN = 1;
+ static constexpr int SCREEN_KEEPON_LEVEL_10MIN = 2;
+ static constexpr int SCREEN_KEEPON_LEVEL_30MIN = 3;
+ static constexpr int SCREEN_KEEPON_LEVEL_ALWAYS = 4;
+ int GetScreenKeeponLevel() const { return screenKeeponLevel_; }
+ /** 设置档位并写入 KV,然后应用当前档位 */
+ void SetScreenKeeponLevel(int level);
+ /** 仅将当前档位应用到系统(不写 KV) */
+ void ApplyScreenKeeponLevel();
+ /** 开机时从 KV 读取档位 */
+ void LoadScreenKeeponLevelFromKV();
+ /** 服务端协议 ScreenTimeoutUpdate:单位秒,0 表示不息屏;落 KV 并立即生效 */
+ void SetScreenTimeoutSeconds(uint32_t screenTimeoutSec);
// 故事模式超时定时器(1分钟无文本切换则退出)
void StartStoryModeTimeoutTimer(void);
// 哄睡界面相关标志
bool m_lullabyView3InquiryStarted = false; // THUNDERBIRD_LULLABYVIEW_3界面,角色是否已经开始询问
+ // 息屏时间档位:0=30秒 1=5分钟 2=10分钟 3=1小时 4=常亮
+ int screenKeeponLevel_{SCREEN_KEEPON_LEVEL_30S};
//音量
int16_t m_volume = 50;
// cat1模组版本
// 记录开机时间
time(&m_bootTime);
- uapi_setScreenDuration(30000);//自动息屏30秒
+ // uapi_setScreenDuration(30000);//自动息屏30秒
Readlocalconfig();
+ LoadScreenKeeponLevelFromKV();
+ ApplyScreenKeeponLevel();
last_eyesShape_ = eyesShape_;
last_hairColor_ = hairColor_;
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[DEVICE_CHARACTER] read character config success (hasScreenImage_=%d from KV, kvRet=%d)", hasScreenImage_, kvRet);
}
+
+ void ThunderBirdModel::LoadScreenKeeponLevelFromKV()
+ {
+ // 仅使用一个 KV:screen_timeout_sec(秒)。协议只会下发:30/300/600/1800/0(0=不息屏)
+ char temp[16] = {0};
+ int kvRet = UtilsGetValue("screen_timeout_sec", temp, sizeof(temp));
+ int sec = 30;
+ if (kvRet >= 0 && temp[0] != '\0') {
+ sec = atoi(temp);
+ }
+ if (sec <= 0) {
+ screenKeeponLevel_ = SCREEN_KEEPON_LEVEL_ALWAYS;
+ sec = 0;
+ } else if (sec == 30) {
+ screenKeeponLevel_ = SCREEN_KEEPON_LEVEL_30S;
+ } else if (sec == 5 * 60) {
+ screenKeeponLevel_ = SCREEN_KEEPON_LEVEL_5MIN;
+ } else if (sec == 10 * 60) {
+ screenKeeponLevel_ = SCREEN_KEEPON_LEVEL_10MIN;
+ } else if (sec == 30 * 60) {
+ screenKeeponLevel_ = SCREEN_KEEPON_LEVEL_30MIN;
+ } else {
+ // 不会有其他档位,兜底回 30 秒
+ screenKeeponLevel_ = SCREEN_KEEPON_LEVEL_30S;
+ sec = 30;
+ }
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ScreenKeepon] LoadScreenKeeponLevelFromKV: sec=%d => level=%d (kvRet=%d)", sec, screenKeeponLevel_, kvRet);
+ }
+
+ void ThunderBirdModel::ApplyScreenKeeponLevel()
+ {
+ uint32_t ms = 30 * 1000; /* 默认 30 秒 */
+ switch (screenKeeponLevel_) {
+ case SCREEN_KEEPON_LEVEL_30S: ms = 30 * 1000; break;
+ case SCREEN_KEEPON_LEVEL_5MIN: ms = 5 * 60 * 1000; break;
+ case SCREEN_KEEPON_LEVEL_10MIN: ms = 10 * 60 * 1000; break;
+ case SCREEN_KEEPON_LEVEL_30MIN: ms = 30 * 60 * 1000; break;
+ case SCREEN_KEEPON_LEVEL_ALWAYS: ms = 30 * 60 * 1000; break; /* 不息屏:auto_off 设置为 30 分钟,常亮由 ScreenAlwaysOnCtr 保证 */
+ default: break;
+ }
+
+ // 常亮档位:开启常亮控制,并启动刷新避免 1 小时超时
+ if (screenKeeponLevel_ == SCREEN_KEEPON_LEVEL_ALWAYS) {
+ ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON);
+ StartAlwaysOnRefreshTimer();
+ } else {
+ ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);
+ StopAlwaysOnRefreshTimer();
+ }
+
+ uapi_setScreenDuration(static_cast<int32_t>(ms));
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ScreenKeepon] ApplyScreenKeeponLevel: level=%d, ms=%u", screenKeeponLevel_, (unsigned)ms);
+ }
+
+ void ThunderBirdModel::SetScreenKeeponLevel(int level)
+ {
+ if (level < SCREEN_KEEPON_LEVEL_30S || level > SCREEN_KEEPON_LEVEL_ALWAYS) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ScreenKeepon] SetScreenKeeponLevel: invalid level=%d, ignore", level);
+ return;
+ }
+ screenKeeponLevel_ = level;
+ // 仅保留一个 KV:screen_timeout_sec(秒)
+ const char *secStr = "30";
+ if (level == SCREEN_KEEPON_LEVEL_5MIN) secStr = "300";
+ else if (level == SCREEN_KEEPON_LEVEL_10MIN) secStr = "600";
+ else if (level == SCREEN_KEEPON_LEVEL_30MIN) secStr = "1800";
+ else if (level == SCREEN_KEEPON_LEVEL_ALWAYS) secStr = "0";
+ (void)UtilsSetValue("screen_timeout_sec", secStr);
+ ApplyScreenKeeponLevel();
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ScreenKeepon] SetScreenKeeponLevel: level=%d, saved to KV", level);
+ }
+
+ void ThunderBirdModel::SetScreenTimeoutSeconds(uint32_t screenTimeoutSec)
+ {
+ // 协议只会下发:30/300/600/1800/0(0=不息屏)
+ if (screenTimeoutSec == 0) {
+ screenKeeponLevel_ = SCREEN_KEEPON_LEVEL_ALWAYS;
+ } else if (screenTimeoutSec == 30) {
+ screenKeeponLevel_ = SCREEN_KEEPON_LEVEL_30S;
+ } else if (screenTimeoutSec == 5 * 60) {
+ screenKeeponLevel_ = SCREEN_KEEPON_LEVEL_5MIN;
+ } else if (screenTimeoutSec == 10 * 60) {
+ screenKeeponLevel_ = SCREEN_KEEPON_LEVEL_10MIN;
+ } else if (screenTimeoutSec == 30 * 60) {
+ screenKeeponLevel_ = SCREEN_KEEPON_LEVEL_30MIN;
+ } else {
+ // 不会有其他值,兜底 30 秒
+ screenKeeponLevel_ = SCREEN_KEEPON_LEVEL_30S;
+ screenTimeoutSec = 30;
+ }
+
+ char buf[16] = {0};
+ (void)snprintf(buf, sizeof(buf) - 1, "%u", (unsigned)screenTimeoutSec);
+ (void)UtilsSetValue("screen_timeout_sec", buf);
+
+ ApplyScreenKeeponLevel();
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ScreenKeepon] SetScreenTimeoutSeconds: sec=%u => level=%d", (unsigned)screenTimeoutSec, screenKeeponLevel_);
+ }
// 解析JSON中的data数据
void ThunderBirdModel::ParseCharacterConfigData(const char* jsonData)
#include "bluetooth/Ln_Bluetooth_apiC.h"
#include "cat1_tcpServer.h"
#include "ln_audio_simple.h"
+#include "ln_api_interface.h"
// 声明播放器消息处理函数
static app_task_definition_t ln_send_taskcfg = {0};
push_vad_initialized_notification();
break;
}
+ case WS_CMD_SCREEN_TIMEOUT_UPDATE:
+ {
+ // {"command":"ScreenTimeoutUpdate","data":{"screenTimeout":30}}
+ if (json_str) {
+ cJSON *root = cJSON_Parse(json_str);
+ if (root) {
+ cJSON *data_obj = cJSON_GetObjectItem(root, "data");
+ cJSON *screenTimeout = (data_obj && cJSON_IsObject(data_obj)) ? cJSON_GetObjectItem(data_obj, "screenTimeout") : NULL;
+ if (screenTimeout && cJSON_IsNumber(screenTimeout)) {
+ int sec = screenTimeout->valueint;
+ if (sec < 0) sec = 0;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[WS] ScreenTimeoutUpdate: screenTimeout=%d", sec);
+ push_screen_timeout_update_notification((uint32_t)sec);
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[WS] ScreenTimeoutUpdate: screenTimeout missing/invalid");
+ }
+ cJSON_Delete(root);
+ }
+ }
+ break;
+ }
default:
{
printf("[WS] Unknown command=%s\n", cmd_str ? cmd_str : "");