From 1c80e29ef5e790c464b7ffa4ed15fd6ab5bab9db Mon Sep 17 00:00:00 2001 From: AeBoPi <109503402+AeBoPi@users.noreply.github.com> Date: Sat, 20 Jun 2026 12:51:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B7=B1=E5=BA=A6?= =?UTF-8?q?=E7=9D=A1=E7=9C=A0=E7=9A=84=E8=A7=A6=E5=8F=91=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- firmware/src/main.cpp | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/firmware/src/main.cpp b/firmware/src/main.cpp index a5480cf..8193ebc 100644 --- a/firmware/src/main.cpp +++ b/firmware/src/main.cpp @@ -1115,10 +1115,10 @@ void setup() { } postRuntimeMode("active"); if (buttonWakeActive) { - Serial.println("[LIVE] Button wakeup: entering active mode"); + Serial.println("[LIVE] Button wakeup: entering temporary active mode"); } else { Serial.println(firstInstallLivePending - ? "[LIVE] First install: default to active mode" + ? "[LIVE] First install: temporary active mode" : "[LIVE] Always active config enabled"); } } else { @@ -1327,6 +1327,12 @@ void loop() { if (reconnected) { lastContentChecksum = 0; // force display refresh after AI chat UI triggerImmediateRefresh(false, true); + if (!focusListening && !alwaysActive) { + ctx.liveMode = false; + postRuntimeMode("interval"); + Serial.println("[AI CHAT] Refresh complete, entering interval deep sleep"); + enterDeepSleep(effectiveSleepMinutes()); + } } else { Serial.println("[AI CHAT] WiFi reconnect failed after conversation, will retry next cycle"); } @@ -1340,7 +1346,12 @@ void loop() { triggerImmediateRefresh(); ctx.wantRefresh = false; ctx.setupDoneAt = millis(); - if (!ctx.liveMode) { + if (!focusListening && !alwaysActive) { + if (ctx.liveMode) { + ctx.liveMode = false; + postRuntimeMode("interval"); + Serial.println("[LIVE] Manual refresh complete, entering interval deep sleep"); + } enterDeepSleep(effectiveSleepMinutes()); } } @@ -1575,12 +1586,16 @@ static void handleLiveMode() { refreshActivityFlags(); triggerImmediateRefresh(false, true); ctx.setupDoneAt = millis(); - if ((shouldExitLive || (wasAlwaysActive && !alwaysActive)) && !focusListening) { + if (!focusListening && !alwaysActive) { ctx.liveMode = false; postRuntimeMode("interval"); - Serial.println(shouldExitLive - ? "[LIVE] Backend requested interval mode after refresh" - : "[LIVE] Always active disabled, entering interval deep sleep"); + if (shouldExitLive) { + Serial.println("[LIVE] Backend requested interval mode after refresh"); + } else if (wasAlwaysActive) { + Serial.println("[LIVE] Always active disabled, entering interval deep sleep"); + } else { + Serial.println("[LIVE] Temporary active refresh complete, entering interval deep sleep"); + } enterDeepSleep(effectiveSleepMinutes()); } return; @@ -1603,6 +1618,12 @@ static void handleLiveMode() { #endif triggerImmediateRefresh(false, true); ctx.setupDoneAt = millis(); + if (!focusListening && !alwaysActive) { + ctx.liveMode = false; + postRuntimeMode("interval"); + Serial.println("[LIVE] Fallback refresh complete, entering interval deep sleep"); + enterDeepSleep(effectiveSleepMinutes()); + } } }