充電してからの経過時間の表示

ガーミンスマートウォッチで、充電してからの経過時間を表示するプログラム。
バッテリーの持ちを視覚化できないかと考えて作った。

ガーミンの永続データの取り扱いについて調べたきっかけが、このプログラムを作るためだった。
ForeAthlete45では、データの保存ができなかったので、DigiInfoに追加することはしないが。

次のような考えで作っている。

  1. バッテリーの容量を取得する。
  2. 前回計測時のバッテリー容量より大きくなった場合、充電後だと判断し、今の時刻を保存する。
  3. 前回計測時のバッテリー容量以下の場合は、現在時刻から2で保存した時刻を引いた数値をバッテリー充電からの経過時間にする。

オブジェクトストアに保存しているデータは、バッテリー容量と充電後の時刻。

実際のプログラムがこちら。

using Toybox.WatchUi;
using Toybox.Graphics;
using Toybox.System;
using Toybox.Lang;
using Toybox.Time;

class BatTime1View extends WatchUi.WatchFace {

	var center;
	
	var batteryLife;
	var prevChargeTime;

    var app;

    function initialize() {
        WatchFace.initialize();
	    app = Application.getApp();
    }

    function onLayout(dc) {
    	center = [dc.getWidth()/2, dc.getHeight()/2];

        batteryLife = app.getProperty("batteryLife");
        if (batteryLife == null) {
        	batteryLife = 100.0;
        	app.setProperty("batteryLife", batteryLife);
        }
        prevChargeTime = app.getProperty("prevChargeTime");
        if (prevChargeTime == null) {
        	prevChargeTime = Time.now();
        	app.setProperty("prevChargeTime", prevChargeTime.value());
        }
        else {
        	prevChargeTime = new Time.Moment(prevChargeTime);
        }
    }

    function onUpdate(dc) {
        dc.setColor(Graphics.COLOR_WHITE, Graphics.COLOR_WHITE);
    	dc.clear();
        dc.setColor(Graphics.COLOR_BLACK, Graphics.COLOR_TRANSPARENT);

    	var now = Time.now();
        var timeS = Time.Gregorian.info(now, Time.FORMAT_SHORT);
    	var nowBat = System.getSystemStats().battery;

        var str = timeS.month + "/" + timeS.day + "\n" +
        	timeS.hour + ":" + timeS.min.format("%02d") + "\n" +
        	nowBat.format("%3.0f");

    	if (batteryLife == null) {
    		batteryLife = nowBat;
    	}
    	if (nowBat > batteryLife) {
    		prevChargeTime = now;
        	app.setProperty("prevChargeTime", prevChargeTime.value());
    	}
    	else {
    		var work = now.subtract(prevChargeTime).value();
    		str += "\n" + (work / 86400) + " " + ((work / 3600) % 24) + ":" + ((work / 60) % 60).format("%02d");
    	}
    	batteryLife = nowBat;
    	app.setProperty("batteryLife", batteryLife);

    	dc.drawText(center[0], center[1], Graphics.FONT_MEDIUM, str,
			Graphics.TEXT_JUSTIFY_VCENTER | Graphics.TEXT_JUSTIFY_CENTER);
    }
}

ちょっと面倒だったのが、経過時間を表示する箇所。

Time::Gregorian.utcInfoを使い、日時分のそれぞれの情報を取り出そうとしたのだが、このメソッドの引数がMomentクラスだった件。
充電時を表す時刻と今の時刻は、それぞれMomentクラスで、その引き算の結果はDurationクラスとなるため、引き算の値をTime::Gregorian.utcInfoに渡すことができなかった。

テスト中は何度も例外が発生し、原因を探るのにちょっと時間がかかってしまった。

Durationとして渡されるのは、秒なので、そこから日時分を計算して表示するようにしている。

実機確認は、Vivoactive HR Jで行ってみた。
その結果は以下のよう感じ。

追記(4/22)

58%のバッテリー容量で8日持った。
腕に巻かず置時計化しているのと、ウォッチフェイスのコードが小さいのでそれほどバッテリーを消費しないためか、結構持ちがいい感じ。
Vivoactive HRは、購入から3年6か月たったもの。

追記(5/2)

バッテリー残量1ケタ台に突入。
18日近く持った。

この後、充電を開始したのだが、その時「ぶるっ」と震えた。
今までにはない現象だった。1ケタ台で充電を始めるとそうなるのか?

コメント

タイトルとURLをコピーしました