Complete
over 4 years ago

WERETECH-11147

Fixed

The burn-in protection on Venu2(s) devices with CIQ4 falsely triggers and turns off the display

I have ported several watch faces with Venu1 AOD support to the Venu2 and Venu2s devices.

My AOD modes are straight forward. I'm using a dense pattern clearing every 2nd pixel row or column on the screen alternating each minute starting with the first row/column or the second row/column.

This ensures that less than 10% of the pixels are on and no particular pixel is on for more than 1 minute.

On the Venu2 the simulator detects a screen burn-in. On the Screen Burn-In Simulation window it looks like the overlay pattern is ignored.

Also some drawing artifacts are missing on the burn-in screen for example the minute and hour hands.

I'm in contact with 2 other developers who have similar problems with at least some of their watch faces.

I already uploaded my watch faces with Venu2 support to the Connect IQ store and received feedback from a user who also owns a Venu1 that

the AOD is not working on his new Venu2. - It turns off the screen.

So this is potentially not only a problem of the simulator but also of the actual device.

Here is a screen recording of the problem in action highlighting the differences between Venu1 and Venu2:

https://drive.google.com/file/d/123bDerdGzCovWEcJlxonKbRBSo96lqrq/view?usp=drivesdk

  • Hi Johnny,

    thanks for investing time in this issue!

    I figured out why the problem does not reproduce with your code. I'm using antialiasing in my watch faces whenever possible (supported and enough mem).

    I turn it on when entering onUpdate() and never turn it off. Hence the overlay pattern is also drawn with antialiasing enabled. Apart from being a waste of CPU resources it was not a problem for the burn-in protection on the Venu1.

    Here is my updated code that now works fine.

    if(ProtectAgainstBurnInWithLinePattern())
    {
        temp_dc.setAntiAlias(false);
        temp_dc.setPenWidth(1);
        temp_dc.setColor(Graphics.COLOR_BLACK, Graphics.COLOR_BLACK);
    
        if(VENU_AOD_HORIZONTAL_LINES == mVenuAOD)
        {            
            for(var y = mToggle ? 0 : 1; y < mDcHeight; y+=2)
            {
                temp_dc.drawLine(0, y, mDcWidth - 1, y);
            }
        }
        else
        {
            for(var x = mToggle ? 0 : 1; x < mDcWidth; x+=2)
            {
                temp_dc.drawLine(x, 0, x, mDcHeight - 1);
            }
        }
    }

  • The bug fix has been pushed to 4.0.2 sdk as well as the Venu2 MR2 scheduled for early June release.

  • I'm having a hard time reproduce your issue, here is the code I wrote to mimic your overlay.

    var _cnt = 0;
    function onUpdate(dc as Dc) as Void {
        dc.setColor(Graphics.COLOR_BLACK, Graphics.COLOR_BLACK);
        dc.clear();
        dc.setColor(Graphics.COLOR_WHITE, Graphics.COLOR_BLACK);
        dc.fillRectangle(206, 0, 20, 40);
        dc.setPenWidth(1);
    	dc.setColor(Graphics.COLOR_BLACK, Graphics.COLOR_BLACK);
    	var delta = _cnt%2;
    	for(var x = delta; x < 416; x+=2) {
    	    dc.drawLine(x, 0, x, 416);
        }
        ++_cnt;
    }

    did I miss anything?

  • There is an other small issue with the Venu2 burn-in protection (at least with the simulator - also the patched one) which I think was mentioned by somebody in this thread before.

    With the overlay pattern I have to account for an extra +1 pixel when drawing horizontal lines and an extra -1 pixel when drawing vertical lines or the burn-in protection will trigger.

    The original Venu does not have the problem.

    Here is evidence in the form of a screen recording which should clarify what I mean.

    https://drive.google.com/file/d/1SmArVY_yE5flnkMW3Y7eeSYK_WG7JkwD/view?usp=sharing

    Again this is an issue that is not going to be a problem for everyone's watch face. It is only a problem if you are drawing in the first row or the last column of the display.

  • we had recently introduced "penalty" on "loadResource" called during low power mode, as that may induce disk i/o, and cause additional power drain.

    is there anyway you can move the loadResource to say, onShow or onLayout, once the resource is loaded to memory, you can use it whenever you want w/o being penalized.

    we can move further discussion to the other thread you opened.