@@ -47,6 +47,11 @@ void IdleTimerCallback(TimerHandle_t xTimer) {
4747 sysTask->OnIdle ();
4848}
4949
50+ void MeasureBatteryTimerCallback (TimerHandle_t xTimer) {
51+ auto * sysTask = static_cast <SystemTask*>(pvTimerGetTimerID (xTimer));
52+ sysTask->PushMessage (Pinetime::System::Messages::MeasureBatteryTimerExpired);
53+ }
54+
5055SystemTask::SystemTask (Drivers::SpiMaster& spi,
5156 Drivers::St7789& lcd,
5257 Pinetime::Drivers::SpiNorFlash& spiNorFlash,
@@ -126,7 +131,8 @@ void SystemTask::Work() {
126131 twiMaster.Init ();
127132 touchPanel.Init ();
128133 dateTimeController.Register (this );
129- batteryController.Init ();
134+ batteryController.Register (this );
135+ batteryController.Update ();
130136 motorController.Init ();
131137 motionSensor.SoftReset ();
132138 timerController.Register (this );
@@ -143,8 +149,6 @@ void SystemTask::Work() {
143149 displayApp.Register (this );
144150 displayApp.Start ();
145151
146- displayApp.PushMessage (Pinetime::Applications::Display::Messages::UpdateBatteryLevel);
147-
148152 heartRateSensor.Init ();
149153 heartRateSensor.Disable ();
150154 heartRateApp.Start ();
@@ -187,7 +191,9 @@ void SystemTask::Work() {
187191
188192 idleTimer = xTimerCreate (" idleTimer" , pdMS_TO_TICKS (2000 ), pdFALSE, this , IdleTimerCallback);
189193 dimTimer = xTimerCreate (" dimTimer" , pdMS_TO_TICKS (settingsController.GetScreenTimeOut () - 2000 ), pdFALSE, this , DimTimerCallback);
194+ measureBatteryTimer = xTimerCreate (" measureBattery" , batteryMeasurementPeriod, pdTRUE, this , MeasureBatteryTimerCallback);
190195 xTimerStart (dimTimer, 0 );
196+ xTimerStart (measureBatteryTimer, portMAX_DELAY);
191197
192198// Suppress endless loop diagnostic
193199#pragma clang diagnostic push
@@ -197,11 +203,6 @@ void SystemTask::Work() {
197203
198204 uint8_t msg;
199205 if (xQueueReceive (systemTasksMsgQueue, &msg, 100 )) {
200-
201- batteryController.Update ();
202- // the battery does not emit events when changing charge levels, so we piggyback
203- // on any system event to read and update the current values
204-
205206 Messages message = static_cast <Messages>(msg);
206207 switch (message) {
207208 case Messages::EnableSleeping:
@@ -232,7 +233,6 @@ void SystemTask::Work() {
232233 lcd.Wakeup ();
233234
234235 displayApp.PushMessage (Pinetime::Applications::Display::Messages::GoToRunning);
235- displayApp.PushMessage (Pinetime::Applications::Display::Messages::UpdateBatteryLevel);
236236 heartRateApp.PushMessage (Pinetime::Applications::HeartRateTask::Messages::WakeUp);
237237
238238 isSleeping = false ;
@@ -326,8 +326,18 @@ void SystemTask::Work() {
326326 stepCounterMustBeReset = true ;
327327 break ;
328328 case Messages::OnChargingEvent:
329+ batteryController.Update ();
329330 motorController.SetDuration (15 );
330- // Battery level is updated on every message - there's no need to do anything
331+ break ;
332+ case Messages::MeasureBatteryTimerExpired:
333+ sendBatteryNotification = true ;
334+ batteryController.Update ();
335+ break ;
336+ case Messages::BatteryMeasurementDone:
337+ if (sendBatteryNotification) {
338+ sendBatteryNotification = false ;
339+ nimbleController.NotifyBatteryLevel (batteryController.PercentRemaining ());
340+ }
331341 break ;
332342
333343 default :
@@ -346,11 +356,6 @@ void SystemTask::Work() {
346356 }
347357 }
348358
349- if (xTaskGetTickCount () - batteryNotificationTick > batteryNotificationPeriod) {
350- nimbleController.NotifyBatteryLevel (batteryController.PercentRemaining ());
351- batteryNotificationTick = xTaskGetTickCount ();
352- }
353-
354359 monitor.Process ();
355360 uint32_t systick_counter = nrf_rtc_counter_get (portNRF_RTC_REG);
356361 dateTimeController.UpdateTime (systick_counter);
0 commit comments