端末の情報を表示したい!

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)だけでも良さそうに見えるのだけど…。