startHeartRateAcquisition method

  1. @override
Future<void> startHeartRateAcquisition()
override

心拍数の取得を開始

Implementation

@override
Future<void> startHeartRateAcquisition() async {
  try {
    final connectedDevice = state.connectedDevice;
    // 未接続の場合
    if (connectedDevice == null) {
      throw HeartRateAdapterException(
        AdapterErrorType.deviceNotConnected,
        AdapterErrorType.deviceNotConnected.message,
        HeartRateDeviceEventStreamErrorType.unknown,
      );
    }

    // 利用可能なデータタイプを取得
    final availabletypes = await _polar
        .getAvailableOnlineStreamDataTypes(connectedDevice.deviceId);
    // 心拍数が利用可能でない場合
    if (!availabletypes.contains(PolarDataType.hr)) {
      throw HeartRateAdapterException(
        AdapterErrorType.libraryError,
        AdapterErrorType.libraryError.message,
        HeartRateDeviceEventStreamErrorType.unknown,
      );
    }

    // 心拍数の取得を開始
    _heartRateStreamSubscription =
        _polar.startHrStreaming(connectedDevice.deviceId).listen((event) {
      // ステートを更新
      state = state.copyWith(isHeartRateAcquisitionStarted: true);
      _deviceEventStreamController.add(HeartRateDeviceEvent.heartRate(
          heartRateList: event.samples
              .map((e) => HeartRateData(heartRate: e.hr, rrsMs: e.rrsMs))
              .toList()));
    }, onError: (error) {
      _deviceEventStreamController.addError(HeartRateAdapterException(
          AdapterErrorType.libraryError,
          AdapterErrorType.libraryError.message,
          HeartRateDeviceEventStreamErrorType.heartRateError,
          detail: error));
    });
  } on HeartRateAdapterException catch (_) {
    rethrow;
  } catch (e) {
    throw HeartRateAdapterException(
      AdapterErrorType.libraryError,
      AdapterErrorType.libraryError.message,
      HeartRateDeviceEventStreamErrorType.unknown,
      detail: e,
    );
  }
}