How to enable an "always-on" mode for Venu/AMOLED

I am trying to do a basic Venu watch face where I'm just printing a large font digital time while in "high power" mode and then printing a very small font time when the device enters sleep. The goal is to get an "always-on" functionality working.

The CIQ3.1 release notes say this:

"Always On watch faces behave differently from MIP to AMOLED. With MIP screens, you can use View.onPartialUpdate to update a portion of the screen every second. With AMOLED screen, this is no longer allowed. Instead, when WatchUi.onEnterSleep is called, you are allowed to render a watch face that must obey the rules of the AMOLED burn-in
protector:

  • No more than 10% screen pixels can be on
  • No pixel can be on longer than 3 mins

Ways you can prevent burn in are by drawing the time with a thin font, shifting the time every minute as not to repeatedly leave the same pixels on, and not having static tick marks that leave the same pixels on.

Note that watch faces can detect whether a product has screen protection enforced by checking the value of DeviceSettings.requiresBurnInProtection."

I have used the OnEnterSleep method to set a var called lowPower (and the OnExitSleep to clear it) and then I do a forced update via WatchUi.requestUpdate(). The update method then paints the screen black and draws the text. The text is very small and clearly less than 10% of the pixels. I also implemented a basic rotational algorithm where the text is shifted around the screen automatically on every update, as per the requirements above. The text never overlaps with itself so I'm pretty sure I'm meeting all of the burn-in requirements.

In the simulator I see everything working correctly, and I can toggle Low Power Mode and everything appears as I want it to. I also don't get the heatmap warning indicator, so again I'm pretty sure I'm meeting all of the requirements. But when I put the .prg on my watch and try to run it, the watch always turns the display off. I see the high power mode, and then I see the small text when it goes to sleep, but then the display immediately turns off. I'm not sure what I am doing wrong.

  • Actually, there's a different way.  Use a checkerboard over the hands, with the color set to black,transparent,  Then shift the checkerboard back and forth by one pixel each minute.  I do this as an option for some watch faces.  An option because that's displayed is dimmer.  The other options is moving things.

    Here's one of mine with the checkerboard.

  • The problem with shifting the center on an analog face is that could still have a single pixel on too long.  Using the checkerboard insures that no pixel is on for more than 1 minute.

  • Yes, that's exactly what I'm facing at the moment and, to be honest, shifting the watch face position too much is also not great for the user, it will be weird if they're looking directly at  it on the moment when it shifts. 

    Definitely the checkered pattern is a great solution for analog hands that I've never though about, thanks a lot for that. The dimmer issue might be solved by using a contrasting color (like white), but not sure how dim that would still be. 

  • Felipe - Thanks!  Yes I'm working on a left/right hand structure that will draw the left portion for one minute then the right portion for the next minute.  But think the checkerboard patterns is the way to go. 

    I'm guessing that the drawArc command is one way to do this or would draw point be more efficient?  I've never used either.

    I cant tell with this close up photo of my Venu screen in low power (this is a Garmin face) if I'm seeing arcs, a checkerboard or just the pixels on the screen.

      

    Can anyone point to an example of a checker board fill?

    Thanks in advance! - J

  • I created a custom font with 1 character - the checker board. with pixel 1,3,5, etc white on the 1st row, 2,4,6, etc in the second row, and so on..

    Draw what you want on the screen, then overlay the checkerboard with setColor(Gfx.COLOR_BLACK,Gfx.COLOR_TRANSPARENT);

    Every other pixel is black, and the others use the color of what was first drawn.

  • Huh... Thanks!  Gotta let that sink in :)

  • , I've even tried drawing just a border of the hands when on low-power (with a black fill color in the middle), but it still doesn't work as those border pixels still get lit on the same repeated pixel even after the center location movement (at least with my design). 

    , do you think that using a custom font is better than having 2 FOR nested loops drawing black pixels? I'm just thinking about memory usage, which one would be leaner as the size of the font would need to be quite big (390x390). But then I could have that font used on the resources for the Venu only, since it doesn't have any issues with memory sizing. :)

  • You can make the checkerborad smaller than the screen.  Say 50x50.  And just have a single character in that font.  Drawing 9 characters (so 450 pixels) is more efferent than doing it with for loops.  It could be a 9 character string for a single row

  • From what I'm seeing, there still may be an issue with using checkerboards when the hands overlap each other each hour.  My solid alternating left right hands (will post when cleaned up) will run for 2hrs until the 2nd overlap.  So a checkerboard might run longer but if the minute pixels overlap with the hour pixels it seems that it would trigger the burn in flag.  

    Unless I'm mistaken, there doesnt seem to be any sort of clear screen that can be used in low power that could clear the screen briefly as the arms overlap.

    The Venu examples I've seen with seemingly solid hands ( and arbors, and battery indicators etc.) are all Garmin made, so maybe they are doing something that Monkey C cant.

    The only thing I can think to add is short hands an a central pivot point that actually moves around like Jim's digital example.

  • With the checkerboard, your hands shouldn't need to move anymore. Just the whole checkerboard would need to move every minute.