Pebble WatchFace開発

年末にPebble WatchFaceを作ってみたので、その備忘録。

  • Pebbleとは?
    • 所謂スマートウォッチ
    • スマホBlueToothでつながる
    • 表示はモノクロe-paper(e-inkではないらしい)ので7日位バッテリーが持つ(自分の実測では5日)
    • ボタンが4つついてるので、これを操作してスマホ側アプリと連携してなんかすることもできる

詳細はこの辺を見て。
公式: Pebble Smartwatch | Smartwatch for iPhone & Android
まとめ: スマートウォッチ「Pebble」まとめ - NAVER まとめ
分解: Pebble Teardown - iFixit
いろんなWatchFace: http://www.mypebblefaces.com/


ここから開発について。

開発関連情報

とにかくここ、こまったらここを見る。
Develop for Pebble

開発環境

自分のPCに環境を作ってもいいですが、Web上でコーディング&コンパイルスマホへのインストールまでできるサイトがあったので、今回はCloudPebbleで開発します。
ちなみにWindowsは今のところ非対応らしい。ただ、Windowsで開発するにせよ、CloudPebbleで開発するにせよ、SDKのアーカイブにサンプルコードが含まれているので、ダウンロードしておいた方が幸せになれます。

SDK

Pebble SDK 1.X系と2.0系があってAPI名とか多分他にもなんかが違う。今から古いのを使うのもなんなんで、2.0を使います。

WatchFace?WatchApp?

WatchFaceはPebbleのボタンを使わないもの、WatchAppはボタンを使えるもの。
BlueTooth通信の有無ではないらしい。

PebbleKit?

iOS, Androidで動くスマホ側のアプリの開発キットらしい。今回は使わないので未調査。

サンプルWatchFace

今回、作ったのは砂時計。ざっくりとした仕様は

  • 1時間で砂が流れ切る
  • 上側と下側の砂の量は、時間と対応付けて表示を変える
  • 砂が流れるアニメーションをつける
  • 砂が流れ切ったら砂時計が1回転する
  • Pebbleを振ると下側の砂が平らになる
// アプリの開始時に実行
static void do_init(void) {
	//割り込みハンドラの登録、リソースの確保、初期化とか
}

// アプリの終了時に実行
static void do_deinit(void) {
	//リソースの開放とか
}

int main(void) {
	do_init();
	app_event_loop(); // おまじない
	do_deinit();
}

…詳細を書こうと思ったけど、
Develop for Pebbleの'Getting Started', 'Pebble Developer Guide'と拙作のソースを見てもらった方が早いなぁ、と思ったり。
きたないけどソースはzinziroge/sandglass_watchface · GitHubに置いてあります。
他にもGithubhttp:// http://www.mypebblefaces.com/でソースが公開されているものもあるのでそれを参考にするのが手っ取り早いと思います。

これで終わるのもあれなのではまったところだけ箇条書き。

時間割り込みの登録

秒、分、時、日、月、年が変わるタイミングで呼ばれるハンドラが登録できるのだが、例えば1秒毎、1時間毎に割り込みをかけようとして以下のように2つハンドラを登録したら1秒毎の割り込みが実施されず。

tick_timer_service_subscribe(SECOND_UNIT, &handle_second_tick);
tick_timer_service_subscribe(HOUR_UNIT, &handle_hour_tick);

正解は、これ。

tick_timer_service_subscribe(SECOND_UNIT|HOUR_UNIT, &handle_tick_timer);

で、ハンドラ側で割り込み要因を判別して処理を分ける。

void handle_tick_timer(struct tm *tick_time, TimeUnits units_changed) {
	if( units_changes | SECOND_UNIT) {
		// 1秒毎に実施する処理
	}
	if( units_changes | HOUR_UNIT )
		// 1時間毎に実施する処理
	}
}
2pixel以上の太い線が描けない

graphics_draw_line() という線を引くAPIがあるが、太さを指定できない(つまり1pixel)。
水平線や垂直線なら graphics_fill_rect() で実現できる。でも、斜め線が描けない。
PebbleにはDrawing Pathsという一筆書きで線を描いて、内部を塗りつぶすこともできるデータ型がある。
これを使って太さと傾きに応じて太線の4頂点の座標を計算すれば、gpath_draw_filled()で描ける。
ちなみにsin,cos,atan2はテーブルで持っていてそれをAPIで参照できるので、上の座標計算もダイナミックにできます。

1つ作ってみての感想

WatchFaceぐらいの規模だと環境作る方がめんどいから、クラウドで開発できるのすごくいいと思う。
エディタもメモ帳レベルだけじゃなくて, vim-like, emacs-likeが選べるのでどっちか使える人には便利。
CloudPebbleは楽チンですばらしいのだが、唯一こまるのがスクリーンショットが撮れないこと(Linux環境だと撮れる(らしい))。
CloudPebble blog | What're we up to?(開発者Blog)を見ると最優先事項だと認識しているらしいので実装されると大変うれしい。