From dd1139b16969a883d1acbc9fa2b1387dc4acfc91 Mon Sep 17 00:00:00 2001 From: Xiaoxia Date: Sun, 9 Mar 2025 19:18:10 +0800 Subject: [PATCH] Add discharging status --- CMakeLists.txt | 2 +- main/boards/common/board.cc | 2 +- main/boards/common/board.h | 2 +- .../esp32-s3-touch-amoled-1.8.cc | 17 ++++++----------- main/boards/kevin-box-2/kevin_box_board.cc | 17 ++++++----------- main/boards/m5stack-core-s3/m5stack_core_s3.cc | 17 ++++++----------- main/boards/tudouzi/kevin_box_board.cc | 17 ++++++----------- .../xingzhi-cube-0.96oled-ml307.cc | 8 +++++++- .../xingzhi-cube-0.96oled-wifi.cc | 8 +++++++- .../xingzhi-cube-1.54tft-ml307.cc | 8 +++++++- .../xingzhi-cube-1.54tft-wifi/power_manager.h | 5 +++++ .../xingzhi-cube-1.54tft-wifi.cc | 8 +++++++- main/display/display.cc | 10 +++++----- main/iot/things/battery.cc | 3 ++- 14 files changed, 67 insertions(+), 57 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8663d99b..0245abad 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.16) -set(PROJECT_VER "1.4.6") +set(PROJECT_VER "1.4.7") # Add this line to disable the specific warning add_compile_options(-Wno-missing-field-initializers) diff --git a/main/boards/common/board.cc b/main/boards/common/board.cc index 893ee7f1..f417cc79 100644 --- a/main/boards/common/board.cc +++ b/main/boards/common/board.cc @@ -44,7 +44,7 @@ std::string Board::GenerateUuid() { return std::string(uuid_str); } -bool Board::GetBatteryLevel(int &level, bool& charging) { +bool Board::GetBatteryLevel(int &level, bool& charging, bool& discharging) { return false; } diff --git a/main/boards/common/board.h b/main/boards/common/board.h index a6baf35b..9c6f5166 100644 --- a/main/boards/common/board.h +++ b/main/boards/common/board.h @@ -45,7 +45,7 @@ public: virtual Udp* CreateUdp() = 0; virtual void StartNetwork() = 0; virtual const char* GetNetworkStateIcon() = 0; - virtual bool GetBatteryLevel(int &level, bool& charging); + virtual bool GetBatteryLevel(int &level, bool& charging, bool& discharging); virtual std::string GetJson(); virtual void SetPowerSaveMode(bool enabled) = 0; }; diff --git a/main/boards/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc b/main/boards/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc index 21a02637..29fe05ef 100644 --- a/main/boards/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc +++ b/main/boards/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc @@ -263,21 +263,16 @@ public: return backlight_; } - virtual bool GetBatteryLevel(int &level, bool& charging) override { - static bool last_charging = false; + virtual bool GetBatteryLevel(int &level, bool& charging, bool& discharging) override { + static bool last_discharging = false; charging = pmic_->IsCharging(); - if (charging != last_charging) { - power_save_timer_->WakeUp(); - last_charging = charging; + discharging = pmic_->IsDischarging(); + if (discharging != last_discharging) { + power_save_timer_->SetEnabled(discharging); + last_discharging = discharging; } level = pmic_->GetBatteryLevel(); - - if (pmic_->IsDischarging()) { - power_save_timer_->SetEnabled(true); - } else { - power_save_timer_->SetEnabled(false); - } return true; } diff --git a/main/boards/kevin-box-2/kevin_box_board.cc b/main/boards/kevin-box-2/kevin_box_board.cc index 1eee73f8..cc72d7dd 100644 --- a/main/boards/kevin-box-2/kevin_box_board.cc +++ b/main/boards/kevin-box-2/kevin_box_board.cc @@ -250,21 +250,16 @@ public: return display_; } - virtual bool GetBatteryLevel(int &level, bool& charging) override { - static bool last_charging = false; + virtual bool GetBatteryLevel(int &level, bool& charging, bool& discharging) override { + static bool last_discharging = false; charging = pmic_->IsCharging(); - if (charging != last_charging) { - power_save_timer_->WakeUp(); - last_charging = charging; + discharging = pmic_->IsDischarging(); + if (discharging != last_discharging) { + power_save_timer_->SetEnabled(discharging); + last_discharging = discharging; } level = pmic_->GetBatteryLevel(); - - if (pmic_->IsDischarging()) { - power_save_timer_->SetEnabled(true); - } else { - power_save_timer_->SetEnabled(false); - } return true; } }; diff --git a/main/boards/m5stack-core-s3/m5stack_core_s3.cc b/main/boards/m5stack-core-s3/m5stack_core_s3.cc index b56accd2..6e7a5a57 100644 --- a/main/boards/m5stack-core-s3/m5stack_core_s3.cc +++ b/main/boards/m5stack-core-s3/m5stack_core_s3.cc @@ -346,21 +346,16 @@ public: return display_; } - virtual bool GetBatteryLevel(int &level, bool& charging) override { - static bool last_charging = false; + virtual bool GetBatteryLevel(int &level, bool& charging, bool& discharging) override { + static bool last_discharging = false; charging = pmic_->IsCharging(); - if (charging != last_charging) { - power_save_timer_->WakeUp(); - last_charging = charging; + discharging = pmic_->IsDischarging(); + if (discharging != last_discharging) { + power_save_timer_->SetEnabled(discharging); + last_discharging = discharging; } level = pmic_->GetBatteryLevel(); - - if (pmic_->IsDischarging()) { - power_save_timer_->SetEnabled(true); - } else { - power_save_timer_->SetEnabled(false); - } return true; } diff --git a/main/boards/tudouzi/kevin_box_board.cc b/main/boards/tudouzi/kevin_box_board.cc index dd3ff285..e2a92870 100644 --- a/main/boards/tudouzi/kevin_box_board.cc +++ b/main/boards/tudouzi/kevin_box_board.cc @@ -269,21 +269,16 @@ public: return display_; } - virtual bool GetBatteryLevel(int &level, bool& charging) override { - static bool last_charging = false; + virtual bool GetBatteryLevel(int &level, bool& charging, bool& discharging) override { + static bool last_discharging = false; charging = pmic_->IsCharging(); - if (charging != last_charging) { - power_save_timer_->WakeUp(); - last_charging = charging; + discharging = pmic_->IsDischarging(); + if (discharging != last_discharging) { + power_save_timer_->SetEnabled(discharging); + last_discharging = discharging; } level = pmic_->GetBatteryLevel(); - - if (pmic_->IsDischarging()) { - power_save_timer_->SetEnabled(true); - } else { - power_save_timer_->SetEnabled(false); - } return true; } }; diff --git a/main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc b/main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc index d735e57f..78ed10e0 100644 --- a/main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc +++ b/main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc @@ -215,8 +215,14 @@ public: return display_; } - virtual bool GetBatteryLevel(int& level, bool& charging) override { + virtual bool GetBatteryLevel(int& level, bool& charging, bool& discharging) override { + static bool last_discharging = false; charging = power_manager_->IsCharging(); + discharging = power_manager_->IsDischarging(); + if (discharging != last_discharging) { + power_save_timer_->SetEnabled(discharging); + last_discharging = discharging; + } level = power_manager_->GetBatteryLevel(); return true; } diff --git a/main/boards/xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc b/main/boards/xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc index 7b99813b..e636acd7 100644 --- a/main/boards/xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc +++ b/main/boards/xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc @@ -220,8 +220,14 @@ public: return display_; } - virtual bool GetBatteryLevel(int& level, bool& charging) override { + virtual bool GetBatteryLevel(int& level, bool& charging, bool& discharging) override { + static bool last_discharging = false; charging = power_manager_->IsCharging(); + discharging = power_manager_->IsDischarging(); + if (discharging != last_discharging) { + power_save_timer_->SetEnabled(discharging); + last_discharging = discharging; + } level = power_manager_->GetBatteryLevel(); return true; } diff --git a/main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc b/main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc index dbb7b919..7f42c497 100644 --- a/main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc +++ b/main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc @@ -196,8 +196,14 @@ public: return &backlight; } - virtual bool GetBatteryLevel(int& level, bool& charging) override { + virtual bool GetBatteryLevel(int& level, bool& charging, bool& discharging) override { + static bool last_discharging = false; charging = power_manager_->IsCharging(); + discharging = power_manager_->IsDischarging(); + if (discharging != last_discharging) { + power_save_timer_->SetEnabled(discharging); + last_discharging = discharging; + } level = power_manager_->GetBatteryLevel(); return true; } diff --git a/main/boards/xingzhi-cube-1.54tft-wifi/power_manager.h b/main/boards/xingzhi-cube-1.54tft-wifi/power_manager.h index 3c1bfaa1..8d238f2c 100644 --- a/main/boards/xingzhi-cube-1.54tft-wifi/power_manager.h +++ b/main/boards/xingzhi-cube-1.54tft-wifi/power_manager.h @@ -167,6 +167,11 @@ public: return is_charging_; } + bool IsDischarging() { + // 没有区分充电和放电,所以直接返回相反状态 + return !is_charging_; + } + uint8_t GetBatteryLevel() { return battery_level_; } diff --git a/main/boards/xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc b/main/boards/xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc index c49f8db9..a85b7a6f 100644 --- a/main/boards/xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc +++ b/main/boards/xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc @@ -199,8 +199,14 @@ public: return &backlight; } - virtual bool GetBatteryLevel(int& level, bool& charging) override { + virtual bool GetBatteryLevel(int& level, bool& charging, bool& discharging) override { + static bool last_discharging = false; charging = power_manager_->IsCharging(); + discharging = power_manager_->IsDischarging(); + if (discharging != last_discharging) { + power_save_timer_->SetEnabled(discharging); + last_discharging = discharging; + } level = power_manager_->GetBatteryLevel(); return true; } diff --git a/main/display/display.cc b/main/display/display.cc index 7acc3a52..7575fc51 100644 --- a/main/display/display.cc +++ b/main/display/display.cc @@ -127,9 +127,9 @@ void Display::Update() { esp_pm_lock_acquire(pm_lock_); // 更新电池图标 int battery_level; - bool charging; + bool charging, discharging; const char* icon = nullptr; - if (board.GetBatteryLevel(battery_level, charging)) { + if (board.GetBatteryLevel(battery_level, charging, discharging)) { if (charging) { icon = FONT_AWESOME_BATTERY_CHARGING; } else { @@ -150,15 +150,15 @@ void Display::Update() { } if (low_battery_popup_ != nullptr) { - if (strcmp(icon, FONT_AWESOME_BATTERY_EMPTY) == 0) { - if (lv_obj_has_flag(low_battery_popup_, LV_OBJ_FLAG_HIDDEN)) { + if (strcmp(icon, FONT_AWESOME_BATTERY_EMPTY) == 0 && discharging) { + if (lv_obj_has_flag(low_battery_popup_, LV_OBJ_FLAG_HIDDEN)) { // 如果低电量提示框隐藏,则显示 lv_obj_clear_flag(low_battery_popup_, LV_OBJ_FLAG_HIDDEN); auto& app = Application::GetInstance(); app.PlaySound(Lang::Sounds::P3_LOW_BATTERY); } } else { // Hide the low battery popup when the battery is not empty - if (!lv_obj_has_flag(low_battery_popup_, LV_OBJ_FLAG_HIDDEN)) { + if (!lv_obj_has_flag(low_battery_popup_, LV_OBJ_FLAG_HIDDEN)) { // 如果低电量提示框显示,则隐藏 lv_obj_add_flag(low_battery_popup_, LV_OBJ_FLAG_HIDDEN); } } diff --git a/main/iot/things/battery.cc b/main/iot/things/battery.cc index 7232a746..d503a4ed 100644 --- a/main/iot/things/battery.cc +++ b/main/iot/things/battery.cc @@ -12,13 +12,14 @@ class Battery : public Thing { private: int level_ = 0; bool charging_ = false; + bool discharging_ = false; public: Battery() : Thing("Battery", "电池管理") { // 定义设备的属性 properties_.AddNumberProperty("level", "当前电量百分比", [this]() -> int { auto& board = Board::GetInstance(); - if (board.GetBatteryLevel(level_, charging_)) { + if (board.GetBatteryLevel(level_, charging_, discharging_)) { return level_; } return 0;