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

Parents
  • FYI:

    I had to do one last small correction to my code.

    Initially I had

    temp_dc.drawLine(0, y, mDcWidth, y);
    and
    temp_dc.drawLine(x, 0, x, mDcHeight);

    just like in your code. I did draw this extra pixel to make the Venu1 AOD work and I thought I can remove it since I'm now drawing without antialiasing.

    I was wrong.

    For the Venu1 and D2 Air devices I have to draw the extra pixel on the right and the bottom edge of the display. - Even with antialiasing turned off!

    Here is a modified version of your example that works on the Venu2 but triggers the Venu1 and D2 Air burn-in protection.

    No big deal but something that needs to be considered in our watch faces.

    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.fillRectangle(206, dc.getHeight() - 40, 20, 40);
        dc.setPenWidth(1);
        dc.setColor(Graphics.COLOR_BLACK, Graphics.COLOR_BLACK);
        var delta = _cnt%2;
        for(var x = delta; x < dc.getWidth(); x+=2) {
            dc.drawLine(x, 0, x, dc.getHeight() - 1);
        }
        ++_cnt;
    }

    And here is my fixed hopefully final version of the overlay pattern.

    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); //One extra pixel on the right edge for the Venu1
            }
        }
        else
        {
            for(var x = mToggle ? 0 : 1; x < mDcWidth; x+=2)
            {
                temp_dc.drawLine(x, 0, x, mDcHeight/* - 1*/); //One extra pixel on the bottom edge for the Venu1
            }
        }
    }

Comment
  • FYI:

    I had to do one last small correction to my code.

    Initially I had

    temp_dc.drawLine(0, y, mDcWidth, y);
    and
    temp_dc.drawLine(x, 0, x, mDcHeight);

    just like in your code. I did draw this extra pixel to make the Venu1 AOD work and I thought I can remove it since I'm now drawing without antialiasing.

    I was wrong.

    For the Venu1 and D2 Air devices I have to draw the extra pixel on the right and the bottom edge of the display. - Even with antialiasing turned off!

    Here is a modified version of your example that works on the Venu2 but triggers the Venu1 and D2 Air burn-in protection.

    No big deal but something that needs to be considered in our watch faces.

    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.fillRectangle(206, dc.getHeight() - 40, 20, 40);
        dc.setPenWidth(1);
        dc.setColor(Graphics.COLOR_BLACK, Graphics.COLOR_BLACK);
        var delta = _cnt%2;
        for(var x = delta; x < dc.getWidth(); x+=2) {
            dc.drawLine(x, 0, x, dc.getHeight() - 1);
        }
        ++_cnt;
    }

    And here is my fixed hopefully final version of the overlay pattern.

    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); //One extra pixel on the right edge for the Venu1
            }
        }
        else
        {
            for(var x = mToggle ? 0 : 1; x < mDcWidth; x+=2)
            {
                temp_dc.drawLine(x, 0, x, mDcHeight/* - 1*/); //One extra pixel on the bottom edge for the Venu1
            }
        }
    }

Children
No Data