PebbeのTimeline Quick View対応

Pebble WatchfaceであるMineclockでPebble OS v4.0のTimeline Quick Viewに対応してみた。

残念ながらTimeline Quick Viewは丸型のPebble Time Roundでは対応しておらず、四角のPebble Timeで使える機能なので押入れで眠っていたPebble Timeを引っ張り出して確認したりした。Timeline Quick ViewはWatchface上に次のTimelineの通知が表示される機能で、まぁ次の予定が時計上で確認できるというものになる。設定で30分前からとか5分前から表示などを設定できる。

Watchfaceの開発者としてはTimeline Quick Viewが表示されてもユーザインタフェース上問題ないようにレイアウトする必要がある。ちなみにPebble TimeではTimeline Quick Viewが高さを50pxくらいとるのでwatchfaceによってはかなりレイアウト上の制限を受ける(Pebble Timeの解像度は144×168)。Timeline Quick Viewに対応していないWatchfaceが重要な時間情報を画面の下で表示していると致命的である。

今後、機種によってTimeline Quick Viewのサイズが変わってくるとかなり面倒なことになるので、今回はデジタル時計部分を無理やり表示するという方法でとりあえず対応した。なおエミュレータを使うと予定がなくてもTimeline Quick Viewの表示のオンオフを pebble emu-set-timeline-quick-view --emulator basalt on で確認できるのでまずはそれで確認するのが良い。

アナログの日時計を対応する場合はTimeline Quick Viewが表示された場合と、そうでない場合で2種類の画像を用意して描画処理をしないといけなくなるのでMinelockのように画面の解像度を前提とした凝ったWatchfaceの対応は苦労することになる。

今回はとりあえずの対応をして他のWatchfaceの開発者の様子を見てみよう。

Mineclock v1.1

Pebble watchfaceであるMineclockに日付を入れて欲しいという要望があったので対応した。最初のバージョンの開発中に一瞬入れていたけどデザインが微妙になったので止めた記憶があったが、とりあえず時間の下に入れてみた。

現在、Pebble Time Roundが黒背景しか見えない問題のせいで実機で確認できていない問題がある。Pebbleのシュミレーターは便利だけどPCのディスプレイではドットの表示が鮮明すぎて細かい部分の調整は実機じゃないとわからない所がある。

あと、今更ながらAtomエディタのプラグインでpb-completionsを入れたら少しだけ補完が効くようになって楽になった。構造体のメンバは出ないようなので完璧ではないが無いよりまし。

Pebble向けMinecraft風Watchface公開

正月くらい(Minecraft風Pebble時計の開発2)に開発していたPebbleのWatchface(時計)を公開した。ゲームのMinecraftの世界に出てくる時計をモチーフにしたものでMineclockと名付けた。

Pebble appstoreのリンクはこちら。

Public Web Link : https://apps.getpebble.com/applications/568aa41c6518afe93f000012
Deep Link : pebble://appstore/568aa41c6518afe93f000012

ビットマップを回転させるとバッテリーを消費してしまうという問題がまだ解決していない。

それで作ったものの塩漬け状態になって放置していたが、マリオの時計(毎分マリオがブロックを叩く)もアニメーションをしているせいかMineclock以上にバッテリーを消費していたのでアニメーションする以上はしょうが無いのかと思うところもあり、取り急ぎバージョン1.0として公開することにした。

バッテリー消費を減らす場合はビットマップを使わずにパスをつかって全部描画するようにしないといけなく、それは今後の課題としては認識はしている。

ソースも公開しているのでWatchfaceの実装の参考に。誰か描画部分をパスで書きなおしたPull Requestを送ってくれないか。

残念なことに、個人的な問題としてPebble Time Roundのディスプレイが壊れたらしく明るい色がホワイトアウトしてしまい、Mineclockもほとんど見えない。そのため現状は黒系のwatchfaceしか使えないでいる。Pebbleのサポートチームとやりとり中。

Pebble Time Round display white out

Minecraft風Pebble時計の開発2

Pebble watchface開発の続き。

なんとなくPebble Classicにも対応してみた。単純にPebble Time向けに作ったpngファイルをHyperditherというアプリで白黒にしただけのやっつけ対応。

通知を表示してwatchfaceに戻ったときに画面の一部が白くなったまま再描画されないことがあるバグは解決できた。

前回は検索の仕方が甘かっただけで同じ質問をForumで見つけた。
https://forums.getpebble.com/discussion/30257/layers-corrupt-after-notifications

AppFocusServiceでWatchappのFocusが戻ってくるイベントを取れた。以下のように修正。

static void app_did_focus(bool in_focus) {
  if (in_focus) {
    Layer *window_layer = window_get_root_layer(s_window);
    layer_mark_dirty(window_layer);
  }
}

static void init(void) {
  s_window = window_create();
  ...
  app_focus_service_subscribe_handlers((AppFocusHandlers){
    .did_focus = app_did_focus,
  });
  ...
}

一瞬は画面の一部は白くなるけど数秒で更新されるので毎分の更新タイミングを待つよりはマシだろう。

バッテリー問題は解決していないんだけど実際のところちゃんと他のwatchfaceと比べていないのでどれくらい変わるのか計ってみるか・・・

Minecraft風Pebble時計

ありそうで無かったのでMinecraft風のPebble Time用の時計を作ってみた。

Minecraftのワールドには時間の概念があって、時間を知るために時計がクラフトできる。それと同じようなものをwatchfaceとして作ってみた。このネタはPebble Classicの時から考えていて、Pebble Time Roundという丸型のPebbleを手に入れたことで開発意欲が湧いた。最初はデジタル時計無しで考えていたのだが、実用性に欠けるのでデジタル時計も合わせてみたら良い感じになった。

季節や地域によって太陽・月と時間の関係は変わってくるので調整が必要とかいろいろ考えはしたけど、使ってみたらAM/PMのアナログ表現として知覚し、実際の日没とずれてても個人的には問題に感じなかった。

2つほど問題が残っていてまだ公開はできていない。

一つは画像を回転していてそれがバッテリー消費に影響していそうなこと。ドキュメントに graphics_draw_rotated_bitmap() はCPUパワーを使うと書いてある。避けるには Draw CommandsGPaths を使うのだが簡単な変換方法がまだ理解できていない。5分に一回描画するようにしようと思ったがPebbleでは一つのLayerを更新するとLayer Treeが再描画されるため、デジタル時計のTextLayerを更新するとアナログ時計のBitmapLayerも更新されてしまう。つまりデジタル時計を表示する限り、毎分描画され graphics_draw_rotated_bitmap() が呼び出されてしまう。

もう一つの問題は、通知を表示したあとにwatchfaceに戻ったときに画面の一部が白くなったまま再描画されないことがあるバグ。描画が重いことに影響しているのか、毎分のデジタル時計の更新がくるまで描画されない。

このまま公開するか考えどころ。