Watchfae works in Emulator but only works for a second and then shows a blank screen on watch. No errors the application works fine, it just does not display the the time on the watch.

This is my first app for a Garmin watch. I am developing only for the Venu 2. The WatchFace app draws the time and date and a bitmap every minute, draws the battery level and heart rate every 5 seconds and draws seconds (as a ring) every second. I am using set clip to only clear part of the screen to replace heart rate and battery level data. I am not generating the time and date on every second.

In the emulator everything works as intended. On the watch, the time date and image are visible for a second and then are no longer visible. Only the seconds are always visible because they are always drawn. I am using the OnUpdate and not OnPartialUpdate because the venu 2 does not support it.

Is there a reason why the behaviour on the Watch is different from the emulator, maybe an emulator setting?
Is the watchface non persistent meaning do I have to draw everything on every update Or is there a way to make the background and time persistent and only change the parts I need?

The app does not crash or have errors and nothing is posted in the log. Any help would be appreciated, I am willing to put the entire code here since this is not a commercial app.

  • Understand that a watch face only updates every second for about 10 seconds after a gesture, and then every 1 minute most of the time.

    On AMOLD devices, when it's doing 1 minute updates, you can have at most 10% of the pixels on at a time.  Otherwise the screen will go blanks.

    Unless you are doing things with onPartialUpdate (not available on AMOLED devices), when the updates are happening every second, you always wanto to update everything on the screen, and not just parts.

    In the sim, make sure you test with settings>low power checked.  That's the once a minute updates, and use "View Heat Map" to see what's happing with the no more than 10% of the pixels.

    See this about AMOLED watch faces:

    https://developer.garmin.com/connect-iq/connect-iq-faq/how-do-i-make-a-watch-face-for-amoled-products/#howdoimakeawatchfaceforamoledproducts

  • Thank you for pointing me in the right direction. When I start something new sometimes I end up with an information overload and end up missing some key things. I did not know dc was not persistent on AMOLED devices.

    I did know about the low power mode because that works well in the emulator and already tested it.

    I tried to do a lot of optimisation and ended up wasting time for nothing.

  • I am handling low power mode and on the emulator it is working fine.

    However on the device it is not working even though Always on is enabled settings->display->non activity-> screen timeout.

    It works 10% of the time and I get a blank Screen 90% of the time. I am only drawing a digital watch in a small font that moves around. "View Heat Map" shows that it is safe and working correctly.

     // Terminate any active timers and prepare for slow updates.
        function onEnterSleep() as Void {
            lowPowerMode = true;
        }
        
        // The user has just looked at their watch. Timers and animations may be started here.
        function onExitSleep() as Void {
            lowPowerMode = false;
        }
        
        // Update the view
        function onUpdate(dc as Dc) as Void {
            if(lowPowerMode){
            }
            else {
            }
    }

  • I resolved this issue from an Old answer you yourself posted. Thanks again .

    The issue was not calling WatchUi.requestUpdate() onEnterSleep and not wearing the watch when testing. AMOLED displays turn off when not  worn not matter the settings.

  • With "View Screen Heat Map", be sure to let it run in low power for 3+ minutes, and you also want to use the 24 hour simulation.  Also, for AMOLED devices, you want to check requiresBurnInProtection as you don't have the same  limits with MIP displays and on many can use onPartialUpdate

    There's also no reason to set clip regions with AMOLED displays as you always want to redraw the entire screen each time onUpdate is called.