+ -
+ AutomaticSampleTriggerType
+
+ -
+ CheckFirmwareUpdateStatus
+
-
FirmwareUpdateStatus
@@ -210,6 +216,9 @@
-
LedConfig
+ -
+ Polar247HrSamplesData
+
-
PolarActiveTime
@@ -338,7 +347,7 @@ Update dependency
diff --git a/polar-sdk-ios/docs/search.json b/polar-sdk-ios/docs/search.json
index 6d39bfc1..dfa0f873 100644
--- a/polar-sdk-ios/docs/search.json
+++ b/polar-sdk-ios/docs/search.json
@@ -1 +1 @@
-{"Typealiases.html#/s:11PolarBleSdk0A10DeviceInfoa":{"name":"PolarDeviceInfo","abstract":"Polar device info
"},"Typealiases.html#/s:11PolarBleSdk0A15HrBroadcastDataa":{"name":"PolarHrBroadcastData","abstract":"deviceInfo: see #PolarDeviceInfo ,
"},"Typealiases.html#/s:11PolarBleSdk0A6HrDataa":{"name":"PolarHrData","abstract":"Polar hr data
"},"Typealiases.html#/s:11PolarBleSdk0A7EcgDataa":{"name":"PolarEcgData","abstract":"Polar Ecg data
"},"Typealiases.html#/s:11PolarBleSdk0A7AccDataa":{"name":"PolarAccData","abstract":"Polar acc data
"},"Typealiases.html#/s:11PolarBleSdk0A8GyroDataa":{"name":"PolarGyroData","abstract":"Polar gyro data
"},"Typealiases.html#/s:11PolarBleSdk0A16MagnetometerDataa":{"name":"PolarMagnetometerData","abstract":"Polar magnetometer data
"},"Typealiases.html#/s:11PolarBleSdk0A15TemperatureDataa":{"name":"PolarTemperatureData","abstract":"Polar Temperature data
"},"Typealiases.html#/s:11PolarBleSdk0A12PressureDataa":{"name":"PolarPressureData","abstract":"Polar Pressure data
"},"Typealiases.html#/s:11PolarBleSdk0A7OhrDataa":{"name":"PolarOhrData","abstract":"Polar Ohr data
"},"Typealiases.html#/s:11PolarBleSdk0A7PpgDataa":{"name":"PolarPpgData","abstract":"Polar PPG data
"},"Typealiases.html#/s:11PolarBleSdk0A7PpiDataa":{"name":"PolarPpiData","abstract":"Polar ppi data
"},"Typealiases.html#/s:11PolarBleSdk0A13ExerciseEntrya":{"name":"PolarExerciseEntry","abstract":"Polar exercise entry
"},"Typealiases.html#/s:11PolarBleSdk0A12ExerciseDataa":{"name":"PolarExerciseData","abstract":"Polar Exercise Data
"},"Typealiases.html#/s:11PolarBleSdk0A15RecordingStatusa":{"name":"PolarRecordingStatus","abstract":"Polar Recording status
"},"Structs/PolarStepsData.html#/s:11PolarBleSdk0A9StepsDataV4date10Foundation4DateVvp":{"name":"date","parent_name":"PolarStepsData"},"Structs/PolarStepsData.html#/s:11PolarBleSdk0A9StepsDataV5stepsSivp":{"name":"steps","parent_name":"PolarStepsData"},"Structs/PolarDistanceData.html#/s:11PolarBleSdk0A12DistanceDataV4date10Foundation4DateVvp":{"name":"date","parent_name":"PolarDistanceData"},"Structs/PolarDistanceData.html#/s:11PolarBleSdk0A12DistanceDataV14distanceMetersSfvp":{"name":"distanceMeters","parent_name":"PolarDistanceData"},"Structs/PolarActiveTime.html#/s:11PolarBleSdk0A10ActiveTimeV5hoursSivp":{"name":"hours","parent_name":"PolarActiveTime"},"Structs/PolarActiveTime.html#/s:11PolarBleSdk0A10ActiveTimeV7minutesSivp":{"name":"minutes","parent_name":"PolarActiveTime"},"Structs/PolarActiveTime.html#/s:11PolarBleSdk0A10ActiveTimeV7secondsSivp":{"name":"seconds","parent_name":"PolarActiveTime"},"Structs/PolarActiveTime.html#/s:11PolarBleSdk0A10ActiveTimeV6millisSivp":{"name":"millis","parent_name":"PolarActiveTime"},"Structs/PolarActiveTime.html#/s:11PolarBleSdk0A10ActiveTimeV5hours7minutes7seconds6millisACSi_S3itcfc":{"name":"init(hours:minutes:seconds:millis:)","parent_name":"PolarActiveTime"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV4date10Foundation4DateVvp":{"name":"date","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV11timeNonWearAA0adE0Vvp":{"name":"timeNonWear","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV9timeSleepAA0adE0Vvp":{"name":"timeSleep","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV13timeSedentaryAA0adE0Vvp":{"name":"timeSedentary","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV17timeLightActivityAA0adE0Vvp":{"name":"timeLightActivity","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV30timeContinuousModerateActivityAA0adE0Vvp":{"name":"timeContinuousModerateActivity","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV32timeIntermittentModerateActivityAA0adE0Vvp":{"name":"timeIntermittentModerateActivity","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV30timeContinuousVigorousActivityAA0adE0Vvp":{"name":"timeContinuousVigorousActivity","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV32timeIntermittentVigorousActivityAA0adE0Vvp":{"name":"timeIntermittentVigorousActivity","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV4date11timeNonWear0H5Sleep0H9Sedentary0H13LightActivity0h18ContinuousModerateN00h12IntermittentpN00ho8VigorousN00hqrN0AC10Foundation4DateV_AA0adE0VA7Qtcfc":{"name":"init(date:timeNonWear:timeSleep:timeSedentary:timeLightActivity:timeContinuousModerateActivity:timeIntermittentModerateActivity:timeContinuousVigorousActivity:timeIntermittentVigorousActivity:)","parent_name":"PolarActiveTimeData"},"Structs/UserIdentifierType.html#/s:11PolarBleSdk18UserIdentifierTypeV18userIdLastModifiedSSvp":{"name":"userIdLastModified","parent_name":"UserIdentifierType"},"Structs/UserIdentifierType.html#/s:11PolarBleSdk18UserIdentifierTypeV24USER_IDENTIFIER_FILENAMESSvpZ":{"name":"USER_IDENTIFIER_FILENAME","parent_name":"UserIdentifierType"},"Structs/UserIdentifierType.html#/s:11PolarBleSdk18UserIdentifierTypeV6createACyFZ":{"name":"create()","parent_name":"UserIdentifierType"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13ohrLogEnabledSbSgvp":{"name":"ohrLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13ppiLogEnabledSbSgvp":{"name":"ppiLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV22accelerationLogEnabledSbSgvp":{"name":"accelerationLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV18caloriesLogEnabledSbSgvp":{"name":"caloriesLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13gpsLogEnabledSbSgvp":{"name":"gpsLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV17gpsNmeaLogEnabledSbSgvp":{"name":"gpsNmeaLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV22magnetometerLogEnabledSbSgvp":{"name":"magnetometerLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13tapLogEnabledSbSgvp":{"name":"tapLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV19barometerLogEnabledSbSgvp":{"name":"barometerLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV19gyroscopeLogEnabledSbSgvp":{"name":"gyroscopeLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV15sleepLogEnabledSbSgvp":{"name":"sleepLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV15slopeLogEnabledSbSgvp":{"name":"slopeLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV22ambientLightLogEnabledSbSgvp":{"name":"ambientLightLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13tlrLogEnabledSbSgvp":{"name":"tlrLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV18ondemandLogEnabledSbSgvp":{"name":"ondemandLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV18capsenseLogEnabledSbSgvp":{"name":"capsenseLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV16fusionLogEnabledSbSgvp":{"name":"fusionLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13metLogEnabledSbSgvp":{"name":"metLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV21verticalAccLogEnabledSbSgvp":{"name":"verticalAccLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13amdLogEnabledSbSgvp":{"name":"amdLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV25skinTemperatureLogEnabledSbSgvp":{"name":"skinTemperatureLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV17compassLogEnabledSbSgvp":{"name":"compassLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV17speed3DLogEnabledSbSgvp":{"name":"speed3DLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV22retainSettingsOverBootSbSgvp":{"name":"retainSettingsOverBoot","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV10logTriggerSiSgvp":{"name":"logTrigger","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV21magnetometerFrequencySiSgvp":{"name":"magnetometerFrequency","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13ppiLogEnabled012accelerationgH008caloriesgH003gpsgH00k4NmeagH0012magnetometergH003tapgH009barometergH009gyroscopegH005sleepgH005slopegH0012ambientLightgH003tlrgH008ondemandgH008capsensegH006fusiongH003metgH003ohrgH0011verticalAccgH003amdgH0015skinTemperaturegH007compassgH0010speed3DLogH010logTrigger0M9FrequencyACSbSg_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_SiSgA2_tcfc":{"name":"init(ppiLogEnabled:accelerationLogEnabled:caloriesLogEnabled:gpsLogEnabled:gpsNmeaLogEnabled:magnetometerLogEnabled:tapLogEnabled:barometerLogEnabled:gyroscopeLogEnabled:sleepLogEnabled:slopeLogEnabled:ambientLightLogEnabled:tlrLogEnabled:ondemandLogEnabled:capsenseLogEnabled:fusionLogEnabled:metLogEnabled:ohrLogEnabled:verticalAccLogEnabled:amdLogEnabled:skinTemperatureLogEnabled:compassLogEnabled:speed3DLogEnabled:logTrigger:magnetometerFrequency:)","parent_name":"SDLogConfig"},"Structs/PolarUserDeviceSettingsData.html#/s:s12IdentifiableP2id2IDQzvp":{"name":"id","parent_name":"PolarUserDeviceSettingsData"},"Structs/PolarUserDeviceSettingsData.html#/s:11PolarBleSdk0A22UserDeviceSettingsDataV06_polardeF0AA0adeF0Cvp":{"name":"_polarUserDeviceSettings","parent_name":"PolarUserDeviceSettingsData"},"Structs/PolarUserDeviceSettingsData.html#/s:11PolarBleSdk0A22UserDeviceSettingsDataVACycfc":{"name":"init()","parent_name":"PolarUserDeviceSettingsData"},"Structs/PolarUserDeviceSettingsData.html#/s:11PolarBleSdk0A22UserDeviceSettingsDataV05polardeF0AA0adeF0Cvp":{"name":"polarUserDeviceSettings","parent_name":"PolarUserDeviceSettingsData"},"Structs/PolarSensorSetting/SettingType.html#/s:11PolarBleSdk0A13SensorSettingV0E4TypeO10sampleRateyA2EmF":{"name":"sampleRate","abstract":"sample rate in hz
","parent_name":"SettingType"},"Structs/PolarSensorSetting/SettingType.html#/s:11PolarBleSdk0A13SensorSettingV0E4TypeO10resolutionyA2EmF":{"name":"resolution","abstract":"resolution in bits
","parent_name":"SettingType"},"Structs/PolarSensorSetting/SettingType.html#/s:11PolarBleSdk0A13SensorSettingV0E4TypeO5rangeyA2EmF":{"name":"range","abstract":"range
","parent_name":"SettingType"},"Structs/PolarSensorSetting/SettingType.html#/s:11PolarBleSdk0A13SensorSettingV0E4TypeO14rangeMilliunityA2EmF":{"name":"rangeMilliunit","abstract":"range with min and max allowed values
","parent_name":"SettingType"},"Structs/PolarSensorSetting/SettingType.html#/s:11PolarBleSdk0A13SensorSettingV0E4TypeO8channelsyA2EmF":{"name":"channels","abstract":"amount of channels available
","parent_name":"SettingType"},"Structs/PolarSensorSetting/SettingType.html#/s:11PolarBleSdk0A13SensorSettingV0E4TypeO7unknownyA2EmF":{"name":"unknown","abstract":"type is unknown
","parent_name":"SettingType"},"Structs/PolarSensorSetting/SettingType.html":{"name":"SettingType","abstract":"settings type
","parent_name":"PolarSensorSetting"},"Structs/PolarSensorSetting.html#/s:11PolarBleSdk0A13SensorSettingV8settingsSDyAC0E4TypeOShys6UInt32VGGvp":{"name":"settings","abstract":"current settings available / set
","parent_name":"PolarSensorSetting"},"Structs/PolarSensorSetting.html#/s:11PolarBleSdk0A13SensorSettingVyACSDyAC0E4TypeOs6UInt32VGcfc":{"name":"init(_:)","abstract":"constructor with desired settings
","parent_name":"PolarSensorSetting"},"Structs/PolarSensorSetting.html#/s:11PolarBleSdk0A13SensorSettingV11maxSettingsACyF":{"name":"maxSettings()","abstract":"helper to retrieve max settings available
","parent_name":"PolarSensorSetting"},"Structs/PolarSensorSetting.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"PolarSensorSetting"},"Structs/PolarRecordingSecret.html#/s:11PolarBleSdk0A15RecordingSecretV3keyAC10Foundation4DataV_tKcfc":{"name":"init(key:)","parent_name":"PolarRecordingSecret"},"Structs/PolarOfflineRecordingTrigger.html#/s:11PolarBleSdk0A23OfflineRecordingTriggerV11triggerModeAA0adefH0Ovp":{"name":"triggerMode","abstract":"The mode of the trigger
","parent_name":"PolarOfflineRecordingTrigger"},"Structs/PolarOfflineRecordingTrigger.html#/s:11PolarBleSdk0A23OfflineRecordingTriggerV15triggerFeaturesSDyAA0A14DeviceDataTypeOAA0A13SensorSettingVSgGvp":{"name":"triggerFeatures","abstract":"Dictionary containing the PolarDeviceDataType
keys for enabled triggers. Dictionary","parent_name":"PolarOfflineRecordingTrigger"},"Structs/PolarOfflineRecordingTrigger.html#/s:11PolarBleSdk0A23OfflineRecordingTriggerV11triggerMode0G8FeaturesAcA0adefH0O_SDyAA0A14DeviceDataTypeOAA0A13SensorSettingVSgGtcfc":{"name":"init(triggerMode:triggerFeatures:)","parent_name":"PolarOfflineRecordingTrigger"},"Structs/PolarOfflineRecordingEntry.html#/s:11PolarBleSdk0A21OfflineRecordingEntryV4pathSSvp":{"name":"path","abstract":"
Recording entry path in device.
","parent_name":"PolarOfflineRecordingEntry"},"Structs/PolarOfflineRecordingEntry.html#/s:11PolarBleSdk0A21OfflineRecordingEntryV4sizeSuvp":{"name":"size","abstract":"Recording size in bytes.
","parent_name":"PolarOfflineRecordingEntry"},"Structs/PolarOfflineRecordingEntry.html#/s:11PolarBleSdk0A21OfflineRecordingEntryV4date10Foundation4DateVvp":{"name":"date","abstract":"The date and time of the recording entry i.e. the moment recording is started
","parent_name":"PolarOfflineRecordingEntry"},"Structs/PolarOfflineRecordingEntry.html#/s:11PolarBleSdk0A21OfflineRecordingEntryV4typeAA0A14DeviceDataTypeOvp":{"name":"type","abstract":"data type of the recording
","parent_name":"PolarOfflineRecordingEntry"},"Structs/PolarOfflineRecordingEntry.html#/s:11PolarBleSdk0A21OfflineRecordingEntryV4path4size4date4typeACSS_Su10Foundation4DateVAA0A14DeviceDataTypeOtcfc":{"name":"init(path:size:date:type:)","parent_name":"PolarOfflineRecordingEntry"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18TrainingBackgroundO10occasionalyA2EmF":{"name":"occasional","parent_name":"TrainingBackground"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18TrainingBackgroundO7regularyA2EmF":{"name":"regular","parent_name":"TrainingBackground"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18TrainingBackgroundO8frequentyA2EmF":{"name":"frequent","parent_name":"TrainingBackground"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18TrainingBackgroundO5heavyyA2EmF":{"name":"heavy","parent_name":"TrainingBackground"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18TrainingBackgroundO7semiProyA2EmF":{"name":"semiPro","parent_name":"TrainingBackground"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18TrainingBackgroundO3proyA2EmF":{"name":"pro","parent_name":"TrainingBackground"},"Structs/PolarFirstTimeUseConfig/TypicalDay.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV10TypicalDayO13mostlySittingyA2EmF":{"name":"mostlySitting","parent_name":"TypicalDay"},"Structs/PolarFirstTimeUseConfig/TypicalDay.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV10TypicalDayO14mostlyStandingyA2EmF":{"name":"mostlyStanding","parent_name":"TypicalDay"},"Structs/PolarFirstTimeUseConfig/TypicalDay.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV10TypicalDayO12mostlyMovingyA2EmF":{"name":"mostlyMoving","parent_name":"TypicalDay"},"Structs/PolarFirstTimeUseConfig/TypicalDay.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV10TypicalDayO11descriptionSSvp":{"name":"description","parent_name":"TypicalDay"},"Structs/PolarFirstTimeUseConfig/Gender.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6GenderO4maleyA2EmF":{"name":"male","parent_name":"Gender"},"Structs/PolarFirstTimeUseConfig/Gender.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6GenderO6femaleyA2EmF":{"name":"female","parent_name":"Gender"},"Structs/PolarFirstTimeUseConfig/Gender.html":{"name":"Gender","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig/TypicalDay.html":{"name":"TypicalDay","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html":{"name":"TrainingBackground","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6genderAC6GenderOvp":{"name":"gender","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV9birthDate10Foundation0I0Vvp":{"name":"birthDate","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6heightSfvp":{"name":"height","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6weightSfvp":{"name":"weight","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV12maxHeartRateSivp":{"name":"maxHeartRate","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6vo2MaxSivp":{"name":"vo2Max","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV16restingHeartRateSivp":{"name":"restingHeartRate","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18trainingBackgroundAC08TrainingI0Ovp":{"name":"trainingBackground","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV06deviceE0SSvp":{"name":"deviceTime","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV10typicalDayAC07TypicalI0Ovp":{"name":"typicalDay","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV16sleepGoalMinutesSivp":{"name":"sleepGoalMinutes","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6gender9birthDate6height6weight12maxHeartRate6vo2Max07restingnO018trainingBackground06deviceE010typicalDay16sleepGoalMinutesA2C6GenderO_10Foundation0J0VS2fS3iAC08TrainingT0OSSAC07TypicalW0OSitcfc":{"name":"init(gender:birthDate:height:weight:maxHeartRate:vo2Max:restingHeartRate:trainingBackground:deviceTime:typicalDay:sleepGoalMinutes:)","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarDiskSpaceData.html#/s:11PolarBleSdk0A13DiskSpaceDataV05totalE0s6UInt64Vvp":{"name":"totalSpace","parent_name":"PolarDiskSpaceData"},"Structs/PolarDiskSpaceData.html#/s:11PolarBleSdk0A13DiskSpaceDataV04freeE0s6UInt64Vvp":{"name":"freeSpace","parent_name":"PolarDiskSpaceData"},"Structs/AutomaticSamples.html#/s:11PolarBleSdk16AutomaticSamplesV3day10Foundation4DateVSgvp":{"name":"day","parent_name":"AutomaticSamples"},"Structs/AutomaticSamples.html#/s:11PolarBleSdk16AutomaticSamplesV3dayAC10Foundation4DateVSg_tcfc":{"name":"init(day:)","parent_name":"AutomaticSamples"},"Structs/LedConfig.html#/s:11PolarBleSdk9LedConfigV07sdkModeD7Enabled03ppigdH0ACSb_Sbtcfc":{"name":"init(sdkModeLedEnabled:ppiModeLedEnabled:)","parent_name":"LedConfig"},"Structs/LedConfig.html":{"name":"LedConfig"},"Structs/AutomaticSamples.html":{"name":"AutomaticSamples","abstract":"Copyright © 2024 Polar Electro Oy. All rights reserved.
"},"Structs/PolarDiskSpaceData.html":{"name":"PolarDiskSpaceData"},"Structs/PolarFirstTimeUseConfig.html":{"name":"PolarFirstTimeUseConfig"},"Structs/PolarOfflineRecordingEntry.html":{"name":"PolarOfflineRecordingEntry","abstract":"Polar offline recording entry container.
"},"Structs/PolarOfflineRecordingTrigger.html":{"name":"PolarOfflineRecordingTrigger","abstract":"Polar offline recording trigger
"},"Structs/PolarRecordingSecret.html":{"name":"PolarRecordingSecret","abstract":"Polar recording secret is used to encrypt the recording.
"},"Structs/PolarSensorSetting.html":{"name":"PolarSensorSetting","abstract":"polar sensor settings class
"},"Structs/PolarUserDeviceSettingsData.html":{"name":"PolarUserDeviceSettingsData"},"Structs/SDLogConfig.html":{"name":"SDLogConfig"},"Structs/UserIdentifierType.html":{"name":"UserIdentifierType","abstract":"Copyright © 2024 Polar Electro Oy. All rights reserved.
"},"Structs/PolarActiveTimeData.html":{"name":"PolarActiveTimeData","abstract":"Copyright © 2024 Polar. All rights reserved.
"},"Structs/PolarActiveTime.html":{"name":"PolarActiveTime"},"Structs/PolarDistanceData.html":{"name":"PolarDistanceData","abstract":"Distance for given date.
"},"Structs/PolarStepsData.html":{"name":"PolarStepsData","abstract":"Steps count for given date.
"},"Protocols/PolarSleepApi.html#/s:11PolarBleSdk0A8SleepApiP03getD4Data10identifier8fromDate02toJ07RxSwift17PrimitiveSequenceVyAH11SingleTraitOSayAA0adG0C0aD14AnalysisResultVGGSS_10Foundation0J0VAUtF":{"name":"getSleepData(identifier:fromDate:toDate:)","abstract":"Get sleep analysis data for a given period.
","parent_name":"PolarSleepApi"},"Protocols/PolarSdkModeApi.html#/s:11PolarBleSdk0aC7ModeApiP13enableSDKModey7RxSwift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGSSF":{"name":"enableSDKMode(_:)","abstract":"Enables SDK mode.
","parent_name":"PolarSdkModeApi"},"Protocols/PolarSdkModeApi.html#/s:11PolarBleSdk0aC7ModeApiP14disableSDKModey7RxSwift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGSSF":{"name":"disableSDKMode(_:)","abstract":"Disables SDK mode.
","parent_name":"PolarSdkModeApi"},"Protocols/PolarSdkModeApi.html#/s:11PolarBleSdk0aC7ModeApiP16isSDKModeEnabledy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOSbGSSF":{"name":"isSDKModeEnabled(_:)","abstract":"Check if SDK mode currently enabled.
","parent_name":"PolarSdkModeApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP012getAvailableD15StreamDataTypesy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOShyAA0a6DeviceJ4TypeOGGSSF":{"name":"getAvailableOnlineStreamDataTypes(_:)","abstract":"Get the data types available in this device for online streaming
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP21requestStreamSettings_7feature7RxSwift17PrimitiveSequenceVyAF11SingleTraitOAA0A13SensorSettingVGSS_AA0A14DeviceDataTypeOtF":{"name":"requestStreamSettings(_:feature:)","abstract":"Request the stream settings available in current operation mode. This request shall be used before the stream is started","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP25requestFullStreamSettings_7feature7RxSwift17PrimitiveSequenceVyAF11SingleTraitOAA0A13SensorSettingVGSS_AA0A14DeviceDataTypeOtF":{"name":"requestFullStreamSettings(_:feature:)","abstract":"
Request full steam settings capabilities. The request returns the all capabilities of the requested streaming feature not limited by the current operation mode.","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP07startHrE0y7RxSwift10ObservableCySays5UInt8V2hr_SaySiG5rrsMsSb11rrAvailableSb13contactStatusSb0rS9SupportedtGGSSF":{"name":"startHrStreaming(_:)","abstract":"
Start heart rate stream. Heart rate stream is stopped if the connection is closed,","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP08startEcgE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_SayAjK_s5Int32V7voltagetG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startEcgStreaming(_:settings:)","abstract":"
Start the ECG (Electrocardiography) stream. ECG stream is stopped if the connection is closed, error occurs or stream is disposed.
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP08startAccE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_SayAjK_s5Int32V1xAM1yAM1ztG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startAccStreaming(_:settings:)","abstract":"Start ACC (Accelerometer) stream. ACC stream is stopped if the connection is closed, error occurs or stream is disposed.
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP09startGyroE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_SayAjK_Sf1xSf1ySf1ztG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startGyroStreaming(_:settings:)","abstract":"Start Gyro stream. Gyro stream is stopped if the connection is closed, error occurs during start or stream is disposed.
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP017startMagnetometerE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_SayAjK_Sf1xSf1ySf1ztG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startMagnetometerStreaming(_:settings:)","abstract":"Start magnetometer stream. Magnetometer stream is stopped if the connection is closed, error occurs or stream is disposed.
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP08startOhrE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_AA0H8DataTypeO4typeSayAjK_Says5Int32VG14channelSamplestG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startOhrStreaming(_:settings:)","abstract":"Start OHR (Optical heart rate) PPG (Photoplethysmography) stream. PPG stream is stopped if the connection is closed, error occurs or stream is disposed.
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP08startPpgE0_8settings7RxSwift10ObservableCyAA0H8DataTypeO4type_Says6UInt64V9timeStamp_Says5Int32VG14channelSamplestG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startPpgStreaming(_:settings:)","abstract":"Start optical sensor PPG (Photoplethysmography) stream. PPG stream is stopped if the connection is closed, error occurs or stream is disposed.
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP08startPpiE0y7RxSwift10ObservableCys6UInt64V9timeStamp_SaySi2hr_s6UInt16V6ppInMsAM0Q13ErrorEstimateSi10blockerBitSi17skinContactStatusSi0xY9SupportedtG7samplestGSSF":{"name":"startPpiStreaming(_:)","abstract":"Start PPI (Pulse to Pulse interval) stream.","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP20startOhrPPIStreamingy7RxSwift10ObservableCys6UInt64V9timeStamp_SaySi2hr_s6UInt16V6ppInMsAM0R13ErrorEstimateSi10blockerBitSi17skinContactStatusSi0yZ9SupportedtG7samplestGSSF":{"name":"startOhrPPIStreaming(_:)","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP016startTemperatureE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_SayAjK_Sf11temperaturetG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startTemperatureStreaming(_:settings:)","abstract":"
Start temperature stream. Temperature stream is stopped if the connection is closed,","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP013startPressureE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_SayAjK_Sf8pressuretG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startPressureStreaming(_:settings:)","abstract":"
Start pressure stream. Pressure stream is stopped if the connection is closed,","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP012getAvailabledE9DataTypesy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOShyAA0a6DeviceI4TypeOGGSSF":{"name":"getAvailableOfflineRecordingDataTypes(_:)","abstract":"
Get the data types available in this device for offline recording
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP07requestdE8Settings_7feature7RxSwift17PrimitiveSequenceVyAF11SingleTraitOAA0A13SensorSettingVGSS_AA0A14DeviceDataTypeOtF":{"name":"requestOfflineRecordingSettings(_:feature:)","abstract":"Request the offline recording settings available in current operation mode. This request shall be used before the offline recording is started","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP011requestFulldE8Settings_7feature7RxSwift17PrimitiveSequenceVyAF11SingleTraitOAA0A13SensorSettingVGSS_AA0A14DeviceDataTypeOtF":{"name":"requestFullOfflineRecordingSettings(_:feature:)","abstract":"
Request all the settings available in the device. The request returns the all capabilities of the requested streaming feature not limited by the current operation mode.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP03getdE6Statusy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOSDyAA0A14DeviceDataTypeOSbGGSSF":{"name":"getOfflineRecordingStatus(_:)","abstract":"Get status of offline recordings.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP04listD10Recordingsy7RxSwift10ObservableCyAA0adE5EntryVGSSF":{"name":"listOfflineRecordings(_:)","abstract":"List offline recordings stored in the device.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP03getD6Record_5entry6secret7RxSwift17PrimitiveSequenceVyAG11SingleTraitOAA0adE4DataOGSS_AA0adE5EntryVAA0aE6SecretVSgtF":{"name":"getOfflineRecord(_:entry:secret:)","abstract":"Fetch recording from the device.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP09listSplitD10Recordingsy7RxSwift10ObservableCyAA0adE5EntryVGSSF":{"name":"listSplitOfflineRecordings(_:)","abstract":"List split offline recordings stored in the device.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP08getSplitD6Record_5entry6secret7RxSwift17PrimitiveSequenceVyAG11SingleTraitOAA0adE4DataOGSS_AA0adE5EntryVAA0aE6SecretVSgtF":{"name":"getSplitOfflineRecord(_:entry:secret:)","abstract":"Fetch split recording from the device.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP06removeD6Record_5entry7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_AA0adE5EntryVtF":{"name":"removeOfflineRecord(_:entry:)","abstract":"Removes offline recording from the device
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP05startdE0_7feature8settings6secret7RxSwift17PrimitiveSequenceVyAH16CompletableTraitOs5NeverOGSS_AA0A14DeviceDataTypeOAA0A13SensorSettingVSgAA0aE6SecretVSgtF":{"name":"startOfflineRecording(_:feature:settings:secret:)","abstract":"Start offline recording.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP04stopdE0_7feature7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_AA0A14DeviceDataTypeOtF":{"name":"stopOfflineRecording(_:feature:)","abstract":"Request to stop offline recording.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP03setdE7Trigger_7trigger6secret7RxSwift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_AA0adeH0VAA0aE6SecretVSgtF":{"name":"setOfflineRecordingTrigger(_:trigger:secret:)","abstract":"Sets the offline recording triggers for a given Polar device. The offline recording can be started automatically in the device by setting the triggers.","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP03getdE12TriggerSetupy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOAA0adeH0VGSSF":{"name":"getOfflineRecordingTriggerSetup(_:)","abstract":"
Retrieves the current offline recording trigger setup in the device.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarH10OfflineExerciseApi.html#/s:11PolarBleSdk0A21H10OfflineExerciseApiP14startRecording_10exerciseId8interval10sampleType7RxSwift17PrimitiveSequenceVyAH16CompletableTraitOs5NeverOGSS_SSAA0I8IntervalOAA06SampleN0OtF":{"name":"startRecording(_:exerciseId:interval:sampleType:)","abstract":"Request start recording. Supported only by Polar H10. Requires polarFileTransfer
feature.
","parent_name":"PolarH10OfflineExerciseApi"},"Protocols/PolarH10OfflineExerciseApi.html#/s:11PolarBleSdk0A21H10OfflineExerciseApiP13stopRecordingy7RxSwift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGSSF":{"name":"stopRecording(_:)","abstract":"Request stop for current recording. Supported only by Polar H10. Requires polarFileTransfer
feature.
","parent_name":"PolarH10OfflineExerciseApi"},"Protocols/PolarH10OfflineExerciseApi.html#/s:11PolarBleSdk0A21H10OfflineExerciseApiP22requestRecordingStatusy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOSb7ongoing_SS7entryIdtGSSF":{"name":"requestRecordingStatus(_:)","abstract":"Request current recording status. Supported only by Polar H10. Requires polarFileTransfer
feature.
","parent_name":"PolarH10OfflineExerciseApi"},"Protocols/PolarH10OfflineExerciseApi.html#/s:11PolarBleSdk0A21H10OfflineExerciseApiP011fetchStoredF4Listy7RxSwift10ObservableCySS4path_10Foundation4DateV4dateSS7entryIdtGSSF":{"name":"fetchStoredExerciseList(_:)","abstract":"Api for fetching stored exercises list from Polar H10 device. Requires polarFileTransfer
feature. This API is working for Polar OH1 and Polar Verity Sense devices too, however in those devices recording of exercise requires that sensor is registered to Polar Flow account.
","parent_name":"PolarH10OfflineExerciseApi"},"Protocols/PolarH10OfflineExerciseApi.html#/s:11PolarBleSdk0A21H10OfflineExerciseApiP05fetchF0_5entry7RxSwift17PrimitiveSequenceVyAF11SingleTraitOs6UInt32V8interval_SayALG7samplestGSS_SS4path_10Foundation4DateV4dateSS0I2IdttF":{"name":"fetchExercise(_:entry:)","abstract":"Api for fetching a single exercise from Polar H10 device. Requires polarFileTransfer
feature. This API is working for Polar OH1 and Polar Verity Sense devices too, however in those devices recording of exercise requires that sensor is registered to Polar Flow account.
","parent_name":"PolarH10OfflineExerciseApi"},"Protocols/PolarH10OfflineExerciseApi.html#/s:11PolarBleSdk0A21H10OfflineExerciseApiP06removeF0_5entry7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_SS4path_10Foundation4DateV4dateSS0I2IdttF":{"name":"removeExercise(_:entry:)","abstract":"Api for removing single exercise from Polar H10 device. Requires polarFileTransfer
feature. This API is working for Polar OH1 and Polar Verity Sense devices too, however in those devices recording of exercise requires that sensor is registered to Polar Flow account.
","parent_name":"PolarH10OfflineExerciseApi"},"Protocols/PolarFirmwareUpdateApi.html#/s:11PolarBleSdk0A17FirmwareUpdateApiP06updateD0y7RxSwift10ObservableCyAA0dE6StatusOGSSF":{"name":"updateFirmware(_:)","abstract":"Updates firmware to given device.
","parent_name":"PolarFirmwareUpdateApi"},"Protocols/PolarBleApiLogger.html#/s:11PolarBleSdk0aB9ApiLoggerP7messageyySSF":{"name":"message(_:)","abstract":"log message from sdk
","parent_name":"PolarBleApiLogger"},"Protocols/PolarBleApiSdkModeFeatureObserver.html#/s:11PolarBleSdk0ab3ApiC19ModeFeatureObserverP03sdkeF9AvailableyySSF":{"name":"sdkModeFeatureAvailable(_:)","abstract":"sdk mode feature available in this device and ready for usage callback
","parent_name":"PolarBleApiSdkModeFeatureObserver"},"Protocols/PolarBleApiDeviceFeaturesObserver.html#/s:11PolarBleSdk0aB25ApiDeviceFeaturesObserverP14hrFeatureReadyyySSF":{"name":"hrFeatureReady(_:)","abstract":"Device HR feature is ready. HR transmission is starting in a short while.
","parent_name":"PolarBleApiDeviceFeaturesObserver"},"Protocols/PolarBleApiDeviceFeaturesObserver.html#/s:11PolarBleSdk0aB25ApiDeviceFeaturesObserverP15ftpFeatureReadyyySSF":{"name":"ftpFeatureReady(_:)","abstract":"Device file transfer protocol is ready.","parent_name":"PolarBleApiDeviceFeaturesObserver"},"Protocols/PolarBleApiDeviceFeaturesObserver.html#/s:11PolarBleSdk0aB25ApiDeviceFeaturesObserverP09streamingF5Ready_0hF0ySS_ShyAA0aE8DataTypeOGtF":{"name":"streamingFeaturesReady(_:streamingFeatures:)","abstract":"
feature ready callback
","parent_name":"PolarBleApiDeviceFeaturesObserver"},"Protocols/PolarBleApiDeviceFeaturesObserver.html#/s:11PolarBleSdk0aB25ApiDeviceFeaturesObserverP03bleC12FeatureReady_7featureySS_AA0abcI0OtF":{"name":"bleSdkFeatureReady(_:feature:)","abstract":"The feature is available in this device and it is ready. Called only for the features which are specified in [PolarBleApi] construction.","parent_name":"PolarBleApiDeviceFeaturesObserver"},"Protocols/PolarBleApiDeviceHrObserver.html#/s:11PolarBleSdk0aB19ApiDeviceHrObserverP15hrValueReceived_4dataySS_s5UInt8V0H0_SaySiG3rrsAI0M2MsSb7contactSb0O9SupportedttF":{"name":"hrValueReceived(_:data:)","abstract":"
HR notification received. Notice when using OH1 and PPI stream is started this callback will produce 0 hr.
","parent_name":"PolarBleApiDeviceHrObserver"},"Protocols/PolarBleApiDeviceInfoObserver.html#/s:11PolarBleSdk0aB21ApiDeviceInfoObserverP20batteryLevelReceived_0hI0ySS_SutF":{"name":"batteryLevelReceived(_:batteryLevel:)","abstract":"Battery level received from device.
","parent_name":"PolarBleApiDeviceInfoObserver"},"Protocols/PolarBleApiDeviceInfoObserver.html#/s:11PolarBleSdk0aB21ApiDeviceInfoObserverP22disInformationReceived_4uuid5valueySS_So6CBUUIDCSStF":{"name":"disInformationReceived(_:uuid:value:)","abstract":"Received DIS info.
","parent_name":"PolarBleApiDeviceInfoObserver"},"Protocols/PolarBleApiDeviceInfoObserver.html#/s:11PolarBleSdk0aB21ApiDeviceInfoObserverP39disInformationReceivedWithKeysAsStrings_3key5valueySS_S2StF":{"name":"disInformationReceivedWithKeysAsStrings(_:key:value:)","abstract":"Received DIS info with String keys.
","parent_name":"PolarBleApiDeviceInfoObserver"},"Protocols/PolarBleApiPowerStateObserver.html#/s:11PolarBleSdk0aB21ApiPowerStateObserverP03bleE2OnyyF":{"name":"blePowerOn()","abstract":"Ble powered on event.
","parent_name":"PolarBleApiPowerStateObserver"},"Protocols/PolarBleApiPowerStateObserver.html#/s:11PolarBleSdk0aB21ApiPowerStateObserverP03bleE3OffyyF":{"name":"blePowerOff()","abstract":"Ble powered off event, no further actions are needed from the application.
","parent_name":"PolarBleApiPowerStateObserver"},"Protocols/PolarBleApiObserver.html#/s:11PolarBleSdk0aB11ApiObserverP16deviceConnectingyySS0F2Id_10Foundation4UUIDV7addressSi4rssiSS4nameSb11connectablet_tF":{"name":"deviceConnecting(_:)","abstract":"Callback when connection attempt is started to device
","parent_name":"PolarBleApiObserver"},"Protocols/PolarBleApiObserver.html#/s:11PolarBleSdk0aB11ApiObserverP15deviceConnectedyySS0F2Id_10Foundation4UUIDV7addressSi4rssiSS4nameSb11connectablet_tF":{"name":"deviceConnected(_:)","abstract":"Device connnection has been established.
","parent_name":"PolarBleApiObserver"},"Protocols/PolarBleApiObserver.html#/s:11PolarBleSdk0aB11ApiObserverP18deviceDisconnected_12pairingErrorySS0F2Id_10Foundation4UUIDV7addressSi4rssiSS4nameSb11connectablet_SbtF":{"name":"deviceDisconnected(_:pairingError:)","abstract":"Connection lost to device.","parent_name":"PolarBleApiObserver"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP7cleanupyyF":{"name":"cleanup()","abstract":"
remove all known devices, which are not in use
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP11polarFilteryySbF":{"name":"polarFilter(_:)","abstract":"Enable or disable polar filter.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP24startAutoConnectToDevice_7service05polarI4Type7RxSwift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSi_So6CBUUIDCSgSSSgtF":{"name":"startAutoConnectToDevice(_:service:polarDeviceType:)","abstract":"Start connecting to a nearby device. PolarBleApiObservers
polarDeviceConnected is","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP15connectToDeviceyySSKF":{"name":"connectToDevice(_:)","abstract":"
Request a connection to a Polar device. Invokes PolarBleApiObservers
polarDeviceConnected.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP20disconnectFromDeviceyySSKF":{"name":"disconnectFromDevice(_:)","abstract":"Disconnect from the current Polar device.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP15searchForDevice7RxSwift10ObservableCySS8deviceId_10Foundation4UUIDV7addressSi4rssiSS4nameSb11connectabletGyF":{"name":"searchForDevice()","abstract":"Start searching for Polar device(s)
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP014startListenForA12HrBroadcastsy7RxSwift10ObservableCySS8deviceId_10Foundation4UUIDV7addressSi4rssiSS4nameSb11connectablet0M4Info_s5UInt8V2hrSb13batteryStatustGShySSGSgF":{"name":"startListenForPolarHrBroadcasts(_:)","abstract":"Start listening the heart rate from Polar devices when subscribed.","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP14isFeatureReady_7featureSbSS_AA0abcF0OtF":{"name":"isFeatureReady(_:feature:)","abstract":"
Check if the feature is ready.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP12setLocalTime_4time4zone7RxSwift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_10Foundation4DateVAO0G4ZoneVtF":{"name":"setLocalTime(_:time:zone:)","abstract":"Set local time to device.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP12getLocalTimey7RxSwift17PrimitiveSequenceVyAE11SingleTraitO10Foundation4DateVGSSF":{"name":"getLocalTime(_:)","abstract":"Get current time in device. Note, the H10 is not supporting time read.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP12getDiskSpacey7RxSwift17PrimitiveSequenceVyAE11SingleTraitOAA0afG4DataVGSSF":{"name":"getDiskSpace(_:)","abstract":"Get PolarDiskSpaceData
from device.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP12setLedConfig_03ledG07RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_AA0fG0VtF":{"name":"setLedConfig(_:ledConfig:)","abstract":"Set [LedConfig] to enable or disable blinking LEDs (Verity Sense 2.2.1+).
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP14doFactoryReset_26preservePairingInformation7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_SbtF":{"name":"doFactoryReset(_:preservePairingInformation:)","abstract":"Perform factory reset to given device.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP9doRestart_26preservePairingInformation7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_SbtF":{"name":"doRestart(_:preservePairingInformation:)","abstract":"Perform restart to given device.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP21getSDLogConfigurationy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOAA0F6ConfigVGSSF":{"name":"getSDLogConfiguration(_:)","abstract":"Get SD log configuration from a device (SDLOGS.BPB)
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP21setSDLogConfiguration_03logG07RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_AA0F6ConfigVtF":{"name":"setSDLogConfiguration(_:logConfiguration:)","abstract":"Set SD log configuration to a device (SDLOGS.BPB)
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP14doFirstTimeUse_9ftuConfig7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_AA0afghJ0VtF":{"name":"doFirstTimeUse(_:ftuConfig:)","abstract":"Set [FtuConfig] for device
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP17setWarehouseSleep_06enablefG07RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_SbSgtF":{"name":"setWarehouseSleep(_:enableWarehouseSleep:)","abstract":"Deprecated. Use “func setWarehouseSleep(_ identifier: String)” instead.","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP17setWarehouseSleepy7RxSwift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGSSF":{"name":"setWarehouseSleep(_:)","abstract":"
Set the device to warehouse sleep state. Factory reset will be performed in order to enable the setting.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP03getA18UserDeviceSettings10identifier7RxSwift17PrimitiveSequenceVyAF11SingleTraitOAA0afgH0C0afgH6ResultVGSS_tF":{"name":"getPolarUserDeviceSettings(identifier:)","abstract":"Get Device User Settings to a device from proto in device (UDEVSET.BPB)
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP03setA18UserDeviceSettings_05polarfgH07RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_AA0afgH0CSgtF":{"name":"setPolarUserDeviceSettings(_:polarUserDeviceSettings:)","abstract":"Set Device User Settings to a device (UDEVSET.BPB)
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP22deleteStoredDeviceData_8dataType5until7RxSwift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_AA0afhJ0C0fhJ0O10Foundation4DateVSgtF":{"name":"deleteStoredDeviceData(_:dataType:until:)","abstract":"Delete data [PolarStoredDataType] from a device.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP8observerAA0abD8Observer_pSgvp":{"name":"observer","abstract":"Common GAP (Generic access profile) observer
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP18deviceInfoObserverAA0abd6DevicefG0_pSgvp":{"name":"deviceInfoObserver","abstract":"Device info observer for DIS (Device information service) and BAS (Battery service) GATT (Generic attributes) client
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP16deviceHrObserverAA0abd6DevicefG0_pSgvp":{"name":"deviceHrObserver","abstract":"Device observer for HR GATT client
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP18powerStateObserverAA0abd5PowerfG0_pSgvp":{"name":"powerStateObserver","abstract":"Bluetooth power state observer
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP22deviceFeaturesObserverAA0abd6DevicefG0_pSgvp":{"name":"deviceFeaturesObserver","abstract":"Device features ready observer
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP22sdkModeFeatureObserverAA0abdcfgH0_pSgvp":{"name":"sdkModeFeatureObserver","abstract":"SDK mode feature available in the device and ready observer
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP02isB7PoweredSbvp":{"name":"isBlePowered","abstract":"Helper to check if Ble is currently powered
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP6loggerAA0abD6Logger_pSgvp":{"name":"logger","abstract":"optional logger set to get traces from sdk
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP21automaticReconnectionSbvp":{"name":"automaticReconnection","abstract":"optional disable or enable automatic reconnection, by default it is enabled
","parent_name":"PolarBleApi"},"Protocols/PolarActivityApi.html#/s:11PolarBleSdk0A11ActivityApiP8getSteps10identifier8fromDate02toJ07RxSwift17PrimitiveSequenceVyAH11SingleTraitOSayAA0aG4DataVGGSS_10Foundation0J0VAStF":{"name":"getSteps(identifier:fromDate:toDate:)","abstract":"Get steps for a given period.
","parent_name":"PolarActivityApi"},"Protocols/PolarActivityApi.html#/s:11PolarBleSdk0A11ActivityApiP11getDistance10identifier8fromDate02toJ07RxSwift17PrimitiveSequenceVyAH11SingleTraitOSayAA0aG4DataVGGSS_10Foundation0J0VAStF":{"name":"getDistance(identifier:fromDate:toDate:)","abstract":"Get distance for a given period.
","parent_name":"PolarActivityApi"},"Protocols/PolarActivityApi.html#/s:11PolarBleSdk0A11ActivityApiP13getActiveTime10identifier8fromDate02toK07RxSwift17PrimitiveSequenceVyAH11SingleTraitOSayAA0agH4DataVGGSS_10Foundation0K0VAStF":{"name":"getActiveTime(identifier:fromDate:toDate:)","abstract":"Get active time for a given period.
","parent_name":"PolarActivityApi"},"Protocols/PolarActivityApi.html":{"name":"PolarActivityApi","abstract":"Protocol defining methods to get steps for a given period.
"},"Protocols/PolarBleApi.html":{"name":"PolarBleApi","abstract":"API.
"},"Protocols/PolarBleApiObserver.html":{"name":"PolarBleApiObserver","abstract":"Polar Ble API connection observer.
"},"Protocols/PolarBleApiPowerStateObserver.html":{"name":"PolarBleApiPowerStateObserver","abstract":"Bluetooth state observer.
"},"Protocols/PolarBleApiDeviceInfoObserver.html":{"name":"PolarBleApiDeviceInfoObserver","abstract":"Device info observer.
"},"Protocols/PolarBleApiDeviceHrObserver.html":{"name":"PolarBleApiDeviceHrObserver","abstract":"Heart rate observer
"},"Protocols/PolarBleApiDeviceFeaturesObserver.html":{"name":"PolarBleApiDeviceFeaturesObserver","abstract":"Data client observer
"},"Protocols/PolarBleApiSdkModeFeatureObserver.html":{"name":"PolarBleApiSdkModeFeatureObserver","abstract":"SDK Mode observer
"},"Protocols/PolarBleApiLogger.html":{"name":"PolarBleApiLogger","abstract":"logger observer
"},"Protocols/PolarFirmwareUpdateApi.html":{"name":"PolarFirmwareUpdateApi"},"Protocols/PolarH10OfflineExerciseApi.html":{"name":"PolarH10OfflineExerciseApi","abstract":"H10 Exercise recording API.
"},"Protocols/PolarOfflineRecordingApi.html":{"name":"PolarOfflineRecordingApi","abstract":"Offline recording API.
"},"Protocols/PolarOnlineStreamingApi.html":{"name":"PolarOnlineStreamingApi","abstract":"Online steaming API.
"},"Protocols/PolarSdkModeApi.html":{"name":"PolarSdkModeApi","abstract":"Polar SDK mode API
"},"Protocols/PolarSleepApi.html":{"name":"PolarSleepApi","abstract":"Protocol defining methods to get Polar Sleep Data
"},"Extensions/PrimitiveSequence.html#/s:7RxSwift17PrimitiveSequenceV11PolarBleSdkAA11SingleTraitORszrlE13asCompletableACyAA0kI0Os5NeverOGyF":{"name":"asCompletable()","parent_name":"PrimitiveSequence"},"Extensions.html#/c:@M@PolarBleSdk@objc(cs)PolarBleApiImpl":{"name":"PolarBleApiImpl"},"Extensions/PrimitiveSequence.html":{"name":"PrimitiveSequence"},"Enums/PolarOfflineRecordingTriggerMode.html#/s:11PolarBleSdk0A27OfflineRecordingTriggerModeO15triggerDisabledyA2CmF":{"name":"triggerDisabled","parent_name":"PolarOfflineRecordingTriggerMode"},"Enums/PolarOfflineRecordingTriggerMode.html#/s:11PolarBleSdk0A27OfflineRecordingTriggerModeO18triggerSystemStartyA2CmF":{"name":"triggerSystemStart","parent_name":"PolarOfflineRecordingTriggerMode"},"Enums/PolarOfflineRecordingTriggerMode.html#/s:11PolarBleSdk0A27OfflineRecordingTriggerModeO20triggerExerciseStartyA2CmF":{"name":"triggerExerciseStart","parent_name":"PolarOfflineRecordingTriggerMode"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO03accdeF0yACs6UInt64V9timeStamp_SayAfG_s5Int32V1xAI1yAI1ztG7samplest_10Foundation4DateVAA0A13SensorSettingVtcACmF":{"name":"accOfflineRecordingData(_:startTime:settings:)","parent_name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO04gyrodeF0yACs6UInt64V9timeStamp_SayAfG_Sf1xSf1ySf1ztG7samplest_10Foundation4DateVAA0A13SensorSettingVtcACmF":{"name":"gyroOfflineRecordingData(_:startTime:settings:)","parent_name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO03magdeF0yACs6UInt64V9timeStamp_SayAfG_Sf1xSf1ySf1ztG7samplest_10Foundation4DateVAA0A13SensorSettingVtcACmF":{"name":"magOfflineRecordingData(_:startTime:settings:)","parent_name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO03ppgdeF0yAcA03PpgF4TypeO4type_Says6UInt64V9timeStamp_Says5Int32VG14channelSamplestG7samplest_10Foundation4DateVAA0A13SensorSettingVtcACmF":{"name":"ppgOfflineRecordingData(_:startTime:settings:)","parent_name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO03ppideF0yACs6UInt64V9timeStamp_SaySi2hr_s6UInt16V6ppInMsAJ0M13ErrorEstimateSi10blockerBitSi17skinContactStatusSi0tU9SupportedtG7samplest_10Foundation4DateVtcACmF":{"name":"ppiOfflineRecordingData(_:startTime:)","parent_name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO02hrdeF0yACSays5UInt8V0G0_SaySiG5rrsMsSb11rrAvailableSb13contactStatusSb0mN9SupportedtG_10Foundation4DateVtcACmF":{"name":"hrOfflineRecordingData(_:startTime:)","parent_name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO011temperaturedeF0yACs6UInt64V9timeStamp_SayAfG_Sf0G0tG7samplest_10Foundation4DateVtcACmF":{"name":"temperatureOfflineRecordingData(_:startTime:)","parent_name":"PolarOfflineRecordingData"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO010fetchingFwE7PackageyACSS_tcACmF":{"name":"fetchingFwUpdatePackage(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO020preparingDeviceForFwE0yACSS_tcACmF":{"name":"preparingDeviceForFwUpdate(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO09writingFwE7PackageyACSS_tcACmF":{"name":"writingFwUpdatePackage(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO012finalizingFwE0yACSS_tcACmF":{"name":"finalizingFwUpdate(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO02fwE21CompletedSuccessfullyyACSS_tcACmF":{"name":"fwUpdateCompletedSuccessfully(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO02fwE12NotAvailableyACSS_tcACmF":{"name":"fwUpdateNotAvailable(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO02fwE6FailedyACSS_tcACmF":{"name":"fwUpdateFailed(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO22notificationNotEnabledyA2CmF":{"name":"notificationNotEnabled","abstract":"GATT characteristic notification not enabled
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO15serviceNotFoundyA2CmF":{"name":"serviceNotFound","abstract":"GATT service not found
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO18deviceNotConnectedyA2CmF":{"name":"deviceNotConnected","abstract":"Device state != Connected
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO14deviceNotFoundyA2CmF":{"name":"deviceNotFound","abstract":"Device not found
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO21operationNotSupportedyA2CmF":{"name":"operationNotSupported","abstract":"Requested operation is not supported
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO19messageEncodeFailedyA2CmF":{"name":"messageEncodeFailed","abstract":"Google protocol buffers encode failed
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO19messageDecodeFailedyA2CmF":{"name":"messageDecodeFailed","abstract":"Google protocol buffers decode failed
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO20dateTimeFormatFailedyACSS_tcACmF":{"name":"dateTimeFormatFailed(description:)","abstract":"String to date time formatting failed
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO22unableToStartStreamingyA2CmF":{"name":"unableToStartStreaming","abstract":"Failed to start streaming
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO15invalidArgumentyACSS_tcACmF":{"name":"invalidArgument(description:)","abstract":"invalid argument
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO05polarbC17InternalExceptionyACSS_tcACmF":{"name":"polarBleSdkInternalException(description:)","abstract":"Polar BLE SDK internal exception indicating something went wrong in SDK internal logic
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO11deviceErroryACSS_tcACmF":{"name":"deviceError(description:)","abstract":"Error on device operation
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO26polarOfflineRecordingErroryACSS_tcACmF":{"name":"polarOfflineRecordingError(description:)","abstract":"Error related to offline recording
","parent_name":"PolarErrors"},"Enums/SampleType.html#/s:11PolarBleSdk10SampleTypeO2hryA2CmF":{"name":"hr","abstract":"recording type to use is hr in BPM
","parent_name":"SampleType"},"Enums/SampleType.html#/s:11PolarBleSdk10SampleTypeO2rryA2CmF":{"name":"rr","abstract":"recording type to use is rr interval
","parent_name":"SampleType"},"Enums/RecordingInterval.html#/s:11PolarBleSdk17RecordingIntervalO11interval_1syA2CmF":{"name":"interval_1s","parent_name":"RecordingInterval"},"Enums/RecordingInterval.html#/s:11PolarBleSdk17RecordingIntervalO11interval_5syA2CmF":{"name":"interval_5s","parent_name":"RecordingInterval"},"Enums/PpgDataType.html#/s:11PolarBleSdk11PpgDataTypeO13ppg3_ambient1yA2CmF":{"name":"ppg3_ambient1","abstract":"3 ppg + 1 ambient
","parent_name":"PpgDataType"},"Enums/PpgDataType.html#/s:11PolarBleSdk11PpgDataTypeO5ppg17yA2CmF":{"name":"ppg17","abstract":"16 ppg + 1 status
","parent_name":"PpgDataType"},"Enums/PpgDataType.html#/s:11PolarBleSdk11PpgDataTypeO7unknownyA2CmF":{"name":"unknown","parent_name":"PpgDataType"},"Enums/OhrDataType.html#/s:11PolarBleSdk11OhrDataTypeO13ppg3_ambient1yA2CmF":{"name":"ppg3_ambient1","abstract":"3 ppg + 1 ambient
","parent_name":"OhrDataType"},"Enums/OhrDataType.html#/s:11PolarBleSdk11OhrDataTypeO7unknownyA2CmF":{"name":"unknown","parent_name":"OhrDataType"},"Enums/PolarActivityDataType.html#/s:11PolarBleSdk0A16ActivityDataTypeO5SLEEPyA2CmF":{"name":"SLEEP","parent_name":"PolarActivityDataType"},"Enums/PolarActivityDataType.html#/s:11PolarBleSdk0A16ActivityDataTypeO5STEPSyA2CmF":{"name":"STEPS","parent_name":"PolarActivityDataType"},"Enums/PolarActivityDataType.html#/s:11PolarBleSdk0A16ActivityDataTypeO8CALORIESyA2CmF":{"name":"CALORIES","parent_name":"PolarActivityDataType"},"Enums/PolarActivityDataType.html#/s:11PolarBleSdk0A16ActivityDataTypeO4NONEyA2CmF":{"name":"NONE","parent_name":"PolarActivityDataType"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO10feature_hryA2CmF":{"name":"feature_hr","abstract":"Hr feature to receive hr and rr data from Polar or any other BLE device via standard HR BLE service
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO19feature_device_infoyA2CmF":{"name":"feature_device_info","abstract":"Device information feature to receive sw information from Polar or any other BLE device
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO20feature_battery_infoyA2CmF":{"name":"feature_battery_info","abstract":"Feature to receive battery level info from Polar or any other BLE device
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO30feature_polar_online_streamingyA2CmF":{"name":"feature_polar_online_streaming","abstract":"Polar sensor streaming feature to stream live online data. For example hr, ecg, acc, ppg, ppi, etc…
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO31feature_polar_offline_recordingyA2CmF":{"name":"feature_polar_offline_recording","abstract":"Polar offline recording feature to record offline data to Polar device without continuous BLE connection.
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO36feature_polar_h10_exercise_recordingyA2CmF":{"name":"feature_polar_h10_exercise_recording","abstract":"H10 exercise recording feature to record exercise data to Polar H10 device without continuous BLE connection.
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO31feature_polar_device_time_setupyA2CmF":{"name":"feature_polar_device_time_setup","abstract":"Feature to read and set device time in Polar device
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO22feature_polar_sdk_modeyA2CmF":{"name":"feature_polar_sdk_mode","abstract":"In SDK mode the wider range of capabilities are available for the online stream or offline recoding than in normal operation mode.
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO27feature_polar_led_animationyA2CmF":{"name":"feature_polar_led_animation","abstract":"Feature to enable or disable SDK mode blinking LED animation.
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO29feature_polar_firmware_updateyA2CmF":{"name":"feature_polar_firmware_update","abstract":"Firmware update for Polar device.
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO27feature_polar_activity_datayA2CmF":{"name":"feature_polar_activity_data","abstract":"Feature to receive activity data from Polar device.
","parent_name":"PolarBleSdkFeature"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO3ecgyA2CmF":{"name":"ecg","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO3accyA2CmF":{"name":"acc","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO3ppgyA2CmF":{"name":"ppg","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO3ppiyA2CmF":{"name":"ppi","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO4gyroyA2CmF":{"name":"gyro","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO12magnetometeryA2CmF":{"name":"magnetometer","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO2hryA2CmF":{"name":"hr","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO11temperatureyA2CmF":{"name":"temperature","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO8pressureyA2CmF":{"name":"pressure","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html":{"name":"PolarDeviceDataType","abstract":"Data types available in Polar devices for online streaming or offline recording.
"},"Enums/PolarBleSdkFeature.html":{"name":"PolarBleSdkFeature","abstract":"Features available in Polar BLE SDK library
"},"Enums/PolarActivityDataType.html":{"name":"PolarActivityDataType","abstract":"The activity recording data types available in Polar devices.
"},"Enums/OhrDataType.html":{"name":"OhrDataType","abstract":"OHR data source enum
"},"Enums/PpgDataType.html":{"name":"PpgDataType","abstract":"PPG data source enum
"},"Enums/RecordingInterval.html":{"name":"RecordingInterval","abstract":"Recoding intervals for H10 recording start
"},"Enums/SampleType.html":{"name":"SampleType","abstract":"Sample types for H10 recording start
"},"Enums/PolarErrors.html":{"name":"PolarErrors","abstract":"Polar SDK errors
"},"Enums/FirmwareUpdateStatus.html":{"name":"FirmwareUpdateStatus"},"Enums/PolarOfflineRecordingData.html":{"name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingTriggerMode.html":{"name":"PolarOfflineRecordingTriggerMode","abstract":"Polar offline recording trigger mode. Offline recording trigger can be used to start the offline recording automatically in device, based on selected trigger mode.
"},"Global%20Variables.html#/s:11PolarBleSdk25DEVICE_SETTINGS_FILE_PATHSSvp":{"name":"DEVICE_SETTINGS_FILE_PATH"},"Classes/BleHtsClient/TemperatureMeasurement.html#/s:11PolarBleSdk0B9HtsClientC22TemperatureMeasurementV18temperatureCelsiusSfvp":{"name":"temperatureCelsius","parent_name":"TemperatureMeasurement"},"Classes/BleHtsClient/TemperatureMeasurement.html#/s:11PolarBleSdk0B9HtsClientC22TemperatureMeasurementV21temperatureFahrenheitSfvp":{"name":"temperatureFahrenheit","parent_name":"TemperatureMeasurement"},"Classes/BleHtsClient/TemperatureMeasurement.html":{"name":"TemperatureMeasurement","parent_name":"BleHtsClient"},"Classes/BleHtsClient.html#/s:11PolarBleSdk0B9HtsClientC22gattServiceTransmitterAcA0B26AttributeTransportProtocol_p_tcfc":{"name":"init(gattServiceTransmitter:)","parent_name":"BleHtsClient"},"Classes/BleHtsClient.html#/s:11PolarBleSdk0B9HtsClientC12disconnectedyyF":{"name":"disconnected()","parent_name":"BleHtsClient"},"Classes/BleHtsClient.html#/s:11PolarBleSdk0B9HtsClientC18processServiceData_4data3errySo6CBUUIDC_10Foundation0H0VSitF":{"name":"processServiceData(_:data:err:)","parent_name":"BleHtsClient"},"Classes/BleHtsClient.html#/s:11PolarBleSdk0B9HtsClientC07observeD13Notifications15checkConnection7RxSwift10ObservableCyAC22TemperatureMeasurementVGSb_tF":{"name":"observeHtsNotifications(checkConnection:)","parent_name":"BleHtsClient"},"Classes/HealthThermometer.html#/s:11PolarBleSdk17HealthThermometerC11HTS_SERVICESo6CBUUIDCvpZ":{"name":"HTS_SERVICE","parent_name":"HealthThermometer"},"Classes/HealthThermometer.html#/s:11PolarBleSdk17HealthThermometerC23TEMPERATURE_MEASUREMENTSo6CBUUIDCvpZ":{"name":"TEMPERATURE_MEASUREMENT","parent_name":"HealthThermometer"},"Classes/HealthThermometer.html#/s:11PolarBleSdk17HealthThermometerC16TEMPERATURE_TYPESo6CBUUIDCvpZ":{"name":"TEMPERATURE_TYPE","parent_name":"HealthThermometer"},"Classes/PolarBackupManager.html#/s:11PolarBleSdk0A13BackupManagerC0D8FileDataV":{"name":"BackupFileData","parent_name":"PolarBackupManager"},"Classes/PolarBackupManager.html#/s:11PolarBleSdk0A13BackupManagerC6clientAcA0B11PsFtpClientC_tcfc":{"name":"init(client:)","parent_name":"PolarBackupManager"},"Classes/PolarBackupManager.html#/s:11PolarBleSdk0A13BackupManagerC12backupDevice7RxSwift17PrimitiveSequenceVyAE11SingleTraitOSayAC0D8FileDataVGGyF":{"name":"backupDevice()","abstract":"Backs up the device.
","parent_name":"PolarBackupManager"},"Classes/PolarBackupManager.html#/s:11PolarBleSdk0A13BackupManagerC07restoreD011backupFiles7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSayAC0D8FileDataVG_tF":{"name":"restoreBackup(backupFiles:)","abstract":"Restores backup to the device.
","parent_name":"PolarBackupManager"},"Classes/PolarSleepData/OriginalSleepRange.html#/s:11PolarBleSdk0A9SleepDataC08OriginalD5RangeV9startTime10Foundation4DateVSgvp":{"name":"startTime","parent_name":"OriginalSleepRange"},"Classes/PolarSleepData/OriginalSleepRange.html#/s:11PolarBleSdk0A9SleepDataC08OriginalD5RangeV7endTime10Foundation4DateVSgvp":{"name":"endTime","parent_name":"OriginalSleepRange"},"Classes/PolarSleepData/SleepCycle.html#/s:11PolarBleSdk0A9SleepDataC0D5CycleV011secondsFromD5Starts6UInt32VSgvp":{"name":"secondsFromSleepStart","parent_name":"SleepCycle"},"Classes/PolarSleepData/SleepCycle.html#/s:11PolarBleSdk0A9SleepDataC0D5CycleV15sleepDepthStartSfSgvp":{"name":"sleepDepthStart","parent_name":"SleepCycle"},"Classes/PolarSleepData/SleepWakePhase.html#/s:11PolarBleSdk0A9SleepDataC0D9WakePhaseV011secondsFromD5Starts6UInt32VSgvp":{"name":"secondsFromSleepStart","parent_name":"SleepWakePhase"},"Classes/PolarSleepData/SleepWakePhase.html#/s:11PolarBleSdk0A9SleepDataC0D9WakePhaseV5stateAC0dF5StateOSgvp":{"name":"state","parent_name":"SleepWakePhase"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV14sleepStartTime10Foundation4DateVSgvp":{"name":"sleepStartTime","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV12sleepEndTime10Foundation4DateVSgvp":{"name":"sleepEndTime","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV12lastModified10Foundation4DateVSgvp":{"name":"lastModified","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV16sleepGoalMinutess6UInt32VSgvp":{"name":"sleepGoalMinutes","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV15sleepWakePhasesSayAC0dI5PhaseVGSgvp":{"name":"sleepWakePhases","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV10snoozeTimeSay10Foundation4DateVGSgvp":{"name":"snoozeTime","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV9alarmTime10Foundation4DateVSgvp":{"name":"alarmTime","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV23sleepStartOffsetSecondss5Int32VSgvp":{"name":"sleepStartOffsetSeconds","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV21sleepEndOffsetSecondss5Int32VSgvp":{"name":"sleepEndOffsetSeconds","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV04userD6RatingAC0dI0OSgvp":{"name":"userSleepRating","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV8deviceIdSSSgvp":{"name":"deviceId","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV13batteryRanOutSbSgvp":{"name":"batteryRanOut","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV11sleepCyclesSayAC0D5CycleVGSgvp":{"name":"sleepCycles","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV05sleepG4Date10Foundation0I0VSgvp":{"name":"sleepResultDate","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV08originalD5RangeAC08OriginaldI0VSgvp":{"name":"originalSleepRange","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/SleepRating.html#/s:11PolarBleSdk0A9SleepDataC0D6RatingO15SLEPT_UNDEFINEDyA2EmF":{"name":"SLEPT_UNDEFINED","parent_name":"SleepRating"},"Classes/PolarSleepData/SleepRating.html#/s:11PolarBleSdk0A9SleepDataC0D6RatingO12SLEPT_POORLYyA2EmF":{"name":"SLEPT_POORLY","parent_name":"SleepRating"},"Classes/PolarSleepData/SleepRating.html#/s:11PolarBleSdk0A9SleepDataC0D6RatingO21SLEPT_SOMEWHAT_POORLYyA2EmF":{"name":"SLEPT_SOMEWHAT_POORLY","parent_name":"SleepRating"},"Classes/PolarSleepData/SleepRating.html#/s:11PolarBleSdk0A9SleepDataC0D6RatingO29SLEPT_NEITHER_POORLY_NOR_WELLyA2EmF":{"name":"SLEPT_NEITHER_POORLY_NOR_WELL","parent_name":"SleepRating"},"Classes/PolarSleepData/SleepRating.html#/s:11PolarBleSdk0A9SleepDataC0D6RatingO19SLEPT_SOMEWHAT_WELLyA2EmF":{"name":"SLEPT_SOMEWHAT_WELL","parent_name":"SleepRating"},"Classes/PolarSleepData/SleepRating.html#/s:11PolarBleSdk0A9SleepDataC0D6RatingO10SLEPT_WELLyA2EmF":{"name":"SLEPT_WELL","parent_name":"SleepRating"},"Classes/PolarSleepData/SleepWakeState.html#/s:11PolarBleSdk0A9SleepDataC0D9WakeStateO7UNKNOWNyA2EmF":{"name":"UNKNOWN","parent_name":"SleepWakeState"},"Classes/PolarSleepData/SleepWakeState.html#/s:11PolarBleSdk0A9SleepDataC0D9WakeStateO4WAKEyA2EmF":{"name":"WAKE","parent_name":"SleepWakeState"},"Classes/PolarSleepData/SleepWakeState.html#/s:11PolarBleSdk0A9SleepDataC0D9WakeStateO3REMyA2EmF":{"name":"REM","parent_name":"SleepWakeState"},"Classes/PolarSleepData/SleepWakeState.html#/s:11PolarBleSdk0A9SleepDataC0D9WakeStateO8NONREM12yA2EmF":{"name":"NONREM12","parent_name":"SleepWakeState"},"Classes/PolarSleepData/SleepWakeState.html#/s:11PolarBleSdk0A9SleepDataC0D9WakeStateO7NONREM3yA2EmF":{"name":"NONREM3","parent_name":"SleepWakeState"},"Classes/PolarSleepData/SleepWakeState.html":{"name":"SleepWakeState","parent_name":"PolarSleepData"},"Classes/PolarSleepData/SleepRating.html":{"name":"SleepRating","parent_name":"PolarSleepData"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html":{"name":"PolarSleepAnalysisResult","parent_name":"PolarSleepData"},"Classes/PolarSleepData/SleepWakePhase.html":{"name":"SleepWakePhase","parent_name":"PolarSleepData"},"Classes/PolarSleepData/SleepCycle.html":{"name":"SleepCycle","parent_name":"PolarSleepData"},"Classes/PolarSleepData/OriginalSleepRange.html":{"name":"OriginalSleepRange","parent_name":"PolarSleepData"},"Classes/PolarUserDeviceSettings/PolarUserDeviceSettingsResult.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0adeF6ResultV14deviceLocationAC0eI0OSgvp":{"name":"deviceLocation","parent_name":"PolarUserDeviceSettingsResult"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:s12IdentifiableP2id2IDQzvp":{"name":"id","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO9UNDEFINEDyA2EmF":{"name":"UNDEFINED","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO5OTHERyA2EmF":{"name":"OTHER","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO10WRIST_LEFTyA2EmF":{"name":"WRIST_LEFT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO11WRIST_RIGHTyA2EmF":{"name":"WRIST_RIGHT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO8NECKLACEyA2EmF":{"name":"NECKLACE","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO5CHESTyA2EmF":{"name":"CHEST","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO10UPPER_BACKyA2EmF":{"name":"UPPER_BACK","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO9FOOT_LEFTyA2EmF":{"name":"FOOT_LEFT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO10FOOT_RIGHTyA2EmF":{"name":"FOOT_RIGHT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO14LOWER_ARM_LEFTyA2EmF":{"name":"LOWER_ARM_LEFT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO15LOWER_ARM_RIGHTyA2EmF":{"name":"LOWER_ARM_RIGHT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO14UPPER_ARM_LEFTyA2EmF":{"name":"UPPER_ARM_LEFT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO16UPPER_ARM_RIGHTsyA2EmF":{"name":"UPPER_ARM_RIGHTs","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO10BIKE_MOUNTyA2EmF":{"name":"BIKE_MOUNT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO5toIntSiyF":{"name":"toInt()","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html":{"name":"DeviceLocation","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings.html#/s:11PolarBleSdk0A18UserDeviceSettingsC9timestamp10Foundation4DateVvp":{"name":"timestamp","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings.html#/s:11PolarBleSdk0A18UserDeviceSettingsC15_deviceLocationAC0eH0Ovp":{"name":"_deviceLocation","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings.html#/s:11PolarBleSdk0A18UserDeviceSettingsC14deviceLocationAC0eH0Ovp":{"name":"deviceLocation","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings/PolarUserDeviceSettingsResult.html":{"name":"PolarUserDeviceSettingsResult","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings.html#/s:11PolarBleSdk0A18UserDeviceSettingsC14getStringValue19deviceLocationIndexSSSi_tFZ":{"name":"getStringValue(deviceLocationIndex:)","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings.html#/s:11PolarBleSdk0A18UserDeviceSettingsC03getE8Location06deviceH0AC0eH0OSS_tFZ":{"name":"getDeviceLocation(deviceLocation:)","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings.html#/s:11PolarBleSdk0A18UserDeviceSettingsC14getAllAsStringSaySSGyFZ":{"name":"getAllAsString()","parent_name":"PolarUserDeviceSettings"},"Classes/PolarStoredDataType/PolarStoredDataTypeResult.html#/s:11PolarBleSdk0A14StoredDataTypeC0adeF6ResultV06storedeF0AC0deF0OSgvp":{"name":"storedDataType","parent_name":"PolarStoredDataTypeResult"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O9UNDEFINEDyA2EmF":{"name":"UNDEFINED","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O8ACTIVITYyA2EmF":{"name":"ACTIVITY","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O11AUTO_SAMPLEyA2EmF":{"name":"AUTO_SAMPLE","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O13DAILY_SUMMARYyA2EmF":{"name":"DAILY_SUMMARY","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O16NIGHTLY_RECOVERYyA2EmF":{"name":"NIGHTLY_RECOVERY","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O6SDLOGSyA2EmF":{"name":"SDLOGS","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O5SLEEPyA2EmF":{"name":"SLEEP","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O11SLEEP_SCOREyA2EmF":{"name":"SLEEP_SCORE","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O5toIntSiyF":{"name":"toInt()","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html":{"name":"StoredDataType","parent_name":"PolarStoredDataType"},"Classes/PolarStoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC07_storedeF0AC0deF0Ovp":{"name":"_storedDataType","parent_name":"PolarStoredDataType"},"Classes/PolarStoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC06storedeF0AC0deF0Ovp":{"name":"storedDataType","parent_name":"PolarStoredDataType"},"Classes/PolarStoredDataType/PolarStoredDataTypeResult.html":{"name":"PolarStoredDataTypeResult","parent_name":"PolarStoredDataType"},"Classes/PolarStoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC14getStringValue04dataF13LocationIndexSSSi_tFZ":{"name":"getStringValue(dataTypeLocationIndex:)","parent_name":"PolarStoredDataType"},"Classes/PolarStoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC14getAllAsStringSaySSGyFZ":{"name":"getAllAsString()","parent_name":"PolarStoredDataType"},"Classes/PolarStoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC8getValue4nameAC0deF0OSS_tFZ":{"name":"getValue(name:)","parent_name":"PolarStoredDataType"},"Classes/PolarBleApiDefaultImpl.html#/s:11PolarBleSdk0aB14ApiDefaultImplC19polarImplementation_8featuresAA0abD0_pSo17OS_dispatch_queueC_ShyAA0abC7FeatureOGtFZ":{"name":"polarImplementation(_:features:)","abstract":"New instance of Polar Ble API implementation
","parent_name":"PolarBleApiDefaultImpl"},"Classes/PolarBleApiDefaultImpl.html#/s:11PolarBleSdk0aB14ApiDefaultImplC11versionInfoSSyFZ":{"name":"versionInfo()","abstract":"Return current version
","parent_name":"PolarBleApiDefaultImpl"},"Classes/PolarBleApiDefaultImpl.html":{"name":"PolarBleApiDefaultImpl","abstract":"Class to provide the default implementation of the Polar Ble API
"},"Classes/PolarStoredDataType.html":{"name":"PolarStoredDataType"},"Classes/PolarUserDeviceSettings.html":{"name":"PolarUserDeviceSettings"},"Classes/PolarSleepData.html":{"name":"PolarSleepData"},"Classes/PolarBackupManager.html":{"name":"PolarBackupManager"},"Classes/HealthThermometer.html":{"name":"HealthThermometer"},"Classes/BleHtsClient.html":{"name":"BleHtsClient"},"Classes.html":{"name":"Classes","abstract":"The following classes are available globally.
"},"Global%20Variables.html":{"name":"Global Variables","abstract":"The following global variables are available globally.
"},"Enums.html":{"name":"Enumerations","abstract":"The following enumerations are available globally.
"},"Extensions.html":{"name":"Extensions","abstract":"The following extensions are available globally.
"},"Protocols.html":{"name":"Protocols","abstract":"The following protocols are available globally.
"},"Structs.html":{"name":"Structures","abstract":"The following structures are available globally.
"},"Typealiases.html":{"name":"Type Aliases","abstract":"The following type aliases are available globally.
"}}
\ No newline at end of file
+{"Typealiases.html#/s:11PolarBleSdk0A10DeviceInfoa":{"name":"PolarDeviceInfo","abstract":"Polar device info
"},"Typealiases.html#/s:11PolarBleSdk0A15HrBroadcastDataa":{"name":"PolarHrBroadcastData","abstract":"deviceInfo: see #PolarDeviceInfo ,
"},"Typealiases.html#/s:11PolarBleSdk0A6HrDataa":{"name":"PolarHrData","abstract":"Polar hr data
"},"Typealiases.html#/s:11PolarBleSdk0A7EcgDataa":{"name":"PolarEcgData","abstract":"Polar Ecg data
"},"Typealiases.html#/s:11PolarBleSdk0A7AccDataa":{"name":"PolarAccData","abstract":"Polar acc data
"},"Typealiases.html#/s:11PolarBleSdk0A8GyroDataa":{"name":"PolarGyroData","abstract":"Polar gyro data
"},"Typealiases.html#/s:11PolarBleSdk0A16MagnetometerDataa":{"name":"PolarMagnetometerData","abstract":"Polar magnetometer data
"},"Typealiases.html#/s:11PolarBleSdk0A15TemperatureDataa":{"name":"PolarTemperatureData","abstract":"Polar Temperature data
"},"Typealiases.html#/s:11PolarBleSdk0A12PressureDataa":{"name":"PolarPressureData","abstract":"Polar Pressure data
"},"Typealiases.html#/s:11PolarBleSdk0A7OhrDataa":{"name":"PolarOhrData","abstract":"Polar Ohr data
"},"Typealiases.html#/s:11PolarBleSdk0A7PpgDataa":{"name":"PolarPpgData","abstract":"Polar PPG data
"},"Typealiases.html#/s:11PolarBleSdk0A7PpiDataa":{"name":"PolarPpiData","abstract":"Polar ppi data
"},"Typealiases.html#/s:11PolarBleSdk0A13ExerciseEntrya":{"name":"PolarExerciseEntry","abstract":"Polar exercise entry
"},"Typealiases.html#/s:11PolarBleSdk0A12ExerciseDataa":{"name":"PolarExerciseData","abstract":"Polar Exercise Data
"},"Typealiases.html#/s:11PolarBleSdk0A15RecordingStatusa":{"name":"PolarRecordingStatus","abstract":"Polar Recording status
"},"Structs/PolarStepsData.html#/s:11PolarBleSdk0A9StepsDataV4date10Foundation4DateVvp":{"name":"date","parent_name":"PolarStepsData"},"Structs/PolarStepsData.html#/s:11PolarBleSdk0A9StepsDataV5stepsSivp":{"name":"steps","parent_name":"PolarStepsData"},"Structs/PolarDistanceData.html#/s:11PolarBleSdk0A12DistanceDataV4date10Foundation4DateVvp":{"name":"date","parent_name":"PolarDistanceData"},"Structs/PolarDistanceData.html#/s:11PolarBleSdk0A12DistanceDataV14distanceMetersSfvp":{"name":"distanceMeters","parent_name":"PolarDistanceData"},"Structs/Polar247HrSamplesData.html#/s:11PolarBleSdk21Polar247HrSamplesDataV4date10Foundation4DateVvp":{"name":"date","parent_name":"Polar247HrSamplesData"},"Structs/Polar247HrSamplesData.html#/s:11PolarBleSdk21Polar247HrSamplesDataV02hrF0SaySiGvp":{"name":"hrSamples","parent_name":"Polar247HrSamplesData"},"Structs/Polar247HrSamplesData.html#/s:11PolarBleSdk21Polar247HrSamplesDataV11triggerTypeAA022AutomaticSampleTriggerI0OSgvp":{"name":"triggerType","parent_name":"Polar247HrSamplesData"},"Structs/Polar247HrSamplesData.html#/s:11PolarBleSdk21Polar247HrSamplesDataV4date02hrF011triggerTypeAC10Foundation4DateV_SaySiGAA022AutomaticSampleTriggerK0OSgtcfc":{"name":"init(date:hrSamples:triggerType:)","parent_name":"Polar247HrSamplesData"},"Structs/Polar247HrSamplesData.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"Polar247HrSamplesData"},"Structs/Polar247HrSamplesData.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"Polar247HrSamplesData"},"Structs/PolarActiveTime.html#/s:11PolarBleSdk0A10ActiveTimeV5hoursSivp":{"name":"hours","parent_name":"PolarActiveTime"},"Structs/PolarActiveTime.html#/s:11PolarBleSdk0A10ActiveTimeV7minutesSivp":{"name":"minutes","parent_name":"PolarActiveTime"},"Structs/PolarActiveTime.html#/s:11PolarBleSdk0A10ActiveTimeV7secondsSivp":{"name":"seconds","parent_name":"PolarActiveTime"},"Structs/PolarActiveTime.html#/s:11PolarBleSdk0A10ActiveTimeV6millisSivp":{"name":"millis","parent_name":"PolarActiveTime"},"Structs/PolarActiveTime.html#/s:11PolarBleSdk0A10ActiveTimeV5hours7minutes7seconds6millisACSi_S3itcfc":{"name":"init(hours:minutes:seconds:millis:)","parent_name":"PolarActiveTime"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV4date10Foundation4DateVvp":{"name":"date","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV11timeNonWearAA0adE0Vvp":{"name":"timeNonWear","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV9timeSleepAA0adE0Vvp":{"name":"timeSleep","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV13timeSedentaryAA0adE0Vvp":{"name":"timeSedentary","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV17timeLightActivityAA0adE0Vvp":{"name":"timeLightActivity","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV30timeContinuousModerateActivityAA0adE0Vvp":{"name":"timeContinuousModerateActivity","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV32timeIntermittentModerateActivityAA0adE0Vvp":{"name":"timeIntermittentModerateActivity","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV30timeContinuousVigorousActivityAA0adE0Vvp":{"name":"timeContinuousVigorousActivity","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV32timeIntermittentVigorousActivityAA0adE0Vvp":{"name":"timeIntermittentVigorousActivity","parent_name":"PolarActiveTimeData"},"Structs/PolarActiveTimeData.html#/s:11PolarBleSdk0A14ActiveTimeDataV4date11timeNonWear0H5Sleep0H9Sedentary0H13LightActivity0h18ContinuousModerateN00h12IntermittentpN00ho8VigorousN00hqrN0AC10Foundation4DateV_AA0adE0VA7Qtcfc":{"name":"init(date:timeNonWear:timeSleep:timeSedentary:timeLightActivity:timeContinuousModerateActivity:timeIntermittentModerateActivity:timeContinuousVigorousActivity:timeIntermittentVigorousActivity:)","parent_name":"PolarActiveTimeData"},"Structs/UserIdentifierType.html#/s:11PolarBleSdk18UserIdentifierTypeV18userIdLastModifiedSSvp":{"name":"userIdLastModified","parent_name":"UserIdentifierType"},"Structs/UserIdentifierType.html#/s:11PolarBleSdk18UserIdentifierTypeV24USER_IDENTIFIER_FILENAMESSvpZ":{"name":"USER_IDENTIFIER_FILENAME","parent_name":"UserIdentifierType"},"Structs/UserIdentifierType.html#/s:11PolarBleSdk18UserIdentifierTypeV6createACyFZ":{"name":"create()","parent_name":"UserIdentifierType"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13ohrLogEnabledSbSgvp":{"name":"ohrLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13ppiLogEnabledSbSgvp":{"name":"ppiLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV22accelerationLogEnabledSbSgvp":{"name":"accelerationLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV18caloriesLogEnabledSbSgvp":{"name":"caloriesLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13gpsLogEnabledSbSgvp":{"name":"gpsLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV17gpsNmeaLogEnabledSbSgvp":{"name":"gpsNmeaLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV22magnetometerLogEnabledSbSgvp":{"name":"magnetometerLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13tapLogEnabledSbSgvp":{"name":"tapLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV19barometerLogEnabledSbSgvp":{"name":"barometerLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV19gyroscopeLogEnabledSbSgvp":{"name":"gyroscopeLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV15sleepLogEnabledSbSgvp":{"name":"sleepLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV15slopeLogEnabledSbSgvp":{"name":"slopeLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV22ambientLightLogEnabledSbSgvp":{"name":"ambientLightLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13tlrLogEnabledSbSgvp":{"name":"tlrLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV18ondemandLogEnabledSbSgvp":{"name":"ondemandLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV18capsenseLogEnabledSbSgvp":{"name":"capsenseLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV16fusionLogEnabledSbSgvp":{"name":"fusionLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13metLogEnabledSbSgvp":{"name":"metLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV21verticalAccLogEnabledSbSgvp":{"name":"verticalAccLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13amdLogEnabledSbSgvp":{"name":"amdLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV25skinTemperatureLogEnabledSbSgvp":{"name":"skinTemperatureLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV17compassLogEnabledSbSgvp":{"name":"compassLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV17speed3DLogEnabledSbSgvp":{"name":"speed3DLogEnabled","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV22retainSettingsOverBootSbSgvp":{"name":"retainSettingsOverBoot","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV10logTriggerSiSgvp":{"name":"logTrigger","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV21magnetometerFrequencySiSgvp":{"name":"magnetometerFrequency","parent_name":"SDLogConfig"},"Structs/SDLogConfig.html#/s:11PolarBleSdk11SDLogConfigV13ppiLogEnabled012accelerationgH008caloriesgH003gpsgH00k4NmeagH0012magnetometergH003tapgH009barometergH009gyroscopegH005sleepgH005slopegH0012ambientLightgH003tlrgH008ondemandgH008capsensegH006fusiongH003metgH003ohrgH0011verticalAccgH003amdgH0015skinTemperaturegH007compassgH0010speed3DLogH010logTrigger0M9FrequencyACSbSg_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_A1_SiSgA2_tcfc":{"name":"init(ppiLogEnabled:accelerationLogEnabled:caloriesLogEnabled:gpsLogEnabled:gpsNmeaLogEnabled:magnetometerLogEnabled:tapLogEnabled:barometerLogEnabled:gyroscopeLogEnabled:sleepLogEnabled:slopeLogEnabled:ambientLightLogEnabled:tlrLogEnabled:ondemandLogEnabled:capsenseLogEnabled:fusionLogEnabled:metLogEnabled:ohrLogEnabled:verticalAccLogEnabled:amdLogEnabled:skinTemperatureLogEnabled:compassLogEnabled:speed3DLogEnabled:logTrigger:magnetometerFrequency:)","parent_name":"SDLogConfig"},"Structs/PolarUserDeviceSettingsData.html#/s:s12IdentifiableP2id2IDQzvp":{"name":"id","parent_name":"PolarUserDeviceSettingsData"},"Structs/PolarUserDeviceSettingsData.html#/s:11PolarBleSdk0A22UserDeviceSettingsDataV06_polardeF0AA0adeF0Cvp":{"name":"_polarUserDeviceSettings","parent_name":"PolarUserDeviceSettingsData"},"Structs/PolarUserDeviceSettingsData.html#/s:11PolarBleSdk0A22UserDeviceSettingsDataVACycfc":{"name":"init()","parent_name":"PolarUserDeviceSettingsData"},"Structs/PolarUserDeviceSettingsData.html#/s:11PolarBleSdk0A22UserDeviceSettingsDataV05polardeF0AA0adeF0Cvp":{"name":"polarUserDeviceSettings","parent_name":"PolarUserDeviceSettingsData"},"Structs/PolarSensorSetting/SettingType.html#/s:11PolarBleSdk0A13SensorSettingV0E4TypeO10sampleRateyA2EmF":{"name":"sampleRate","abstract":"sample rate in hz
","parent_name":"SettingType"},"Structs/PolarSensorSetting/SettingType.html#/s:11PolarBleSdk0A13SensorSettingV0E4TypeO10resolutionyA2EmF":{"name":"resolution","abstract":"resolution in bits
","parent_name":"SettingType"},"Structs/PolarSensorSetting/SettingType.html#/s:11PolarBleSdk0A13SensorSettingV0E4TypeO5rangeyA2EmF":{"name":"range","abstract":"range
","parent_name":"SettingType"},"Structs/PolarSensorSetting/SettingType.html#/s:11PolarBleSdk0A13SensorSettingV0E4TypeO14rangeMilliunityA2EmF":{"name":"rangeMilliunit","abstract":"range with min and max allowed values
","parent_name":"SettingType"},"Structs/PolarSensorSetting/SettingType.html#/s:11PolarBleSdk0A13SensorSettingV0E4TypeO8channelsyA2EmF":{"name":"channels","abstract":"amount of channels available
","parent_name":"SettingType"},"Structs/PolarSensorSetting/SettingType.html#/s:11PolarBleSdk0A13SensorSettingV0E4TypeO7unknownyA2EmF":{"name":"unknown","abstract":"type is unknown
","parent_name":"SettingType"},"Structs/PolarSensorSetting/SettingType.html":{"name":"SettingType","abstract":"settings type
","parent_name":"PolarSensorSetting"},"Structs/PolarSensorSetting.html#/s:11PolarBleSdk0A13SensorSettingV8settingsSDyAC0E4TypeOShys6UInt32VGGvp":{"name":"settings","abstract":"current settings available / set
","parent_name":"PolarSensorSetting"},"Structs/PolarSensorSetting.html#/s:11PolarBleSdk0A13SensorSettingVyACSDyAC0E4TypeOs6UInt32VGcfc":{"name":"init(_:)","abstract":"constructor with desired settings
","parent_name":"PolarSensorSetting"},"Structs/PolarSensorSetting.html#/s:11PolarBleSdk0A13SensorSettingV11maxSettingsACyF":{"name":"maxSettings()","abstract":"helper to retrieve max settings available
","parent_name":"PolarSensorSetting"},"Structs/PolarSensorSetting.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"PolarSensorSetting"},"Structs/PolarRecordingSecret.html#/s:11PolarBleSdk0A15RecordingSecretV3keyAC10Foundation4DataV_tKcfc":{"name":"init(key:)","parent_name":"PolarRecordingSecret"},"Structs/PolarOfflineRecordingTrigger.html#/s:11PolarBleSdk0A23OfflineRecordingTriggerV11triggerModeAA0adefH0Ovp":{"name":"triggerMode","abstract":"The mode of the trigger
","parent_name":"PolarOfflineRecordingTrigger"},"Structs/PolarOfflineRecordingTrigger.html#/s:11PolarBleSdk0A23OfflineRecordingTriggerV15triggerFeaturesSDyAA0A14DeviceDataTypeOAA0A13SensorSettingVSgGvp":{"name":"triggerFeatures","abstract":"Dictionary containing the PolarDeviceDataType
keys for enabled triggers. Dictionary","parent_name":"PolarOfflineRecordingTrigger"},"Structs/PolarOfflineRecordingTrigger.html#/s:11PolarBleSdk0A23OfflineRecordingTriggerV11triggerMode0G8FeaturesAcA0adefH0O_SDyAA0A14DeviceDataTypeOAA0A13SensorSettingVSgGtcfc":{"name":"init(triggerMode:triggerFeatures:)","parent_name":"PolarOfflineRecordingTrigger"},"Structs/PolarOfflineRecordingEntry.html#/s:11PolarBleSdk0A21OfflineRecordingEntryV4pathSSvp":{"name":"path","abstract":"
Recording entry path in device.
","parent_name":"PolarOfflineRecordingEntry"},"Structs/PolarOfflineRecordingEntry.html#/s:11PolarBleSdk0A21OfflineRecordingEntryV4sizeSuvp":{"name":"size","abstract":"Recording size in bytes.
","parent_name":"PolarOfflineRecordingEntry"},"Structs/PolarOfflineRecordingEntry.html#/s:11PolarBleSdk0A21OfflineRecordingEntryV4date10Foundation4DateVvp":{"name":"date","abstract":"The date and time of the recording entry i.e. the moment recording is started
","parent_name":"PolarOfflineRecordingEntry"},"Structs/PolarOfflineRecordingEntry.html#/s:11PolarBleSdk0A21OfflineRecordingEntryV4typeAA0A14DeviceDataTypeOvp":{"name":"type","abstract":"data type of the recording
","parent_name":"PolarOfflineRecordingEntry"},"Structs/PolarOfflineRecordingEntry.html#/s:11PolarBleSdk0A21OfflineRecordingEntryV4path4size4date4typeACSS_Su10Foundation4DateVAA0A14DeviceDataTypeOtcfc":{"name":"init(path:size:date:type:)","parent_name":"PolarOfflineRecordingEntry"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18TrainingBackgroundO10occasionalyA2EmF":{"name":"occasional","parent_name":"TrainingBackground"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18TrainingBackgroundO7regularyA2EmF":{"name":"regular","parent_name":"TrainingBackground"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18TrainingBackgroundO8frequentyA2EmF":{"name":"frequent","parent_name":"TrainingBackground"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18TrainingBackgroundO5heavyyA2EmF":{"name":"heavy","parent_name":"TrainingBackground"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18TrainingBackgroundO7semiProyA2EmF":{"name":"semiPro","parent_name":"TrainingBackground"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18TrainingBackgroundO3proyA2EmF":{"name":"pro","parent_name":"TrainingBackground"},"Structs/PolarFirstTimeUseConfig/TypicalDay.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV10TypicalDayO13mostlySittingyA2EmF":{"name":"mostlySitting","parent_name":"TypicalDay"},"Structs/PolarFirstTimeUseConfig/TypicalDay.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV10TypicalDayO14mostlyStandingyA2EmF":{"name":"mostlyStanding","parent_name":"TypicalDay"},"Structs/PolarFirstTimeUseConfig/TypicalDay.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV10TypicalDayO12mostlyMovingyA2EmF":{"name":"mostlyMoving","parent_name":"TypicalDay"},"Structs/PolarFirstTimeUseConfig/TypicalDay.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV10TypicalDayO11descriptionSSvp":{"name":"description","parent_name":"TypicalDay"},"Structs/PolarFirstTimeUseConfig/Gender.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6GenderO4maleyA2EmF":{"name":"male","parent_name":"Gender"},"Structs/PolarFirstTimeUseConfig/Gender.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6GenderO6femaleyA2EmF":{"name":"female","parent_name":"Gender"},"Structs/PolarFirstTimeUseConfig/Gender.html":{"name":"Gender","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig/TypicalDay.html":{"name":"TypicalDay","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig/TrainingBackground.html":{"name":"TrainingBackground","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6genderAC6GenderOvp":{"name":"gender","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV9birthDate10Foundation0I0Vvp":{"name":"birthDate","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6heightSfvp":{"name":"height","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6weightSfvp":{"name":"weight","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV12maxHeartRateSivp":{"name":"maxHeartRate","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6vo2MaxSivp":{"name":"vo2Max","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV16restingHeartRateSivp":{"name":"restingHeartRate","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV18trainingBackgroundAC08TrainingI0Ovp":{"name":"trainingBackground","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV06deviceE0SSvp":{"name":"deviceTime","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV10typicalDayAC07TypicalI0Ovp":{"name":"typicalDay","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV16sleepGoalMinutesSivp":{"name":"sleepGoalMinutes","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarFirstTimeUseConfig.html#/s:11PolarBleSdk0A18FirstTimeUseConfigV6gender9birthDate6height6weight12maxHeartRate6vo2Max07restingnO018trainingBackground06deviceE010typicalDay16sleepGoalMinutesA2C6GenderO_10Foundation0J0VS2fS3iAC08TrainingT0OSSAC07TypicalW0OSitcfc":{"name":"init(gender:birthDate:height:weight:maxHeartRate:vo2Max:restingHeartRate:trainingBackground:deviceTime:typicalDay:sleepGoalMinutes:)","parent_name":"PolarFirstTimeUseConfig"},"Structs/PolarDiskSpaceData.html#/s:11PolarBleSdk0A13DiskSpaceDataV05totalE0s6UInt64Vvp":{"name":"totalSpace","parent_name":"PolarDiskSpaceData"},"Structs/PolarDiskSpaceData.html#/s:11PolarBleSdk0A13DiskSpaceDataV04freeE0s6UInt64Vvp":{"name":"freeSpace","parent_name":"PolarDiskSpaceData"},"Structs/AutomaticSamples.html#/s:11PolarBleSdk16AutomaticSamplesV3day10Foundation4DateVSgvp":{"name":"day","parent_name":"AutomaticSamples"},"Structs/AutomaticSamples.html#/s:11PolarBleSdk16AutomaticSamplesV3dayAC10Foundation4DateVSg_tcfc":{"name":"init(day:)","parent_name":"AutomaticSamples"},"Structs/LedConfig.html#/s:11PolarBleSdk9LedConfigV07sdkModeD7Enabled03ppigdH0ACSb_Sbtcfc":{"name":"init(sdkModeLedEnabled:ppiModeLedEnabled:)","parent_name":"LedConfig"},"Structs/LedConfig.html":{"name":"LedConfig"},"Structs/AutomaticSamples.html":{"name":"AutomaticSamples","abstract":"Copyright © 2024 Polar Electro Oy. All rights reserved.
"},"Structs/PolarDiskSpaceData.html":{"name":"PolarDiskSpaceData"},"Structs/PolarFirstTimeUseConfig.html":{"name":"PolarFirstTimeUseConfig"},"Structs/PolarOfflineRecordingEntry.html":{"name":"PolarOfflineRecordingEntry","abstract":"Polar offline recording entry container.
"},"Structs/PolarOfflineRecordingTrigger.html":{"name":"PolarOfflineRecordingTrigger","abstract":"Polar offline recording trigger
"},"Structs/PolarRecordingSecret.html":{"name":"PolarRecordingSecret","abstract":"Polar recording secret is used to encrypt the recording.
"},"Structs/PolarSensorSetting.html":{"name":"PolarSensorSetting","abstract":"polar sensor settings class
"},"Structs/PolarUserDeviceSettingsData.html":{"name":"PolarUserDeviceSettingsData"},"Structs/SDLogConfig.html":{"name":"SDLogConfig"},"Structs/UserIdentifierType.html":{"name":"UserIdentifierType","abstract":"Copyright © 2024 Polar Electro Oy. All rights reserved.
"},"Structs/PolarActiveTimeData.html":{"name":"PolarActiveTimeData","abstract":"Copyright © 2024 Polar. All rights reserved.
"},"Structs/PolarActiveTime.html":{"name":"PolarActiveTime"},"Structs/Polar247HrSamplesData.html":{"name":"Polar247HrSamplesData","abstract":"Copyright © 2024 Polar. All rights reserved.
"},"Structs/PolarDistanceData.html":{"name":"PolarDistanceData","abstract":"Distance for given date.
"},"Structs/PolarStepsData.html":{"name":"PolarStepsData","abstract":"Steps count for given date.
"},"Protocols/PolarSleepApi.html#/s:11PolarBleSdk0A8SleepApiP03getD4Data10identifier8fromDate02toJ07RxSwift17PrimitiveSequenceVyAH11SingleTraitOSayAA0adG0C0aD14AnalysisResultVGGSS_10Foundation0J0VAUtF":{"name":"getSleepData(identifier:fromDate:toDate:)","abstract":"Get sleep analysis data for a given period.
","parent_name":"PolarSleepApi"},"Protocols/PolarSdkModeApi.html#/s:11PolarBleSdk0aC7ModeApiP13enableSDKModey7RxSwift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGSSF":{"name":"enableSDKMode(_:)","abstract":"Enables SDK mode.
","parent_name":"PolarSdkModeApi"},"Protocols/PolarSdkModeApi.html#/s:11PolarBleSdk0aC7ModeApiP14disableSDKModey7RxSwift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGSSF":{"name":"disableSDKMode(_:)","abstract":"Disables SDK mode.
","parent_name":"PolarSdkModeApi"},"Protocols/PolarSdkModeApi.html#/s:11PolarBleSdk0aC7ModeApiP16isSDKModeEnabledy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOSbGSSF":{"name":"isSDKModeEnabled(_:)","abstract":"Check if SDK mode currently enabled.
","parent_name":"PolarSdkModeApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP012getAvailableD15StreamDataTypesy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOShyAA0a6DeviceJ4TypeOGGSSF":{"name":"getAvailableOnlineStreamDataTypes(_:)","abstract":"Get the data types available in this device for online streaming
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP21requestStreamSettings_7feature7RxSwift17PrimitiveSequenceVyAF11SingleTraitOAA0A13SensorSettingVGSS_AA0A14DeviceDataTypeOtF":{"name":"requestStreamSettings(_:feature:)","abstract":"Request the stream settings available in current operation mode. This request shall be used before the stream is started","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP25requestFullStreamSettings_7feature7RxSwift17PrimitiveSequenceVyAF11SingleTraitOAA0A13SensorSettingVGSS_AA0A14DeviceDataTypeOtF":{"name":"requestFullStreamSettings(_:feature:)","abstract":"
Request full steam settings capabilities. The request returns the all capabilities of the requested streaming feature not limited by the current operation mode.","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP07startHrE0y7RxSwift10ObservableCySays5UInt8V2hr_SaySiG5rrsMsSb11rrAvailableSb13contactStatusSb0rS9SupportedtGGSSF":{"name":"startHrStreaming(_:)","abstract":"
Start heart rate stream. Heart rate stream is stopped if the connection is closed,","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP08startEcgE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_SayAjK_s5Int32V7voltagetG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startEcgStreaming(_:settings:)","abstract":"
Start the ECG (Electrocardiography) stream. ECG stream is stopped if the connection is closed, error occurs or stream is disposed.
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP08startAccE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_SayAjK_s5Int32V1xAM1yAM1ztG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startAccStreaming(_:settings:)","abstract":"Start ACC (Accelerometer) stream. ACC stream is stopped if the connection is closed, error occurs or stream is disposed.
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP09startGyroE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_SayAjK_Sf1xSf1ySf1ztG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startGyroStreaming(_:settings:)","abstract":"Start Gyro stream. Gyro stream is stopped if the connection is closed, error occurs during start or stream is disposed.
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP017startMagnetometerE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_SayAjK_Sf1xSf1ySf1ztG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startMagnetometerStreaming(_:settings:)","abstract":"Start magnetometer stream. Magnetometer stream is stopped if the connection is closed, error occurs or stream is disposed.
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP08startOhrE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_AA0H8DataTypeO4typeSayAjK_Says5Int32VG14channelSamplestG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startOhrStreaming(_:settings:)","abstract":"Start OHR (Optical heart rate) PPG (Photoplethysmography) stream. PPG stream is stopped if the connection is closed, error occurs or stream is disposed.
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP08startPpgE0_8settings7RxSwift10ObservableCyAA0H8DataTypeO4type_Says6UInt64V9timeStamp_Says5Int32VG14channelSamplestG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startPpgStreaming(_:settings:)","abstract":"Start optical sensor PPG (Photoplethysmography) stream. PPG stream is stopped if the connection is closed, error occurs or stream is disposed.
","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP08startPpiE0y7RxSwift10ObservableCys6UInt64V9timeStamp_SaySi2hr_s6UInt16V6ppInMsAM0Q13ErrorEstimateSi10blockerBitSi17skinContactStatusSi0xY9SupportedtG7samplestGSSF":{"name":"startPpiStreaming(_:)","abstract":"Start PPI (Pulse to Pulse interval) stream.","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP20startOhrPPIStreamingy7RxSwift10ObservableCys6UInt64V9timeStamp_SaySi2hr_s6UInt16V6ppInMsAM0R13ErrorEstimateSi10blockerBitSi17skinContactStatusSi0yZ9SupportedtG7samplestGSSF":{"name":"startOhrPPIStreaming(_:)","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP016startTemperatureE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_SayAjK_Sf11temperaturetG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startTemperatureStreaming(_:settings:)","abstract":"
Start temperature stream. Temperature stream is stopped if the connection is closed,","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOnlineStreamingApi.html#/s:11PolarBleSdk0A18OnlineStreamingApiP013startPressureE0_8settings7RxSwift10ObservableCys6UInt64V9timeStamp_SayAjK_Sf8pressuretG7samplestGSS_AA0A13SensorSettingVtF":{"name":"startPressureStreaming(_:settings:)","abstract":"
Start pressure stream. Pressure stream is stopped if the connection is closed,","parent_name":"PolarOnlineStreamingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP012getAvailabledE9DataTypesy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOShyAA0a6DeviceI4TypeOGGSSF":{"name":"getAvailableOfflineRecordingDataTypes(_:)","abstract":"
Get the data types available in this device for offline recording
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP07requestdE8Settings_7feature7RxSwift17PrimitiveSequenceVyAF11SingleTraitOAA0A13SensorSettingVGSS_AA0A14DeviceDataTypeOtF":{"name":"requestOfflineRecordingSettings(_:feature:)","abstract":"Request the offline recording settings available in current operation mode. This request shall be used before the offline recording is started","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP011requestFulldE8Settings_7feature7RxSwift17PrimitiveSequenceVyAF11SingleTraitOAA0A13SensorSettingVGSS_AA0A14DeviceDataTypeOtF":{"name":"requestFullOfflineRecordingSettings(_:feature:)","abstract":"
Request all the settings available in the device. The request returns the all capabilities of the requested streaming feature not limited by the current operation mode.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP03getdE6Statusy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOSDyAA0A14DeviceDataTypeOSbGGSSF":{"name":"getOfflineRecordingStatus(_:)","abstract":"Get status of offline recordings.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP04listD10Recordingsy7RxSwift10ObservableCyAA0adE5EntryVGSSF":{"name":"listOfflineRecordings(_:)","abstract":"List offline recordings stored in the device.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP03getD6Record_5entry6secret7RxSwift17PrimitiveSequenceVyAG11SingleTraitOAA0adE4DataOGSS_AA0adE5EntryVAA0aE6SecretVSgtF":{"name":"getOfflineRecord(_:entry:secret:)","abstract":"Fetch recording from the device.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP06getSubE5Count10identifier5entry7RxSwift17PrimitiveSequenceVyAG11SingleTraitOSiGSS_AA0adE5EntryVtF":{"name":"getSubRecordingCount(identifier:entry:)","abstract":"Fetch number sub recordings in recording from the device.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP09listSplitD10Recordingsy7RxSwift10ObservableCyAA0adE5EntryVGSSF":{"name":"listSplitOfflineRecordings(_:)","abstract":"List split offline recordings stored in the device.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP08getSplitD6Record_5entry6secret7RxSwift17PrimitiveSequenceVyAG11SingleTraitOAA0adE4DataOGSS_AA0adE5EntryVAA0aE6SecretVSgtF":{"name":"getSplitOfflineRecord(_:entry:secret:)","abstract":"Fetch split recording from the device.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP06removeD6Record_5entry7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_AA0adE5EntryVtF":{"name":"removeOfflineRecord(_:entry:)","abstract":"Removes offline recording from the device
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP05startdE0_7feature8settings6secret7RxSwift17PrimitiveSequenceVyAH16CompletableTraitOs5NeverOGSS_AA0A14DeviceDataTypeOAA0A13SensorSettingVSgAA0aE6SecretVSgtF":{"name":"startOfflineRecording(_:feature:settings:secret:)","abstract":"Start offline recording.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP04stopdE0_7feature7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_AA0A14DeviceDataTypeOtF":{"name":"stopOfflineRecording(_:feature:)","abstract":"Request to stop offline recording.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP03setdE7Trigger_7trigger6secret7RxSwift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_AA0adeH0VAA0aE6SecretVSgtF":{"name":"setOfflineRecordingTrigger(_:trigger:secret:)","abstract":"Sets the offline recording triggers for a given Polar device. The offline recording can be started automatically in the device by setting the triggers.","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarOfflineRecordingApi.html#/s:11PolarBleSdk0A19OfflineRecordingApiP03getdE12TriggerSetupy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOAA0adeH0VGSSF":{"name":"getOfflineRecordingTriggerSetup(_:)","abstract":"
Retrieves the current offline recording trigger setup in the device.
","parent_name":"PolarOfflineRecordingApi"},"Protocols/PolarH10OfflineExerciseApi.html#/s:11PolarBleSdk0A21H10OfflineExerciseApiP14startRecording_10exerciseId8interval10sampleType7RxSwift17PrimitiveSequenceVyAH16CompletableTraitOs5NeverOGSS_SSAA0I8IntervalOAA06SampleN0OtF":{"name":"startRecording(_:exerciseId:interval:sampleType:)","abstract":"Request start recording. Supported only by Polar H10. Requires polarFileTransfer
feature.
","parent_name":"PolarH10OfflineExerciseApi"},"Protocols/PolarH10OfflineExerciseApi.html#/s:11PolarBleSdk0A21H10OfflineExerciseApiP13stopRecordingy7RxSwift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGSSF":{"name":"stopRecording(_:)","abstract":"Request stop for current recording. Supported only by Polar H10. Requires polarFileTransfer
feature.
","parent_name":"PolarH10OfflineExerciseApi"},"Protocols/PolarH10OfflineExerciseApi.html#/s:11PolarBleSdk0A21H10OfflineExerciseApiP22requestRecordingStatusy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOSb7ongoing_SS7entryIdtGSSF":{"name":"requestRecordingStatus(_:)","abstract":"Request current recording status. Supported only by Polar H10. Requires polarFileTransfer
feature.
","parent_name":"PolarH10OfflineExerciseApi"},"Protocols/PolarH10OfflineExerciseApi.html#/s:11PolarBleSdk0A21H10OfflineExerciseApiP011fetchStoredF4Listy7RxSwift10ObservableCySS4path_10Foundation4DateV4dateSS7entryIdtGSSF":{"name":"fetchStoredExerciseList(_:)","abstract":"Api for fetching stored exercises list from Polar H10 device. Requires polarFileTransfer
feature. This API is working for Polar OH1 and Polar Verity Sense devices too, however in those devices recording of exercise requires that sensor is registered to Polar Flow account.
","parent_name":"PolarH10OfflineExerciseApi"},"Protocols/PolarH10OfflineExerciseApi.html#/s:11PolarBleSdk0A21H10OfflineExerciseApiP05fetchF0_5entry7RxSwift17PrimitiveSequenceVyAF11SingleTraitOs6UInt32V8interval_SayALG7samplestGSS_SS4path_10Foundation4DateV4dateSS0I2IdttF":{"name":"fetchExercise(_:entry:)","abstract":"Api for fetching a single exercise from Polar H10 device. Requires polarFileTransfer
feature. This API is working for Polar OH1 and Polar Verity Sense devices too, however in those devices recording of exercise requires that sensor is registered to Polar Flow account.
","parent_name":"PolarH10OfflineExerciseApi"},"Protocols/PolarH10OfflineExerciseApi.html#/s:11PolarBleSdk0A21H10OfflineExerciseApiP06removeF0_5entry7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_SS4path_10Foundation4DateV4dateSS0I2IdttF":{"name":"removeExercise(_:entry:)","abstract":"Api for removing single exercise from Polar H10 device. Requires polarFileTransfer
feature. This API is working for Polar OH1 and Polar Verity Sense devices too, however in those devices recording of exercise requires that sensor is registered to Polar Flow account.
","parent_name":"PolarH10OfflineExerciseApi"},"Protocols/PolarFirmwareUpdateApi.html#/s:11PolarBleSdk0A17FirmwareUpdateApiP05checkdE0y7RxSwift10ObservableCyAA05CheckdE6StatusOGSSF":{"name":"checkFirmwareUpdate(_:)","abstract":"Checks firmware update to given device.
","parent_name":"PolarFirmwareUpdateApi"},"Protocols/PolarFirmwareUpdateApi.html#/s:11PolarBleSdk0A17FirmwareUpdateApiP06updateD0y7RxSwift10ObservableCyAA0dE6StatusOGSSF":{"name":"updateFirmware(_:)","abstract":"Updates firmware to given device.
","parent_name":"PolarFirmwareUpdateApi"},"Protocols/PolarBleApiLogger.html#/s:11PolarBleSdk0aB9ApiLoggerP7messageyySSF":{"name":"message(_:)","abstract":"log message from sdk
","parent_name":"PolarBleApiLogger"},"Protocols/PolarBleApiSdkModeFeatureObserver.html#/s:11PolarBleSdk0ab3ApiC19ModeFeatureObserverP03sdkeF9AvailableyySSF":{"name":"sdkModeFeatureAvailable(_:)","abstract":"sdk mode feature available in this device and ready for usage callback
","parent_name":"PolarBleApiSdkModeFeatureObserver"},"Protocols/PolarBleApiDeviceFeaturesObserver.html#/s:11PolarBleSdk0aB25ApiDeviceFeaturesObserverP14hrFeatureReadyyySSF":{"name":"hrFeatureReady(_:)","abstract":"Device HR feature is ready. HR transmission is starting in a short while.
","parent_name":"PolarBleApiDeviceFeaturesObserver"},"Protocols/PolarBleApiDeviceFeaturesObserver.html#/s:11PolarBleSdk0aB25ApiDeviceFeaturesObserverP15ftpFeatureReadyyySSF":{"name":"ftpFeatureReady(_:)","abstract":"Device file transfer protocol is ready.","parent_name":"PolarBleApiDeviceFeaturesObserver"},"Protocols/PolarBleApiDeviceFeaturesObserver.html#/s:11PolarBleSdk0aB25ApiDeviceFeaturesObserverP09streamingF5Ready_0hF0ySS_ShyAA0aE8DataTypeOGtF":{"name":"streamingFeaturesReady(_:streamingFeatures:)","abstract":"
feature ready callback
","parent_name":"PolarBleApiDeviceFeaturesObserver"},"Protocols/PolarBleApiDeviceFeaturesObserver.html#/s:11PolarBleSdk0aB25ApiDeviceFeaturesObserverP03bleC12FeatureReady_7featureySS_AA0abcI0OtF":{"name":"bleSdkFeatureReady(_:feature:)","abstract":"The feature is available in this device and it is ready. Called only for the features which are specified in [PolarBleApi] construction.","parent_name":"PolarBleApiDeviceFeaturesObserver"},"Protocols/PolarBleApiDeviceHrObserver.html#/s:11PolarBleSdk0aB19ApiDeviceHrObserverP15hrValueReceived_4dataySS_s5UInt8V0H0_SaySiG3rrsAI0M2MsSb7contactSb0O9SupportedttF":{"name":"hrValueReceived(_:data:)","abstract":"
HR notification received. Notice when using OH1 and PPI stream is started this callback will produce 0 hr.
","parent_name":"PolarBleApiDeviceHrObserver"},"Protocols/PolarBleApiDeviceInfoObserver.html#/s:11PolarBleSdk0aB21ApiDeviceInfoObserverP20batteryLevelReceived_0hI0ySS_SutF":{"name":"batteryLevelReceived(_:batteryLevel:)","abstract":"Battery level received from device.
","parent_name":"PolarBleApiDeviceInfoObserver"},"Protocols/PolarBleApiDeviceInfoObserver.html#/s:11PolarBleSdk0aB21ApiDeviceInfoObserverP22disInformationReceived_4uuid5valueySS_So6CBUUIDCSStF":{"name":"disInformationReceived(_:uuid:value:)","abstract":"Received DIS info.
","parent_name":"PolarBleApiDeviceInfoObserver"},"Protocols/PolarBleApiDeviceInfoObserver.html#/s:11PolarBleSdk0aB21ApiDeviceInfoObserverP39disInformationReceivedWithKeysAsStrings_3key5valueySS_S2StF":{"name":"disInformationReceivedWithKeysAsStrings(_:key:value:)","abstract":"Received DIS info with String keys.
","parent_name":"PolarBleApiDeviceInfoObserver"},"Protocols/PolarBleApiPowerStateObserver.html#/s:11PolarBleSdk0aB21ApiPowerStateObserverP03bleE2OnyyF":{"name":"blePowerOn()","abstract":"Ble powered on event.
","parent_name":"PolarBleApiPowerStateObserver"},"Protocols/PolarBleApiPowerStateObserver.html#/s:11PolarBleSdk0aB21ApiPowerStateObserverP03bleE3OffyyF":{"name":"blePowerOff()","abstract":"Ble powered off event, no further actions are needed from the application.
","parent_name":"PolarBleApiPowerStateObserver"},"Protocols/PolarBleApiObserver.html#/s:11PolarBleSdk0aB11ApiObserverP16deviceConnectingyySS0F2Id_10Foundation4UUIDV7addressSi4rssiSS4nameSb11connectablet_tF":{"name":"deviceConnecting(_:)","abstract":"Callback when connection attempt is started to device
","parent_name":"PolarBleApiObserver"},"Protocols/PolarBleApiObserver.html#/s:11PolarBleSdk0aB11ApiObserverP15deviceConnectedyySS0F2Id_10Foundation4UUIDV7addressSi4rssiSS4nameSb11connectablet_tF":{"name":"deviceConnected(_:)","abstract":"Device connnection has been established.
","parent_name":"PolarBleApiObserver"},"Protocols/PolarBleApiObserver.html#/s:11PolarBleSdk0aB11ApiObserverP18deviceDisconnected_12pairingErrorySS0F2Id_10Foundation4UUIDV7addressSi4rssiSS4nameSb11connectablet_SbtF":{"name":"deviceDisconnected(_:pairingError:)","abstract":"Connection lost to device.","parent_name":"PolarBleApiObserver"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP7cleanupyyF":{"name":"cleanup()","abstract":"
remove all known devices, which are not in use
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP11polarFilteryySbF":{"name":"polarFilter(_:)","abstract":"Enable or disable polar filter.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP24startAutoConnectToDevice_7service05polarI4Type7RxSwift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSi_So6CBUUIDCSgSSSgtF":{"name":"startAutoConnectToDevice(_:service:polarDeviceType:)","abstract":"Start connecting to a nearby device. PolarBleApiObservers
polarDeviceConnected is","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP15connectToDeviceyySSKF":{"name":"connectToDevice(_:)","abstract":"
Request a connection to a Polar device. Invokes PolarBleApiObservers
polarDeviceConnected.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP20disconnectFromDeviceyySSKF":{"name":"disconnectFromDevice(_:)","abstract":"Disconnect from the current Polar device.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP15searchForDevice7RxSwift10ObservableCySS8deviceId_10Foundation4UUIDV7addressSi4rssiSS4nameSb11connectabletGyF":{"name":"searchForDevice()","abstract":"Start searching for Polar device(s)
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP014startListenForA12HrBroadcastsy7RxSwift10ObservableCySS8deviceId_10Foundation4UUIDV7addressSi4rssiSS4nameSb11connectablet0M4Info_s5UInt8V2hrSb13batteryStatustGShySSGSgF":{"name":"startListenForPolarHrBroadcasts(_:)","abstract":"Start listening the heart rate from Polar devices when subscribed.","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP14isFeatureReady_7featureSbSS_AA0abcF0OtF":{"name":"isFeatureReady(_:feature:)","abstract":"
Check if the feature is ready.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP12setLocalTime_4time4zone7RxSwift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_10Foundation4DateVAO0G4ZoneVtF":{"name":"setLocalTime(_:time:zone:)","abstract":"Set local time to device.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP12getLocalTimey7RxSwift17PrimitiveSequenceVyAE11SingleTraitO10Foundation4DateVGSSF":{"name":"getLocalTime(_:)","abstract":"Get current time in device. Note, the H10 is not supporting time read.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP12getDiskSpacey7RxSwift17PrimitiveSequenceVyAE11SingleTraitOAA0afG4DataVGSSF":{"name":"getDiskSpace(_:)","abstract":"Get PolarDiskSpaceData
from device.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP12setLedConfig_03ledG07RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_AA0fG0VtF":{"name":"setLedConfig(_:ledConfig:)","abstract":"Set [LedConfig] to enable or disable blinking LEDs (Verity Sense 2.2.1+).
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP14doFactoryReset_26preservePairingInformation7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_SbtF":{"name":"doFactoryReset(_:preservePairingInformation:)","abstract":"Perform factory reset to given device.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP9doRestart_26preservePairingInformation7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_SbtF":{"name":"doRestart(_:preservePairingInformation:)","abstract":"Perform restart to given device.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP21getSDLogConfigurationy7RxSwift17PrimitiveSequenceVyAE11SingleTraitOAA0F6ConfigVGSSF":{"name":"getSDLogConfiguration(_:)","abstract":"Get SD log configuration from a device (SDLOGS.BPB)
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP21setSDLogConfiguration_03logG07RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_AA0F6ConfigVtF":{"name":"setSDLogConfiguration(_:logConfiguration:)","abstract":"Set SD log configuration to a device (SDLOGS.BPB)
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP14doFirstTimeUse_9ftuConfig7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_AA0afghJ0VtF":{"name":"doFirstTimeUse(_:ftuConfig:)","abstract":"Set [FtuConfig] for device
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP17setWarehouseSleep_06enablefG07RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_SbSgtF":{"name":"setWarehouseSleep(_:enableWarehouseSleep:)","abstract":"Deprecated. Use “func setWarehouseSleep(_ identifier: String)” instead.","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP17setWarehouseSleepy7RxSwift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGSSF":{"name":"setWarehouseSleep(_:)","abstract":"
Set the device to warehouse sleep state. Factory reset will be performed in order to enable the setting.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP03getA18UserDeviceSettings10identifier7RxSwift17PrimitiveSequenceVyAF11SingleTraitOAA0afgH0C0afgH6ResultVGSS_tF":{"name":"getPolarUserDeviceSettings(identifier:)","abstract":"Get Device User Settings to a device from proto in device (UDEVSET.BPB)
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP03setA18UserDeviceSettings_05polarfgH07RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_AA0afgH0CSgtF":{"name":"setPolarUserDeviceSettings(_:polarUserDeviceSettings:)","abstract":"Set Device User Settings to a device (UDEVSET.BPB)
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP22deleteStoredDeviceData_8dataType5until7RxSwift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_AA0afhJ0C0fhJ0O10Foundation4DateVSgtF":{"name":"deleteStoredDeviceData(_:dataType:until:)","abstract":"Delete data [PolarStoredDataType] from a device.
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP8observerAA0abD8Observer_pSgvp":{"name":"observer","abstract":"Common GAP (Generic access profile) observer
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP18deviceInfoObserverAA0abd6DevicefG0_pSgvp":{"name":"deviceInfoObserver","abstract":"Device info observer for DIS (Device information service) and BAS (Battery service) GATT (Generic attributes) client
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP16deviceHrObserverAA0abd6DevicefG0_pSgvp":{"name":"deviceHrObserver","abstract":"Device observer for HR GATT client
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP18powerStateObserverAA0abd5PowerfG0_pSgvp":{"name":"powerStateObserver","abstract":"Bluetooth power state observer
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP22deviceFeaturesObserverAA0abd6DevicefG0_pSgvp":{"name":"deviceFeaturesObserver","abstract":"Device features ready observer
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP22sdkModeFeatureObserverAA0abdcfgH0_pSgvp":{"name":"sdkModeFeatureObserver","abstract":"SDK mode feature available in the device and ready observer
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP02isB7PoweredSbvp":{"name":"isBlePowered","abstract":"Helper to check if Ble is currently powered
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP6loggerAA0abD6Logger_pSgvp":{"name":"logger","abstract":"optional logger set to get traces from sdk
","parent_name":"PolarBleApi"},"Protocols/PolarBleApi.html#/s:11PolarBleSdk0aB3ApiP21automaticReconnectionSbvp":{"name":"automaticReconnection","abstract":"optional disable or enable automatic reconnection, by default it is enabled
","parent_name":"PolarBleApi"},"Protocols/PolarActivityApi.html#/s:11PolarBleSdk0A11ActivityApiP8getSteps10identifier8fromDate02toJ07RxSwift17PrimitiveSequenceVyAH11SingleTraitOSayAA0aG4DataVGGSS_10Foundation0J0VAStF":{"name":"getSteps(identifier:fromDate:toDate:)","abstract":"Get steps for a given period.
","parent_name":"PolarActivityApi"},"Protocols/PolarActivityApi.html#/s:11PolarBleSdk0A11ActivityApiP11getDistance10identifier8fromDate02toJ07RxSwift17PrimitiveSequenceVyAH11SingleTraitOSayAA0aG4DataVGGSS_10Foundation0J0VAStF":{"name":"getDistance(identifier:fromDate:toDate:)","abstract":"Get distance for a given period.
","parent_name":"PolarActivityApi"},"Protocols/PolarActivityApi.html#/s:11PolarBleSdk0A11ActivityApiP13getActiveTime10identifier8fromDate02toK07RxSwift17PrimitiveSequenceVyAH11SingleTraitOSayAA0agH4DataVGGSS_10Foundation0K0VAStF":{"name":"getActiveTime(identifier:fromDate:toDate:)","abstract":"Get active time for a given period.
","parent_name":"PolarActivityApi"},"Protocols/PolarActivityApi.html#/s:11PolarBleSdk0A11ActivityApiP15get247HrSamples10identifier8fromDate02toK07RxSwift17PrimitiveSequenceVyAH11SingleTraitOSayAA08Polar247gH4DataVGGSS_10Foundation0K0VAStF":{"name":"get247HrSamples(identifier:fromDate:toDate:)","abstract":"Get 24/7 heart rate samples for a given period.
","parent_name":"PolarActivityApi"},"Protocols/PolarActivityApi.html":{"name":"PolarActivityApi","abstract":"Protocol defining methods to get steps for a given period.
"},"Protocols/PolarBleApi.html":{"name":"PolarBleApi","abstract":"API.
"},"Protocols/PolarBleApiObserver.html":{"name":"PolarBleApiObserver","abstract":"Polar Ble API connection observer.
"},"Protocols/PolarBleApiPowerStateObserver.html":{"name":"PolarBleApiPowerStateObserver","abstract":"Bluetooth state observer.
"},"Protocols/PolarBleApiDeviceInfoObserver.html":{"name":"PolarBleApiDeviceInfoObserver","abstract":"Device info observer.
"},"Protocols/PolarBleApiDeviceHrObserver.html":{"name":"PolarBleApiDeviceHrObserver","abstract":"Heart rate observer
"},"Protocols/PolarBleApiDeviceFeaturesObserver.html":{"name":"PolarBleApiDeviceFeaturesObserver","abstract":"Data client observer
"},"Protocols/PolarBleApiSdkModeFeatureObserver.html":{"name":"PolarBleApiSdkModeFeatureObserver","abstract":"SDK Mode observer
"},"Protocols/PolarBleApiLogger.html":{"name":"PolarBleApiLogger","abstract":"logger observer
"},"Protocols/PolarFirmwareUpdateApi.html":{"name":"PolarFirmwareUpdateApi"},"Protocols/PolarH10OfflineExerciseApi.html":{"name":"PolarH10OfflineExerciseApi","abstract":"H10 Exercise recording API.
"},"Protocols/PolarOfflineRecordingApi.html":{"name":"PolarOfflineRecordingApi","abstract":"Offline recording API.
"},"Protocols/PolarOnlineStreamingApi.html":{"name":"PolarOnlineStreamingApi","abstract":"Online steaming API.
"},"Protocols/PolarSdkModeApi.html":{"name":"PolarSdkModeApi","abstract":"Polar SDK mode API
"},"Protocols/PolarSleepApi.html":{"name":"PolarSleepApi","abstract":"Protocol defining methods to get Polar Sleep Data
"},"Extensions/PrimitiveSequence.html#/s:7RxSwift17PrimitiveSequenceV11PolarBleSdkAA11SingleTraitORszrlE13asCompletableACyAA0kI0Os5NeverOGyF":{"name":"asCompletable()","parent_name":"PrimitiveSequence"},"Extensions.html#/c:@M@PolarBleSdk@objc(cs)PolarBleApiImpl":{"name":"PolarBleApiImpl"},"Extensions/PrimitiveSequence.html":{"name":"PrimitiveSequence"},"Enums/AutomaticSampleTriggerType.html#/s:11PolarBleSdk26AutomaticSampleTriggerTypeO12highActivityyA2CmF":{"name":"highActivity","parent_name":"AutomaticSampleTriggerType"},"Enums/AutomaticSampleTriggerType.html#/s:11PolarBleSdk26AutomaticSampleTriggerTypeO11lowActivityyA2CmF":{"name":"lowActivity","parent_name":"AutomaticSampleTriggerType"},"Enums/AutomaticSampleTriggerType.html#/s:11PolarBleSdk26AutomaticSampleTriggerTypeO5timedyA2CmF":{"name":"timed","parent_name":"AutomaticSampleTriggerType"},"Enums/AutomaticSampleTriggerType.html#/s:11PolarBleSdk26AutomaticSampleTriggerTypeO6manualyA2CmF":{"name":"manual","parent_name":"AutomaticSampleTriggerType"},"Enums/PolarOfflineRecordingTriggerMode.html#/s:11PolarBleSdk0A27OfflineRecordingTriggerModeO15triggerDisabledyA2CmF":{"name":"triggerDisabled","parent_name":"PolarOfflineRecordingTriggerMode"},"Enums/PolarOfflineRecordingTriggerMode.html#/s:11PolarBleSdk0A27OfflineRecordingTriggerModeO18triggerSystemStartyA2CmF":{"name":"triggerSystemStart","parent_name":"PolarOfflineRecordingTriggerMode"},"Enums/PolarOfflineRecordingTriggerMode.html#/s:11PolarBleSdk0A27OfflineRecordingTriggerModeO20triggerExerciseStartyA2CmF":{"name":"triggerExerciseStart","parent_name":"PolarOfflineRecordingTriggerMode"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO03accdeF0yACs6UInt64V9timeStamp_SayAfG_s5Int32V1xAI1yAI1ztG7samplest_10Foundation4DateVAA0A13SensorSettingVtcACmF":{"name":"accOfflineRecordingData(_:startTime:settings:)","parent_name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO04gyrodeF0yACs6UInt64V9timeStamp_SayAfG_Sf1xSf1ySf1ztG7samplest_10Foundation4DateVAA0A13SensorSettingVtcACmF":{"name":"gyroOfflineRecordingData(_:startTime:settings:)","parent_name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO03magdeF0yACs6UInt64V9timeStamp_SayAfG_Sf1xSf1ySf1ztG7samplest_10Foundation4DateVAA0A13SensorSettingVtcACmF":{"name":"magOfflineRecordingData(_:startTime:settings:)","parent_name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO03ppgdeF0yAcA03PpgF4TypeO4type_Says6UInt64V9timeStamp_Says5Int32VG14channelSamplestG7samplest_10Foundation4DateVAA0A13SensorSettingVtcACmF":{"name":"ppgOfflineRecordingData(_:startTime:settings:)","parent_name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO03ppideF0yACs6UInt64V9timeStamp_SaySi2hr_s6UInt16V6ppInMsAJ0M13ErrorEstimateSi10blockerBitSi17skinContactStatusSi0tU9SupportedtG7samplest_10Foundation4DateVtcACmF":{"name":"ppiOfflineRecordingData(_:startTime:)","parent_name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO02hrdeF0yACSays5UInt8V0G0_SaySiG5rrsMsSb11rrAvailableSb13contactStatusSb0mN9SupportedtG_10Foundation4DateVtcACmF":{"name":"hrOfflineRecordingData(_:startTime:)","parent_name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingData.html#/s:11PolarBleSdk0A20OfflineRecordingDataO011temperaturedeF0yACs6UInt64V9timeStamp_SayAfG_Sf0G0tG7samplest_10Foundation4DateVtcACmF":{"name":"temperatureOfflineRecordingData(_:startTime:)","parent_name":"PolarOfflineRecordingData"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO010fetchingFwE7PackageyACSS_tcACmF":{"name":"fetchingFwUpdatePackage(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO020preparingDeviceForFwE0yACSS_tcACmF":{"name":"preparingDeviceForFwUpdate(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO09writingFwE7PackageyACSS_tcACmF":{"name":"writingFwUpdatePackage(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO012finalizingFwE0yACSS_tcACmF":{"name":"finalizingFwUpdate(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO02fwE21CompletedSuccessfullyyACSS_tcACmF":{"name":"fwUpdateCompletedSuccessfully(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO02fwE12NotAvailableyACSS_tcACmF":{"name":"fwUpdateNotAvailable(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/FirmwareUpdateStatus.html#/s:11PolarBleSdk20FirmwareUpdateStatusO02fwE6FailedyACSS_tcACmF":{"name":"fwUpdateFailed(details:)","parent_name":"FirmwareUpdateStatus"},"Enums/CheckFirmwareUpdateStatus.html#/s:11PolarBleSdk25CheckFirmwareUpdateStatusO07checkFwF9AvailableyACSS_tcACmF":{"name":"checkFwUpdateAvailable(version:)","parent_name":"CheckFirmwareUpdateStatus"},"Enums/CheckFirmwareUpdateStatus.html#/s:11PolarBleSdk25CheckFirmwareUpdateStatusO07checkFwF12NotAvailableyACSS_tcACmF":{"name":"checkFwUpdateNotAvailable(details:)","parent_name":"CheckFirmwareUpdateStatus"},"Enums/CheckFirmwareUpdateStatus.html#/s:11PolarBleSdk25CheckFirmwareUpdateStatusO07checkFwF6FailedyACSS_tcACmF":{"name":"checkFwUpdateFailed(details:)","parent_name":"CheckFirmwareUpdateStatus"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO22notificationNotEnabledyA2CmF":{"name":"notificationNotEnabled","abstract":"GATT characteristic notification not enabled
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO15serviceNotFoundyA2CmF":{"name":"serviceNotFound","abstract":"GATT service not found
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO18deviceNotConnectedyA2CmF":{"name":"deviceNotConnected","abstract":"Device state != Connected
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO14deviceNotFoundyA2CmF":{"name":"deviceNotFound","abstract":"Device not found
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO21operationNotSupportedyA2CmF":{"name":"operationNotSupported","abstract":"Requested operation is not supported
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO19messageEncodeFailedyA2CmF":{"name":"messageEncodeFailed","abstract":"Google protocol buffers encode failed
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO19messageDecodeFailedyA2CmF":{"name":"messageDecodeFailed","abstract":"Google protocol buffers decode failed
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO20dateTimeFormatFailedyACSS_tcACmF":{"name":"dateTimeFormatFailed(description:)","abstract":"String to date time formatting failed
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO22unableToStartStreamingyA2CmF":{"name":"unableToStartStreaming","abstract":"Failed to start streaming
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO15invalidArgumentyACSS_tcACmF":{"name":"invalidArgument(description:)","abstract":"invalid argument
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO05polarbC17InternalExceptionyACSS_tcACmF":{"name":"polarBleSdkInternalException(description:)","abstract":"Polar BLE SDK internal exception indicating something went wrong in SDK internal logic
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO11deviceErroryACSS_tcACmF":{"name":"deviceError(description:)","abstract":"Error on device operation
","parent_name":"PolarErrors"},"Enums/PolarErrors.html#/s:11PolarBleSdk0A6ErrorsO26polarOfflineRecordingErroryACSS_tcACmF":{"name":"polarOfflineRecordingError(description:)","abstract":"Error related to offline recording
","parent_name":"PolarErrors"},"Enums/SampleType.html#/s:11PolarBleSdk10SampleTypeO2hryA2CmF":{"name":"hr","abstract":"recording type to use is hr in BPM
","parent_name":"SampleType"},"Enums/SampleType.html#/s:11PolarBleSdk10SampleTypeO2rryA2CmF":{"name":"rr","abstract":"recording type to use is rr interval
","parent_name":"SampleType"},"Enums/RecordingInterval.html#/s:11PolarBleSdk17RecordingIntervalO11interval_1syA2CmF":{"name":"interval_1s","parent_name":"RecordingInterval"},"Enums/RecordingInterval.html#/s:11PolarBleSdk17RecordingIntervalO11interval_5syA2CmF":{"name":"interval_5s","parent_name":"RecordingInterval"},"Enums/PpgDataType.html#/s:11PolarBleSdk11PpgDataTypeO13ppg3_ambient1yA2CmF":{"name":"ppg3_ambient1","abstract":"3 ppg + 1 ambient
","parent_name":"PpgDataType"},"Enums/PpgDataType.html#/s:11PolarBleSdk11PpgDataTypeO5ppg17yA2CmF":{"name":"ppg17","abstract":"16 ppg + 1 status
","parent_name":"PpgDataType"},"Enums/PpgDataType.html#/s:11PolarBleSdk11PpgDataTypeO7unknownyA2CmF":{"name":"unknown","parent_name":"PpgDataType"},"Enums/OhrDataType.html#/s:11PolarBleSdk11OhrDataTypeO13ppg3_ambient1yA2CmF":{"name":"ppg3_ambient1","abstract":"3 ppg + 1 ambient
","parent_name":"OhrDataType"},"Enums/OhrDataType.html#/s:11PolarBleSdk11OhrDataTypeO7unknownyA2CmF":{"name":"unknown","parent_name":"OhrDataType"},"Enums/PolarActivityDataType.html#/s:11PolarBleSdk0A16ActivityDataTypeO5SLEEPyA2CmF":{"name":"SLEEP","parent_name":"PolarActivityDataType"},"Enums/PolarActivityDataType.html#/s:11PolarBleSdk0A16ActivityDataTypeO5STEPSyA2CmF":{"name":"STEPS","parent_name":"PolarActivityDataType"},"Enums/PolarActivityDataType.html#/s:11PolarBleSdk0A16ActivityDataTypeO8CALORIESyA2CmF":{"name":"CALORIES","parent_name":"PolarActivityDataType"},"Enums/PolarActivityDataType.html#/s:11PolarBleSdk0A16ActivityDataTypeO10HR_SAMPLESyA2CmF":{"name":"HR_SAMPLES","parent_name":"PolarActivityDataType"},"Enums/PolarActivityDataType.html#/s:11PolarBleSdk0A16ActivityDataTypeO4NONEyA2CmF":{"name":"NONE","parent_name":"PolarActivityDataType"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO10feature_hryA2CmF":{"name":"feature_hr","abstract":"Hr feature to receive hr and rr data from Polar or any other BLE device via standard HR BLE service
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO19feature_device_infoyA2CmF":{"name":"feature_device_info","abstract":"Device information feature to receive sw information from Polar or any other BLE device
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO20feature_battery_infoyA2CmF":{"name":"feature_battery_info","abstract":"Feature to receive battery level info from Polar or any other BLE device
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO30feature_polar_online_streamingyA2CmF":{"name":"feature_polar_online_streaming","abstract":"Polar sensor streaming feature to stream live online data. For example hr, ecg, acc, ppg, ppi, etc…
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO31feature_polar_offline_recordingyA2CmF":{"name":"feature_polar_offline_recording","abstract":"Polar offline recording feature to record offline data to Polar device without continuous BLE connection.
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO36feature_polar_h10_exercise_recordingyA2CmF":{"name":"feature_polar_h10_exercise_recording","abstract":"H10 exercise recording feature to record exercise data to Polar H10 device without continuous BLE connection.
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO31feature_polar_device_time_setupyA2CmF":{"name":"feature_polar_device_time_setup","abstract":"Feature to read and set device time in Polar device
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO22feature_polar_sdk_modeyA2CmF":{"name":"feature_polar_sdk_mode","abstract":"In SDK mode the wider range of capabilities are available for the online stream or offline recoding than in normal operation mode.
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO27feature_polar_led_animationyA2CmF":{"name":"feature_polar_led_animation","abstract":"Feature to enable or disable SDK mode blinking LED animation.
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO29feature_polar_firmware_updateyA2CmF":{"name":"feature_polar_firmware_update","abstract":"Firmware update for Polar device.
","parent_name":"PolarBleSdkFeature"},"Enums/PolarBleSdkFeature.html#/s:11PolarBleSdk0abC7FeatureO27feature_polar_activity_datayA2CmF":{"name":"feature_polar_activity_data","abstract":"Feature to receive activity data from Polar device.
","parent_name":"PolarBleSdkFeature"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO3ecgyA2CmF":{"name":"ecg","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO3accyA2CmF":{"name":"acc","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO3ppgyA2CmF":{"name":"ppg","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO3ppiyA2CmF":{"name":"ppi","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO4gyroyA2CmF":{"name":"gyro","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO12magnetometeryA2CmF":{"name":"magnetometer","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO2hryA2CmF":{"name":"hr","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO11temperatureyA2CmF":{"name":"temperature","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html#/s:11PolarBleSdk0A14DeviceDataTypeO8pressureyA2CmF":{"name":"pressure","parent_name":"PolarDeviceDataType"},"Enums/PolarDeviceDataType.html":{"name":"PolarDeviceDataType","abstract":"Data types available in Polar devices for online streaming or offline recording.
"},"Enums/PolarBleSdkFeature.html":{"name":"PolarBleSdkFeature","abstract":"Features available in Polar BLE SDK library
"},"Enums/PolarActivityDataType.html":{"name":"PolarActivityDataType","abstract":"The activity recording data types available in Polar devices.
"},"Enums/OhrDataType.html":{"name":"OhrDataType","abstract":"OHR data source enum
"},"Enums/PpgDataType.html":{"name":"PpgDataType","abstract":"PPG data source enum
"},"Enums/RecordingInterval.html":{"name":"RecordingInterval","abstract":"Recoding intervals for H10 recording start
"},"Enums/SampleType.html":{"name":"SampleType","abstract":"Sample types for H10 recording start
"},"Enums/PolarErrors.html":{"name":"PolarErrors","abstract":"Polar SDK errors
"},"Enums/CheckFirmwareUpdateStatus.html":{"name":"CheckFirmwareUpdateStatus"},"Enums/FirmwareUpdateStatus.html":{"name":"FirmwareUpdateStatus"},"Enums/PolarOfflineRecordingData.html":{"name":"PolarOfflineRecordingData"},"Enums/PolarOfflineRecordingTriggerMode.html":{"name":"PolarOfflineRecordingTriggerMode","abstract":"Polar offline recording trigger mode. Offline recording trigger can be used to start the offline recording automatically in device, based on selected trigger mode.
"},"Enums/AutomaticSampleTriggerType.html":{"name":"AutomaticSampleTriggerType"},"Global%20Variables.html#/s:11PolarBleSdk25DEVICE_SETTINGS_FILE_PATHSSvp":{"name":"DEVICE_SETTINGS_FILE_PATH"},"Classes/BleHtsClient/TemperatureMeasurement.html#/s:11PolarBleSdk0B9HtsClientC22TemperatureMeasurementV18temperatureCelsiusSfvp":{"name":"temperatureCelsius","parent_name":"TemperatureMeasurement"},"Classes/BleHtsClient/TemperatureMeasurement.html#/s:11PolarBleSdk0B9HtsClientC22TemperatureMeasurementV21temperatureFahrenheitSfvp":{"name":"temperatureFahrenheit","parent_name":"TemperatureMeasurement"},"Classes/BleHtsClient/TemperatureMeasurement.html":{"name":"TemperatureMeasurement","parent_name":"BleHtsClient"},"Classes/BleHtsClient.html#/s:11PolarBleSdk0B9HtsClientC22gattServiceTransmitterAcA0B26AttributeTransportProtocol_p_tcfc":{"name":"init(gattServiceTransmitter:)","parent_name":"BleHtsClient"},"Classes/BleHtsClient.html#/s:11PolarBleSdk0B9HtsClientC12disconnectedyyF":{"name":"disconnected()","parent_name":"BleHtsClient"},"Classes/BleHtsClient.html#/s:11PolarBleSdk0B9HtsClientC18processServiceData_4data3errySo6CBUUIDC_10Foundation0H0VSitF":{"name":"processServiceData(_:data:err:)","parent_name":"BleHtsClient"},"Classes/BleHtsClient.html#/s:11PolarBleSdk0B9HtsClientC07observeD13Notifications15checkConnection7RxSwift10ObservableCyAC22TemperatureMeasurementVGSb_tF":{"name":"observeHtsNotifications(checkConnection:)","parent_name":"BleHtsClient"},"Classes/HealthThermometer.html#/s:11PolarBleSdk17HealthThermometerC11HTS_SERVICESo6CBUUIDCvpZ":{"name":"HTS_SERVICE","parent_name":"HealthThermometer"},"Classes/HealthThermometer.html#/s:11PolarBleSdk17HealthThermometerC23TEMPERATURE_MEASUREMENTSo6CBUUIDCvpZ":{"name":"TEMPERATURE_MEASUREMENT","parent_name":"HealthThermometer"},"Classes/HealthThermometer.html#/s:11PolarBleSdk17HealthThermometerC16TEMPERATURE_TYPESo6CBUUIDCvpZ":{"name":"TEMPERATURE_TYPE","parent_name":"HealthThermometer"},"Classes/PolarBackupManager.html#/s:11PolarBleSdk0A13BackupManagerC0D8FileDataV":{"name":"BackupFileData","parent_name":"PolarBackupManager"},"Classes/PolarBackupManager.html#/s:11PolarBleSdk0A13BackupManagerC6clientAcA0B11PsFtpClientC_tcfc":{"name":"init(client:)","parent_name":"PolarBackupManager"},"Classes/PolarBackupManager.html#/s:11PolarBleSdk0A13BackupManagerC12backupDevice7RxSwift17PrimitiveSequenceVyAE11SingleTraitOSayAC0D8FileDataVGGyF":{"name":"backupDevice()","abstract":"Backs up the device.
","parent_name":"PolarBackupManager"},"Classes/PolarBackupManager.html#/s:11PolarBleSdk0A13BackupManagerC07restoreD011backupFiles7RxSwift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSayAC0D8FileDataVG_tF":{"name":"restoreBackup(backupFiles:)","abstract":"Restores backup to the device.
","parent_name":"PolarBackupManager"},"Classes/PolarSleepData/OriginalSleepRange.html#/s:11PolarBleSdk0A9SleepDataC08OriginalD5RangeV9startTime10Foundation4DateVSgvp":{"name":"startTime","parent_name":"OriginalSleepRange"},"Classes/PolarSleepData/OriginalSleepRange.html#/s:11PolarBleSdk0A9SleepDataC08OriginalD5RangeV7endTime10Foundation4DateVSgvp":{"name":"endTime","parent_name":"OriginalSleepRange"},"Classes/PolarSleepData/SleepCycle.html#/s:11PolarBleSdk0A9SleepDataC0D5CycleV011secondsFromD5Starts6UInt32VSgvp":{"name":"secondsFromSleepStart","parent_name":"SleepCycle"},"Classes/PolarSleepData/SleepCycle.html#/s:11PolarBleSdk0A9SleepDataC0D5CycleV15sleepDepthStartSfSgvp":{"name":"sleepDepthStart","parent_name":"SleepCycle"},"Classes/PolarSleepData/SleepWakePhase.html#/s:11PolarBleSdk0A9SleepDataC0D9WakePhaseV011secondsFromD5Starts6UInt32VSgvp":{"name":"secondsFromSleepStart","parent_name":"SleepWakePhase"},"Classes/PolarSleepData/SleepWakePhase.html#/s:11PolarBleSdk0A9SleepDataC0D9WakePhaseV5stateAC0dF5StateOSgvp":{"name":"state","parent_name":"SleepWakePhase"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV14sleepStartTime10Foundation4DateVSgvp":{"name":"sleepStartTime","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV12sleepEndTime10Foundation4DateVSgvp":{"name":"sleepEndTime","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV12lastModified10Foundation4DateVSgvp":{"name":"lastModified","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV16sleepGoalMinutess6UInt32VSgvp":{"name":"sleepGoalMinutes","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV15sleepWakePhasesSayAC0dI5PhaseVGSgvp":{"name":"sleepWakePhases","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV10snoozeTimeSay10Foundation4DateVGSgvp":{"name":"snoozeTime","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV9alarmTime10Foundation4DateVSgvp":{"name":"alarmTime","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV23sleepStartOffsetSecondss5Int32VSgvp":{"name":"sleepStartOffsetSeconds","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV21sleepEndOffsetSecondss5Int32VSgvp":{"name":"sleepEndOffsetSeconds","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV04userD6RatingAC0dI0OSgvp":{"name":"userSleepRating","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV8deviceIdSSSgvp":{"name":"deviceId","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV13batteryRanOutSbSgvp":{"name":"batteryRanOut","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV11sleepCyclesSayAC0D5CycleVGSgvp":{"name":"sleepCycles","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV05sleepG4Date10Foundation0I0VSgvp":{"name":"sleepResultDate","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html#/s:11PolarBleSdk0A9SleepDataC0aD14AnalysisResultV08originalD5RangeAC08OriginaldI0VSgvp":{"name":"originalSleepRange","parent_name":"PolarSleepAnalysisResult"},"Classes/PolarSleepData/SleepRating.html#/s:11PolarBleSdk0A9SleepDataC0D6RatingO15SLEPT_UNDEFINEDyA2EmF":{"name":"SLEPT_UNDEFINED","parent_name":"SleepRating"},"Classes/PolarSleepData/SleepRating.html#/s:11PolarBleSdk0A9SleepDataC0D6RatingO12SLEPT_POORLYyA2EmF":{"name":"SLEPT_POORLY","parent_name":"SleepRating"},"Classes/PolarSleepData/SleepRating.html#/s:11PolarBleSdk0A9SleepDataC0D6RatingO21SLEPT_SOMEWHAT_POORLYyA2EmF":{"name":"SLEPT_SOMEWHAT_POORLY","parent_name":"SleepRating"},"Classes/PolarSleepData/SleepRating.html#/s:11PolarBleSdk0A9SleepDataC0D6RatingO29SLEPT_NEITHER_POORLY_NOR_WELLyA2EmF":{"name":"SLEPT_NEITHER_POORLY_NOR_WELL","parent_name":"SleepRating"},"Classes/PolarSleepData/SleepRating.html#/s:11PolarBleSdk0A9SleepDataC0D6RatingO19SLEPT_SOMEWHAT_WELLyA2EmF":{"name":"SLEPT_SOMEWHAT_WELL","parent_name":"SleepRating"},"Classes/PolarSleepData/SleepRating.html#/s:11PolarBleSdk0A9SleepDataC0D6RatingO10SLEPT_WELLyA2EmF":{"name":"SLEPT_WELL","parent_name":"SleepRating"},"Classes/PolarSleepData/SleepWakeState.html#/s:11PolarBleSdk0A9SleepDataC0D9WakeStateO7UNKNOWNyA2EmF":{"name":"UNKNOWN","parent_name":"SleepWakeState"},"Classes/PolarSleepData/SleepWakeState.html#/s:11PolarBleSdk0A9SleepDataC0D9WakeStateO4WAKEyA2EmF":{"name":"WAKE","parent_name":"SleepWakeState"},"Classes/PolarSleepData/SleepWakeState.html#/s:11PolarBleSdk0A9SleepDataC0D9WakeStateO3REMyA2EmF":{"name":"REM","parent_name":"SleepWakeState"},"Classes/PolarSleepData/SleepWakeState.html#/s:11PolarBleSdk0A9SleepDataC0D9WakeStateO8NONREM12yA2EmF":{"name":"NONREM12","parent_name":"SleepWakeState"},"Classes/PolarSleepData/SleepWakeState.html#/s:11PolarBleSdk0A9SleepDataC0D9WakeStateO7NONREM3yA2EmF":{"name":"NONREM3","parent_name":"SleepWakeState"},"Classes/PolarSleepData/SleepWakeState.html":{"name":"SleepWakeState","parent_name":"PolarSleepData"},"Classes/PolarSleepData/SleepRating.html":{"name":"SleepRating","parent_name":"PolarSleepData"},"Classes/PolarSleepData/PolarSleepAnalysisResult.html":{"name":"PolarSleepAnalysisResult","parent_name":"PolarSleepData"},"Classes/PolarSleepData/SleepWakePhase.html":{"name":"SleepWakePhase","parent_name":"PolarSleepData"},"Classes/PolarSleepData/SleepCycle.html":{"name":"SleepCycle","parent_name":"PolarSleepData"},"Classes/PolarSleepData/OriginalSleepRange.html":{"name":"OriginalSleepRange","parent_name":"PolarSleepData"},"Classes/PolarUserDeviceSettings/PolarUserDeviceSettingsResult.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0adeF6ResultV14deviceLocationAC0eI0Ovp":{"name":"deviceLocation","parent_name":"PolarUserDeviceSettingsResult"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:s12IdentifiableP2id2IDQzvp":{"name":"id","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO9UNDEFINEDyA2EmF":{"name":"UNDEFINED","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO5OTHERyA2EmF":{"name":"OTHER","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO10WRIST_LEFTyA2EmF":{"name":"WRIST_LEFT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO11WRIST_RIGHTyA2EmF":{"name":"WRIST_RIGHT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO8NECKLACEyA2EmF":{"name":"NECKLACE","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO5CHESTyA2EmF":{"name":"CHEST","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO10UPPER_BACKyA2EmF":{"name":"UPPER_BACK","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO9FOOT_LEFTyA2EmF":{"name":"FOOT_LEFT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO10FOOT_RIGHTyA2EmF":{"name":"FOOT_RIGHT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO14LOWER_ARM_LEFTyA2EmF":{"name":"LOWER_ARM_LEFT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO15LOWER_ARM_RIGHTyA2EmF":{"name":"LOWER_ARM_RIGHT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO14UPPER_ARM_LEFTyA2EmF":{"name":"UPPER_ARM_LEFT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO16UPPER_ARM_RIGHTsyA2EmF":{"name":"UPPER_ARM_RIGHTs","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO10BIKE_MOUNTyA2EmF":{"name":"BIKE_MOUNT","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html#/s:11PolarBleSdk0A18UserDeviceSettingsC0E8LocationO5toIntSiyF":{"name":"toInt()","parent_name":"DeviceLocation"},"Classes/PolarUserDeviceSettings/DeviceLocation.html":{"name":"DeviceLocation","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings.html#/s:11PolarBleSdk0A18UserDeviceSettingsC9timestamp10Foundation4DateVvp":{"name":"timestamp","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings.html#/s:11PolarBleSdk0A18UserDeviceSettingsC15_deviceLocationAC0eH0Ovp":{"name":"_deviceLocation","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings.html#/s:11PolarBleSdk0A18UserDeviceSettingsC14deviceLocationAC0eH0Ovp":{"name":"deviceLocation","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings/PolarUserDeviceSettingsResult.html":{"name":"PolarUserDeviceSettingsResult","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings.html#/s:11PolarBleSdk0A18UserDeviceSettingsC14getStringValue19deviceLocationIndexSSSi_tFZ":{"name":"getStringValue(deviceLocationIndex:)","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings.html#/s:11PolarBleSdk0A18UserDeviceSettingsC03getE8Location06deviceH0AC0eH0OSS_tFZ":{"name":"getDeviceLocation(deviceLocation:)","parent_name":"PolarUserDeviceSettings"},"Classes/PolarUserDeviceSettings.html#/s:11PolarBleSdk0A18UserDeviceSettingsC14getAllAsStringSaySSGyFZ":{"name":"getAllAsString()","parent_name":"PolarUserDeviceSettings"},"Classes/PolarStoredDataType/PolarStoredDataTypeResult.html#/s:11PolarBleSdk0A14StoredDataTypeC0adeF6ResultV06storedeF0AC0deF0OSgvp":{"name":"storedDataType","parent_name":"PolarStoredDataTypeResult"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O9UNDEFINEDyA2EmF":{"name":"UNDEFINED","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O8ACTIVITYyA2EmF":{"name":"ACTIVITY","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O11AUTO_SAMPLEyA2EmF":{"name":"AUTO_SAMPLE","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O13DAILY_SUMMARYyA2EmF":{"name":"DAILY_SUMMARY","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O16NIGHTLY_RECOVERYyA2EmF":{"name":"NIGHTLY_RECOVERY","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O6SDLOGSyA2EmF":{"name":"SDLOGS","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O5SLEEPyA2EmF":{"name":"SLEEP","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O11SLEEP_SCOREyA2EmF":{"name":"SLEEP_SCORE","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC0deF0O5toIntSiyF":{"name":"toInt()","parent_name":"StoredDataType"},"Classes/PolarStoredDataType/StoredDataType.html":{"name":"StoredDataType","parent_name":"PolarStoredDataType"},"Classes/PolarStoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC07_storedeF0AC0deF0Ovp":{"name":"_storedDataType","parent_name":"PolarStoredDataType"},"Classes/PolarStoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC06storedeF0AC0deF0Ovp":{"name":"storedDataType","parent_name":"PolarStoredDataType"},"Classes/PolarStoredDataType/PolarStoredDataTypeResult.html":{"name":"PolarStoredDataTypeResult","parent_name":"PolarStoredDataType"},"Classes/PolarStoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC14getStringValue04dataF13LocationIndexSSSi_tFZ":{"name":"getStringValue(dataTypeLocationIndex:)","parent_name":"PolarStoredDataType"},"Classes/PolarStoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC14getAllAsStringSaySSGyFZ":{"name":"getAllAsString()","parent_name":"PolarStoredDataType"},"Classes/PolarStoredDataType.html#/s:11PolarBleSdk0A14StoredDataTypeC8getValue4nameAC0deF0OSS_tFZ":{"name":"getValue(name:)","parent_name":"PolarStoredDataType"},"Classes/PolarBleApiDefaultImpl.html#/s:11PolarBleSdk0aB14ApiDefaultImplC19polarImplementation_8featuresAA0abD0_pSo17OS_dispatch_queueC_ShyAA0abC7FeatureOGtFZ":{"name":"polarImplementation(_:features:)","abstract":"New instance of Polar Ble API implementation
","parent_name":"PolarBleApiDefaultImpl"},"Classes/PolarBleApiDefaultImpl.html#/s:11PolarBleSdk0aB14ApiDefaultImplC11versionInfoSSyFZ":{"name":"versionInfo()","abstract":"Return current version
","parent_name":"PolarBleApiDefaultImpl"},"Classes/PolarBleApiDefaultImpl.html":{"name":"PolarBleApiDefaultImpl","abstract":"Class to provide the default implementation of the Polar Ble API
"},"Classes/PolarStoredDataType.html":{"name":"PolarStoredDataType"},"Classes/PolarUserDeviceSettings.html":{"name":"PolarUserDeviceSettings"},"Classes/PolarSleepData.html":{"name":"PolarSleepData"},"Classes/PolarBackupManager.html":{"name":"PolarBackupManager"},"Classes/HealthThermometer.html":{"name":"HealthThermometer"},"Classes/BleHtsClient.html":{"name":"BleHtsClient"},"Classes.html":{"name":"Classes","abstract":"The following classes are available globally.
"},"Global%20Variables.html":{"name":"Global Variables","abstract":"The following global variables are available globally.
"},"Enums.html":{"name":"Enumerations","abstract":"The following enumerations are available globally.
"},"Extensions.html":{"name":"Extensions","abstract":"The following extensions are available globally.
"},"Protocols.html":{"name":"Protocols","abstract":"The following protocols are available globally.
"},"Structs.html":{"name":"Structures","abstract":"The following structures are available globally.
"},"Typealiases.html":{"name":"Type Aliases","abstract":"The following type aliases are available globally.
"}}
\ No newline at end of file
diff --git a/sources/Android/android-communications/library/src/main/java/com/polar/androidcommunications/api/ble/model/gatt/client/psftp/BlePsFtpClient.java b/sources/Android/android-communications/library/src/main/java/com/polar/androidcommunications/api/ble/model/gatt/client/psftp/BlePsFtpClient.java
index eb29d212..3a35bc41 100644
--- a/sources/Android/android-communications/library/src/main/java/com/polar/androidcommunications/api/ble/model/gatt/client/psftp/BlePsFtpClient.java
+++ b/sources/Android/android-communications/library/src/main/java/com/polar/androidcommunications/api/ble/model/gatt/client/psftp/BlePsFtpClient.java
@@ -647,7 +647,7 @@ void readResponse(ByteArrayOutputStream outputStream, final long timeoutSeconds)
// connection lost
throw new BleDisconnected("Connection lost during read response");
}
- Pair packet = mtuInputQueue.poll();
+ Pair packet = mtuInputQueue.poll(PROTOCOL_TIMEOUT_SECONDS, TimeUnit.SECONDS);
if (packet != null && packet.second == 0) {
BlePsFtpUtils.processRfc76MessageFrameHeader(response, packet.first);
if (sequenceNumber.getSeq() != response.sequenceNumber) {
diff --git a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/PolarActivityApi.kt b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/PolarActivityApi.kt
index f33aaaa5..de8b76a7 100644
--- a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/PolarActivityApi.kt
+++ b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/PolarActivityApi.kt
@@ -1,8 +1,12 @@
package com.polar.sdk.api
+import com.polar.sdk.api.model.activity.Polar247HrSamplesData
import com.polar.sdk.api.model.activity.PolarActiveTimeData
import com.polar.sdk.api.model.activity.PolarDistanceData
import com.polar.sdk.api.model.activity.PolarStepsData
+import com.polar.sdk.api.model.activity.PolarCaloriesData
+import com.polar.sdk.impl.utils.CaloriesType
+import com.polar.sdk.api.model.sleep.PolarNightlyRechargeData
import io.reactivex.rxjava3.core.Single
import java.util.Date
@@ -41,4 +45,35 @@ interface PolarActivityApi {
* @return A [Single] emitting a list of [PolarActiveTimeData] representing the active time data for the specified period.
*/
fun getActiveTime(identifier: String, fromDate: Date, toDate: Date): Single>
+
+ /**
+ * Get specific calories type for a given period.
+ *
+ * @param identifier The Polar device ID or BT address.
+ * @param fromDate The starting date of the period to retrieve calories data from.
+ * @param toDate The ending date of the period to retrieve calories data from.
+ * @param caloriesType The type of calories data to retrieve (e.g., ACTIVITY, TRAINING, BMR).
+ * @return A [Single] emitting a list of [PolarCaloriesData] representing the calories data for the specified period.
+ */
+ fun getCalories(identifier: String, fromDate: Date, toDate: Date, caloriesType: CaloriesType): Single>
+
+ /**
+ * Get 24/7 heart rate samples for a given period.
+ *
+ * @param identifier The Polar device ID or BT address.
+ * @param fromDate The starting date of the period to retrieve heart rate samples from.
+ * @param toDate The ending date of the period to retrieve heart rate samples from.
+ * @return A [Single] emitting a list of [Polar247HrSamplesData] representing the heart rate samples for the specified period.
+ */
+ fun get247HrSamples(identifier: String, fromDate: Date, toDate: Date): Single>
+
+ /**
+ * Get nightly recharge for a given period.
+ *
+ * @param identifier The Polar device ID or BT address.
+ * @param fromDate The starting date of the period to retrieve nightly recharge from.
+ * @param toDate The ending date of the period to retrieve nightly recharge from.
+ * @return A [Single] emitting a list of [PolarNightlyRechargeData] representing the nightly recharge data for the specified period.
+ */
+ fun getNightlyRecharge(identifier: String, fromDate: Date, toDate: Date): Single>
}
\ No newline at end of file
diff --git a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/PolarBleApi.kt b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/PolarBleApi.kt
index c178659e..d62f28ad 100644
--- a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/PolarBleApi.kt
+++ b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/PolarBleApi.kt
@@ -122,7 +122,7 @@ abstract class PolarBleApi(val features: Set) : PolarOnlineS
* The activity recording data types available in Polar devices.
*/
enum class PolarActivityDataType {
- SLEEP, STEPS, DISTANCE
+ SLEEP, STEPS, DISTANCE, CALORIES, HR_SAMPLES, NIGHTLY_RECHARGE
}
/**
diff --git a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/PolarBleApiDefaultImpl.kt b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/PolarBleApiDefaultImpl.kt
index ee170420..e0d9f0b2 100644
--- a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/PolarBleApiDefaultImpl.kt
+++ b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/PolarBleApiDefaultImpl.kt
@@ -25,6 +25,6 @@ object PolarBleApiDefaultImpl {
*/
@JvmStatic
fun versionInfo(): String {
- return "5.9.0"
+ return "5.10.0"
}
}
\ No newline at end of file
diff --git a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/model/activity/PolarAutomaticSamplesData.kt b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/model/activity/PolarAutomaticSamplesData.kt
new file mode 100644
index 00000000..a96a4e5a
--- /dev/null
+++ b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/model/activity/PolarAutomaticSamplesData.kt
@@ -0,0 +1,31 @@
+package com.polar.sdk.api.model.activity
+
+import java.util.Date
+
+data class Polar247HrSamplesData(
+ val date: Date,
+ val hrSamples: List,
+ val triggerType: AutomaticSampleTriggerType
+)
+
+enum class AutomaticSampleTriggerType(val value: Int) {
+ /**
+ * Automatic measurement triggered by user high activity. Contains 1-n samples
+ */
+ TRIGGER_TYPE_HIGH_ACTIVITY(1),
+
+ /**
+ * Automatic measurement triggered by user low activity. Contains 1-n samples
+ */
+ TRIGGER_TYPE_LOW_ACTIVITY(2),
+
+ /**
+ * Automatic measurement triggered by timer. Contains 1 sample
+ */
+ TRIGGER_TYPE_TIMED(3),
+
+ /**
+ * Manual measurement (other than exercise) triggered by user. Contains 1-n samples
+ */
+ TRIGGER_TYPE_MANUAL(4)
+}
\ No newline at end of file
diff --git a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/model/activity/PolarCaloriesData.kt b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/model/activity/PolarCaloriesData.kt
new file mode 100644
index 00000000..facc724f
--- /dev/null
+++ b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/model/activity/PolarCaloriesData.kt
@@ -0,0 +1,9 @@
+package com.polar.sdk.api.model.activity
+
+import java.util.Date
+
+/**
+ * Activity calories data for a given [date].
+ * Includes the calories value based on the requested type (e.g., activity, training, or BMR).
+ */
+data class PolarCaloriesData(val date: Date? = null, val calories: Int? = null)
\ No newline at end of file
diff --git a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/model/sleep/PolarNightlyRechargeData.kt b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/model/sleep/PolarNightlyRechargeData.kt
new file mode 100644
index 00000000..9630795d
--- /dev/null
+++ b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/api/model/sleep/PolarNightlyRechargeData.kt
@@ -0,0 +1,66 @@
+package com.polar.sdk.api.model.sleep
+
+import java.time.LocalDateTime
+import java.util.Date
+
+data class PolarNightlyRechargeData(
+ // Date and time of the result was created
+ val createdTimestamp: LocalDateTime,
+
+ // Date and time when the file was last modified
+ val modifiedTimestamp: LocalDateTime?,
+
+ // The limit of ansStatus is from -15.7068 to 15.7068. A value over 0 represents higher parasympathetic activity than usual (and lower sympathetic), and a value below 0 represents lower parasympathetic activity than usual (and higher sympathetic)
+ val ansStatus: Float?,
+
+ // The combination of normalized ANS status and normalized Sleep Score and Sleep Metric. Between 1 to 6.
+ val recoveryIndicator: Int?,
+
+ // Indicates the level of combination of ANS and Sleep inside the recoveryIndicator class. 0 indicates the bottom of the class, and ~100 indicates almost the next level.
+ val recoveryIndicatorSubLevel: Int?,
+
+ // Rating of ans status on a scale of 1-5 compared to own usual level. (5 = best, 1 = worst)
+ val ansRate: Int?,
+
+ // Rating of sleep score status on a scale of 1-5 compared to own usual level (5 = best, 1 = worst)
+ val scoreRateObsolete: Int?,
+
+ // Mean of the HR (after 0.5h from sleep start to 4.5h after sleep start hr) samples to beat interval time. (ms)
+ val meanNightlyRecoveryRRI: Int?,
+
+ // Mean of the PPI (after 0.5h from sleep start to 4.5h after sleep start PPI) calculated RMSSD values. (ms)
+ val meanNightlyRecoveryRMSSD: Int?,
+
+ // Mean of the respiration interval (after 0.5h from sleep start to 4.5h after sleep start) samples. (ms)
+ val meanNightlyRecoveryRespirationInterval: Int?,
+
+ // The mean RRI from the baseline calculation. (ms)
+ val meanBaselineRRI: Int?,
+
+ // The standard deviation of RRI from baseline calculation.
+ val sdBaselineRRI: Int?,
+
+ // The mean RMSSD from the baseline calculation. (ms)
+ val meanBaselineRMSSD: Int?,
+
+ // The standard deviation of RMSSD from baseline calculation.
+ val sdBaselineRMSSD: Int?,
+
+ // Mean Respiration Interval from the baseline calculation. (ms)
+ val meanBaselineRespirationInterval: Int?,
+
+ // The standard deviation of Respiration Interval from baseline calculation.
+ val sdBaselineRespirationInterval: Int?,
+
+ // Chosen sleep tip for the user.
+ val sleepTip: String?,
+
+ // Chosen vitality tip for the user.
+ val vitalityTip: String?,
+
+ // Chosen exercise tip for the user.
+ val exerciseTip: String?,
+
+ // Date for which the sleep result and nightly recovery result is for
+ val sleepResultDate: Date?
+)
\ No newline at end of file
diff --git a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/BDBleApiImpl.kt b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/BDBleApiImpl.kt
index 579b63b2..57c6822b 100644
--- a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/BDBleApiImpl.kt
+++ b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/BDBleApiImpl.kt
@@ -43,10 +43,15 @@ import com.polar.sdk.api.model.*
import com.polar.sdk.api.model.activity.PolarActiveTimeData
import com.polar.sdk.api.model.activity.PolarDistanceData
import com.polar.sdk.api.model.activity.PolarStepsData
+import com.polar.sdk.api.model.activity.PolarCaloriesData
+import com.polar.sdk.impl.utils.CaloriesType
import com.polar.sdk.api.model.sleep.PolarSleepAnalysisResult
import com.polar.sdk.api.model.sleep.PolarSleepData
import com.polar.sdk.api.model.PolarUserDeviceSettings
+import com.polar.sdk.api.model.activity.Polar247HrSamplesData
+import com.polar.sdk.api.model.sleep.PolarNightlyRechargeData
import com.polar.sdk.impl.utils.PolarActivityUtils
+import com.polar.sdk.impl.utils.PolarAutomaticSamplesUtils
import com.polar.sdk.impl.utils.PolarBackupManager
import com.polar.sdk.impl.utils.PolarDataUtils
import com.polar.sdk.impl.utils.PolarDataUtils.mapPMDClientOfflineHrDataToPolarHrData
@@ -67,6 +72,7 @@ import com.polar.sdk.impl.utils.PolarDataUtils.mapPolarOfflineTriggerToPmdOfflin
import com.polar.sdk.impl.utils.PolarDataUtils.mapPolarSecretToPmdSecret
import com.polar.sdk.impl.utils.PolarDataUtils.mapPolarSettingsToPmdSettings
import com.polar.sdk.impl.utils.PolarFirmwareUpdateUtils
+import com.polar.sdk.impl.utils.PolarNightlyRechargeUtils
import com.polar.sdk.impl.utils.PolarSleepUtils
import com.polar.sdk.impl.utils.PolarTimeUtils
import com.polar.sdk.impl.utils.PolarTimeUtils.javaCalendarToPbPftpSetLocalTime
@@ -101,6 +107,9 @@ import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*
import java.util.concurrent.TimeUnit
+import java.util.concurrent.ConcurrentHashMap
+import java.util.concurrent.ConcurrentLinkedQueue
+import java.util.concurrent.atomic.AtomicBoolean
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.util.regex.Matcher
@@ -124,7 +133,6 @@ class BDBleApiImpl private constructor(context: Context, features: Set = mutableMapOf()
private val dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd", Locale.ENGLISH)
init {
@@ -1271,6 +1279,7 @@ class BDBleApiImpl private constructor(context: Context, features: Set = mutableMapOf()
BleLogger.d(TAG, "Remove offline record from device $identifier path ${entry.path}")
val session = try {
sessionPsFtpClientReady(identifier)
@@ -2190,17 +2199,53 @@ class BDBleApiImpl private constructor(context: Context, features: Set> {
+ val session = try {
+ sessionPsFtpClientReady(identifier)
+ } catch (error: Throwable) {
+ return Single.error(error)
+ }
+ val client = session.fetchClient(BlePsFtpUtils.RFC77_PFTP_SERVICE) as BlePsFtpClient?
+ ?: return Single.error(PolarServiceNotAvailable())
+
+ val caloriesDataList = mutableListOf>()
+
+ val calendar = Calendar.getInstance()
+ calendar.time = fromDate
+
+ val datesList = mutableListOf()
+
+ while (!calendar.time.after(toDate)) {
+ datesList.add(calendar.time)
+ calendar.add(Calendar.DATE, 1)
+ }
+
+ return Observable.fromIterable(datesList)
+ .flatMapSingle { date ->
+ PolarActivityUtils.readSpecificCaloriesFromDayDirectory(client, date, caloriesType)
+ .map { calories ->
+ Pair(date, calories)
+ }
+ }
+ .toList()
+ .map { pairs ->
+ pairs.forEach { pair ->
+ caloriesDataList.add(Pair(pair.first, pair.second))
+ }
+ caloriesDataList.map { PolarCaloriesData(it.first, it.second) }
+ }
+ }
+
private fun getDatesBetween(startDate: LocalDate, endDate: LocalDate): MutableList {
var theDate: LocalDate = startDate
var datesList = mutableListOf()
- while (startDate == endDate || endDate.isAfter(theDate)) {
+ while (theDate == endDate || endDate.isAfter(theDate)) {
datesList.add(theDate)
theDate = theDate.plusDays(1)
}
return datesList
-
}
override fun getActiveTime(identifier: String, fromDate: Date, toDate: Date): Single> {
@@ -2323,6 +2368,52 @@ class BDBleApiImpl private constructor(context: Context, features: Set> {
+ val session = try {
+ sessionPsFtpClientReady(identifier)
+ } catch (error: Throwable) {
+ return Single.error(error)
+ }
+ val client = session.fetchClient(BlePsFtpUtils.RFC77_PFTP_SERVICE) as BlePsFtpClient?
+ ?: return Single.error(PolarServiceNotAvailable())
+
+ return PolarAutomaticSamplesUtils.read247HrSamples(client, fromDate, toDate)
+ }
+
+ override fun getNightlyRecharge(identifier: String, fromDate: Date, toDate: Date): Single> {
+ val session = try {
+ sessionPsFtpClientReady(identifier)
+ } catch (error: Throwable) {
+ return Single.error(error)
+ }
+ val client = session.fetchClient(BlePsFtpUtils.RFC77_PFTP_SERVICE) as BlePsFtpClient?
+ ?: return Single.error(PolarServiceNotAvailable())
+
+ val nightlyRechargeDataList = mutableListOf()
+
+ val calendar = Calendar.getInstance()
+ calendar.time = fromDate
+
+ val datesList = mutableListOf()
+
+ while (!calendar.time.after(toDate)) {
+ datesList.add(calendar.time)
+ calendar.add(Calendar.DATE, 1)
+ }
+
+ return Observable.fromIterable(datesList)
+ .flatMapMaybe { date ->
+ PolarNightlyRechargeUtils.readNightlyRechargeData(client, date)
+ .doOnSuccess { nightlyRechargeData ->
+ nightlyRechargeDataList.add(nightlyRechargeData)
+ }
+ }
+ .toList()
+ .flatMap { list ->
+ Single.just(nightlyRechargeDataList)
+ }
+ }
+
private fun sendInitializationAndStartSyncNotifications(client: BlePsFtpClient) {
BleLogger.d(TAG, "Sending initialize session and start sync notifications")
client.sendNotification(
@@ -2438,7 +2529,7 @@ class BDBleApiImpl private constructor(context: Context, features: Set {
folderPath = "/SDLOGS"
cond = FetchRecursiveCondition { entry: String ->
@@ -2474,55 +2566,85 @@ class BDBleApiImpl private constructor(context: Context, features: Set {
- BleLogger.d(TAG, "Starting to delete files from /U/0/AUTOS/ folder from device $identifier.")
- deleteAutoSyncFiles(identifier).subscribe()
- }
-
- PolarStoredDataType.SDLOGS.type -> {
- BleLogger.d(TAG, "Starting to delete files from SDLOGS folder from device $identifier.")
- deleteSdLogFiles(identifier).subscribe()
- }
-
- else -> {
- BleLogger.d(
- TAG,
- "Starting to delete files from /U/0 directory, file type: $dataType.name from device $identifier."
- )
- deleteDataDirectories(identifier, until).subscribe()
- }
- }
+ dataDeletionStats.fileDeletionMap[it] = false
}.doOnError { error ->
BleLogger.e(TAG, "Encountered exception while deleting files in device $identifier.. Error: $error")
Completable.error(error)
- }.subscribe()
+ }.doOnComplete {
+ if (dataDeletionStats.amountOfHandedDeletions == dataDeletionStats.fileDeletionMap.size) {
+ dataDeletionStats.deleteOperationCompleteLock.set(true)
+ }
+ }.blockingSubscribe()
+
+ when (dataType.type) {
+ PolarStoredDataType.AUTO_SAMPLE.type -> {
+ BleLogger.d(TAG, "Starting to delete files from /U/0/AUTOS/ folder from device $identifier.")
+ deleteAutoSampleFiles(identifier, dataDeletionStats).parallel().runOn(Schedulers.computation()).sequential()
+ .doOnError { error ->
+ BleLogger.e(TAG, "Encountered exception while deleting AUTO_SAMPLE files in device $identifier. Error: $error")
+ Completable.error(error)
+ }.subscribe()
+ }
+
+ PolarStoredDataType.SDLOGS.type -> {
+ BleLogger.d(TAG, "Starting to delete files from SDLOGS folder from device $identifier.")
+ deleteSdLogFiles(identifier, dataDeletionStats)
+ .doOnError { error ->
+ BleLogger.e(TAG, "Encountered exception while deleting SDLOGS files in device $identifier. Error: $error")
+ Completable.error(error)
+ }.subscribe()
+ }
+
+ else -> {
+ BleLogger.d(
+ TAG,
+ "Starting to delete files from /U/0 directory, file type: $dataType.name from device $identifier."
+ )
+ deleteDataDirectories(identifier, until, dataDeletionStats).parallel().runOn(Schedulers.computation()).sequential()
+ .doOnError { error ->
+ BleLogger.e(TAG, "Encountered exception while deleting ${dataType.type} files in device $identifier. Error: $error")
+ Completable.error(error)
+ }.subscribe()
+ }
+ }
+
+ try {
+ while(!dataDeletionStats.deleteOperationCompleteLock.get()){
+ Thread.sleep(500);
+ }
+ } catch (e: InterruptedException) {
+ BleLogger.e(TAG, "Encountered exception while waiting for deletion process to complete. Error: $e")
+ }
return Completable.complete()
}
- private fun deleteAutoSyncFiles(identifier: String): Flowable> {
+ private fun deleteAutoSampleFiles(identifier: String, dataDeletionStats: DataDeletionStats): Flowable> {
- return Flowable.fromIterable(fileDeletionMap.asIterable()).doOnEach() { item ->
+ return Flowable.fromIterable(dataDeletionStats.fileDeletionMap.asIterable()).doOnEach() { item ->
val file = item.value
if (file != null && !file.value) {
getFile(identifier, file.key)
.subscribe(
{ byteArray ->
+ dataDeletionStats.amountOfHandedDeletions++
val proto = PbAutomaticSampleSessions.parseFrom(byteArray)
val date = PolarTimeUtils.pbDateToLocalDate(proto.day)
// Delete all files but leave files from today.
if (date.isBefore(LocalDate.now())) {
- fileDeletionMap[file.key] = true
+ dataDeletionStats.fileDeletionMap[file.key] = true
removeSingleFile(identifier, file.key)
.map { _ ->
- fileDeletionMap[file.key] = true
+ dataDeletionStats.fileDeletionMap[file.key] = true
+ }.doFinally {
+ if (dataDeletionStats.amountOfHandedDeletions == dataDeletionStats.fileDeletionMap.size) {
+ dataDeletionStats.deleteOperationCompleteLock.set(true)
+ }
}.doOnError { error ->
BleLogger.e(TAG, "Failed to delete autosync file $file.key from device $identifier. Error: $error")
}.subscribe()
+ } else if (dataDeletionStats.amountOfHandedDeletions == dataDeletionStats.fileDeletionMap.size) {
+ dataDeletionStats.deleteOperationCompleteLock.set(true)
}
},
{ error ->
@@ -2533,31 +2655,38 @@ class BDBleApiImpl private constructor(context: Context, features: Set> {
+ private fun deleteSdLogFiles(identifier: String, dataDeletionStats: DataDeletionStats):Flowable> {
- return Flowable.fromIterable(fileDeletionMap.asIterable()).doOnEach() { item ->
+ return Flowable.fromIterable(dataDeletionStats.fileDeletionMap.asIterable()).doOnEach() { item ->
val file = item.value
if (file != null && !file.value) {
+ dataDeletionStats.amountOfHandedDeletions++
removeSingleFile(identifier, file.key)
.map { _ ->
- fileDeletionMap[file.key] = true
+ dataDeletionStats.fileDeletionMap[file.key] = true
+
+ }.doFinally {
+ if (dataDeletionStats.amountOfHandedDeletions == dataDeletionStats.fileDeletionMap.size) {
+ dataDeletionStats.deleteOperationCompleteLock.set(true)
+ }
}.doOnError { error ->
BleLogger.e(
TAG,
"Failed to delete Log file $file.key from device $identifier. Error: $error"
)
}.subscribe()
+ } else if (dataDeletionStats.amountOfHandedDeletions == dataDeletionStats.fileDeletionMap.size) {
+ dataDeletionStats.deleteOperationCompleteLock.set(true)
}
}
}
- private fun deleteDataDirectories(identifier: String, until: LocalDate?): Flowable {
+ private fun deleteDataDirectories(identifier: String, until: LocalDate?, dataDeletionStats: DataDeletionStats): Flowable {
- var directoryList: MutableList = mutableListOf()
-
- return Flowable.fromIterable(fileDeletionMap.asIterable())
+ return Flowable.fromIterable(dataDeletionStats.fileDeletionMap.asIterable())
.map { file ->
- var deleteFile = false
+ dataDeletionStats.amountOfHandedDeletions++
+ var fileDateIsBefore = false
val pattern: Pattern =
Pattern.compile("(?
- BleLogger.e(
- TAG,
- "Failed to delete data directory $dir from device $identifier. Error: $error"
- )
+ if (fileDateIsBefore) {
+ val path = listOf(file.key.split("/").subList(0, file.key.split("/").lastIndex))[0].joinToString(separator = "/")
+ var deleteDir = true
+ for (dir in dataDeletionStats.deletedDirs) {
+ if (dir.equals(path)) {
+ deleteDir = false
+ break
}
- .doOnSuccess {
- deleteDayDirectory(identifier, listOf(file.key.split("/").subList(0,file.key.split("/").lastIndex - 1))[0].joinToString(separator = "/")).subscribe()
- }.subscribe()
+ }
+ if (deleteDir) {
+ dataDeletionStats.deletedDirs.add(path)
+ removeSingleFile(identifier, path)
+ .doOnError { error ->
+ BleLogger.e(
+ TAG,
+ "Failed to delete data directory $path from device $identifier. Error: $error"
+ )
+ }.doFinally {
+ if (dataDeletionStats.amountOfHandedDeletions == dataDeletionStats.fileDeletionMap.size) {
+ dataDeletionStats.deleteOperationCompleteLock.set(true)
+ }
+ }.doOnSuccess {
+ deleteDayDirectory(
+ identifier,
+ listOf(
+ file.key.split("/")
+ .subList(0, file.key.split("/").lastIndex - 1)
+ )[0].joinToString(separator = "/")
+ ).subscribe()
+ }.subscribe()
+ }
+ } else if (dataDeletionStats.amountOfHandedDeletions == dataDeletionStats.fileDeletionMap.size) {
+ dataDeletionStats.deleteOperationCompleteLock.set(true)
}
}
-
- return Flowable.just(Unit)
}
private fun deleteDataDirectories(identifier: String): Flowable {
+ val fileDeletionMap: MutableMap = mutableMapOf()
return Flowable.fromIterable(fileDeletionMap.asIterable())
.map { file ->
val dir = listOf(file.key.split("/").subList(0, file.key.split("/").lastIndex))[0].joinToString(separator = "/")
@@ -2602,43 +2751,43 @@ class BDBleApiImpl private constructor(context: Context, features: Set {
var fileList: MutableList = mutableListOf()
- listFiles(identifier, dir,
- condition = { entry ->
- entry.matches(Regex("^(\\d{8})(/)")) ||
- entry.matches(Regex("^([A-Z-0-9]{1,6}[0-9]{0,10000})(/)")) ||
- entry.contains(".BPB") ||
- entry.contains(".REC")
- })
- .map {
- fileList.add(it)
- }
- .doFinally {
- if (fileList.isEmpty()) {
- removeSingleFile(identifier, dir)
- .doOnError { error ->
- BleLogger.e(
- TAG,
- "Failed to delete day directory $dir from device $identifier. Error: $error"
- )
- }.subscribe()
+
+ return Flowable.create({ emitter ->
+ listFiles(identifier, dir,
+ condition = { entry ->
+ entry.matches(Regex("^(\\d{8})(/)")) ||
+ entry.matches(Regex("^([A-Z-0-9]{1,6}[0-9]{0,10000})(/)")) ||
+ //entry.matches(Regex("^(\\d{6})(/)")) ||
+ entry.contains(".BPB") ||
+ entry.contains(".REC")
+ })
+ .map {
+ fileList.add(it)
}
- }
- .doOnError { error ->
- BleLogger.e(
- TAG,
- "Failed to list files from day directory $dir from device $identifier. Error: $error"
- )
- Completable.error(error)
- }
- .subscribe()
- return Completable.complete()
+ .doFinally {
+ if (fileList.isEmpty()) {
+ removeSingleFile(identifier, dir)
+ .doOnError { error ->
+ BleLogger.e(
+ TAG,
+ "Failed to delete day directory $dir from device $identifier. Error: $error"
+ )
+ }.subscribe()
+ }
+ }
+ .doOnError { error ->
+ BleLogger.e(
+ TAG,
+ "Failed to list files from day directory $dir from device $identifier. Error: $error"
+ )
+ throw PolarBleSdkInstanceException("Failed to delete day directory $dir from device $identifier. Error: $error")
+ }.subscribe()
+ }, BackpressureStrategy.BUFFER)
}
private fun removeSingleFile(identifier: String, filePath: String): Single {
@@ -2652,7 +2801,9 @@ class BDBleApiImpl private constructor(context: Context, features: Set
+ Single.error(handleError(throwable))
+ }
}
private fun listFiles(identifier: String, folderPath: String = "/", condition: FetchRecursiveCondition): Flowable {
@@ -3259,4 +3410,11 @@ class BDBleApiImpl private constructor(context: Context, features: Set = ConcurrentLinkedQueue(),
+ val fileDeletionMap: ConcurrentHashMap = ConcurrentHashMap()
+)
\ No newline at end of file
diff --git a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/utils/PolarActivityUtils.kt b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/utils/PolarActivityUtils.kt
index b283f3dd..316c751b 100644
--- a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/utils/PolarActivityUtils.kt
+++ b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/utils/PolarActivityUtils.kt
@@ -4,6 +4,7 @@ import com.polar.androidcommunications.api.ble.BleLogger
import com.polar.androidcommunications.api.ble.model.gatt.client.psftp.BlePsFtpClient
import com.polar.sdk.api.model.activity.PolarActiveTime
import com.polar.sdk.api.model.activity.PolarActiveTimeData
+import com.polar.sdk.api.model.activity.PolarCaloriesData
import fi.polar.remote.representation.protobuf.ActivitySamples
import fi.polar.remote.representation.protobuf.DailySummary
import fi.polar.remote.representation.protobuf.Types.PbDuration
@@ -23,6 +24,10 @@ private const val DAILY_SUMMARY_PROTO = "DSUM.BPB"
private val dateFormat = SimpleDateFormat("yyyyMMdd", Locale.ENGLISH)
private const val TAG = "PolarActivityUtils"
+enum class CaloriesType {
+ ACTIVITY, TRAINING, BMR
+}
+
internal object PolarActivityUtils {
/**
@@ -117,6 +122,37 @@ internal object PolarActivityUtils {
})
}
+ fun readSpecificCaloriesFromDayDirectory(client: BlePsFtpClient, date: Date, caloriesType: CaloriesType): Single {
+ BleLogger.d(TAG, "readSpecificCaloriesFromDayDirectory: $date, type: $caloriesType")
+ return sendSyncStart(client)
+ .andThen(Single.create { emitter ->
+ val dailySummaryFilePath = "$ARABICA_USER_ROOT_FOLDER${dateFormat.format(date)}/${DAILY_SUMMARY_DIRECTORY}${DAILY_SUMMARY_PROTO}"
+ val disposable = client.request(
+ PftpRequest.PbPFtpOperation.newBuilder()
+ .setCommand(PftpRequest.PbPFtpOperation.Command.GET)
+ .setPath(dailySummaryFilePath)
+ .build()
+ .toByteArray()
+ )
+ .subscribe(
+ { response ->
+ val proto = DailySummary.PbDailySummary.parseFrom(response.toByteArray())
+ val caloriesValue = when (caloriesType) {
+ CaloriesType.ACTIVITY -> proto.activityCalories
+ CaloriesType.TRAINING -> proto.trainingCalories
+ CaloriesType.BMR -> proto.bmrCalories
+ }
+ emitter.onSuccess(caloriesValue)
+ },
+ { error ->
+ BleLogger.w(TAG, "readSpecificCaloriesFromDayDirectory() failed for path: $dailySummaryFilePath, error: $error")
+ emitter.onSuccess(0)
+ }
+ )
+ emitter.setDisposable(disposable)
+ })
+ }
+
// Send sync start to generate daily summary for the current date
private fun sendSyncStart(client: BlePsFtpClient): Completable {
return client.sendNotification(
diff --git a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/utils/PolarAutomaticSamplesUtils.kt b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/utils/PolarAutomaticSamplesUtils.kt
new file mode 100644
index 00000000..5aa31a2a
--- /dev/null
+++ b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/utils/PolarAutomaticSamplesUtils.kt
@@ -0,0 +1,98 @@
+package com.polar.sdk.impl.utils
+
+import com.polar.androidcommunications.api.ble.BleLogger
+import com.polar.androidcommunications.api.ble.model.gatt.client.psftp.BlePsFtpClient
+import com.polar.sdk.api.model.activity.Polar247HrSamplesData
+import com.polar.sdk.api.model.activity.AutomaticSampleTriggerType
+import fi.polar.remote.representation.protobuf.AutomaticSamples
+import fi.polar.remote.representation.protobuf.AutomaticSamples.PbAutomaticSampleSessions
+import io.reactivex.rxjava3.core.Single
+import protocol.PftpRequest
+import protocol.PftpResponse.*
+import java.util.Calendar
+import java.util.Date
+import java.util.regex.Pattern
+
+private const val ARABICA_USER_ROOT_FOLDER = "/U/0/"
+private const val AUTOMATIC_SAMPLES_DIRECTORY = "AUTOS/"
+private const val AUTOMATIC_SAMPLES_PATTERN = "AUTOS\\d{3}\\.BPB"
+private const val TAG = "PolarAutomaticSamplesUtils"
+internal object PolarAutomaticSamplesUtils {
+
+ /**
+ * Read 24/7 heart rate samples for given date range.
+ */
+ fun read247HrSamples(client: BlePsFtpClient, fromDate: Date, toDate: Date): Single> {
+ BleLogger.d(TAG, "read247HrSamples: from $fromDate to $toDate")
+ return Single.create { emitter ->
+ val autoSamplesPath = "$ARABICA_USER_ROOT_FOLDER$AUTOMATIC_SAMPLES_DIRECTORY"
+ val builder = PftpRequest.PbPFtpOperation.newBuilder()
+ builder.command = PftpRequest.PbPFtpOperation.Command.GET
+ builder.path = autoSamplesPath
+ val disposable = client.request(builder.build().toByteArray()).subscribe(
+ { response ->
+ val dir = PbPFtpDirectory.parseFrom(response.toByteArray())
+ val pattern = Pattern.compile(AUTOMATIC_SAMPLES_PATTERN)
+ val filteredFiles = dir.entriesList
+ .filter { pattern.matcher(it.name).matches() }
+ .map { it.name }
+
+ val hrSamplesDataList = mutableListOf()
+
+ val fileRequests = filteredFiles.map { fileName ->
+ val filePath = "$autoSamplesPath$fileName"
+ val fileBuilder = PftpRequest.PbPFtpOperation.newBuilder()
+ fileBuilder.command = PftpRequest.PbPFtpOperation.Command.GET
+ fileBuilder.path = filePath
+ BleLogger.d(TAG, "Sending GET request for file: $filePath")
+ client.request(fileBuilder.build().toByteArray()).map { fileResponse ->
+ val sampleSessions = PbAutomaticSampleSessions.parseFrom(fileResponse.toByteArray())
+ val sampleDateProto = sampleSessions.day
+ sampleSessions.samplesList.forEach { sample ->
+ val sampleTimeProto = sample.time
+ val sampleDate = Calendar.getInstance().apply {
+ set(sampleDateProto.year, sampleDateProto.month - 1, sampleDateProto.day, sampleTimeProto.hour, sampleTimeProto.minute, sampleTimeProto.seconds)
+ set(Calendar.MILLISECOND, 0)
+ }.time
+
+ val sampleDateForCheck = Calendar.getInstance().apply {
+ set(sampleDateProto.year, sampleDateProto.month - 1, sampleDateProto.day, 0, 0, 0)
+ set(Calendar.MILLISECOND, 0)
+ }.time
+
+ if (sampleDateForCheck in fromDate..toDate) {
+ val hrSamples = sample.heartRateList
+ val triggerType = when (sample.triggerType) {
+ AutomaticSamples.PbMeasTriggerType.TRIGGER_TYPE_HIGH_ACTIVITY -> AutomaticSampleTriggerType.TRIGGER_TYPE_HIGH_ACTIVITY
+ AutomaticSamples.PbMeasTriggerType.TRIGGER_TYPE_LOW_ACTIVITY -> AutomaticSampleTriggerType.TRIGGER_TYPE_LOW_ACTIVITY
+ AutomaticSamples.PbMeasTriggerType.TRIGGER_TYPE_TIMED -> AutomaticSampleTriggerType.TRIGGER_TYPE_TIMED
+ AutomaticSamples.PbMeasTriggerType.TRIGGER_TYPE_MANUAL -> AutomaticSampleTriggerType.TRIGGER_TYPE_MANUAL
+ else -> throw IllegalArgumentException("Unknown trigger type: ${sample.triggerType}")
+ }
+ hrSamplesDataList.add(Polar247HrSamplesData(sampleDate, hrSamples, triggerType))
+ } else {
+ BleLogger.d(TAG, "Sample date $sampleDate is out of range: $fromDate to $toDate")
+ }
+ }
+ }
+ }
+
+ Single.merge(fileRequests)
+ .doOnComplete {
+ emitter.onSuccess(hrSamplesDataList)
+ }
+ .doOnError { error ->
+ BleLogger.e(TAG, "Error processing files: $error")
+ emitter.onError(error)
+ }
+ .subscribe()
+ },
+ { error ->
+ BleLogger.e(TAG, "read247HrSamples() failed for path: $autoSamplesPath, error: $error")
+ emitter.onError(error)
+ }
+ )
+ emitter.setDisposable(disposable)
+ }
+ }
+}
\ No newline at end of file
diff --git a/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/utils/PolarNightlyRechargeUtils.kt b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/utils/PolarNightlyRechargeUtils.kt
new file mode 100644
index 00000000..45f5a9ef
--- /dev/null
+++ b/sources/Android/android-communications/library/src/sdk/java/com/polar/sdk/impl/utils/PolarNightlyRechargeUtils.kt
@@ -0,0 +1,82 @@
+package com.polar.sdk.impl.utils
+
+import com.polar.androidcommunications.api.ble.BleLogger
+import com.polar.androidcommunications.api.ble.model.gatt.client.psftp.BlePsFtpClient
+import com.polar.sdk.api.model.sleep.PolarNightlyRechargeData
+import fi.polar.remote.representation.protobuf.NightlyRecovery.PbNightlyRecoveryStatus
+import io.reactivex.rxjava3.core.Maybe
+import protocol.PftpRequest
+import java.text.SimpleDateFormat
+import java.util.Calendar
+import java.util.Date
+import java.util.Locale
+
+private const val ARABICA_USER_ROOT_FOLDER = "/U/0/"
+private const val NIGHTLY_RECOVERY_DIRECTORY = "NR/"
+private const val NIGHTLY_RECOVERY_PROTO = "NR.BPB"
+private val dateFormat = SimpleDateFormat("yyyyMMdd", Locale.ENGLISH)
+private const val TAG = "PolarNightlyRechargeUtils"
+
+internal object PolarNightlyRechargeUtils {
+
+ /**
+ * Read nightly recharge data for given date range.
+ */
+ fun readNightlyRechargeData(client: BlePsFtpClient, date: Date): Maybe {
+ BleLogger.d(TAG, "readNightlyRechargeData: $date")
+ return Maybe.create { emitter ->
+ val nightlyRecoveryFilePath = "$ARABICA_USER_ROOT_FOLDER${dateFormat.format(date)}/$NIGHTLY_RECOVERY_DIRECTORY$NIGHTLY_RECOVERY_PROTO"
+ val disposable = client.request(PftpRequest.PbPFtpOperation.newBuilder()
+ .setCommand(PftpRequest.PbPFtpOperation.Command.GET)
+ .setPath(nightlyRecoveryFilePath)
+ .build()
+ .toByteArray()
+ ).subscribe(
+ { response ->
+ val recoveryStatus = PbNightlyRecoveryStatus.parseFrom(response.toByteArray())
+ val recoveryDateProto = recoveryStatus.sleepResultDate
+ val recoveryDate = Calendar.getInstance().apply {
+ set(recoveryDateProto.year, recoveryDateProto.month - 1, recoveryDateProto.day, 0, 0, 0)
+ set(Calendar.MILLISECOND, 0)
+ }.time
+
+ val createdTimestamp = PolarTimeUtils.pbSystemDateTimeToLocalDateTime(recoveryStatus.createdTimestamp)
+ val modifiedTimestamp = if (recoveryStatus.hasModifiedTimestamp()) {
+ PolarTimeUtils.pbSystemDateTimeToLocalDateTime(recoveryStatus.modifiedTimestamp)
+ } else {
+ null
+ }
+
+ val nightlyRechargeData = PolarNightlyRechargeData(
+ createdTimestamp = createdTimestamp,
+ modifiedTimestamp = modifiedTimestamp,
+ ansStatus = recoveryStatus.ansStatus,
+ recoveryIndicator = recoveryStatus.recoveryIndicator,
+ recoveryIndicatorSubLevel = recoveryStatus.recoveryIndicatorSubLevel,
+ ansRate = recoveryStatus.ansRate,
+ scoreRateObsolete = recoveryStatus.scoreRateOBSOLETE,
+ meanNightlyRecoveryRRI = recoveryStatus.meanNightlyRecoveryRRI,
+ meanNightlyRecoveryRMSSD = recoveryStatus.meanNightlyRecoveryRMSSD,
+ meanNightlyRecoveryRespirationInterval = recoveryStatus.meanNightlyRecoveryRespirationInterval,
+ meanBaselineRRI = recoveryStatus.meanBaselineRRI,
+ sdBaselineRRI = recoveryStatus.sdBaselineRRI,
+ meanBaselineRMSSD = recoveryStatus.meanBaselineRMSSD,
+ sdBaselineRMSSD = recoveryStatus.sdBaselineRMSSD,
+ meanBaselineRespirationInterval = recoveryStatus.meanBaselineRespirationInterval,
+ sdBaselineRespirationInterval = recoveryStatus.sdBaselineRespirationInterval,
+ sleepTip = recoveryStatus.sleepTip,
+ vitalityTip = recoveryStatus.vitalityTip,
+ exerciseTip = recoveryStatus.exerciseTip,
+ sleepResultDate = recoveryDate
+ )
+ emitter.onSuccess(nightlyRechargeData)
+ },
+ { error ->
+ BleLogger.w(TAG, "Failed to fetch nightly recharge for date: $date, error: $error")
+ emitter.onComplete()
+ }
+ )
+ emitter.setDisposable(disposable)
+ }
+ }
+}
\ No newline at end of file
diff --git a/sources/Android/android-communications/library/src/sdk/proto/dailysummary.proto b/sources/Android/android-communications/library/src/sdk/proto/dailysummary.proto
index ca98e4ad..ebc9436b 100644
--- a/sources/Android/android-communications/library/src/sdk/proto/dailysummary.proto
+++ b/sources/Android/android-communications/library/src/sdk/proto/dailysummary.proto
@@ -20,6 +20,9 @@ message PbActivityClassTimes {
};
message PbDailySummary {
+ optional uint32 activity_calories = 3 [(type)=CALORIES];
+ optional uint32 training_calories = 4 [(type)=CALORIES];
+ optional uint32 bmr_calories = 5 [(type)=CALORIES];
optional PbActivityClassTimes activity_class_times = 7;
optional float activity_distance = 8 [(type)=DISTANCE];
};
diff --git a/sources/Android/android-communications/library/src/sdk/proto/nightly_recovery.proto b/sources/Android/android-communications/library/src/sdk/proto/nightly_recovery.proto
new file mode 100644
index 00000000..1aec80ec
--- /dev/null
+++ b/sources/Android/android-communications/library/src/sdk/proto/nightly_recovery.proto
@@ -0,0 +1,81 @@
+// NR.BPB=PbNightlyRecoveryStatus
+syntax = "proto2";
+
+package data;
+import "types.proto";
+import "nanopb.proto";
+
+option java_package = "fi.polar.remote.representation.protobuf";
+option java_outer_classname = "NightlyRecovery";
+
+/*
+ Nightly recovery data structure definition
+*/
+
+message PbNightlyRecoveryStatus {
+ // Date and time of the result was created
+ required PbSystemDateTime created_timestamp = 1;
+
+ // Date and time when the file was last modified
+ optional PbSystemDateTime modified_timestamp = 2;
+
+ // The limit of ansStatus is from -15.7068 to 15.7068. A value over 0 is representing
+ // higher parasymphatetic activity than usually (and lower symphatetic) and value below 0
+ // is representing lower parasymphatetic activity than usually (and higher symphatetic)
+ optional float ans_status = 3;
+
+ // The combination of normalized ANS status and normalized Sleep Score and Sleep Metric. Between 1 to 6.
+ optional int32 recovery_indicator = 4;
+
+ // This is a number between 0-100 and it indicates in more detail what is the level of combination of ANS
+ // and Sleep inside the recoveryIndicator class. I.e. if your recovery_indicator is 2, than
+ // recovery_indicator_sub_level 0 indicates that you are at the bottom of that class and ~100
+ // indicates that you are at almost recovery_indicator level 3.
+ optional int32 recovery_indicator_sub_level = 5;
+
+ // Rating of ans status in scale 1-5 compared to own usual level. (5 = best, 1 = worst)
+ optional int32 ans_rate = 6;
+
+ // Rating of sleep score status in scale 1-5 compared to own usual level (5 = best, 1 = worst)
+ optional int32 score_rate_OBSOLETE = 7;
+
+ // Mean of the HR (after 0.5h from sleep start to 4,5h after sleep start hr) samples to beat interval time. (ms)
+ optional int32 mean_nightly_recovery_RRI = 8;
+
+ // Mean of the PPI (after 0.5h from sleep start to 4,5h after sleep start PPI) calculated RMSSD values. (ms)
+ optional int32 mean_nightly_recovery_RMSSD = 9;
+
+ // Mean of the respiration interval (after 0.5h from sleep start to 4,5h after sleep start) samples. (ms)
+ optional int32 mean_nightly_recovery_respiration_interval = 10;
+
+ // The mean RRI from the baseline calculation. (ms)
+ optional int32 mean_baseline_RRI = 11;
+
+ // The standard deviation of RRI from baseline calculation.
+ optional int32 sd_baseline_RRI = 12;
+
+ // The mean RMSSD from the baseline calculation.
+ optional int32 mean_baseline_RMSSD = 13;
+
+ // The standard deviation of RMSSD from baseline calculation.
+ optional int32 sd_baseline_RMSSD = 14;
+
+ // mean Respiration Interval from the baseline calculation. (ms)
+ optional int32 mean_baseline_respiration_interval = 15;
+
+ // The standard deviation of Respiration Interval from baseline calculation.
+ optional int32 sd_baseline_respiration_interval = 16;
+
+ // Chosen sleep tip for the user.
+ optional string sleep_tip = 17 [(nanopb).max_size = 6];
+
+ // Chosen vitality tip for the user.
+ optional string vitality_tip = 18 [(nanopb).max_size = 6];
+
+ // Chosen exercise tip for the user.
+ optional string exercise_tip = 19 [(nanopb).max_size = 6];
+
+ // Date for which the sleep result and nightly recovery result is for
+ optional PbDate sleep_result_date = 20;
+};
+
diff --git a/sources/Android/android-communications/library/src/test/java/com/polar/sdk/api/model/utils/PolarActivityUtilsTest.kt b/sources/Android/android-communications/library/src/test/java/com/polar/sdk/api/model/utils/PolarActivityUtilsTest.kt
index 4d784d32..f95285a1 100644
--- a/sources/Android/android-communications/library/src/test/java/com/polar/sdk/api/model/utils/PolarActivityUtilsTest.kt
+++ b/sources/Android/android-communications/library/src/test/java/com/polar/sdk/api/model/utils/PolarActivityUtilsTest.kt
@@ -3,6 +3,7 @@ package com.polar.sdk.api.model.utils
import com.polar.androidcommunications.api.ble.model.gatt.client.psftp.BlePsFtpClient
import com.polar.sdk.api.model.activity.PolarActiveTime
import com.polar.sdk.api.model.activity.PolarActiveTimeData
+import com.polar.sdk.impl.utils.CaloriesType
import com.polar.sdk.impl.utils.PolarActivityUtils
import fi.polar.remote.representation.protobuf.ActivitySamples
import fi.polar.remote.representation.protobuf.DailySummary
@@ -168,6 +169,88 @@ class PolarActivityUtilsTest {
confirmVerified(client)
}
+ @Test
+ fun `readSpecificCaloriesFromDayDirectory() should return specific calories value`() {
+ // Arrange
+ val client = mockk()
+ val date = Date()
+ val caloriesType = CaloriesType.ACTIVITY
+ val expectedCalories = 500
+ val expectedPath = "/U/0/${dateFormat.format(date)}/DSUM/DSUM.BPB"
+
+ val dailySummaryBuilder = DailySummary.PbDailySummary.newBuilder()
+ when (caloriesType) {
+ CaloriesType.ACTIVITY -> dailySummaryBuilder.activityCalories = expectedCalories
+ CaloriesType.TRAINING -> dailySummaryBuilder.trainingCalories = expectedCalories
+ CaloriesType.BMR -> dailySummaryBuilder.bmrCalories = expectedCalories
+ }
+ val dailySummary = dailySummaryBuilder.build()
+ val outputStream = ByteArrayOutputStream()
+ dailySummary.writeTo(outputStream)
+
+ every { client.request(any()) } returns Single.just(outputStream)
+ every { client.sendNotification(any(), null) } returns Completable.complete()
+
+ // Act
+ val testObserver = PolarActivityUtils.readSpecificCaloriesFromDayDirectory(client, date, caloriesType).test()
+
+ // Assert
+ testObserver.assertComplete()
+ testObserver.assertNoErrors()
+ testObserver.assertValue(expectedCalories)
+
+ verifyOrder {
+ client.sendNotification(
+ PftpNotification.PbPFtpHostToDevNotification.START_SYNC.number,
+ null
+ )
+ client.request(
+ PftpRequest.PbPFtpOperation.newBuilder()
+ .setCommand(PftpRequest.PbPFtpOperation.Command.GET)
+ .setPath(expectedPath)
+ .build()
+ .toByteArray()
+ )
+ }
+ confirmVerified(client)
+ }
+
+ @Test
+ fun `readSpecificCaloriesFromDayDirectory() should return 0 if activity file not found`() {
+ // Arrange
+ val client = mockk()
+ val date = Date()
+ val caloriesType = CaloriesType.ACTIVITY
+ val expectedPath = "/U/0/${dateFormat.format(date)}/DSUM/DSUM.BPB"
+ val expectedError = Throwable("File not found")
+
+ every { client.request(any()) } returns Single.error(expectedError)
+ every { client.sendNotification(any(), null) } returns Completable.complete()
+
+ // Act
+ val testObserver = PolarActivityUtils.readSpecificCaloriesFromDayDirectory(client, date, caloriesType).test()
+
+ // Assert
+ testObserver.assertComplete()
+ testObserver.assertNoErrors()
+ testObserver.assertValue(0)
+
+ verifyOrder {
+ client.sendNotification(
+ PftpNotification.PbPFtpHostToDevNotification.START_SYNC.number,
+ null
+ )
+ client.request(
+ PftpRequest.PbPFtpOperation.newBuilder()
+ .setCommand(PftpRequest.PbPFtpOperation.Command.GET)
+ .setPath(expectedPath)
+ .build()
+ .toByteArray()
+ )
+ }
+ confirmVerified(client)
+ }
+
@Test
fun `readActiveTimeFromDayDirectory() should return PolarActiveTimeData`() {
// Arrange
diff --git a/sources/Android/android-communications/library/src/test/java/com/polar/sdk/api/model/utils/PolarAutomaticSamplesUtilsTest.kt b/sources/Android/android-communications/library/src/test/java/com/polar/sdk/api/model/utils/PolarAutomaticSamplesUtilsTest.kt
new file mode 100644
index 00000000..b576fda3
--- /dev/null
+++ b/sources/Android/android-communications/library/src/test/java/com/polar/sdk/api/model/utils/PolarAutomaticSamplesUtilsTest.kt
@@ -0,0 +1,232 @@
+package com.polar.sdk.api.model.utils
+
+import com.polar.androidcommunications.api.ble.model.gatt.client.psftp.BlePsFtpClient
+import com.polar.sdk.api.model.activity.AutomaticSampleTriggerType
+import com.polar.sdk.impl.utils.PolarAutomaticSamplesUtils
+import fi.polar.remote.representation.protobuf.AutomaticSamples.*
+import fi.polar.remote.representation.protobuf.Types
+import io.mockk.confirmVerified
+import io.mockk.every
+import io.mockk.mockk
+import io.mockk.verify
+import io.reactivex.rxjava3.core.Single
+import org.junit.Test
+import protocol.PftpResponse.*
+import java.io.ByteArrayOutputStream
+import java.util.*
+
+class PolarAutomaticSamplesUtilsTest {
+
+ private val mockClient = mockk()
+
+ @Test
+ fun `read247HrSamples() should correctly filter samples by date and parse all trigger types`() {
+ // Arrange
+ val fromDate = Calendar.getInstance().apply { set(2024, 10, 10, 0, 0, 0); set(Calendar.MILLISECOND, 0) }.time
+ val toDate = Calendar.getInstance().apply { set(2024, 10, 18, 0, 0, 0); set(Calendar.MILLISECOND, 0) }.time
+
+ val mockDirectoryContent = ByteArrayOutputStream().apply {
+ PbPFtpDirectory.newBuilder()
+ .addAllEntries(
+ listOf(
+ PbPFtpEntry.newBuilder().setName("AUTOS000.BPB").setSize(333L).build(),
+ PbPFtpEntry.newBuilder().setName("AUTOS001.BPB").setSize(444L).build()
+ )
+ ).build().writeTo(this)
+ }
+
+ val mockFileContent1 = ByteArrayOutputStream().apply {
+ PbAutomaticSampleSessions.newBuilder()
+ .addAllSamples(
+ listOf(
+ PbAutomaticHeartRateSamples.newBuilder()
+ .addAllHeartRate(listOf(60, 61, 63))
+ .setTime(
+ Types.PbTime.newBuilder()
+ .setHour(10)
+ .setMinute(12)
+ .setSeconds(34)
+ .build()
+ )
+ .setTriggerType(PbMeasTriggerType.TRIGGER_TYPE_HIGH_ACTIVITY)
+ .build(),
+ PbAutomaticHeartRateSamples.newBuilder()
+ .addAllHeartRate(listOf(80, 81, 83))
+ .setTime(
+ Types.PbTime.newBuilder()
+ .setHour(12)
+ .setMinute(0)
+ .setSeconds(0)
+ .build()
+ )
+ .setTriggerType(PbMeasTriggerType.TRIGGER_TYPE_MANUAL)
+ .build()
+ )
+ ).setDay(
+ Types.PbDate.newBuilder()
+ .setYear(2024)
+ .setMonth(11)
+ .setDay(18)
+ .build()
+ )
+ .build()
+ .writeTo(this)
+ }
+
+ val mockFileContent2 = ByteArrayOutputStream().apply {
+ PbAutomaticSampleSessions.newBuilder()
+ .addAllSamples(
+ listOf(
+ PbAutomaticHeartRateSamples.newBuilder()
+ .addAllHeartRate(listOf(70, 72, 74))
+ .setTime(
+ Types.PbTime.newBuilder()
+ .setHour(16)
+ .setMinute(49)
+ .setSeconds(36)
+ .build()
+ )
+ .setTriggerType(PbMeasTriggerType.TRIGGER_TYPE_LOW_ACTIVITY)
+ .build(),
+ PbAutomaticHeartRateSamples.newBuilder()
+ .addAllHeartRate(listOf(90, 91, 93))
+ .setTime(
+ Types.PbTime.newBuilder()
+ .setHour(18)
+ .setMinute(0)
+ .setSeconds(0)
+ .build()
+ )
+ .setTriggerType(PbMeasTriggerType.TRIGGER_TYPE_TIMED)
+ .build()
+ )
+ ).setDay(
+ Types.PbDate.newBuilder()
+ .setYear(2024)
+ .setMonth(11)
+ .setDay(15)
+ .build()
+ )
+ .build()
+ .writeTo(this)
+ }
+
+ every { mockClient.request(any()) } returns Single.just(mockDirectoryContent) andThen Single.just(mockFileContent1) andThen Single.just(mockFileContent2)
+
+ // Act
+ val result = PolarAutomaticSamplesUtils.read247HrSamples(mockClient, fromDate, toDate).blockingGet()
+
+ // Assert
+ verify { mockClient.request(any()) }
+ confirmVerified(mockClient)
+
+ assert(result.size == 4)
+ val date1 = Calendar.getInstance().apply { set(2024, 10, 18, 10, 12, 34); set(Calendar.MILLISECOND, 0) }
+ assert(result[0].date == date1.time)
+ assert(result[0].hrSamples == listOf(60, 61, 63))
+ assert(result[0].triggerType == AutomaticSampleTriggerType.TRIGGER_TYPE_HIGH_ACTIVITY)
+
+ val date2 = Calendar.getInstance().apply { set(2024, 10, 18, 12, 0, 0); set(Calendar.MILLISECOND, 0) }
+ assert(result[1].date == date2.time)
+ assert(result[1].hrSamples == listOf(80, 81, 83))
+ assert(result[1].triggerType == AutomaticSampleTriggerType.TRIGGER_TYPE_MANUAL)
+
+ val date3 = Calendar.getInstance().apply { set(2024, 10, 15, 16, 49, 36); set(Calendar.MILLISECOND, 0) }
+ assert(result[2].date == date3.time)
+ assert(result[2].hrSamples == listOf(70, 72, 74))
+ assert(result[2].triggerType == AutomaticSampleTriggerType.TRIGGER_TYPE_LOW_ACTIVITY)
+
+ val date4 = Calendar.getInstance().apply { set(2024, 10, 15, 18, 0, 0); set(Calendar.MILLISECOND, 0) }
+ assert(result[3].date == date4.time)
+ assert(result[3].hrSamples == listOf(90, 91, 93))
+ assert(result[3].triggerType == AutomaticSampleTriggerType.TRIGGER_TYPE_TIMED)
+ }
+
+ @Test
+ fun `read247HrSamples() should filter out samples outside the date range`() {
+ // Arrange
+ val fromDate = Calendar.getInstance().apply { set(2024, 10, 10, 0, 0, 0); set(Calendar.MILLISECOND, 0) }.time
+ val toDate = Calendar.getInstance().apply { set(2024, 10, 18, 0, 0, 0); set(Calendar.MILLISECOND, 0) }.time
+
+ val mockDirectoryContent = ByteArrayOutputStream().apply {
+ PbPFtpDirectory.newBuilder()
+ .addAllEntries(
+ listOf(
+ PbPFtpEntry.newBuilder().setName("AUTOS000.BPB").setSize(333L).build()
+ )
+ ).build().writeTo(this)
+ }
+
+ val mockFileContent = ByteArrayOutputStream().apply {
+ PbAutomaticSampleSessions.newBuilder()
+ .addAllSamples(
+ listOf(
+ PbAutomaticHeartRateSamples.newBuilder()
+ .addAllHeartRate(listOf(60, 61, 63))
+ .setTime(
+ Types.PbTime.newBuilder()
+ .setHour(10)
+ .setMinute(12)
+ .setSeconds(34)
+ .build()
+ )
+ .setTriggerType(PbMeasTriggerType.TRIGGER_TYPE_HIGH_ACTIVITY)
+ .build(),
+ PbAutomaticHeartRateSamples.newBuilder()
+ .addAllHeartRate(listOf(70, 72, 74))
+ .setTime(
+ Types.PbTime.newBuilder()
+ .setHour(14)
+ .setMinute(30)
+ .setSeconds(0)
+ .build()
+ )
+ .setTriggerType(PbMeasTriggerType.TRIGGER_TYPE_LOW_ACTIVITY)
+ .build()
+ )
+ ).setDay(
+ Types.PbDate.newBuilder()
+ .setYear(2024)
+ .setMonth(11)
+ .setDay(20)
+ .build()
+ ).build().writeTo(this)
+ }
+
+ val mockFileContent2 = ByteArrayOutputStream().apply {
+ PbAutomaticSampleSessions.newBuilder()
+ .addAllSamples(
+ listOf(
+ PbAutomaticHeartRateSamples.newBuilder()
+ .addAllHeartRate(listOf(80, 81, 83))
+ .setTime(
+ Types.PbTime.newBuilder()
+ .setHour(16)
+ .setMinute(45)
+ .setSeconds(0)
+ .build()
+ )
+ .setTriggerType(PbMeasTriggerType.TRIGGER_TYPE_MANUAL)
+ .build()
+ )
+ ).setDay(
+ Types.PbDate.newBuilder()
+ .setYear(2024)
+ .setMonth(11)
+ .setDay(9)
+ .build()
+ ).build().writeTo(this)
+ }
+
+ every { mockClient.request(any()) } returns Single.just(mockDirectoryContent) andThen Single.just(mockFileContent) andThen Single.just(mockFileContent2)
+
+ // Act
+ val result = PolarAutomaticSamplesUtils.read247HrSamples(mockClient, fromDate, toDate).blockingGet()
+
+ // Assert
+ verify { mockClient.request(any()) }
+ confirmVerified(mockClient)
+
+ assert(result.isEmpty())
+ }
+}
\ No newline at end of file
diff --git a/sources/Android/android-communications/library/src/test/java/com/polar/sdk/api/model/utils/PolarNightlyRechargeUtilsTest.kt b/sources/Android/android-communications/library/src/test/java/com/polar/sdk/api/model/utils/PolarNightlyRechargeUtilsTest.kt
new file mode 100644
index 00000000..1e4fd399
--- /dev/null
+++ b/sources/Android/android-communications/library/src/test/java/com/polar/sdk/api/model/utils/PolarNightlyRechargeUtilsTest.kt
@@ -0,0 +1,150 @@
+package com.polar.sdk.api.model.utils
+
+import com.polar.androidcommunications.api.ble.BleLogger
+import fi.polar.remote.representation.protobuf.Types.PbDate
+import fi.polar.remote.representation.protobuf.Types.PbSystemDateTime
+import fi.polar.remote.representation.protobuf.Types.PbTime
+import com.polar.androidcommunications.api.ble.model.gatt.client.psftp.BlePsFtpClient
+import com.polar.sdk.api.model.sleep.PolarNightlyRechargeData
+import com.polar.sdk.impl.utils.PolarNightlyRechargeUtils
+import com.polar.sdk.impl.utils.PolarTimeUtils
+import fi.polar.remote.representation.protobuf.NightlyRecovery
+import io.mockk.confirmVerified
+import io.mockk.every
+import io.mockk.mockk
+import io.mockk.verify
+import io.reactivex.rxjava3.core.Single
+import org.junit.Test
+import protocol.PftpRequest
+import java.io.ByteArrayOutputStream
+import java.text.SimpleDateFormat
+import java.time.LocalDateTime
+import java.util.*
+
+class PolarNightlyRechargeUtilsTest {
+
+ @Test
+ fun `readNightlyRechargeData() should return nightly recharge data`() {
+ // Arrange
+ val dateFormatter = SimpleDateFormat("yyyyMMdd", Locale.ENGLISH)
+ val mockClient = mockk()
+ val date = Date()
+ val expectedPath = "/U/0/${dateFormatter.format(date)}/NR/NR.BPB"
+
+ val outputStream = ByteArrayOutputStream().apply {
+ val proto = NightlyRecovery.PbNightlyRecoveryStatus.newBuilder()
+ .setSleepResultDate(PbDate.newBuilder().setYear(2024).setMonth(12).setDay(5).build())
+ .setCreatedTimestamp(PbSystemDateTime.newBuilder()
+ .setDate(PbDate.newBuilder().setYear(2023).setMonth(12).setDay(5).build())
+ .setTime(PbTime.newBuilder().setHour(10).setMinute(0).setSeconds(0).setMillis(0).build())
+ .setTrusted(true)
+ .build())
+ .setModifiedTimestamp(PbSystemDateTime.newBuilder()
+ .setDate(PbDate.newBuilder().setYear(2023).setMonth(12).setDay(5).build())
+ .setTime(PbTime.newBuilder().setHour(10).setMinute(0).setSeconds(0).setMillis(0).build())
+ .setTrusted(true)
+ .build())
+ .setAnsStatus(5.5f)
+ .setRecoveryIndicator(3)
+ .setRecoveryIndicatorSubLevel(50)
+ .setAnsRate(4)
+ .setScoreRateOBSOLETE(2)
+ .setMeanNightlyRecoveryRRI(800)
+ .setMeanNightlyRecoveryRMSSD(50)
+ .setMeanNightlyRecoveryRespirationInterval(1000)
+ .setMeanBaselineRRI(750)
+ .setSdBaselineRRI(30)
+ .setMeanBaselineRMSSD(45)
+ .setSdBaselineRMSSD(20)
+ .setMeanBaselineRespirationInterval(950)
+ .setSdBaselineRespirationInterval(25)
+ .setSleepTip("Sleep tip 1")
+ .setVitalityTip("Vitality tip 2")
+ .setExerciseTip("Exercise tip 3")
+ .build()
+ proto.writeTo(this)
+ }
+
+ val createdTimestamp = LocalDateTime.of(2023, 12, 5, 10, 0, 0, 0)
+ val calendar = Calendar.getInstance().apply {
+ set(2024, Calendar.DECEMBER, 5, 0, 0, 0)
+ set(Calendar.MILLISECOND, 0)
+ }
+ val sleepResultDate = calendar.time
+
+ val expectedResult = PolarNightlyRechargeData(
+ createdTimestamp = createdTimestamp,
+ modifiedTimestamp = createdTimestamp,
+ ansStatus = 5.5f,
+ recoveryIndicator = 3,
+ recoveryIndicatorSubLevel = 50,
+ ansRate = 4,
+ scoreRateObsolete = 2,
+ meanNightlyRecoveryRRI = 800,
+ meanNightlyRecoveryRMSSD = 50,
+ meanNightlyRecoveryRespirationInterval = 1000,
+ meanBaselineRRI = 750,
+ sdBaselineRRI = 30,
+ meanBaselineRMSSD = 45,
+ sdBaselineRMSSD = 20,
+ meanBaselineRespirationInterval = 950,
+ sdBaselineRespirationInterval = 25,
+ sleepTip = "Sleep tip 1",
+ vitalityTip = "Vitality tip 2",
+ exerciseTip = "Exercise tip 3",
+ sleepResultDate = sleepResultDate
+ )
+
+ every { mockClient.request(any()) } returns Single.just(outputStream)
+
+ // Act
+ val testObserver = PolarNightlyRechargeUtils.readNightlyRechargeData(mockClient, date).test()
+
+ // Assert
+ testObserver.assertComplete()
+ testObserver.assertNoErrors()
+ testObserver.assertValue(expectedResult)
+
+ verify {
+ mockClient.request(
+ PftpRequest.PbPFtpOperation.newBuilder()
+ .setCommand(PftpRequest.PbPFtpOperation.Command.GET)
+ .setPath(expectedPath)
+ .build()
+ .toByteArray()
+ )
+ }
+ confirmVerified(mockClient)
+ }
+
+ @Test
+ fun `readNightlyRechargeData() should return null when an error is thrown`() {
+ // Arrange
+ val dateFormatter = SimpleDateFormat("yyyyMMdd", Locale.ENGLISH)
+ val mockClient = mockk()
+ val date = Date()
+ val expectedPath = "/U/0/${dateFormatter.format(date)}/NR/NR.BPB"
+ val expectedError = Throwable("No nightly recharge data found")
+
+ every { mockClient.request(any()) } returns Single.error(expectedError)
+
+ // Act
+ val testObserver = PolarNightlyRechargeUtils.readNightlyRechargeData(mockClient, date).test()
+
+ // Assert
+ testObserver.assertComplete()
+ testObserver.assertNoErrors()
+ testObserver.assertNoValues()
+
+ verify {
+ mockClient.request(
+ PftpRequest.PbPFtpOperation.newBuilder()
+ .setCommand(PftpRequest.PbPFtpOperation.Command.GET)
+ .setPath(expectedPath)
+ .build()
+ .toByteArray()
+ )
+ }
+ confirmVerified(mockClient)
+ }
+}
\ No newline at end of file
diff --git a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarActivityApi.swift b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarActivityApi.swift
index 19aae899..93b93478 100644
--- a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarActivityApi.swift
+++ b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarActivityApi.swift
@@ -31,4 +31,13 @@ public protocol PolarActivityApi {
/// - toDate: The ending date of the period to retrieve active time from.
/// - Returns: A Single emitting an array of `PolarActiveTimeData` representing the active time data for the specified period.
func getActiveTime(identifier: String, fromDate: Date, toDate: Date) -> Single<[PolarActiveTimeData]>
+
+ /// Get 24/7 heart rate samples for a given period.
+ ///
+ /// - Parameters:
+ /// - identifier: The Polar device ID or BT address.
+ /// - fromDate: The starting date of the period to retrieve heart rate samples from.
+ /// - toDate: The ending date of the period to retrieve heart rate samples from.
+ /// - Returns: A Single emitting an array of `PolarActiveTimeData` representing the heart rate samples data for the specified period.
+ func get247HrSamples(identifier: String, fromDate: Date, toDate: Date) -> Single<[Polar247HrSamplesData]>
}
diff --git a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarBleApi.swift b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarBleApi.swift
index 0c15db4e..e65517d2 100644
--- a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarBleApi.swift
+++ b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarBleApi.swift
@@ -60,6 +60,7 @@ public enum PolarActivityDataType: String, CaseIterable {
case SLEEP
case STEPS
case CALORIES
+ case HR_SAMPLES
case NONE
}
@@ -408,7 +409,7 @@ public protocol PolarBleApi: PolarOfflineRecordingApi, PolarOnlineStreamingApi,
/// @param until, Data will be deleted from device from history until this date.
/// @return [Completable] emitting success or error
func deleteStoredDeviceData(_ identifier: String, dataType: PolarStoredDataType.StoredDataType, until: Date?) -> Completable
-
+
/// Common GAP (Generic access profile) observer
var observer: PolarBleApiObserver? { get set }
diff --git a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarBleApiDefaultImpl.swift b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarBleApiDefaultImpl.swift
index ed779ed5..cf71345a 100644
--- a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarBleApiDefaultImpl.swift
+++ b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarBleApiDefaultImpl.swift
@@ -18,6 +18,6 @@ public class PolarBleApiDefaultImpl {
///
/// - Returns: version in format major.minor.patch
public static func versionInfo() -> String {
- return "5.9.0"
+ return "5.10.0"
}
}
diff --git a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarFirmwareUpdateApi.swift b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarFirmwareUpdateApi.swift
index e89cc025..d3f8c4ec 100644
--- a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarFirmwareUpdateApi.swift
+++ b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarFirmwareUpdateApi.swift
@@ -4,6 +4,13 @@ import Foundation
import RxSwift
public protocol PolarFirmwareUpdateApi {
+ /**
+ * Checks firmware update to given device.
+ *
+ * - Parameter identifier: Polar device ID or BT address
+ * - Returns: Observable emitting status of firmware update check
+ */
+ func checkFirmwareUpdate(_ identifier: String) -> Observable
/**
* Updates firmware to given device.
*
diff --git a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarOfflineRecordingApi.swift b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarOfflineRecordingApi.swift
index aa74427c..53c040fb 100644
--- a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarOfflineRecordingApi.swift
+++ b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/PolarOfflineRecordingApi.swift
@@ -80,6 +80,17 @@ public protocol PolarOfflineRecordingApi {
/// - error: fetch recording request failed. see `PolarErrors` for possible errors invoked
func getOfflineRecord(_ identifier: String, entry: PolarOfflineRecordingEntry, secret: PolarRecordingSecret?) -> Single< PolarOfflineRecordingData>
+ /// Fetch number sub recordings in recording from the device.
+ ///
+ ///
+ /// - Parameters:
+ /// - identifier: polar device id
+ /// - entry: The offline recording whose subrecording count will be checked
+ /// - Returns: Single
+ /// - success : the offline recording subrecording count
+ /// - error: fetch recording request failed. see `PolarErrors` for possible errors invoked
+ func getSubRecordingCount(identifier: String, entry: PolarOfflineRecordingEntry) -> Single
+
/// List split offline recordings stored in the device.
///
/// - Parameters:
diff --git a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/PolarFirmwareUpdateModels.swift b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/PolarFirmwareUpdateModels.swift
index 53774502..19cb4beb 100644
--- a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/PolarFirmwareUpdateModels.swift
+++ b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/PolarFirmwareUpdateModels.swift
@@ -2,6 +2,12 @@
import Foundation
+public enum CheckFirmwareUpdateStatus {
+ case checkFwUpdateAvailable(version: String)
+ case checkFwUpdateNotAvailable(details: String)
+ case checkFwUpdateFailed(details: String)
+}
+
public enum FirmwareUpdateStatus {
case fetchingFwUpdatePackage(details: String)
case preparingDeviceForFwUpdate(details: String)
diff --git a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/PolarUserDeviceSettings.swift b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/PolarUserDeviceSettings.swift
index 8a122630..d26ecb43 100644
--- a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/PolarUserDeviceSettings.swift
+++ b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/PolarUserDeviceSettings.swift
@@ -44,7 +44,7 @@ public class PolarUserDeviceSettings {
}
public struct PolarUserDeviceSettingsResult: Codable {
- public var deviceLocation: DeviceLocation!
+ public var deviceLocation: DeviceLocation = .UNDEFINED
}
static func toProto(deviceUserLocation: (DeviceLocation)) -> Data_PbUserDeviceSettings {
diff --git a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/activity/PolarAutomaticSamplesData.swift b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/activity/PolarAutomaticSamplesData.swift
new file mode 100644
index 00000000..f5304510
--- /dev/null
+++ b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/activity/PolarAutomaticSamplesData.swift
@@ -0,0 +1,73 @@
+/// Copyright © 2024 Polar. All rights reserved.
+
+import Foundation
+
+public struct Polar247HrSamplesData: Codable {
+ public let date: Date
+ public let hrSamples: [Int]
+ public let triggerType: AutomaticSampleTriggerType?
+
+ enum CodingKeys: String, CodingKey {
+ case date
+ case hrSamples
+ case triggerType
+ }
+
+ public init(date: Date, hrSamples: [Int], triggerType: AutomaticSampleTriggerType?) {
+ self.date = date
+ self.hrSamples = hrSamples
+ self.triggerType = triggerType
+ }
+
+ public init(from decoder: Decoder) throws {
+ let container = try decoder.container(keyedBy: CodingKeys.self)
+
+ let dateString = try container.decode(String.self, forKey: .date)
+ guard let decodedDate = ISO8601DateFormatter().date(from: dateString) else {
+ throw DecodingError.dataCorruptedError(forKey: .date, in: container, debugDescription: "Invalid date format")
+ }
+ date = decodedDate
+
+ hrSamples = try container.decode([Int].self, forKey: .hrSamples)
+
+ let triggerTypeString = try container.decode(String.self, forKey: .triggerType)
+ guard let decodedTriggerType = AutomaticSampleTriggerType(stringValue: triggerTypeString) else {
+ throw DecodingError.dataCorruptedError(forKey: .triggerType, in: container, debugDescription: "Invalid trigger type string")
+ }
+ triggerType = decodedTriggerType
+ }
+
+ public func encode(to encoder: Encoder) throws {
+ var container = encoder.container(keyedBy: CodingKeys.self)
+ let dateString = ISO8601DateFormatter().string(from: date)
+ try container.encode(dateString, forKey: .date)
+ try container.encode(hrSamples, forKey: .hrSamples)
+ try container.encode(triggerType?.stringValue, forKey: .triggerType)
+ }
+}
+
+public enum AutomaticSampleTriggerType: String, Codable {
+ case highActivity = "highActivity"
+ case lowActivity = "lowActivity"
+ case timed = "timed"
+ case manual = "manual"
+
+ init?(stringValue: String) {
+ switch stringValue {
+ case "highActivity":
+ self = .highActivity
+ case "lowActivity":
+ self = .lowActivity
+ case "timed":
+ self = .timed
+ case "manual":
+ self = .manual
+ default:
+ return nil
+ }
+ }
+
+ var stringValue: String {
+ return self.rawValue
+ }
+}
diff --git a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/sleep/PolarSleepData.swift b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/sleep/PolarSleepData.swift
index 6c3617e8..9c7aa7de 100644
--- a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/sleep/PolarSleepData.swift
+++ b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/api/model/sleep/PolarSleepData.swift
@@ -6,19 +6,23 @@ import Foundation
public class PolarSleepData {
- public enum SleepWakeState: Int, Codable {
- case UNKNOWN = 0
- case WAKE = -2
- case REM = -3
- case NONREM12 = -5
- case NONREM3 = -6
+ public enum SleepWakeState: String, Codable {
+ case UNKNOWN = "UNKNOWN"
+ case WAKE = "WAKE"
+ case REM = "REM"
+ case NONREM12 = "NONREM12"
+ case NONREM3 = "NONREM3"
static func getByValue(value: Int) -> SleepWakeState {
- guard let status = SleepWakeState(rawValue: value) else {
- BleLogger.error("Invalid SleepWakeState value: \(value)")
- return UNKNOWN
+
+ switch value {
+ case 0: return .UNKNOWN
+ case -2: return .WAKE
+ case -3: return .REM
+ case -5: return .NONREM12
+ case -6: return .NONREM3
+ default: return .UNKNOWN
}
- return status
}
}
diff --git a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/impl/PolarBleApiImpl.swift b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/impl/PolarBleApiImpl.swift
index dd7fbd0b..806a2471 100644
--- a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/impl/PolarBleApiImpl.swift
+++ b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/impl/PolarBleApiImpl.swift
@@ -51,7 +51,6 @@ import UIKit
var connectSubscriptions = [String : Disposable]()
var serviceList = [CBUUID.init(string: "180D")]
let features:Set
- var fileDeletionMap = [String : Bool]()
let dateFormatter = ISO8601DateFormatter()
required public init(_ queue: DispatchQueue, features: Set) {
@@ -1420,7 +1419,7 @@ extension PolarBleApiImpl: PolarBleApi {
}
}
- private func getSubRecordingCount(identifier: String, entry: PolarOfflineRecordingEntry) -> Single {
+ func getSubRecordingCount(identifier: String, entry: PolarOfflineRecordingEntry) -> Single {
return Single.create { single in
do {
let session = try self.sessionFtpClientReady(identifier)
@@ -2203,6 +2202,90 @@ extension PolarBleApiImpl: PolarBleApi {
return Disposables.create()
}
}
+
+ func checkFirmwareUpdate(_ identifier: String) -> Observable {
+ let fwApi = FirmwareUpdateApi()
+
+ do {
+ let session = try self.sessionFtpClientReady(identifier)
+ guard let client = session.fetchGattClient(BlePsFtpClient.PSFTP_SERVICE) as? BlePsFtpClient else {
+ return Observable.just(CheckFirmwareUpdateStatus.checkFwUpdateFailed(details: "No BlePsFtpClient available"))
+ }
+ self.sendInitializationAndStartSyncNotifications(client: client)
+
+ guard let deviceInfo = PolarFirmwareUpdateUtils.readDeviceFirmwareInfo(client: client, deviceId: identifier) else {
+ return Observable.just(CheckFirmwareUpdateStatus.checkFwUpdateFailed(details: "Failed to read device firmware info"))
+ }
+
+ let firmwareUpdateRequest: FirmwareUpdateRequest
+ do {
+ firmwareUpdateRequest = try FirmwareUpdateRequest(
+ clientId: "polar-sensor-data-collector-ios",
+ uuid: PolarDeviceUuid.fromDeviceId(identifier),
+ firmwareVersion: deviceInfo.deviceFwVersion,
+ hardwareCode: deviceInfo.deviceHardwareCode
+ )
+ } catch {
+ return Observable.just(CheckFirmwareUpdateStatus.checkFwUpdateFailed(details: "Failed to create FirmwareUpdateRequest: \(error.localizedDescription)"))
+ }
+
+ return Observable.create { observer in
+ fwApi.checkFirmwareUpdate(firmwareUpdateRequest: firmwareUpdateRequest) { result in
+ switch result {
+ case .success(let apiResponse):
+ guard let statusCode = apiResponse.statusCode else {
+ BleLogger.error("No status code received")
+ observer.onNext(CheckFirmwareUpdateStatus.checkFwUpdateFailed(details: "No status code received"))
+ observer.onCompleted()
+ return
+ }
+
+ if statusCode == 204 {
+ BleLogger.trace("Firmware update not available, status code 204")
+ observer.onNext(CheckFirmwareUpdateStatus.checkFwUpdateNotAvailable(details: "Firmware update not available"))
+ observer.onCompleted()
+ return
+ }
+
+ if statusCode == 400 {
+ BleLogger.error("Bad request, status code 400")
+ observer.onNext(CheckFirmwareUpdateStatus.checkFwUpdateFailed(details: "Bad request to firmware API"))
+ observer.onCompleted()
+ return
+ }
+
+ guard statusCode == 200 else {
+ BleLogger.error("Unexpected status code: \(statusCode)")
+ observer.onNext(CheckFirmwareUpdateStatus.checkFwUpdateFailed(details: "Unexpected status code: \(statusCode)"))
+ observer.onCompleted()
+ return
+ }
+
+ let deviceFwVersion = deviceInfo.deviceFwVersion
+ if !PolarFirmwareUpdateUtils.isAvailableFirmwareVersionHigher(currentVersion: deviceFwVersion, availableVersion: apiResponse.version!) {
+ BleLogger.trace("No firmware update available, device firmware version \(deviceFwVersion)")
+ observer.onNext(CheckFirmwareUpdateStatus.checkFwUpdateNotAvailable(details: "No firmware update available, device firmware version \(deviceFwVersion)"))
+ observer.onCompleted()
+ return
+ }
+
+ BleLogger.trace("Firmware update available, latest firmware version: \(apiResponse.version!), device firmware version \(deviceFwVersion)")
+ observer.onNext(CheckFirmwareUpdateStatus.checkFwUpdateAvailable(version: apiResponse.version!))
+ observer.onCompleted()
+
+ case .failure(let error):
+ BleLogger.error("Error checking firmware update: \(error)")
+ observer.onNext(CheckFirmwareUpdateStatus.checkFwUpdateFailed(details: "Error checking firmware update: \(error.localizedDescription)"))
+ observer.onCompleted()
+ }
+ }
+ return Disposables.create()
+ }
+ } catch {
+ BleLogger.error("Error during firmware update check: \(error)")
+ return Observable.just(CheckFirmwareUpdateStatus.checkFwUpdateFailed(details: "Error: \(error.localizedDescription)"))
+ }
+ }
func updateFirmware(_ identifier: String) -> Observable {
let fwApi = FirmwareUpdateApi()
@@ -2315,7 +2398,7 @@ extension PolarBleApiImpl: PolarBleApi {
}
return Observable.from(sortedFirmwarePackage)
- .flatMap { fileEntry -> Observable in
+ .concatMap { fileEntry -> Observable in
let fileName = fileEntry.key
let firmwareBytes = fileEntry.value
let filePath = "/\(fileName)"
@@ -2341,12 +2424,24 @@ extension PolarBleApiImpl: PolarBleApi {
})
.andThen(Single.just(status))
.flatMap { _ in
- BleLogger.trace("Performing factory reset while preserving pairing information")
- return self.doFactoryReset(identifier, preservePairingInformation: true)
- .do(onSubscribe: {
- BleLogger.trace("Factory reset initiated")
- })
- .andThen(Single.just(()))
+ return Single.create { singleObserver in
+ do {
+ let session = try self.sessionFtpClientReady(identifier)
+ singleObserver(.success(session))
+ } catch {
+ BleLogger.trace("Error: \(error). Waiting for FTP client readiness.")
+ singleObserver(.failure(error))
+ }
+ return Disposables.create()
+ }
+ .flatMap { _ in
+ BleLogger.trace("Performing factory reset while preserving pairing information")
+ return self.doFactoryReset(identifier, preservePairingInformation: true)
+ .do(onSubscribe: {
+ BleLogger.trace("Factory reset initiated")
+ })
+ .andThen(Single.just(()))
+ }
}
.flatMap { _ in
BleLogger.trace("Waiting for device session to open after factory reset with timeout: \(factoryResetMaxWaitTimeSeconds) seconds")
@@ -2559,6 +2654,19 @@ extension PolarBleApiImpl: PolarBleApi {
return Single.error(error)
}
}
+
+ func get247HrSamples(identifier: String, fromDate: Date, toDate: Date) -> Single<[Polar247HrSamplesData]> {
+ do {
+ let session = try self.sessionFtpClientReady(identifier)
+ guard let client = session.fetchGattClient(BlePsFtpClient.PSFTP_SERVICE) as? BlePsFtpClient else {
+ return Single.error(PolarErrors.serviceNotFound)
+ }
+
+ return PolarAutomaticSamplesUtils.read247HrSamples(client: client, fromDate: fromDate, toDate: toDate)
+ } catch {
+ return Single.error(error)
+ }
+ }
@available(*, deprecated, message: "Use setWarehouseSleep(_ identifier: String) instead")
func setWarehouseSleep(_ identifier: String, enableWarehouseSleep: Bool?) -> Completable {
@@ -2697,21 +2805,21 @@ extension PolarBleApiImpl: PolarBleApi {
return Single.error(error)
}
}
-
+
func deleteStoredDeviceData(_ identifier: String, dataType: PolarStoredDataType.StoredDataType, until: Date?) -> Completable {
- fileDeletionMap.removeAll()
+ var dataDeletionStats = DataDeletionStats()
let entryPattern = dataType.rawValue
switch dataType {
case .AUTO_SAMPLE:
- return deleteListedFilesByType(identifier: identifier, entryPath: "/U/0/AUTOS", until: until!, dataType, condition:{ (entry) -> Bool in
+ return deleteListedFilesByType(identifier: identifier, dataDeletionStats: dataDeletionStats, entryPath: "/U/0/AUTOS", until: until!, dataType, condition:{ (entry) -> Bool in
entry.contains("^(\\d{8})(/)") ||
entry == "\(entryPattern)/" ||
entry.contains(".BPB")
})
case .SDLOGS:
- return deleteListedFilesByType(identifier: identifier, entryPath: "/SDLOGS", until: until!, dataType, condition:{ (entry) -> Bool in
+ return deleteListedFilesByType(identifier: identifier, dataDeletionStats: dataDeletionStats, entryPath: "/SDLOGS", until: until!, dataType, condition:{ (entry) -> Bool in
entry.contains("^(\\d{8})(/)") ||
entry == "\(entryPattern)/" ||
entry.contains(".SLG") ||
@@ -2727,7 +2835,7 @@ extension PolarBleApiImpl: PolarBleApi {
fallthrough
case .SLEEP_SCORE:
if (until != nil) {
- return deleteListedFilesByType(identifier: identifier, entryPath: "/U/0/", until: until!, dataType, condition:{ (entry) -> Bool in
+ return deleteListedFilesByType(identifier: identifier, dataDeletionStats: dataDeletionStats, entryPath: "/U/0/", until: until!, dataType, condition:{ (entry) -> Bool in
return entry.matches("^([0-9]{8})(\\/)") ||
entry == "\(entryPattern)/" ||
entry.contains(".BPB") &&
@@ -2742,11 +2850,11 @@ extension PolarBleApiImpl: PolarBleApi {
}
}
- private func deleteListedFilesByType(identifier: String, entryPath: String, until: Date, _ dataType: PolarStoredDataType.StoredDataType, condition: @escaping (_ p: String) -> Bool) -> Completable {
-
- listFiles(identifier: identifier, folderPath: entryPath, condition: condition)
+ private func deleteListedFilesByType(identifier: String, dataDeletionStats: DataDeletionStats, entryPath: String, until: Date, _ dataType: PolarStoredDataType.StoredDataType, condition: @escaping (_ p: String) -> Bool) -> Completable {
+
+ listFiles(identifier: identifier, dataDeletionStats: dataDeletionStats, folderPath: entryPath, condition: condition)
.map{ [self] item -> () in
- fileDeletionMap[item] = false
+ dataDeletionStats.fileDeletionMap[item] = false
}
.asObservable()
.subscribe(
@@ -2757,14 +2865,14 @@ extension PolarBleApiImpl: PolarBleApi {
switch dataType {
case .AUTO_SAMPLE:
BleLogger.trace("Starting to delete files from /U/0/AUTOS/ folder.")
- checkAutoSampleFiles(identifier: identifier).subscribe(
+ checkAutoSampleFiles(identifier: identifier, dataDeletionStats: dataDeletionStats).subscribe(
onCompleted: {
- deleteAutoSampleFiles(identifier: identifier)
+ deleteAutoSampleFiles(identifier: identifier, dataDeletionStats: dataDeletionStats)
}
)
case .SDLOGS:
BleLogger.trace("Starting to delete files from SDLOGS folder.")
- deleteSdLogFiles(identifier: identifier)
+ deleteSdLogFiles(identifier: identifier, dataDeletionStats: dataDeletionStats)
case .ACTIVITY:
fallthrough
case .DAILY_SUMMARY:
@@ -2775,16 +2883,22 @@ extension PolarBleApiImpl: PolarBleApi {
fallthrough
case .SLEEP_SCORE:
BleLogger.trace("Starting to delete files from /U/0 directory, file type: " + dataType.rawValue)
- deleteDataDirectories(identifier: identifier, until: until)
+ deleteDataDirectories(identifier: identifier, until: until, dataDeletionStats: dataDeletionStats)
case .UNDEFINED:
BleLogger.trace("User selected \(dataType.rawValue). Do nothing.")
}
}
)
+
+
+ while(!dataDeletionStats.deleteOpCompleted.get()){
+ Thread.sleep(forTimeInterval: 0.5);
+ }
+
return Completable.empty()
}
- private func listFiles(identifier: String, folderPath: String = "/", condition: @escaping (_ p: String) -> Bool) -> Observable {
+ private func listFiles(identifier: String, dataDeletionStats: DataDeletionStats, folderPath: String = "/", condition: @escaping (_ p: String) -> Bool) -> Observable {
do {
let session = try self.sessionFtpClientReady(identifier)
@@ -2803,7 +2917,7 @@ extension PolarBleApiImpl: PolarBleApi {
return fetchRecursive(path, client: client, condition: condition)
.map { (entry) -> String in
- self.fileDeletionMap[entry.name] = false
+ dataDeletionStats.fileDeletionMap[entry.name] = false
return (entry.name)
}
@@ -2812,11 +2926,11 @@ extension PolarBleApiImpl: PolarBleApi {
}
}
- private func checkAutoSampleFiles(identifier: String) -> Observable {
+ private func checkAutoSampleFiles(identifier: String, dataDeletionStats: DataDeletionStats) -> Observable {
- return Observable.range(start: 0, count: self.fileDeletionMap.count)
+ return Observable.range(start: 0, count: dataDeletionStats.fileDeletionMap.count)
.flatMap() { [self] index -> Observable in
- let filePath = Array(fileDeletionMap)[index]
+ let filePath = Array(dataDeletionStats.fileDeletionMap)[index]
return getFile(identifier: identifier, filePath: filePath.key)
.map { file -> NSData in
let calendar = Calendar.current
@@ -2830,7 +2944,7 @@ extension PolarBleApiImpl: PolarBleApi {
switch dateCompareResult {
case .orderedSame:
- self.fileDeletionMap.removeValue(forKey: filePath.key)
+ dataDeletionStats.fileDeletionMap.removeValue(forKey: filePath.key)
case .orderedAscending:
break
case .orderedDescending:
@@ -2842,58 +2956,71 @@ extension PolarBleApiImpl: PolarBleApi {
}
}
- private func deleteAutoSampleFiles(identifier: String) {
+ private func deleteAutoSampleFiles(identifier: String, dataDeletionStats: DataDeletionStats) {
- Observable.from(self.fileDeletionMap)
+ Observable.from(dataDeletionStats.fileDeletionMap)
.flatMap() { file, item -> PrimitiveSequence in
- self.removeSingleFile(identifier: identifier, filePath: file)
+ dataDeletionStats.amountOfHandedDeletions+=1
+ return self.removeSingleFile(identifier: identifier, filePath: file)
.map { _ -> () in
- self.fileDeletionMap[file] = true
+ dataDeletionStats.fileDeletionMap[file] = true
}
}.subscribe(
onError: { error in
BleLogger.error("Error in deleting auto samples file from device \(identifier). Error: \(error)")
+ },
+ onCompleted: {
+ if (dataDeletionStats.amountOfHandedDeletions == dataDeletionStats.fileDeletionMap.count) {
+ dataDeletionStats.deleteOpCompleted.set(true)
+ }
}
)
}
- private func deleteSdLogFiles(identifier: String) {
+ private func deleteSdLogFiles(identifier: String, dataDeletionStats: DataDeletionStats) {
- Observable.from(self.fileDeletionMap)
+ Observable.from(dataDeletionStats.fileDeletionMap)
.flatMap() { file, item -> PrimitiveSequence in
- self.removeSingleFile(identifier: identifier, filePath: file)
+ dataDeletionStats.amountOfHandedDeletions+=1
+ return self.removeSingleFile(identifier: identifier, filePath: file)
.map { _ -> () in
- self.fileDeletionMap[file] = true
+ dataDeletionStats.fileDeletionMap[file] = true
}
}
.subscribe(
onNext: {print("")},
onError: { error in
BleLogger.error("Error in deleting log file from device \(identifier). Error: \(error)")
+ },
+ onCompleted: {
+ if (dataDeletionStats.amountOfHandedDeletions == dataDeletionStats.fileDeletionMap.count) {
+ dataDeletionStats.deleteOpCompleted.set(true)
+ }
}
)
}
- private func deleteDataDirectories(identifier: String, until: Date) {
+ private func deleteDataDirectories(identifier: String, until: Date, dataDeletionStats: DataDeletionStats) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyyMMdd"
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
var directorySet = [String : Bool]()
-
- for (file, _) in fileDeletionMap {
+
+ for (file, _) in dataDeletionStats.fileDeletionMap {
let fileUriParts = file.split(separator: "/")
let fileDate = dateFromStringWOTime(dateFrom: String(fileUriParts[2]))
// Remove time from until date.
let until = dateFromStringWOTime(dateFrom: dateFormatter.string(from: until))
if !(fileDate < until) {
- self.fileDeletionMap.removeValue(forKey: file)
+ dataDeletionStats.fileDeletionMap.removeValue(forKey: file)
}
}
-
- Observable.from(fileDeletionMap)
+
+ Observable.from(dataDeletionStats.fileDeletionMap)
.flatMap() { fileUri, item -> PrimitiveSequence in
+ dataDeletionStats.amountOfHandedDeletions+=1
let parentFolderPath = "/" + fileUri.split(separator: "/").dropLast().joined(separator: "/")
return self.removeSingleFile(identifier: identifier, filePath: parentFolderPath)
.map { _ -> () in
@@ -2904,57 +3031,62 @@ extension PolarBleApiImpl: PolarBleApi {
BleLogger.error("Error while deleting a data directory, error: \(error)")
},
onCompleted: {
- self.findFilesFromDayDirectories(identifier: identifier)
+ self.findFilesFromDayDirectories(identifier: identifier, dataDeletionStats: dataDeletionStats)
}
)
}
- private func findFilesFromDayDirectories(identifier: String) -> Completable {
+ private func findFilesFromDayDirectories(identifier: String, dataDeletionStats: DataDeletionStats) {
var remainingFiles = [String : Bool]()
- for (file, _) in fileDeletionMap {
- let fileUriParts = file.split(separator: "/")
- let fileUri = "/" + fileUriParts.dropLast().dropLast().joined(separator: "/")
-
- listFiles(identifier: identifier, folderPath: fileUri, condition: { (entry) -> Bool in
- return entry.matches("^([0-9]{8})(\\/)") ||
- entry.matches("^([A-Z-0-9]{1,6}[0-9]{0,10000})(/)") ||
- entry.contains(".BPB") ||
- entry.contains(".REC")
- })
- .map{ item -> () in
- remainingFiles[item] = false
- }
- .asObservable()
- .subscribe(
- onError: { error in
- // If day directory is totally empty BlePsFtpUtility.processRfc76MessageFrame throws error as there is no payload from device.
- if ("frameHasNoPayload".compare("\(error)") == .orderedSame) {
- self.deleteDayDirectories(identifier: identifier)
- } else {
- BleLogger.error("An error occurred while trying read from path \(fileUri), error: \(error)")
- }
- },
- onCompleted: {
- if (remainingFiles.isEmpty) {
- self.deleteDayDirectories(identifier: identifier)
- }
+ if (!dataDeletionStats.fileDeletionMap.isEmpty) {
+ for (file, _) in dataDeletionStats.fileDeletionMap {
+ let fileUriParts = file.split(separator: "/")
+ let fileUri = "/" + fileUriParts.dropLast().dropLast().joined(separator: "/")
+
+ listFiles(identifier: identifier, dataDeletionStats: dataDeletionStats, folderPath: fileUri, condition: { (entry) -> Bool in
+ return entry.matches("^([0-9]{8})(\\/)") ||
+ entry.matches("^([A-Z-0-9]{1,6}[0-9]{0,10000})(/)") ||
+ entry.contains(".BPB") ||
+ entry.contains(".REC")
+ })
+ .map{ item -> () in
+ remainingFiles[item] = false
}
- )
+ .asObservable()
+ .subscribe(
+ onError: { error in
+ // If day directory is totally empty BlePsFtpUtility.processRfc76MessageFrame throws error as there is no payload from device.
+ if ("frameHasNoPayload".compare("\(error)") == .orderedSame) {
+ self.deleteDayDirectories(identifier: identifier, dataDeletionStats: dataDeletionStats)
+ } else {
+ BleLogger.error("An error occurred while trying read from path \(fileUri), error: \(error)")
+ }
+ },
+ onCompleted: {
+ if (remainingFiles.isEmpty) {
+ self.deleteDayDirectories(identifier: identifier, dataDeletionStats: dataDeletionStats)
+ } else {
+ dataDeletionStats.deleteOpCompleted.set(true)
+ }
+ }
+ )
+ }
+ } else {
+ dataDeletionStats.deleteOpCompleted.set(true)
}
- return Completable.empty()
}
- private func deleteDayDirectories(identifier: String) {
+ private func deleteDayDirectories(identifier: String, dataDeletionStats: DataDeletionStats) {
var directorySet = [String : Bool]()
- for (file, _) in fileDeletionMap {
+ for (file, _) in dataDeletionStats.fileDeletionMap {
let fileUri = "/" + file.split(separator: "/").dropLast().dropLast().joined(separator: "/")
directorySet[fileUri] = false
}
-
+
Observable.from(directorySet)
.flatMap() { fileUri, item -> PrimitiveSequence in
return self.removeSingleFile(identifier: identifier, filePath: fileUri)
@@ -2962,12 +3094,13 @@ extension PolarBleApiImpl: PolarBleApi {
BleLogger.trace("Deleted directory \(fileUri)")
}
}.subscribe(
- onNext: {print("")},
onError: { error in
BleLogger.error("An error occurred while deleting a directory, error: \(error)")
},
onCompleted: {
- self.deleteDayDirectories(identifier: identifier)
+ if (dataDeletionStats.amountOfHandedDeletions == dataDeletionStats.fileDeletionMap.count) {
+ dataDeletionStats.deleteOpCompleted.set(true)
+ }
}
)
}
@@ -3037,6 +3170,13 @@ extension PolarBleApiImpl: PolarBleApi {
).subscribe()
}
+ private func sendInitializationAndStartSyncNotificationsCompletable(client: BlePsFtpClient) -> Completable {
+ return client.sendNotification(Protocol_PbPFtpHostToDevNotification.initializeSession.rawValue, parameters: nil)
+ .andThen(
+ client.sendNotification(Protocol_PbPFtpHostToDevNotification.startSync.rawValue, parameters: nil)
+ )
+ }
+
private func sendTerminateAndStopSyncNotifications(client: BlePsFtpClient) {
var params = Protocol_PbPFtpStopSyncParams()
params.completed = true
@@ -3060,53 +3200,58 @@ extension PolarBleApiImpl: PolarBleApi {
let factoryResetMaxWaitTimeSeconds: TimeInterval = 6 * 60
BleLogger.trace("Write FW to device")
return doFactoryReset(deviceId, preservePairingInformation: true)
- .andThen(waitDeviceSessionToOpen(deviceId: deviceId, timeoutSeconds: Int(factoryResetMaxWaitTimeSeconds), waitForDeviceDownSeconds: 10))
- .andThen(Observable.create { observer in
- do {
- let session = try self.sessionFtpClientReady(deviceId)
- guard let client = session.fetchGattClient(BlePsFtpClient.PSFTP_SERVICE) as? BlePsFtpClient else {
- throw PolarErrors.serviceNotFound
- }
+ .andThen(waitDeviceSessionToOpen(deviceId: deviceId, timeoutSeconds: Int(factoryResetMaxWaitTimeSeconds), waitForDeviceDownSeconds: 10))
+ .andThen(Observable.create { observer in
+ do {
+ let session = try self.sessionFtpClientReady(deviceId)
+ guard let client = session.fetchGattClient(BlePsFtpClient.PSFTP_SERVICE) as? BlePsFtpClient else {
+ throw PolarErrors.serviceNotFound
+ }
- BleLogger.trace("Initialize session")
- self.sendInitializationAndStartSyncNotifications(client: client)
- sleep(1) // Some race condition here?
- BleLogger.trace("Start \(firmwareFilePath) write")
-
- var builder = Protocol_PbPFtpOperation()
- builder.command = Protocol_PbPFtpOperation.Command.put
- builder.path = firmwareFilePath
- let proto = try builder.serializedData()
- return client.write(
- proto as NSData,
- data: InputStream(data: firmwareBytes)
- )
- .throttle(.seconds(5), scheduler: MainScheduler.instance)
- .do(onNext: { bytesWritten in
- BleLogger.trace("Writing firmware update file, bytes written: \(bytesWritten)/\(firmwareBytes.count)")
- observer.onNext(UInt(bytesWritten))
+ BleLogger.trace("Initialize session")
+ return self.sendInitializationAndStartSyncNotificationsCompletable(client: client)
+ .andThen(Completable.create { completable in
+ do {
+ BleLogger.trace("Start \(firmwareFilePath) write")
+ var builder = Protocol_PbPFtpOperation()
+ builder.command = Protocol_PbPFtpOperation.Command.put
+ builder.path = firmwareFilePath
+ let proto = try builder.serializedData()
+
+ _ = client.write(proto as NSData, data: InputStream(data: firmwareBytes))
+ .throttle(.seconds(5), scheduler: MainScheduler.instance)
+ .do(onNext: { bytesWritten in
+ BleLogger.trace("Writing firmware update file, bytes written: \(bytesWritten)/\(firmwareBytes.count)")
+ observer.onNext(UInt(bytesWritten))
+ })
+ .ignoreElements()
+ .asCompletable()
+ .subscribe(onCompleted: {
+ if firmwareFilePath.contains("SYSUPDAT.IMG") {
+ BleLogger.trace("Firmware file is SYSUPDAT.IMG, waiting for reboot")
+ }
+ observer.onCompleted()
+ completable(.completed)
+ }, onError: { error in
+ BleLogger.error("Error during firmware write: \(error.localizedDescription)")
+ observer.onError(error)
+ completable(.error(error))
+ })
+ } catch {
+ completable(.error(error))
+ }
+ return Disposables.create()
})
- .ignoreElements()
- .asCompletable()
.subscribe(onCompleted: {
- if firmwareFilePath.contains("SYSUPDAT.IMG") {
- BleLogger.trace("Firmware file is SYSUPDAT.IMG, waiting for reboot")
- }
observer.onCompleted()
}, onError: { error in
- BleLogger.trace("ERROR: \(error.localizedDescription)")
- if (error.localizedDescription.contains("ResponseError error 1")) {
- observer.onCompleted()
- } else {
- BleLogger.trace("Error in writeFirmwareToDevice(): \(error.localizedDescription)")
- observer.onError(error)
- }
+ observer.onError(error)
})
- } catch {
- observer.onError(error)
- }
- return Disposables.create()
- })
+ } catch {
+ observer.onError(error)
+ }
+ return Disposables.create()
+ })
}
@@ -3605,3 +3750,10 @@ private extension Date {
}
}
+
+private class DataDeletionStats {
+ var fileDeletionMap = [String : Bool]()
+ let deleteOpCompleted = AtomicBoolean(initialValue: false)
+ var amountOfHandedDeletions = 0
+ var deletedDirs = [String]()
+}
diff --git a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/impl/utils/PolarAutomaticSamplesUtils.swift b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/impl/utils/PolarAutomaticSamplesUtils.swift
new file mode 100644
index 00000000..780a5e0c
--- /dev/null
+++ b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/impl/utils/PolarAutomaticSamplesUtils.swift
@@ -0,0 +1,121 @@
+// Copyright © 2024 Polar. All rights reserved.
+
+import Foundation
+import RxSwift
+
+private let ARABICA_USER_ROOT_FOLDER = "/U/0/"
+private let AUTOMATIC_SAMPLES_DIRECTORY = "AUTOS/"
+private let AUTOMATIC_SAMPLES_PATTERN = #"AUTOS\d{3}\.BPB"#
+private let TAG = "PolarAutomaticSamplesUtils"
+
+
+internal class PolarAutomaticSamplesUtils {
+
+ /// Read 24/7 heart rate samples for a given date range.
+ static func read247HrSamples(client: BlePsFtpClient, fromDate: Date, toDate: Date) -> Single<[Polar247HrSamplesData]> {
+ BleLogger.trace(TAG, "read247HrSamples: from \(fromDate) to \(toDate)")
+ return Single<[Polar247HrSamplesData]>.create { emitter in
+ let autoSamplesPath = "\(ARABICA_USER_ROOT_FOLDER)\(AUTOMATIC_SAMPLES_DIRECTORY)"
+
+ let operation = Protocol_PbPFtpOperation.with {
+ $0.command = .get
+ $0.path = autoSamplesPath
+ }
+
+ let disposable = client.request(try! operation.serializedData()).subscribe(
+ onSuccess: { response in
+ do {
+ let dir = try Protocol_PbPFtpDirectory(serializedData: Data(response))
+ let regex = try NSRegularExpression(pattern: AUTOMATIC_SAMPLES_PATTERN)
+ let filteredFiles = dir.entries.compactMap { entry -> String? in
+ let range = NSRange(location: 0, length: entry.name.count)
+ return regex.firstMatch(in: entry.name, range: range) != nil ? entry.name : nil
+ }
+
+ var hrSamplesDataList: [Polar247HrSamplesData] = []
+
+ let fileRequests = filteredFiles.map { fileName -> Single in
+ let filePath = "\(autoSamplesPath)\(fileName)"
+ let fileOperation = Protocol_PbPFtpOperation.with {
+ $0.command = .get
+ $0.path = filePath
+ }
+
+ return client.request(try! fileOperation.serializedData()).map { fileResponse in
+ let sampleSessions = try Data_PbAutomaticSampleSessions(serializedData: Data(fileResponse))
+ let sampleDateProto = sampleSessions.day
+
+ sampleSessions.samples.forEach { sample in
+ let sampleTimeProto = sample.time
+
+ let calendar = Calendar(identifier: .gregorian)
+
+ let sampleDate = calendar.date(from: DateComponents(
+ year: Int(sampleDateProto.year),
+ month: Int(sampleDateProto.month),
+ day: Int(sampleDateProto.day),
+ hour: Int(sampleTimeProto.hour),
+ minute: Int(sampleTimeProto.minute),
+ second: Int(sampleTimeProto.seconds),
+ nanosecond: 0
+ ))!
+
+ if sampleDate >= fromDate && sampleDate <= toDate {
+ let hrSamples = sample.heartRate.map { Int($0) }
+
+ let triggerType: AutomaticSampleTriggerType
+
+ switch sample.triggerType {
+ case .triggerTypeHighActivity:
+ triggerType = .highActivity
+ case .triggerTypeLowActivity:
+ triggerType = .lowActivity
+ case .triggerTypeTimed:
+ triggerType = .timed
+ case .triggerTypeManual:
+ triggerType = .manual
+ }
+
+ let data = Polar247HrSamplesData(
+ date: sampleDate,
+ hrSamples: hrSamples,
+ triggerType: triggerType
+ )
+
+ hrSamplesDataList.append(data)
+ } else {
+ BleLogger.trace(TAG, "Sample date \(sampleDate) is out of range: \(fromDate) to \(toDate)")
+ }
+ }
+ }
+ }
+
+ Observable.merge(fileRequests.map { $0.asObservable() })
+ .subscribe(
+ onError: { error in
+ BleLogger.error(TAG, "Error processing files: \(error)")
+ emitter(.failure(error))
+ },
+ onCompleted: {
+ emitter(.success(hrSamplesDataList))
+ }
+ )
+
+ } catch {
+ BleLogger.error(TAG, "read247HrSamples() failed for path: \(autoSamplesPath), error: \(error)")
+ emitter(.failure(error))
+ }
+ },
+ onFailure: { error in
+ BleLogger.error(TAG, "read247HrSamples() failed for path: \(autoSamplesPath), error: \(error)")
+ emitter(.failure(error))
+ }
+ )
+
+ return Disposables.create {
+ disposable.dispose()
+ }
+ }
+ }
+
+}
diff --git a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/impl/utils/PolarUserDeviceSettingsUtils.swift b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/impl/utils/PolarUserDeviceSettingsUtils.swift
index a5afd3fe..19b1d0f8 100644
--- a/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/impl/utils/PolarUserDeviceSettingsUtils.swift
+++ b/sources/iOS/ios-communications/Sources/PolarBleSdk/sdk/impl/utils/PolarUserDeviceSettingsUtils.swift
@@ -34,7 +34,7 @@ internal class PolarUserDeviceSettingsUtils {
},
onFailure: { error in
BleLogger.error("getDeviceUserLocation() failed for device: \(client), error: \(error).")
- emitter(.success(PolarUserDeviceSettings.PolarUserDeviceSettingsResult(deviceLocation: nil)))
+ emitter(.success(PolarUserDeviceSettings.PolarUserDeviceSettingsResult(deviceLocation: .UNDEFINED)))
}
)
return Disposables.create {
diff --git a/sources/iOS/ios-communications/Tests/PolarBleSdkTests/MockBlePsFtpClient.swift b/sources/iOS/ios-communications/Tests/PolarBleSdkTests/MockBlePsFtpClient.swift
index db46d798..a6e9ccb1 100644
--- a/sources/iOS/ios-communications/Tests/PolarBleSdkTests/MockBlePsFtpClient.swift
+++ b/sources/iOS/ios-communications/Tests/PolarBleSdkTests/MockBlePsFtpClient.swift
@@ -10,6 +10,7 @@ public protocol BlePsFtpClient {
class MockBlePsFtpClient: BlePsFtpClient {
var requestCalls: [Data] = []
+ var requestReturnValues: [Single] = []
var requestReturnValueClosure: ((Data) -> Single)?
var requestReturnValue: Single?
var directoryContentReturnValue: Single?
@@ -22,6 +23,11 @@ class MockBlePsFtpClient: BlePsFtpClient {
func request(_ data: Data) -> Single {
requestCalls.append(data)
+
+ if !requestReturnValues.isEmpty {
+ return requestReturnValues.removeFirst()
+ }
+
if let returnValue = requestReturnValueClosure {
return returnValue(data)
}
diff --git a/sources/iOS/ios-communications/Tests/PolarBleSdkTests/PolarAutomaticSamplesUnitTest.swift b/sources/iOS/ios-communications/Tests/PolarBleSdkTests/PolarAutomaticSamplesUnitTest.swift
new file mode 100644
index 00000000..85567b73
--- /dev/null
+++ b/sources/iOS/ios-communications/Tests/PolarBleSdkTests/PolarAutomaticSamplesUnitTest.swift
@@ -0,0 +1,166 @@
+import Foundation
+import XCTest
+import RxSwift
+import RxTest
+
+class PolarAutomaticSamplesUtilsTests: XCTestCase {
+
+ var mockClient: MockBlePsFtpClient!
+
+ override func setUpWithError() throws {
+ mockClient = MockBlePsFtpClient()
+ }
+
+ override func tearDownWithError() throws {
+ mockClient = nil
+ }
+
+ func testRead247HrSamples_SuccessfulResponse() {
+ // Arrange
+ let calendar = Calendar(identifier: .gregorian)
+ let fromDate = calendar.date(from: DateComponents(year: 2024, month: 11, day: 10, hour: 0, minute: 0, second: 0))!
+ let toDate = calendar.date(from: DateComponents(year: 2024, month: 11, day: 19, hour: 0, minute: 0, second: 0))!
+
+ let mockDirectoryContent = try! Protocol_PbPFtpDirectory.with {
+ $0.entries = [
+ Protocol_PbPFtpEntry.with { $0.name = "AUTOS000.BPB"; $0.size = 333 },
+ Protocol_PbPFtpEntry.with { $0.name = "AUTOS001.BPB"; $0.size = 444 }
+ ]
+ }.serializedData()
+
+ let mockFileContent1 = try! Data_PbAutomaticSampleSessions.with {
+ $0.samples = [
+ Data_PbAutomaticHeartRateSamples.with {
+ $0.heartRate = [60, 61, 63].map { UInt32($0) }
+ $0.time = PbTime.with { $0.hour = 10; $0.minute = 12; $0.seconds = 34 }
+ $0.triggerType = Data_PbMeasTriggerType.triggerTypeHighActivity
+ },
+ Data_PbAutomaticHeartRateSamples.with {
+ $0.heartRate = [80, 81, 83].map { UInt32($0) }
+ $0.time = PbTime.with { $0.hour = 12; $0.minute = 0; $0.seconds = 0 }
+ $0.triggerType = Data_PbMeasTriggerType.triggerTypeManual
+ }
+ ]
+ $0.day = PbDate.with { $0.year = 2024; $0.month = 11; $0.day = 15 }
+ }.serializedData()
+
+ let mockFileContent2 = try! Data_PbAutomaticSampleSessions.with {
+ $0.samples = [
+ Data_PbAutomaticHeartRateSamples.with {
+ $0.heartRate = [70, 72, 74].map { UInt32($0) }
+ $0.time = PbTime.with { $0.hour = 16; $0.minute = 49; $0.seconds = 36 }
+ $0.triggerType = Data_PbMeasTriggerType.triggerTypeLowActivity
+ },
+ Data_PbAutomaticHeartRateSamples.with {
+ $0.heartRate = [90, 91, 93].map { UInt32($0) }
+ $0.time = PbTime.with { $0.hour = 18; $0.minute = 0; $0.seconds = 0 }
+ $0.triggerType = Data_PbMeasTriggerType.triggerTypeTimed
+ }
+ ]
+ $0.day = PbDate.with { $0.year = 2024; $0.month = 11; $0.day = 18 }
+ }.serializedData()
+
+ mockClient.requestReturnValues = [
+ Single.just(mockDirectoryContent),
+ Single.just(mockFileContent1),
+ Single.just(mockFileContent2)
+ ]
+
+ // Act
+ let expectation = XCTestExpectation(description: "Read HR samples from day directory")
+ PolarAutomaticSamplesUtils.read247HrSamples(client: mockClient, fromDate: fromDate, toDate: toDate)
+ .subscribe(onSuccess: { samples in
+ // Assert
+ XCTAssertEqual(samples.count, 4)
+
+ let calendar = Calendar.current
+
+ let date1 = calendar.date(from: DateComponents(year: 2024, month: 11, day: 15, hour: 10, minute: 12, second: 34))!
+ XCTAssertEqual(samples[0].date, date1)
+ XCTAssertEqual(samples[0].hrSamples, [60, 61, 63])
+ XCTAssertEqual(samples[0].triggerType, .highActivity)
+
+ let date2 = calendar.date(from: DateComponents(year: 2024, month: 11, day: 15, hour: 12, minute: 0, second: 0))!
+ XCTAssertEqual(samples[1].date, date2)
+ XCTAssertEqual(samples[1].hrSamples, [80, 81, 83])
+ XCTAssertEqual(samples[1].triggerType, .manual)
+
+ let date3 = calendar.date(from: DateComponents(year: 2024, month: 11, day: 18, hour: 16, minute: 49, second: 36))!
+ XCTAssertEqual(samples[2].date, date3)
+ XCTAssertEqual(samples[2].hrSamples, [70, 72, 74])
+ XCTAssertEqual(samples[2].triggerType, .lowActivity)
+
+ let date4 = calendar.date(from: DateComponents(year: 2024, month: 11, day: 18, hour: 18, minute: 0, second: 0))!
+ XCTAssertEqual(samples[3].date, date4)
+ XCTAssertEqual(samples[3].hrSamples, [90, 91, 93])
+ XCTAssertEqual(samples[3].triggerType, .timed)
+
+ expectation.fulfill()
+ })
+
+ wait(for: [expectation], timeout: 1)
+ }
+
+ func testRead247HrSamples_FilterOutSamplesOutsideDateRange() {
+ // Arrange
+ let calendar = Calendar(identifier: .gregorian)
+ let fromDate = calendar.date(from: DateComponents(year: 2024, month: 11, day: 20, hour: 0, minute: 0, second: 0))!
+ let toDate = calendar.date(from: DateComponents(year: 2024, month: 11, day: 9, hour: 0, minute: 0, second: 0))!
+
+ let mockDirectoryContent = try! Protocol_PbPFtpDirectory.with {
+ $0.entries = [
+ Protocol_PbPFtpEntry.with { $0.name = "AUTOS000.BPB"; $0.size = 333 },
+ Protocol_PbPFtpEntry.with { $0.name = "AUTOS001.BPB"; $0.size = 444 }
+ ]
+ }.serializedData()
+
+ let mockFileContent1 = try! Data_PbAutomaticSampleSessions.with {
+ $0.samples = [
+ Data_PbAutomaticHeartRateSamples.with {
+ $0.heartRate = [60, 61, 63].map { UInt32($0) }
+ $0.time = PbTime.with { $0.hour = 10; $0.minute = 12; $0.seconds = 34 }
+ $0.triggerType = Data_PbMeasTriggerType.triggerTypeHighActivity
+ },
+ Data_PbAutomaticHeartRateSamples.with {
+ $0.heartRate = [80, 81, 83].map { UInt32($0) }
+ $0.time = PbTime.with { $0.hour = 12; $0.minute = 0; $0.seconds = 0 }
+ $0.triggerType = Data_PbMeasTriggerType.triggerTypeManual
+ }
+ ]
+ $0.day = PbDate.with { $0.year = 2024; $0.month = 11; $0.day = 15 }
+ }.serializedData()
+
+ let mockFileContent2 = try! Data_PbAutomaticSampleSessions.with {
+ $0.samples = [
+ Data_PbAutomaticHeartRateSamples.with {
+ $0.heartRate = [70, 72, 74].map { UInt32($0) }
+ $0.time = PbTime.with { $0.hour = 16; $0.minute = 49; $0.seconds = 36 }
+ $0.triggerType = Data_PbMeasTriggerType.triggerTypeLowActivity
+ },
+ Data_PbAutomaticHeartRateSamples.with {
+ $0.heartRate = [90, 91, 93].map { UInt32($0) }
+ $0.time = PbTime.with { $0.hour = 18; $0.minute = 0; $0.seconds = 0 }
+ $0.triggerType = Data_PbMeasTriggerType.triggerTypeTimed
+ }
+ ]
+ $0.day = PbDate.with { $0.year = 2024; $0.month = 11; $0.day = 18 }
+ }.serializedData()
+
+ mockClient.requestReturnValues = [
+ Single.just(mockDirectoryContent),
+ Single.just(mockFileContent1),
+ Single.just(mockFileContent2)
+ ]
+
+ // Act
+ let expectation = XCTestExpectation(description: "No samples in date range")
+ PolarAutomaticSamplesUtils.read247HrSamples(client: mockClient, fromDate: fromDate, toDate: toDate)
+ .subscribe(onSuccess: { samples in
+ // Assert
+ XCTAssertEqual(samples.count, 0)
+ expectation.fulfill()
+ })
+
+ wait(for: [expectation], timeout: 1)
+ }
+}
\ No newline at end of file
diff --git a/sources/iOS/ios-communications/iOSCommunications.xcodeproj/project.pbxproj b/sources/iOS/ios-communications/iOSCommunications.xcodeproj/project.pbxproj
index e8a0dc72..ffc6e968 100644
--- a/sources/iOS/ios-communications/iOSCommunications.xcodeproj/project.pbxproj
+++ b/sources/iOS/ios-communications/iOSCommunications.xcodeproj/project.pbxproj
@@ -113,6 +113,9 @@
841A37952C808BD9009194CC /* structures.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = A577289227CE860600855884 /* structures.pb.swift */; };
841A37962C808D49009194CC /* communications_pftp_request.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = A52DB1DA2A1F59770073E795 /* communications_pftp_request.pb.swift */; };
841BE3312C0DCFA70022DAEA /* pftp_notification.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = A577289027CE860600855884 /* pftp_notification.pb.swift */; };
+ 8428E1DF2CEF47350021E3B1 /* PolarAutomaticSamplesUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428E1DE2CEF47350021E3B1 /* PolarAutomaticSamplesUtils.swift */; };
+ 8428E1E02CEF47350021E3B1 /* PolarAutomaticSamplesUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428E1DE2CEF47350021E3B1 /* PolarAutomaticSamplesUtils.swift */; };
+ 8428E1E42CEF73CB0021E3B1 /* PolarAutomaticSamplesUnitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428E1E32CEF73CB0021E3B1 /* PolarAutomaticSamplesUnitTest.swift */; };
84655A902C08947F00D49203 /* PolarActiveTimeData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84655A8F2C08947F00D49203 /* PolarActiveTimeData.swift */; };
84655A912C08947F00D49203 /* PolarActiveTimeData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84655A8F2C08947F00D49203 /* PolarActiveTimeData.swift */; };
84655A922C08947F00D49203 /* PolarActiveTimeData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84655A8F2C08947F00D49203 /* PolarActiveTimeData.swift */; };
@@ -350,6 +353,9 @@
AA27EF302C995EB30097AF23 /* PolarUserDeviceSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA27EF2E2C995EB30097AF23 /* PolarUserDeviceSettings.swift */; };
AA27EF342C995EFC0097AF23 /* PolarUserDeviceSettingsUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA27EF332C995EFC0097AF23 /* PolarUserDeviceSettingsUtils.swift */; };
AA27EF352C995EFC0097AF23 /* PolarUserDeviceSettingsUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA27EF332C995EFC0097AF23 /* PolarUserDeviceSettingsUtils.swift */; };
+ AA7DA2842CF9B4FF00275965 /* PolarAutomaticSamplesData.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA7DA2832CF9B4FF00275965 /* PolarAutomaticSamplesData.swift */; };
+ AA7DA2852CF9B4FF00275965 /* PolarAutomaticSamplesData.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA7DA2832CF9B4FF00275965 /* PolarAutomaticSamplesData.swift */; };
+ AA7DA2862CF9B4FF00275965 /* PolarAutomaticSamplesData.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA7DA2832CF9B4FF00275965 /* PolarAutomaticSamplesData.swift */; };
AA818E5B2C06F8A000D45B3C /* PolarSleepData.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA818E582C06F8A000D45B3C /* PolarSleepData.swift */; };
AA818E5E2C06F8B100D45B3C /* PolarSleepUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA818E5C2C06F8B100D45B3C /* PolarSleepUtils.swift */; };
AA818E612C06F8C200D45B3C /* PolarSleepApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA818E5F2C06F8C200D45B3C /* PolarSleepApi.swift */; };
@@ -454,6 +460,8 @@
6CCFE3FF1E5D76C100FAA131 /* BlePsdClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BlePsdClient.swift; path = ble/api/model/gatt/client/BlePsdClient.swift; sourceTree = ""; };
6CD12AC9201F126500F3A417 /* BleGattException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BleGattException.swift; path = ble/api/model/gatt/exceptions/BleGattException.swift; sourceTree = ""; };
841A37882C7DF53B009194CC /* PolarDeviceUuidTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolarDeviceUuidTest.swift; sourceTree = ""; };
+ 8428E1DE2CEF47350021E3B1 /* PolarAutomaticSamplesUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolarAutomaticSamplesUtils.swift; sourceTree = ""; };
+ 8428E1E32CEF73CB0021E3B1 /* PolarAutomaticSamplesUnitTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolarAutomaticSamplesUnitTest.swift; sourceTree = ""; };
84655A8F2C08947F00D49203 /* PolarActiveTimeData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolarActiveTimeData.swift; sourceTree = ""; };
846B11B72C60E07A004EA886 /* device.pb.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = device.pb.swift; sourceTree = ""; };
8484D97E2C775B3400271DA5 /* PolarDeviceUuid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolarDeviceUuid.swift; sourceTree = ""; };
@@ -566,6 +574,7 @@
AA27EF2A2C995E690097AF23 /* user_devset.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = user_devset.pb.swift; sourceTree = ""; };
AA27EF2E2C995EB30097AF23 /* PolarUserDeviceSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PolarUserDeviceSettings.swift; sourceTree = ""; };
AA27EF332C995EFC0097AF23 /* PolarUserDeviceSettingsUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PolarUserDeviceSettingsUtils.swift; sourceTree = ""; };
+ AA7DA2832CF9B4FF00275965 /* PolarAutomaticSamplesData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolarAutomaticSamplesData.swift; sourceTree = ""; };
AA818E582C06F8A000D45B3C /* PolarSleepData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PolarSleepData.swift; sourceTree = ""; };
AA818E5C2C06F8B100D45B3C /* PolarSleepUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PolarSleepUtils.swift; sourceTree = ""; };
AA818E5F2C06F8C200D45B3C /* PolarSleepApi.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PolarSleepApi.swift; sourceTree = ""; };
@@ -897,6 +906,7 @@
A5A43C702BDFD2920066334F /* PolarBackupManager.swift */,
A5A5EA332BE0DD8E00EDEF87 /* PolarFirmwareUpdateUtils.swift */,
A5BC3EF32BF20FBD008DD743 /* PolarActivityUtils.swift */,
+ 8428E1DE2CEF47350021E3B1 /* PolarAutomaticSamplesUtils.swift */,
);
path = utils;
sourceTree = "";
@@ -911,6 +921,7 @@
A5BC3EFB2BF34EA7008DD743 /* PolarActivityUtilsTest.swift */,
84CE7CF42C0DDAF80096A44A /* MockBlePsFtpClient.swift */,
841A37882C7DF53B009194CC /* PolarDeviceUuidTest.swift */,
+ 8428E1E32CEF73CB0021E3B1 /* PolarAutomaticSamplesUnitTest.swift */,
);
path = PolarBleSdkTests;
sourceTree = "";
@@ -1052,6 +1063,7 @@
A5BC3EEB2BF20D16008DD743 /* activity */ = {
isa = PBXGroup;
children = (
+ AA7DA2832CF9B4FF00275965 /* PolarAutomaticSamplesData.swift */,
A5BC3EEC2BF20D39008DD743 /* PolarStepsData.swift */,
A5986D282BF7534A0014C5DF /* PolarDistanceData.swift */,
84655A8F2C08947F00D49203 /* PolarActiveTimeData.swift */,
@@ -1530,6 +1542,7 @@
6C4A6A2B1CC0BA0400E3AD73 /* BleRssiFilter.swift in Sources */,
6C67C8011E169CCE00411498 /* BleHrClient.swift in Sources */,
A580139725B1636A00654E60 /* BlePolarDeviceCapabilitiesUtility.swift in Sources */,
+ AA7DA2862CF9B4FF00275965 /* PolarAutomaticSamplesData.swift in Sources */,
A57D05212924C800002824D9 /* PmdTimeStampUtils.swift in Sources */,
84D0098E2C85D46500AB4C43 /* user_physdata.pb.swift in Sources */,
A5BC3EED2BF20D39008DD743 /* PolarStepsData.swift in Sources */,
@@ -1719,6 +1732,7 @@
A57728B427CE860600855884 /* PolarBleApiObservers.swift in Sources */,
A57D05362930932A002824D9 /* MagData.swift in Sources */,
A57D05422930A8CA002824D9 /* EcgData.swift in Sources */,
+ 8428E1DF2CEF47350021E3B1 /* PolarAutomaticSamplesUtils.swift in Sources */,
6C770B8C206B77F300F3D51D /* BleAdvertisementContent.swift in Sources */,
A5BC3EF42BF20FBD008DD743 /* PolarActivityUtils.swift in Sources */,
A58F0CAD2983EE2700B5615C /* OfflineHrData.swift in Sources */,
@@ -1753,6 +1767,7 @@
6C770B97206B77F300F3D51D /* BleGattClientFactory.swift in Sources */,
A59A0D302990D68E007D30A3 /* PmdSdkMode.swift in Sources */,
A55E08B42A29EB0C0059E6C7 /* BleHtsClient.swift in Sources */,
+ AA7DA2852CF9B4FF00275965 /* PolarAutomaticSamplesData.swift in Sources */,
AAB386F12CB918CA00D18313 /* ppi_samples.pb.swift in Sources */,
AAB386F22CB918CA00D18313 /* automatic_samples.pb.swift in Sources */,
A5DE0958295B092700BC2E0B /* PmdRecordingType.swift in Sources */,
@@ -1811,6 +1826,7 @@
846B11B92C60E07A004EA886 /* device.pb.swift in Sources */,
A5986D2B2BF7534A0014C5DF /* PolarDistanceData.swift in Sources */,
A57F8B192BE0E3B200F8708F /* RxObserver.swift in Sources */,
+ 8428E1E02CEF47350021E3B1 /* PolarAutomaticSamplesUtils.swift in Sources */,
AA27EF352C995EFC0097AF23 /* PolarUserDeviceSettingsUtils.swift in Sources */,
A527E7C029ED53730059C22E /* (null) in Sources */,
A57F8B142BE0E30A00F8708F /* BleAttributeTransportProtocol.swift in Sources */,
@@ -1842,10 +1858,12 @@
84CE7CFA2C0DEC740096A44A /* structures.pb.swift in Sources */,
A57F8B1C2BE0E67100F8708F /* communications_pftp_request.pb.swift in Sources */,
84CE7CF62C0DE98B0096A44A /* PolarSleepUtilsTest.swift in Sources */,
+ 8428E1E42CEF73CB0021E3B1 /* PolarAutomaticSamplesUnitTest.swift in Sources */,
AA27EF302C995EB30097AF23 /* PolarUserDeviceSettings.swift in Sources */,
A57F8B152BE0E32200F8708F /* types.pb.swift in Sources */,
84CE7CF72C0DEC190096A44A /* PolarSleepData.swift in Sources */,
A57F8B1A2BE0E3C400F8708F /* AtomicBoolean.swift in Sources */,
+ AA7DA2842CF9B4FF00275965 /* PolarAutomaticSamplesData.swift in Sources */,
84CE7CF52C0DDAF80096A44A /* MockBlePsFtpClient.swift in Sources */,
A5743696291B824300E901A4 /* PolarTimeUtilsTests.swift in Sources */,
A5A43C6F2BDFD0520066334F /* FirmwareUpdateApiModels.swift in Sources */,