Watchfaceを見てると、バッテリー状態とかBluetooth接続状態を表示しているのがたくさんあります。
僕も表示したい!
いつものように、事例に合ったサンプルを見てみます。→ classio-battery-connection
実行すると、こういう感じです。
時刻と、Bluetooth接続状態、電池状態が表示されてます。
ソース見ていきましょう。init() / deinit() / main() はいつも通りな感じ。
main_window_load() の中で以下のことをやってます。
1.現在のBluetoothコネクション状態を表示
handle_bluetooth(bluetooth_connection_service_peek());
2.現在の時刻を表示。(この中でバッテリー状態も表示)
handle_second_tick(current_time, SECOND_UNIT);
3.さきほどの時刻表示(handle_second_tick)を、秒ごと(SECOND_UNIT)に呼び出されるように登録。
tick_timer_service_subscribe(SECOND_UNIT, handle_second_tick);
4.バッテリー充電状態が変化したら、バッテリー充電状態表示変更を呼び出すように登録、
battery_state_service_subscribe(handle_battery);
5.Bluetooth状態が変化したら、Bluetooth状態表示変更を呼び出すように登録
bluetooth_connection_service_subscribe(handle_bluetooth);
Bluetooth関連のサービスのドキュメント見てみましょう。
bool bluetooth_connection_service_peek(void)
これで現在の状態をチェックできます。Bluetooth接続されてればtrue、されてなければ false です。
void bluetooth_connection_service_subscribe(BluetoothConnectionHandler handler)
これでハンドラを登録しておくと、Bluetoothの接続/非接続時に、ハンドラを呼び出してくれます。
void bluetooth_connection_service_unsubscribe(void)
登録したハンドラを削除します。main_window_unload()の時に忘れずに実行。
サンプルでは、Bluetoothのハンドラは、下記のように作ってあります。
static void handle_bluetooth(bool connected) { text_layer_set_text(s_connection_layer, connected ? "connected" : "disconnected"); }
引数で接続状態が渡ってくるので、それを利用していろいろやればいいですね。
バッテリー状態のドキュメント見てみましょう。
void battery_state_service_subscribe(BatteryStateHandler handler)
これでハンドラを登録しておくと、バッテリー状態が変わった時に、ハンドラを呼び出してくれます。
void battery_state_service_unsubscribe(void)
Bluetoothと同様、削除忘れずに。
サンプルでは、ハンドラは下記のような感じ。
static void handle_battery(BatteryChargeState charge_state) { static char battery_text[] = "100% charged"; if (charge_state.is_charging) { snprintf(battery_text, sizeof(battery_text), "charging"); } else { snprintf(battery_text, sizeof(battery_text), "%d%% charged", charge_state.charge_percent); } text_layer_set_text(s_battery_layer, battery_text); }
BatteryChargeState の形で、バッテリー状態が渡ってきます。
typedef struct { uint8_t charge_percent; bool is_charging; book is_plugged; } BatteryChargeState;
バッテリーの充電パーセント(1~100)/ バッテリーがチャージ中かどうか / 電源ケーブルが接続されているか、が入っています。
BatteryChargeState battery_state_service_peek(void)
これで現在の状態を取得することができます。
サンプルプログラムだと、バッテリー状態は「1秒ごとの時計更新時」と「バッテリー状態変更時」に更新されていますね。
こちらの例だと、バッテリー状態変更時の呼び出し(battery_state_service_subscribe)だけでも良さそうに見えるのだけど…。