[REQUEST] watchface settable custom length of time to remain in Hi power mode

Former Member
Former Member
I would like to have the ability to keep the second hand visible for longer than the default 10 seconds.

Could you please give us a way to set the length of time that a watchface will stay in full power mode before going back to low power mode so we can keep the second hand running longer. I know that it will be a drain on the batter but the seconds need to remain displayed long enough to be useful. As it is now custom watchfaces are severely crippled.

10 seconds is not very useful.

I am a pilot and need a second hand to remain available for about 5 minutes at a time, long enough to shoot a timed approach.
It would be nice to be able to use the second hand for something like taking a pulse which requires at least 15 seconds but 30 seconds to a minute would be much more handy.
Getting your speed by timing for a minute needs the second hand available for about 2 minutes.

Thank you
  • Would be nice to be able to configure it!
  • My guess is that this probably won't change since power management is a priority for our products, but I'll pass along your request for consideration. I think it's more likely that we'd allow configuration up to 30 seconds than to do something like five minutes. I'd suggest right now that if you needed a longer-term second hand or timer, you could either compile a watch face as an app, or create a custom app for aviation use. Not quite as convenient as just glancing at your watch, I realize, but it would circumvent the 10 second timeout.
  • Former Member
    Former Member over 10 years ago
    How about a callback function you can setup that gets called once a second when the watch is in a low power state? We are well aware of the power issues and we could then have a minimalist function intended to do just the minimum needed and not draw the full watch face.

    - For my analog watch face I would set up a smaller inner face with nothing in it but the seconds hand so I could update the watch with two draw calls, one to erase the old hand and one to draw the new hand.

    - A single draw call to make a blinking dot would at least keep the watch face looking alive.

    - Or two draw calls to update digital seconds.

    The most flexible method would be to draw the watchface without a second hand once every minute and then copy the face into a bitmap. Then with a low power call back function you could draw the bitmap to erase the old seconds and then just draw the new seconds on it, that would allow for the second indicator to overlap other items. I am not sure of the power draw for printing a fullface bitmap. It might take more or less power than drawing a filled circle depending on the setup. You could save even more cpu cycles if the callback function automatically drew the saved bitmap to the screen as you could save a few draw calls, name lookup's, and variable retrievals, and stack usage by hard coding the face-saved bitmap's location in memory and size. Then we would only have to draw the seconds indicator/hand.
  • Former Member
    Former Member over 10 years ago
    Also, I find the gesture to bring the watch out of low power mode to be rather unreliable. It would be nice if just pressing one of the currently unused buttons (lower left or lower right) would pull the watch out of low power mode.
  • How about a callback function you can setup that gets called once a second when the watch is in a low power state?

    It's already there. It's called onUpdate(). :)

    For my analog watch face I would set up a smaller inner face with nothing in it but the seconds hand so I could update the watch with two draw calls, one to erase the old hand and one to draw the new hand.

    Unless you know of some special way of erasing rendered data, this would only work for applications where the thing being erased doesn't obscure something and isn't obscured by something. If the hour hand is is drawn on top of the second hand and you 'erase' the second hand (presumably by rendering over it in the background color), you've erased part of the hour hand as well. You'd need some sort of mask to tell you what is you can and cannot erase

    A single draw call to make a blinking dot would at least keep the watch face looking alive.

    Again, this only works if you know what is under that dot, so it is not something that can be implemented generally. If you want a pulse indicator, you can already do that pretty easily.

    class MyWatchFace extends Ui.WatchFace
    {
    var low_power_mode = false;

    function onEnterSleep() {
    low_power_mode = true;
    Ui.requestUpdate();
    }

    function onExitSleep() {
    low_power_mode = false;
    Ui.requestUpdate();
    }

    var show_blinker = false;

    function onUpdate(dc) {

    // render your watch face as normal

    if (low_power_mode) {
    show_blinker = false;
    }

    if (show_blinker) {
    dc.setColor(Gfx.COLOR_WHITE, Gfx.COLOR_WHITE);
    dc.drawCircle(5, 5, 3);
    }
    }
    }


    two draw calls to update digital seconds.

    If you think the draw calls are expensive, you can avoid making them yourself in onUpdate(). If the digital time fields don't obscure anything, drawing them with the appropriate background color just works.

    var prev_hour = -1;
    var prev_min = -1;
    var prev_sec = -1;

    function onUpdate(dc) {

    var time = Sys.getClockTime();

    if (prev_hour == time.hour) {
    if (prev_min == time.min) {
    // render the seconds only
    }
    else {
    // render minutes/seconds
    }
    }
    else {
    // render hours/minutes/seconds
    }
    }
  • Former Member
    Former Member over 10 years ago
    Thank you for all the great information @Travis.Vitek.

    Unless I am mistaken, I thought onUpdate() only gets called once a minute when the watch is in low power mode and once a second in high power mode. I need more of a timer callback every second, but timers are disabled for watchfaces.

    Could I use animate() to continue a second hand moving for a while after low power mode is entered?
  • You are correct, onUpdate() is called automatically ever minute in low-power mode and once a second otherwise. You are supposed to be able to create timers when not in low-power mode, but you are supposed to stop them when you return to low-power mode.

    From your most recent post, it sounds like you are just trying to find a way to circumvent this limitation. Shame, shame... :)