はじめに
やっぱりみなさんも、エオルゼア時計(以下略)
というわけでこちらは @nora_wanko さんの「スマートウオッチ作る (1) SAM L22ボードの入手・組付け」に便乗した記事です。
なお実機は注文しましたがまだ発送もされていないので、動作検証はエミュレータでのものを紹介します。
前提条件
- Sensor Watchの開発環境を構築済みであること
Faceの追加
下記のコマンドで行えます。
cd movement/template/
python3 watch_face.py <フェイスタイプ> <フェイス名>
今回は下記のようなコマンドを実行します。
cd movement/template/
python3 watch_face.py clock eorzea_clock
※cファイル及びヘッダファイル名は、フェイス名の末尾に「_face」がついたものになります。
このコマンドを実行することにより新フェイスのcファイルとヘッダファイルが生成される他、必要ファイルへの追記が行われます。
すでに存在するフェイスのcファイルとヘッダファイルをコピーするなどして作成すると、make
および emmake make
に失敗します。(失敗しました)
エオルゼア時間をFaceに表示する
エオルゼア秒はいつものように、日本時間における週内経過秒を求めてそれを「1440 ÷ 70」倍したエオルゼア秒から求めます。
念のため計算機資源に気を使ってみました。
const int ONE_DAY_SEC = 60 * 60 * 24;
const int ONE_HOUR_SEC = 60 * 60;
const double MULTIPLIER_TO_EORZEA_SEC = (double)1440 / (double)70;
typedef struct {
uint8_t hour;
uint8_t minute;
uint8_t second;
} eorzea_clock_hms_t;
static void _date_time_to_hms(eorzea_clock_hms_t *date_time_eorzea, watch_date_time date_time) {
unsigned int weekday_index;
double week_sec;
unsigned int eorzea_week_sec;
weekday_index = _get_weekday_index(date_time);
week_sec = (ONE_DAY_SEC * weekday_index) + (ONE_HOUR_SEC * date_time.unit.hour) + (60 * date_time.unit.minute) + date_time.unit.second;
eorzea_week_sec = (unsigned int)(week_sec * MULTIPLIER_TO_EORZEA_SEC);
date_time_eorzea->hour = (eorzea_week_sec / ONE_HOUR_SEC) % 24;
date_time_eorzea->minute = (eorzea_week_sec / 60) % 60;
date_time_eorzea->second = eorzea_week_sec % 60;
}
あとは画面更新用の関数を作成して、毎Tickごとに呼び出されるようにすれば完成です!
なお例によってエオルゼア秒は、精度とTickが荒いので非表示としています。
static void _update(movement_settings_t *settings, eorzea_clock_state_t *state) {
char buf[11];
watch_date_time date_time = watch_rtc_get_date_time();
eorzea_clock_hms_t eorzea_time;
_date_time_to_hms(&eorzea_time, date_time);
sprintf(&buf[0], "%s %02d%02d--", "ET", eorzea_time.hour, eorzea_time.minute);
watch_set_colon();
watch_set_indicator(WATCH_INDICATOR_24H);
watch_display_string(buf, 0);
}
エミュレータでの実行結果
今後の課題
- 12時間/24時間表示を切り替えられるようにする
- RTCが日本時間以外に設定されている場合の考慮
さいごに
楽しいスマートウォッチ生活を!