@@ -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,
@@ -127,7 +132,8 @@ void SystemTask::Work() {
127132 twiMaster.Init ();
128133 touchPanel.Init ();
129134 dateTimeController.Register (this );
130- batteryController.Init ();
135+ batteryController.Register (this );
136+ batteryController.Update ();
131137 motorController.Init ();
132138 motionSensor.SoftReset ();
133139 timerController.Register (this );
@@ -144,8 +150,6 @@ void SystemTask::Work() {
144150 displayApp.Register (this );
145151 displayApp.Start ();
146152
147- displayApp.PushMessage (Pinetime::Applications::Display::Messages::UpdateBatteryLevel);
148-
149153 heartRateSensor.Init ();
150154 heartRateSensor.Disable ();
151155 heartRateApp.Start ();
@@ -188,7 +192,9 @@ void SystemTask::Work() {
188192
189193 idleTimer = xTimerCreate (" idleTimer" , pdMS_TO_TICKS (2000 ), pdFALSE, this , IdleTimerCallback);
190194 dimTimer = xTimerCreate (" dimTimer" , pdMS_TO_TICKS (settingsController.GetScreenTimeOut () - 2000 ), pdFALSE, this , DimTimerCallback);
195+ measureBatteryTimer = xTimerCreate (" measureBattery" , batteryMeasurementPeriod, pdTRUE, this , MeasureBatteryTimerCallback);
191196 xTimerStart (dimTimer, 0 );
197+ xTimerStart (measureBatteryTimer, portMAX_DELAY);
192198
193199// Suppress endless loop diagnostic
194200#pragma clang diagnostic push
@@ -198,11 +204,6 @@ void SystemTask::Work() {
198204
199205 uint8_t msg;
200206 if (xQueueReceive (systemTasksMsgQueue, &msg, 100 )) {
201-
202- batteryController.Update ();
203- // the battery does not emit events when changing charge levels, so we piggyback
204- // on any system event to read and update the current values
205-
206207 Messages message = static_cast <Messages>(msg);
207208 switch (message) {
208209 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 ;
@@ -327,8 +327,18 @@ void SystemTask::Work() {
327327 stepCounterMustBeReset = true ;
328328 break ;
329329 case Messages::OnChargingEvent:
330+ batteryController.Update ();
330331 motorController.RunForDuration (15 );
331- // Battery level is updated on every message - there's no need to do anything
332+ break ;
333+ case Messages::MeasureBatteryTimerExpired:
334+ sendBatteryNotification = true ;
335+ batteryController.Update ();
336+ break ;
337+ case Messages::BatteryMeasurementDone:
338+ if (sendBatteryNotification) {
339+ sendBatteryNotification = false ;
340+ nimbleController.NotifyBatteryLevel (batteryController.PercentRemaining ());
341+ }
332342 break ;
333343
334344 default :
@@ -347,11 +357,6 @@ void SystemTask::Work() {
347357 }
348358 }
349359
350- if (xTaskGetTickCount () - batteryNotificationTick > batteryNotificationPeriod) {
351- nimbleController.NotifyBatteryLevel (batteryController.PercentRemaining ());
352- batteryNotificationTick = xTaskGetTickCount ();
353- }
354-
355360 monitor.Process ();
356361 uint32_t systick_counter = nrf_rtc_counter_get (portNRF_RTC_REG);
357362 dateTimeController.UpdateTime (systick_counter);
0 commit comments