Garmin ウォッチ用ウォッチフェイスを作る(その5)

前回まででウォッチフェイスの表示についてはほぼ完成しました。
alasixosaka.hatenablog.com
今回は、フォントをオリジナルに変えてみようと思います。
やり方は、いつも参考にしているmayoさんのブログに詳しく書いてあります。
note.com
ここでは簡単に概略だけを書いておきます。ほぼ参考サイトのやり方通りで動きます。
まず、フォントデータを用意するためにBMfontというソフトをダウンロードします。
インストールは不要です。ダウンロードしたファイルのbmfont64.exeをクリックすると起動します(OSが64bitの場合、32bitならbmfont32.exeを選ぶ)。起動したら、ガーミンウォッチに表示したいフォントを選びます。
色々あって悩みますが、今回は、HPSimplifiedというフォントを選びました。その辺は好みだと思うのですが、自分的には明朝系のフォントよりもゴチック系のフォントの方が好みです。また、このフォントはパソコンがHPだからインストールされているのかもしれません(確認はしてませんが)。
とりあえず、フォントが決まったらサイズを適当な大きさにします。文字盤のメインの表示だと96pixelくらいがちょうどよいようです。それも好みの問題ですが。
フォントとサイズが決まったら、save bitmap as で適当な名前を付けて保存します。このとき、参考サイトだと拡張子がfntのファイルとpngのファイルができると書いてありますが、自分の場合デフォルトではfntとtgaの拡張子のファイルができました。どちらでも特に問題はなく、fntのファイルだけあればよいようです。
できたフォントを、プロジェクトのresourceフォルダにfontsというフォルダを作って格納します。そして、そのフォルダにfont.xmlを作って、

<fonts>
    <font id = "HP" filename="HP.fnt"/>
</fonts>

のように記述します。ファイル名は先ほどダウンロードしたfntファイルのもの。font id はプログラム中で使う識別子です。
次に、layout.xmlで作ったフォントを表示したい部分のフォント名をfont = @Fonts.HPというように修正します。
これで、オリジナルフォントが表示されるようになります。

フォントがオリジナルに変更された

実機で試す

さて、結構お気に入りのウォッチフェイスができたので実機で試してみました。
やり方はあちこちに書いてあるので今更ですが、ガーミンウォッチをパソコンに接続し、プロジェクトのbinフォルダのxxxx,prg(xxxxはプロジェクト名)というファイルをウォッチのGarmin>Appsというフォルダにコピーして格納します。ケーブルを取り外すとそのまま新しいウォッチフェイスが動きます。

Low Power Modeにはまる

これでお気に入りのウォッチフェイスができて、めでたしめでたしと思いきや、様子が変。秒針(デジタルなので正確には秒表示というべきか)がすぐに止まってしまう。時計を動かすとまた動き出すが、しばらくするとまた止まる。この動きはどっかで見たような。そう、COROSとおなじではないか。COROSも節電のために秒針は常に動いておらず腕を動かすと動き出して、しばらくすると止まる。たしかに、前にも書いたようにスマートウォッチってそういうもんでしょと言われればそれまでなんですが、特に有機ELを表示に使っているウォッチなんかは表示そのものが消えてしまったりする。ただ、個人的には普段使いの時計として使うなら秒針は常に動いていて欲しいと思っているし、現に、ガーミンではデフォルトでインストールされているウォッチフェイスだと秒針は常に動いている。また、ConnectIQからインストールしたウォッチフェイスでも秒針は常に動いていた。ということは何か方法があるはず。
色々調べると、ウォッチの種類によるようなのですが、アクティブモードとローパワーモードがあってアクティビティー中や腕を動かしたときはアクティブモードに入って毎秒更新になり、アクティビティー中でない通常のスマートウォッチモードの時は10秒後にローパワーモードに入って節電をするらしい。
つまり、プログラム中のonUpdate()はアクティブモードでは1秒毎に動作し、ローパワーモードでは1分毎に動作する。ローパワーモードで1秒ごとに動作するには別にonPartialUpdate()という関数が用意されていて、ローパワーモードの時に1秒毎に呼び出される。
ということで早速やってみた。
基本に戻って、新しいプロジェクトを作成し、秒の表示の部分をonPartialUpdate()関数を作ってその中に書いてみた。
シミュレータではsettingからLow Power Modeを選んでチェックを入れるとローパワーモードに入る。
これで万事解決と思ったらそうは問屋が卸さない。しばらくすると秒針が59秒で止まる。
ちなみに、onUpdate()の所と、onPartialUpdate()の所に、System.println("full update"); System.println("partial update");と書いて動作を確認してみた。この辺はArduinoみたいで結構原始的。一応デバッグモードも用意されているが、ブレークポイントで止まってくれるくらいで、その時の変数の状態などは全然表示してくれないので、原始的な方法がデバッグには必要なようだ。
コメントを見て、動作を見てみると、しばらくはパーシャルアップデートが動いているが、1分経過後の次のフルアップデートのタイミングで必ず止まる。
実機でも試してみたが動作は同じ。これは完全に行き詰ったか、と思ったが、実際に毎秒動くプログラムを書いている人がいるので絶対に何か解決策があるはず。色々探してようやく解決策が見つかった。ただそれも簡単ではなくいろいろ試行錯誤が必要で、その辺の詳しくはまた次回に書いてみたいと思います。