From fe94541568399175b0ad7e010da0012a11b77900 Mon Sep 17 00:00:00 2001 From: minacode Date: Mon, 3 Oct 2022 12:15:37 +0200 Subject: [PATCH 01/15] added low battery message --- src/components/battery/BatteryController.cpp | 6 ++++++ src/components/battery/BatteryController.h | 1 + src/systemtask/Messages.h | 1 + src/systemtask/SystemTask.cpp | 11 +++++++++++ 4 files changed, 19 insertions(+) diff --git a/src/components/battery/BatteryController.cpp b/src/components/battery/BatteryController.cpp index 300d097827..9247bb34d4 100644 --- a/src/components/battery/BatteryController.cpp +++ b/src/components/battery/BatteryController.cpp @@ -85,10 +85,16 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) { if ((isPowerPresent && newPercent > percentRemaining) || (!isPowerPresent && newPercent < percentRemaining) || firstMeasurement) { firstMeasurement = false; + lastPercentRemaining = percentRemaining; percentRemaining = newPercent; systemTask->PushMessage(System::Messages::BatteryPercentageUpdated); } + constexpr uint8_t lowBatteryThreshold {50}; + if (!isPowerPresent && lastPercentRemaining >= lowBatteryThreshold && percentRemaining < lowBatteryThreshold) { + systemTask->PushMessage(System::Messages::LowBattery); + } + nrfx_saadc_uninit(); isReading = false; } diff --git a/src/components/battery/BatteryController.h b/src/components/battery/BatteryController.h index 5a7394c4d4..53eb7d19fa 100644 --- a/src/components/battery/BatteryController.h +++ b/src/components/battery/BatteryController.h @@ -39,6 +39,7 @@ namespace Pinetime { static constexpr nrf_saadc_input_t batteryVoltageAdcInput = NRF_SAADC_INPUT_AIN7; uint16_t voltage = 0; uint8_t percentRemaining = 0; + uint8_t lastPercentRemaining = 0; bool isFull = false; bool isCharging = false; diff --git a/src/systemtask/Messages.h b/src/systemtask/Messages.h index 7a46e0609c..a1a19b2fdb 100644 --- a/src/systemtask/Messages.h +++ b/src/systemtask/Messages.h @@ -29,6 +29,7 @@ namespace Pinetime { StopRinging, MeasureBatteryTimerExpired, BatteryPercentageUpdated, + LowBattery, StartFileTransfer, StopFileTransfer, BleRadioEnableToggle diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 1c871fd2b3..0342a13f83 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -425,6 +425,17 @@ void SystemTask::Work() { case Messages::BatteryPercentageUpdated: nimbleController.NotifyBatteryLevel(batteryController.PercentRemaining()); break; + case Messages::LowBattery: + { + Pinetime::Controllers::NotificationManager::Notification notif; + std::array message {"Low Battery\0Low Battery\0"}; + notif.message = message; + notif.size = 25; + notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; + notificationManager.Push(std::move(notif)); + PushMessage(Messages::OnNewNotification); + } + break; case Messages::OnPairing: if (state == SystemTaskState::Sleeping) { GoToRunning(); From 431070d1d484e835c570e75954c5c114597cd4e3 Mon Sep 17 00:00:00 2001 From: minacode Date: Mon, 3 Oct 2022 13:16:35 +0200 Subject: [PATCH 02/15] format --- src/systemtask/SystemTask.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 0342a13f83..b48819204b 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -425,17 +425,15 @@ void SystemTask::Work() { case Messages::BatteryPercentageUpdated: nimbleController.NotifyBatteryLevel(batteryController.PercentRemaining()); break; - case Messages::LowBattery: - { - Pinetime::Controllers::NotificationManager::Notification notif; - std::array message {"Low Battery\0Low Battery\0"}; - notif.message = message; - notif.size = 25; - notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; - notificationManager.Push(std::move(notif)); - PushMessage(Messages::OnNewNotification); - } - break; + case Messages::LowBattery: { + Pinetime::Controllers::NotificationManager::Notification notif; + std::array message {"Low Battery\0Low Battery\0"}; + notif.message = message; + notif.size = 25; + notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; + notificationManager.Push(std::move(notif)); + PushMessage(Messages::OnNewNotification); + } break; case Messages::OnPairing: if (state == SystemTaskState::Sleeping) { GoToRunning(); From bb77ea9623cd6e39da88d1f7bc0a5aadd9544d7f Mon Sep 17 00:00:00 2001 From: minacode Date: Mon, 3 Oct 2022 14:22:18 +0200 Subject: [PATCH 03/15] add percentage rescaling --- src/components/battery/BatteryController.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/battery/BatteryController.cpp b/src/components/battery/BatteryController.cpp index 9247bb34d4..88883b6952 100644 --- a/src/components/battery/BatteryController.cpp +++ b/src/components/battery/BatteryController.cpp @@ -82,6 +82,11 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) { } else { newPercent = std::min((voltage - battery_min) * 100 / (battery_max - battery_min), isCharging ? 99 : 100); } + // quick hack for better values + // rescale the percentages between 35 and 100 + constexpr uint8_t realMin = 35; + newPercent = std::max(newPercent, realMin); + newPercent = (newPercent - realMin) * 100 / (100 - realMin); if ((isPowerPresent && newPercent > percentRemaining) || (!isPowerPresent && newPercent < percentRemaining) || firstMeasurement) { firstMeasurement = false; @@ -90,7 +95,8 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) { systemTask->PushMessage(System::Messages::BatteryPercentageUpdated); } - constexpr uint8_t lowBatteryThreshold {50}; + // warn at 20% battery (wrt. rescaling above) + constexpr uint8_t lowBatteryThreshold {20}; if (!isPowerPresent && lastPercentRemaining >= lowBatteryThreshold && percentRemaining < lowBatteryThreshold) { systemTask->PushMessage(System::Messages::LowBattery); } From 12c1a9a36d9d4def87320947cda59269b47a87b9 Mon Sep 17 00:00:00 2001 From: minacode Date: Sun, 9 Oct 2022 21:58:57 +0200 Subject: [PATCH 04/15] added message, changed UI --- src/components/battery/BatteryController.cpp | 9 ++++----- src/components/battery/BatteryController.h | 5 +++++ src/displayapp/screens/BatteryInfo.cpp | 2 +- src/systemtask/SystemTask.cpp | 4 ++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/components/battery/BatteryController.cpp b/src/components/battery/BatteryController.cpp index 88883b6952..c27cd224a9 100644 --- a/src/components/battery/BatteryController.cpp +++ b/src/components/battery/BatteryController.cpp @@ -93,12 +93,11 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) { lastPercentRemaining = percentRemaining; percentRemaining = newPercent; systemTask->PushMessage(System::Messages::BatteryPercentageUpdated); - } - // warn at 20% battery (wrt. rescaling above) - constexpr uint8_t lowBatteryThreshold {20}; - if (!isPowerPresent && lastPercentRemaining >= lowBatteryThreshold && percentRemaining < lowBatteryThreshold) { - systemTask->PushMessage(System::Messages::LowBattery); + // warn at 20% battery (wrt. rescaling above) + if (!isPowerPresent && BatteryIsLow() && lastPercentRemaining > lowBatteryThreshold) { + systemTask->PushMessage(System::Messages::LowBattery); + } } nrfx_saadc_uninit(); diff --git a/src/components/battery/BatteryController.h b/src/components/battery/BatteryController.h index 53eb7d19fa..df592232e9 100644 --- a/src/components/battery/BatteryController.h +++ b/src/components/battery/BatteryController.h @@ -17,6 +17,9 @@ namespace Pinetime { uint8_t PercentRemaining() const { return percentRemaining; } + bool BatteryIsLow() const { + return percentRemaining <= lowBatteryThreshold; + } uint16_t Voltage() const { return voltage; @@ -51,6 +54,8 @@ namespace Pinetime { void SaadcEventHandler(nrfx_saadc_evt_t const* p_event); static void AdcCallbackStatic(nrfx_saadc_evt_t const* event); + static constexpr uint8_t lowBatteryThreshold {20}; + bool isReading = false; Pinetime::System::SystemTask* systemTask = nullptr; diff --git a/src/displayapp/screens/BatteryInfo.cpp b/src/displayapp/screens/BatteryInfo.cpp index 9febda61a9..87d1f2e181 100644 --- a/src/displayapp/screens/BatteryInfo.cpp +++ b/src/displayapp/screens/BatteryInfo.cpp @@ -59,7 +59,7 @@ void BatteryInfo::Refresh() { } else if (batteryPercent == 100) { lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_BLUE); lv_label_set_text_static(status, "Fully charged"); - } else if (batteryPercent < 10) { + } else if (batteryController.BatteryIsLow()) { lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_YELLOW); lv_label_set_text_static(status, "Battery low"); } else { diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index b48819204b..5bfdc2ea8f 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -427,9 +427,9 @@ void SystemTask::Work() { break; case Messages::LowBattery: { Pinetime::Controllers::NotificationManager::Notification notif; - std::array message {"Low Battery\0Low Battery\0"}; + std::array message {"Low Battery\0Charge your watch to prevent data loss\0"}; notif.message = message; - notif.size = 25; + notif.size = 52; notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; notificationManager.Push(std::move(notif)); PushMessage(Messages::OnNewNotification); From da70c3d68d69f8b57921ba047074772d0cdf5598 Mon Sep 17 00:00:00 2001 From: minacode Date: Sun, 9 Oct 2022 22:02:49 +0200 Subject: [PATCH 05/15] format --- src/components/battery/BatteryController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/battery/BatteryController.cpp b/src/components/battery/BatteryController.cpp index c27cd224a9..e90199bd6f 100644 --- a/src/components/battery/BatteryController.cpp +++ b/src/components/battery/BatteryController.cpp @@ -96,7 +96,7 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) { // warn at 20% battery (wrt. rescaling above) if (!isPowerPresent && BatteryIsLow() && lastPercentRemaining > lowBatteryThreshold) { - systemTask->PushMessage(System::Messages::LowBattery); + systemTask->PushMessage(System::Messages::LowBattery); } } From 97d9f71a6b9f84750a56412337e52715b4c8c179 Mon Sep 17 00:00:00 2001 From: minacode Date: Thu, 20 Oct 2022 14:55:07 +0200 Subject: [PATCH 06/15] added punctuation --- src/systemtask/SystemTask.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index b56055667e..89fe7d7d8b 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -427,9 +427,9 @@ void SystemTask::Work() { break; case Messages::LowBattery: { Pinetime::Controllers::NotificationManager::Notification notif; - std::array message {"Low Battery\0Charge your watch to prevent data loss\0"}; + std::array message {"Low Battery\0Charge your watch to prevent data loss.\0"}; notif.message = message; - notif.size = 52; + notif.size = 53; notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; notificationManager.Push(std::move(notif)); PushMessage(Messages::OnNewNotification); From f1699c9f5c18d287b3abb684654e8b4b553fb6a0 Mon Sep 17 00:00:00 2001 From: minacode Date: Mon, 31 Oct 2022 22:08:41 +0100 Subject: [PATCH 07/15] cutout scaling hack --- src/components/battery/BatteryController.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/components/battery/BatteryController.cpp b/src/components/battery/BatteryController.cpp index e90199bd6f..426270b8d6 100644 --- a/src/components/battery/BatteryController.cpp +++ b/src/components/battery/BatteryController.cpp @@ -82,11 +82,6 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) { } else { newPercent = std::min((voltage - battery_min) * 100 / (battery_max - battery_min), isCharging ? 99 : 100); } - // quick hack for better values - // rescale the percentages between 35 and 100 - constexpr uint8_t realMin = 35; - newPercent = std::max(newPercent, realMin); - newPercent = (newPercent - realMin) * 100 / (100 - realMin); if ((isPowerPresent && newPercent > percentRemaining) || (!isPowerPresent && newPercent < percentRemaining) || firstMeasurement) { firstMeasurement = false; From 8ca234058dd39890134d68d481ced7aa90608cfe Mon Sep 17 00:00:00 2001 From: minacode Date: Sun, 20 Nov 2022 13:16:28 +0100 Subject: [PATCH 08/15] fixed a comment, set threshold to 15% --- src/components/battery/BatteryController.cpp | 2 +- src/components/battery/BatteryController.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/battery/BatteryController.cpp b/src/components/battery/BatteryController.cpp index 490fc223c2..b73ea6f31a 100644 --- a/src/components/battery/BatteryController.cpp +++ b/src/components/battery/BatteryController.cpp @@ -94,7 +94,7 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) { percentRemaining = newPercent; systemTask->PushMessage(System::Messages::BatteryPercentageUpdated); - // warn at 20% battery (wrt. rescaling above) + // warn about low battery when not charging and below threshold if (!isPowerPresent && BatteryIsLow() && lastPercentRemaining > lowBatteryThreshold) { systemTask->PushMessage(System::Messages::LowBattery); } diff --git a/src/components/battery/BatteryController.h b/src/components/battery/BatteryController.h index df592232e9..3a7d73cee4 100644 --- a/src/components/battery/BatteryController.h +++ b/src/components/battery/BatteryController.h @@ -54,7 +54,7 @@ namespace Pinetime { void SaadcEventHandler(nrfx_saadc_evt_t const* p_event); static void AdcCallbackStatic(nrfx_saadc_evt_t const* event); - static constexpr uint8_t lowBatteryThreshold {20}; + static constexpr uint8_t lowBatteryThreshold {15}; bool isReading = false; From 66212fca81b105ec62b89190c6c1bb54bc224c5f Mon Sep 17 00:00:00 2001 From: minacode Date: Mon, 21 Nov 2022 00:03:09 +0100 Subject: [PATCH 09/15] changed to bool --- src/components/battery/BatteryController.cpp | 9 +++++++-- src/components/battery/BatteryController.h | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/battery/BatteryController.cpp b/src/components/battery/BatteryController.cpp index b73ea6f31a..df31631564 100644 --- a/src/components/battery/BatteryController.cpp +++ b/src/components/battery/BatteryController.cpp @@ -88,15 +88,20 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) { newPercent = std::min(aprox.GetValue(voltage), isCharging ? uint8_t {99} : uint8_t {100}); } + if (isPowerPresent) { + batteryLowNotified = false; + } + if ((isPowerPresent && newPercent > percentRemaining) || (!isPowerPresent && newPercent < percentRemaining) || firstMeasurement) { firstMeasurement = false; - lastPercentRemaining = percentRemaining; percentRemaining = newPercent; systemTask->PushMessage(System::Messages::BatteryPercentageUpdated); + // warn about low battery when not charging and below threshold - if (!isPowerPresent && BatteryIsLow() && lastPercentRemaining > lowBatteryThreshold) { + if (BatteryIsLow() && !isPowerPresent && !batteryLowNotified) { systemTask->PushMessage(System::Messages::LowBattery); + batteryLowNotified = true; } } diff --git a/src/components/battery/BatteryController.h b/src/components/battery/BatteryController.h index 3a7d73cee4..627ca7d41d 100644 --- a/src/components/battery/BatteryController.h +++ b/src/components/battery/BatteryController.h @@ -42,7 +42,7 @@ namespace Pinetime { static constexpr nrf_saadc_input_t batteryVoltageAdcInput = NRF_SAADC_INPUT_AIN7; uint16_t voltage = 0; uint8_t percentRemaining = 0; - uint8_t lastPercentRemaining = 0; + bool batteryLowNotified = false; bool isFull = false; bool isCharging = false; From b25fdb48fbabed4ea0cd6f9d85b0ac0deb834d90 Mon Sep 17 00:00:00 2001 From: minacode Date: Mon, 21 Nov 2022 00:07:29 +0100 Subject: [PATCH 10/15] format --- src/components/battery/BatteryController.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/battery/BatteryController.cpp b/src/components/battery/BatteryController.cpp index df31631564..c5833fdac0 100644 --- a/src/components/battery/BatteryController.cpp +++ b/src/components/battery/BatteryController.cpp @@ -97,7 +97,6 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) { percentRemaining = newPercent; systemTask->PushMessage(System::Messages::BatteryPercentageUpdated); - // warn about low battery when not charging and below threshold if (BatteryIsLow() && !isPowerPresent && !batteryLowNotified) { systemTask->PushMessage(System::Messages::LowBattery); From 9300d5240ae50e75cb5358357916856836844513 Mon Sep 17 00:00:00 2001 From: minacode Date: Wed, 7 Dec 2022 13:57:22 +0100 Subject: [PATCH 11/15] removed magic number --- src/systemtask/SystemTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 89fe7d7d8b..bd3090f469 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -427,7 +427,7 @@ void SystemTask::Work() { break; case Messages::LowBattery: { Pinetime::Controllers::NotificationManager::Notification notif; - std::array message {"Low Battery\0Charge your watch to prevent data loss.\0"}; + std::array message {"Low Battery\0Charge your watch to prevent data loss.\0"}; notif.message = message; notif.size = 53; notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; From 088196c8b9b1a66630ad495e17a9579833639360 Mon Sep 17 00:00:00 2001 From: minacode Date: Wed, 7 Dec 2022 14:01:43 +0100 Subject: [PATCH 12/15] format --- src/systemtask/SystemTask.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index bd3090f469..de7dbffaaa 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -427,7 +427,8 @@ void SystemTask::Work() { break; case Messages::LowBattery: { Pinetime::Controllers::NotificationManager::Notification notif; - std::array message {"Low Battery\0Charge your watch to prevent data loss.\0"}; + std::array message { + "Low Battery\0Charge your watch to prevent data loss.\0"}; notif.message = message; notif.size = 53; notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; From 2449727665b64eecdf0ad0cbf2bb83d7c5a10e08 Mon Sep 17 00:00:00 2001 From: minacode Date: Tue, 20 Dec 2022 21:56:06 +0100 Subject: [PATCH 13/15] hopefully fixed crash on notification --- src/systemtask/SystemTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index de7dbffaaa..8ff621eb2f 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -429,7 +429,7 @@ void SystemTask::Work() { Pinetime::Controllers::NotificationManager::Notification notif; std::array message { "Low Battery\0Charge your watch to prevent data loss.\0"}; - notif.message = message; + notif.message = std::move(message); notif.size = 53; notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; notificationManager.Push(std::move(notif)); From 1d7a60d2bf0c95c05de825a92ad2f077ef47c867 Mon Sep 17 00:00:00 2001 From: Max Friedrich Date: Mon, 26 Dec 2022 23:34:29 +0100 Subject: [PATCH 14/15] Update src/systemtask/SystemTask.cpp Co-authored-by: JF --- src/systemtask/SystemTask.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 2f5fd214de..687c90a565 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -426,10 +426,10 @@ void SystemTask::Work() { break; case Messages::LowBattery: { Pinetime::Controllers::NotificationManager::Notification notif; - std::array message { - "Low Battery\0Charge your watch to prevent data loss.\0"}; - notif.message = std::move(message); - notif.size = 53; + constexpr char message[] = "Low Battery\0Charge your watch to prevent data loss.\0"; + constexpr size_t messageSize = std::min(sizeof(message), Pinetime::Controllers::NotificationManager::MaximumMessageSize()); + std::memcpy(notif.message.data(), message, messageSize); + notif.size = messageSize; notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; notificationManager.Push(std::move(notif)); PushMessage(Messages::OnNewNotification); From ebf05b01b86e1e74f2dd899d23d3d820dc8eb062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Tue, 27 Dec 2022 12:06:49 +0100 Subject: [PATCH 15/15] Include algorithm and cstring for std::memcpy and std::min --- src/systemtask/SystemTask.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 687c90a565..73f573fa0e 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -18,6 +18,8 @@ #include "BootErrors.h" #include +#include +#include using namespace Pinetime::System;