Complete

Screen disappears after couple of seconds on F45 or Vivoactive4 (due to battery optimizations)

In 10-50 seconds, a screen turns black in FR45 or Vivoactive 4 when it it is not redrawn every single on-update. Simply no-operation in onUpdate will turn the screen black instead of keeping the last image. 

No problems reported on other devices. 

Reason for not redrawing the screen all the time: I strive for battery saving and don't render seconds. It takes a lot (time-wise) to compute all charts and redraw the screen every time. So I redraw it only once a minute and I had a magnificent battery life. Better than stock watch faces. 

How to fix(?):

  1. can the problem be solved by updating the firmware of the affected watches? 
  2. is there a way how to tell the watch just to keep the current display

How to measure a battery impact(?):

  1. how to measure the battery impact empirically? I just measured a rendering time in ms, but don't know what impact on the battery it actually has. Is there a better way to measure and optimize the battery impact? 
  2. what operations actually drains the battery? 
  3. Does BufferedBitmap count to the watch face memory limit? If not, can prerendering into it can improve a battery consumption? 

Thanks for your guidance and fixing the affected devices firmware. 

  • Is it possible to detect if the device clears the display automatically or not? E. g. like it is for OLED devices. Or is there a list of them? 

  • Some devices clear the screen before the onUpdate().  Not a bug, because with onUpdate, you should draw the whole screen.  They only time it's OK to only do a part is in onPartialUpdate().

    Only doing part in onUpdate will also be an issue with some messages from the FW on some devices.

    And the vast majority of the time, onUpdate is only called once a minute, so it really shouldn't impact battery that much.

  • p.s. I would add this is a temp workaround for now, as I use this WF as my daily driver while I am becoming familiar with CIQ (this is my first interaction w/ CIQ);

    I would add my VA4 is on the latest firmware available, and given this problem is unique to few models only, I would hazard a guess this might be a firmware issue/bug ?

  • Same/similar problem here on my VA4:
    for the very same reason of battery optimization,
    code has been set to only full-draw WF after onLayout and settings-modified calls (the latter gets invoked by the App::onSettingsChanged);
    other than these specific triggers for a full WF draw,
    code is set to only redrew areas of modified values
    (e.g. 'minutes' area upon top-of-minute/BPM area upon diff BPM value, and same with distance steps etc)

    -- works fine on the sim, even when low-power mode is toggled to ON

    -- as noted in the OP - runs fine on my actual VA3m device

    -- on my actual VA4 device WF is fully drawn and displayed for 1sec or so,
    and then display gets wiped and from that moment on only redrawn values would show and remain;
    e.g. assuming time is 10:00, then upon sideloading and disconnecting:
    full WF will be drawn and shown for 1sec or so, then all will disappear except for seconds-indicator blinker (drawn on each call to onUpdate),
    then at 10:01 display will show the '1' of the minutes (and will keep showing the minutes from that moment on);
    same w/ e.g. BPM;
    To resolve, I have followed the pointer from the awesome jim_m_58,
    and added code to toggle the perform-full-draw flag ON in onPartialUpdate/onEnterSleep/onExitSleep
    (note onUpdate toggles that flag to OFF after drawing full/partial as per that flag);
    With this logic, upon ejecting/unplugging the device:
    - full display is shown for 1sec or so
    - displays goes blank for ~10sec
    - full WF display is shown and remains visible


    here are the method-calls traces from VA4, detailing ~5min since sideloading code w/ the additional triggers mentioned above:

    2021-03-31 00:37:19: in ShiroView::onLayout             <<< after (sideloading and) disconnecting device; method toggles perform-full-draw flag to ON
    2021-03-31 00:37:20: in ShiroView::onUpdate             <<< performed full-draw as per perform-full-draw flag and then set it to OFF; FW was indeed fully visible
    2021-03-31 00:37:20: in ShiroView::onUpdate             <<< ???
    2021-03-31 00:37:20: in ShiroView::onUpdate             <<< ???
    2021-03-31 00:37:21: in ShiroApp::onStop                <<< no idea why; this seems to be be where display is wiped ...
    2021-03-31 00:37:26: in ShiroView::onLayout             <<< ... and while this method toggles perform-full-draw flag to ON, display remained blank for ~10sec
    2021-03-31 00:37:26: in ShiroView::onUpdate             <<<-+
    2021-03-31 00:37:26: in ShiroView::onUpdate                 |
    2021-03-31 00:37:27: in ShiroView::onUpdate                 |
    2021-03-31 00:37:28: in ShiroView::onUpdate                 |
    2021-03-31 00:37:29: in ShiroView::onUpdate                 |
    2021-03-31 00:37:30: in ShiroView::onUpdate                 |
    2021-03-31 00:37:31: in ShiroView::onUpdate                 |+--- during these ~10sec I could see the WF seconds-indicator blinking;
    2021-03-31 00:37:32: in ShiroView::onUpdate                 |     it is set to blink constantly, i.e. during each call to onUpdate
    2021-03-31 00:37:33: in ShiroView::onUpdate                 |     (from white->to dark-gray->to white->to dark-gray->to white->...)
    2021-03-31 00:37:34: in ShiroView::onUpdate                 |
    2021-03-31 00:37:34: in ShiroView::onUpdate                 |
    2021-03-31 00:37:34: in ShiroView::onUpdate                 |
    2021-03-31 00:37:35: in ShiroView::onUpdate             <<<-+
    2021-03-31 00:37:36: in ShiroView::onEnterSleep         <<< I think here FW was fully drawn once again and is fully visible since 
    2021-03-31 00:37:36: in ShiroView::onUpdate
    2021-03-31 00:38:00: in ShiroView::onUpdate
    2021-03-31 00:39:00: in ShiroView::onUpdate
    2021-03-31 00:40:00: in ShiroView::onUpdate
    2021-03-31 00:41:00: in ShiroView::onUpdate
    2021-03-31 00:41:21: in ShiroView::onExitSleep          <<< connected device to USB to retrieve this log
    2021-03-31 00:41:21: in ShiroView::onUpdate             <<<
    2021-03-31 00:41:21: in ShiroApp::onStop                <<< connected device to USB to retrieve this log
    

  • Same/similar problem here on my VA4:
    for the very same reason of battery optimization,
    code has been set to only full-draw WF after onLayout and settings-modified calls (the latter gets invoked by the App::onSettingsChanged);
    other than these specific triggers for a full WF draw,
    code is set to only redrew areas of modified values
    (e.g. 'minutes' area upon top-of-minute/BPM area upon diff BPM value, and same with distance steps etc)

    -- works fine on the sim, even when low-power mode is toggled to ON

    -- as noted in the OP - runs fine on my actual VA3m device

    -- on my actual VA4 device WF is fully drawn and displayed for 1sec or so,
    and then display gets wiped and from that moment on only redrawn values would show and remain;
    e.g. assuming time is 10:00, then upon sideloading and disconnecting:
    full WF will be drawn and shown for 1sec or so, then all will disappear except for seconds-indicator blinker (drawn on each call to onUpdate),
    then at 10:01 display will show the '1' of the minutes (and will keep showing the minutes from that moment on);
    same w/ e.g. BPM;
    To resolve, I have followed the pointer from the awesome jim_m_58,
    and added code to toggle the perform-full-draw flag ON in onPartialUpdate/onEnterSleep/onExitSleep
    (note onUpdate toggles that flag to OFF after drawing full/partial as per that flag);
    With this logic, upon ejecting/unplugging the device:
    - full display is shown for 1sec or so
    - displays goes blank for ~10sec
    - full WF display is shown and remains visible


    here are the method-calls traces of ~5min:

    2021-03-31 00:37:19: in ShiroView::onLayout             <<< after (sideloading and) disconnecting device; method toggles perform-full-draw flag to ON
    2021-03-31 00:37:20: in ShiroView::onUpdate             <<< performed full-draw as per perform-full-draw flag and then set it to OFF; FW was indeed fully visible
    2021-03-31 00:37:20: in ShiroView::onUpdate             <<< not sure why timestamp is same
    2021-03-31 00:37:20: in ShiroView::onUpdate             <<< not sure why timestamp is same
    2021-03-31 00:37:21: in ShiroApp::onStop                <<< no idea why; this seems to be be where display is wiped ...
    2021-03-31 00:37:26: in ShiroView::onLayout             <<< ... and while this method toggles perform-full-draw flag to ON, display remained blank for ~10sec
    2021-03-31 00:37:26: in ShiroView::onUpdate             <<<-+
    2021-03-31 00:37:26: in ShiroView::onUpdate                 |
    2021-03-31 00:37:27: in ShiroView::onUpdate                 |
    2021-03-31 00:37:28: in ShiroView::onUpdate                 |
    2021-03-31 00:37:29: in ShiroView::onUpdate                 |
    2021-03-31 00:37:30: in ShiroView::onUpdate                 |
    2021-03-31 00:37:31: in ShiroView::onUpdate                 |+--- during these ~10sec I could see the WF seconds-indicator blinking;
    2021-03-31 00:37:32: in ShiroView::onUpdate                 |     it is set to blink constantly, i.e. during each call to onUpdate
    2021-03-31 00:37:33: in ShiroView::onUpdate                 |     (from white->to dark-gray->to white->to dark-gray->to white->...)
    2021-03-31 00:37:34: in ShiroView::onUpdate                 |
    2021-03-31 00:37:34: in ShiroView::onUpdate                 |
    2021-03-31 00:37:34: in ShiroView::onUpdate                 |
    2021-03-31 00:37:35: in ShiroView::onUpdate             <<<-+
    2021-03-31 00:37:36: in ShiroView::onEnterSleep         <<< I think here FW was fully drawn once again and is fully visible since 
    2021-03-31 00:37:36: in ShiroView::onUpdate
    2021-03-31 00:38:00: in ShiroView::onUpdate
    2021-03-31 00:39:00: in ShiroView::onUpdate
    2021-03-31 00:40:00: in ShiroView::onUpdate
    2021-03-31 00:41:00: in ShiroView::onUpdate
    2021-03-31 00:41:21: in ShiroView::onExitSleep          <<< connected device to USB to retrieve this log
    2021-03-31 00:41:21: in ShiroView::onUpdate             <<<
    2021-03-31 00:41:21: in ShiroApp::onStop                <<< connected device to USB to retrieve this log