LoginSignup
2
0

More than 1 year has passed since last update.

Sensor Watch (SAM L22ボード)で物理エオルゼア時計を作る

Last updated at Posted at 2022-12-10

はじめに

やっぱりみなさんも、エオルゼア時計(以下略)
というわけでこちらは @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」倍したエオルゼア秒から求めます。
念のため計算機資源に気を使ってみました。

eorzea_clock_face.c(抜粋)
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が荒いので非表示としています。

eorzea_clock_face.c(抜粋)
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が日本時間以外に設定されている場合の考慮

さいごに

楽しいスマートウォッチ生活を!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0