From c7265ede5924fdb69341bf18b445ca167510386c Mon Sep 17 00:00:00 2001 From: David Anderson Date: Wed, 19 Jul 2023 15:06:16 -0700 Subject: [PATCH] client, Android: if suspend because of battery heat or charge, don't resume for at least 5 minutes. Avoid rapid start/stop when at threshold. --- client/client_state.h | 4 ++++ client/cs_prefs.cpp | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/client/client_state.h b/client/client_state.h index d1cd32306b..bce4b7650f 100644 --- a/client/client_state.h +++ b/client/client_state.h @@ -685,6 +685,10 @@ extern THREAD throttle_thread; // Android: if don't get a report_device_status() RPC from the GUI // in this interval, exit. // We rely on the GUI to report battery status. +#define ANDROID_BATTERY_BACKOFF 300 + // Android: if battery is overheated or undercharged, + // suspend for at least this long + // (avoid rapid start/stop) #ifndef ANDROID #define USE_NET_PREFS diff --git a/client/cs_prefs.cpp b/client/cs_prefs.cpp index b266d7dece..d73e497aa6 100644 --- a/client/cs_prefs.cpp +++ b/client/cs_prefs.cpp @@ -265,17 +265,28 @@ int CLIENT_STATE::check_suspend_processing() { } #ifdef ANDROID + // suspend if we haven't heard from the GUI in 30 sec + // (we rely on it for battery info) + // if (now > device_status_time + ANDROID_KEEPALIVE_TIMEOUT) { requested_exit = true; return SUSPEND_REASON_NO_GUI_KEEPALIVE; } // check for hot battery + // If suspend because of hot battery, don't resume for at least 5 min + // (crude hysteresis) // + static double battery_heat_resume_time=0; + if (now < battery_heat_resume_time) { + return SUSPEND_REASON_BATTERY_OVERHEATED; + } if (device_status.battery_state == BATTERY_STATE_OVERHEATED) { + battery_heat_resume_time = now + ANDROID_BATTERY_BACKOFF; return SUSPEND_REASON_BATTERY_OVERHEATED; } if (device_status.battery_temperature_celsius > global_prefs.battery_max_temperature) { + battery_heat_resume_time = now + ANDROID_BATTERY_BACKOFF; return SUSPEND_REASON_BATTERY_OVERHEATED; } @@ -283,9 +294,14 @@ int CLIENT_STATE::check_suspend_processing() { // while it's recharging. // So compute only if 95% charged or more. // + static double battery_charge_resume_time=0; + if (now < battery_charge_resume_time) { + return SUSPEND_REASON_BATTERY_CHARGING; + } int cp = device_status.battery_charge_pct; if (cp >= 0) { if (cp < global_prefs.battery_charge_min_pct) { + battery_charge_resume_time = now + ANDROID_BATTERY_BACKOFF; return SUSPEND_REASON_BATTERY_CHARGING; } }