リアルタイムの心拍数取得
- 2024/05/07更新
機種をfr165に変更したところ、下記の実装で現在の心拍数を取得できることが分かった。
fr45で取得できなかったのは、fr45の問題だったのか、ファームで更新されたのか、開発環境に依存したものなのかは不明。
ForeAthlete 45で心拍数を計測する実装方法について、以前ここで出したが、Garminのフォーラムなどで調べてみたところ、以下のような実装にするのが一般的だというのが掲載されていた。
function retrieveHeartrateText() {
var currentHeartrate = Activity.getActivityInfo().currentHeartRate;
if (currentHeartrate == null) {
currentHeartrate = ActivityMonitor.getHeartRateHistory(1, true).next().heartRate;
}
if (currentHeartrate != null && currentHeartrate != ActivityMonitor.INVALID_HR_SAMPLE) {
return currentHeartrate.format("%d");
}
else {
return "---";
}
}
まずは、Activity::Info::currentHeartRateを取得し、これがnullだった場合に、履歴から持ってこいという内容。
この実装を実機で試したところ、現在の心拍数は取得できず、どうしても履歴側の心拍数しか取得することができなかった。
この確認のため、どちらの値かを画面で確認できるように一部実装を変更したものを実機で試した。
上記の画像で、65cとなっている部分が心拍数なのだが、履歴側から持ってきた場合末尾にcを入れるような実装にしており、実機では、c付きの心拍数でしか表示されなかったため。
一応、数日ほど、アクティビティも実行しながら確認したのだが、すべてc付きだった。
シミュレーター上で確認したところ、FIT Dataのシミュレーションを開始した場合にcが外れた。
FIT Dataが、実機ではどういった状態なのか調査はできなかったが、字面を見るかぎり、アクティビティ実行時なのかもしれない。
ForeAthlete 45は、アクティビティ実行時にウォッチフェイスを表示できないので、Activity::Info::currentHeartRateの情報取得はできないのかもしれない。
結論的なもの
Activity::Info::currentHeartRateは使わず、ActivityMonitor.getHeartRateHistoryで履歴情報のみ利用するのが今のところ正しいのかもしれない。
fr165を使っている限り、トップに書かれている実装通りで問題なさそう。
ついでにわかったこと
今回心拍数について調べていたところ、iPhoneのGarmin Connectのアプリ側で見る心拍数が、ForeAthlete 45側のリアルタイムの情報みたいなことが分かった。
ちょっと写真が汚いのだが、ForeAthlete 45側の心拍数表示用のウィジェット?の心拍数とiPhone側に表示される心拍数がほぼ連動していた。(Bluetoothで通信しているためか、1~2秒ぐらいのラグはあったのだが)
コメント