From 187098ff594e294a72759c37372b1970611b1a83 Mon Sep 17 00:00:00 2001 From: Erkki Silvola Date: Wed, 20 Mar 2019 07:21:53 +0200 Subject: [PATCH] initial commit --- .gitignore | 13 + Polar_SDK_License.txt | 92 + README.md | 344 +++ ThirdPartySoftwareListing.txt | 288 +++ .../PolarSDK-Broadcast-Demo/.gitignore | 9 + .../PolarSDK-Broadcast-Demo/app/.gitignore | 1 + .../PolarSDK-Broadcast-Demo/app/build.gradle | 42 + .../app/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.java | 26 + .../app/src/main/AndroidManifest.xml | 27 + .../BroadcastActivity.java | 158 ++ .../polarsdkbroadcastdemo/MainActivity.java | 42 + .../PolarDeviceAdapter.java | 56 + .../drawable-v24/ic_launcher_foreground.xml | 34 + .../res/drawable/ic_launcher_background.xml | 170 ++ .../app/src/main/res/layout/activity_br.xml | 13 + .../app/src/main/res/layout/activity_main.xml | 27 + .../app/src/main/res/layout/layout_card.xml | 46 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2963 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4905 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2060 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2783 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4490 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6895 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6387 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10413 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9128 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15132 bytes .../app/src/main/res/values/colors.xml | 6 + .../app/src/main/res/values/strings.xml | 9 + .../app/src/main/res/values/styles.xml | 11 + .../ExampleUnitTest.java | 17 + .../PolarSDK-Broadcast-Demo/build.gradle | 27 + .../PolarSDK-Broadcast-Demo/settings.gradle | 1 + .../PolarSDK-ECG-HR-Demo/.gitignore | 8 + .../PolarSDK-ECG-HR-Demo/app/.gitignore | 1 + .../PolarSDK-ECG-HR-Demo/app/build.gradle | 40 + .../app/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.java | 26 + .../app/src/main/AndroidManifest.xml | 28 + .../polar/polarsdkecghrdemo/ECGActivity.java | 191 ++ .../polar/polarsdkecghrdemo/MainActivity.java | 95 + .../com/polar/polarsdkecghrdemo/Plotter.java | 86 + .../polarsdkecghrdemo/PlotterListener.java | 5 + .../drawable-v24/ic_launcher_foreground.xml | 34 + .../res/drawable/ic_launcher_background.xml | 170 ++ .../app/src/main/res/layout/activity_ecg.xml | 45 + .../app/src/main/res/layout/activity_main.xml | 44 + .../res/layout/device_id_dialog_layout.xml | 13 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2963 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4905 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2060 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2783 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4490 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6895 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6387 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10413 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9128 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15132 bytes .../app/src/main/res/values/colors.xml | 6 + .../app/src/main/res/values/strings.xml | 9 + .../app/src/main/res/values/styles.xml | 16 + .../polarsdkecghrdemo/ExampleUnitTest.java | 17 + .../PolarSDK-ECG-HR-Demo/build.gradle | 27 + .../PolarSDK-ECG-HR-Demo/settings.gradle | 1 + .../PolarSDK-Exercise-Demo/.gitignore | 9 + .../PolarSDK-Exercise-Demo/app/.gitignore | 1 + .../PolarSDK-Exercise-Demo/app/build.gradle | 46 + .../app/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.java | 26 + .../app/src/main/AndroidManifest.xml | 28 + .../ExerciseActivity.java | 189 ++ .../polarsdkexercisedemo/ExerciseAdapter.java | 88 + .../ItemClickListener.java | 7 + .../polarsdkexercisedemo/MainActivity.java | 42 + .../polar/polarsdkexercisedemo/Plotter.java | 80 + .../polarsdkexercisedemo/PlotterListener.java | 5 + .../drawable-v24/ic_launcher_foreground.xml | 34 + .../res/drawable/ic_launcher_background.xml | 170 ++ .../app/src/main/res/layout/activity_exe.xml | 42 + .../app/src/main/res/layout/activity_main.xml | 27 + .../app/src/main/res/layout/list_item.xml | 19 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2963 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4905 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2060 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2783 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4490 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6895 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6387 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10413 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9128 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15132 bytes .../app/src/main/res/values/colors.xml | 6 + .../app/src/main/res/values/strings.xml | 8 + .../app/src/main/res/values/styles.xml | 11 + .../polarsdkexercisedemo/ExampleUnitTest.java | 17 + .../PolarSDK-Exercise-Demo/build.gradle | 27 + .../PolarSDK-Exercise-Demo/settings.gradle | 1 + demos/iOS-Demos/PolarSDK-ACC-Demo/Cartfile | 1 + .../project.pbxproj | 391 ++++ .../PolarSDK-ACC-Demo/AppDelegate.swift | 39 + .../AppIcon.appiconset/Contents.json | 98 + .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../Base.lproj/Main.storyboard | 119 ++ .../PolarSDK-ACC-Demo/Info.plist | 43 + .../PolarSDK-ACC-Demo/ViewController.swift | 121 ++ .../PolarSDK-Broadcast-Demo/Cartfile | 1 + .../project.pbxproj | 402 ++++ .../PolarSDK-Broadcast-Demo/AppDelegate.swift | 46 + .../AppIcon.appiconset/Contents.json | 98 + .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../Base.lproj/Main.storyboard | 110 + .../PolarSDK-Broadcast-Demo/Info.plist | 49 + .../PolarCollectionViewCell.swift | 14 + .../ViewController.swift | 93 + .../iOS-Demos/PolarSDK-Exercise-Demo/Cartfile | 1 + .../project.pbxproj | 397 ++++ .../PolarSDK-Exercise-Demo/AppDelegate.swift | 46 + .../AppIcon.appiconset/Contents.json | 98 + .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../Base.lproj/Main.storyboard | 102 + .../PolarSDK-Exercise-Demo/Info.plist | 45 + .../PolarTableViewCell.swift | 25 + .../ViewController.swift | 150 ++ .../androidBleSdkTestApp/app/build.gradle | 51 + .../app/src/main/AndroidManifest.xml | 27 + .../polar/com/androidblesdk/MainActivity.java | 607 ++++++ .../drawable-v24/ic_launcher_foreground.xml | 34 + .../res/drawable/ic_launcher_background.xml | 170 ++ .../app/src/main/res/layout/activity_main.xml | 105 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3056 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5024 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2096 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2858 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4569 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7098 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6464 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10676 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9250 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15523 bytes .../app/src/main/res/values/colors.xml | 6 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/styles.xml | 11 + .../androidBleSdkTestApp/build.gradle | 27 + .../androidBleSdkTestApp/settings.gradle | 1 + examples/example-ios/Cartfile | 1 + .../project.pbxproj | 418 ++++ .../polarBleSdkTestApp/ApiWrapperSwift.swift | 276 +++ .../polarBleSdkTestApp/AppDelegate.swift | 40 + .../AppIcon.appiconset/Contents.json | 98 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../Base.lproj/Main.storyboard | 183 ++ .../example-ios/polarBleSdkTestApp/Info.plist | 49 + .../polarBleSdkTestApp/ViewController.swift | 331 +++ .../polarBleSdkTestApp-Bridging-Header.h | 3 + .../docs/html/BDBleApiImpl_8java.html | 99 + .../docs/html/BDBleApiImpl_8java_source.html | 187 ++ .../html/PolarAccelerometerData_8java.html | 99 + .../PolarAccelerometerData_8java_source.html | 85 + .../docs/html/PolarBiozData_8java.html | 97 + .../docs/html/PolarBiozData_8java_source.html | 85 + .../docs/html/PolarBleApiCallback_8java.html | 97 + .../PolarBleApiCallback_8java_source.html | 103 + .../html/PolarBleApiDefaultImpl_8java.html | 97 + .../PolarBleApiDefaultImpl_8java_source.html | 90 + .../docs/html/PolarBleApi_8java.html | 103 + .../docs/html/PolarBleApi_8java_source.html | 145 ++ .../html/PolarDeviceDisconnected_8java.html | 97 + .../PolarDeviceDisconnected_8java_source.html | 82 + .../docs/html/PolarDeviceInfo_8java.html | 97 + .../html/PolarDeviceInfo_8java_source.html | 87 + .../html/PolarDeviceNotConnected_8java.html | 97 + .../PolarDeviceNotConnected_8java_source.html | 82 + .../docs/html/PolarDeviceNotFound_8java.html | 97 + .../PolarDeviceNotFound_8java_source.html | 82 + .../docs/html/PolarEcgData_8java.html | 97 + .../docs/html/PolarEcgData_8java_source.html | 85 + .../docs/html/PolarExerciseData_8java.html | 97 + .../html/PolarExerciseData_8java_source.html | 85 + .../docs/html/PolarExerciseEntry_8java.html | 97 + .../html/PolarExerciseEntry_8java_source.html | 86 + .../docs/html/PolarHrBroadcastData_8java.html | 97 + .../PolarHrBroadcastData_8java_source.html | 87 + .../docs/html/PolarHrData_8java.html | 97 + .../docs/html/PolarHrData_8java_source.html | 89 + .../PolarNotificationNotEnabled_8java.html | 97 + ...arNotificationNotEnabled_8java_source.html | 82 + .../docs/html/PolarOhrPPGData_8java.html | 99 + .../html/PolarOhrPPGData_8java_source.html | 85 + .../docs/html/PolarOhrPPIData_8java.html | 99 + .../html/PolarOhrPPIData_8java_source.html | 85 + .../PolarOperationNotSupported_8java.html | 97 + ...larOperationNotSupported_8java_source.html | 82 + .../docs/html/PolarSensorSetting_8java.html | 101 + .../html/PolarSensorSetting_8java_source.html | 95 + .../html/PolarServiceNotAvailable_8java.html | 97 + ...PolarServiceNotAvailable_8java_source.html | 82 + polar-sdk-android/docs/html/annotated.html | 116 + polar-sdk-android/docs/html/annotated_dup.js | 4 + polar-sdk-android/docs/html/bc_s.png | Bin 0 -> 676 bytes polar-sdk-android/docs/html/bdwn.png | Bin 0 -> 147 bytes polar-sdk-android/docs/html/classes.html | 97 + ...r_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html | 1494 +++++++++++++ ...lar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.js | 37 + ...ar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.png | Bin 0 -> 771 bytes ...1sdk_1_1api_1_1PolarBleApiDefaultImpl.html | 174 ++ ..._1_1errors_1_1PolarDeviceDisconnected.html | 94 + ...i_1_1errors_1_1PolarDeviceDisconnected.png | Bin 0 -> 854 bytes ..._1_1errors_1_1PolarDeviceNotConnected.html | 94 + ...i_1_1errors_1_1PolarDeviceNotConnected.png | Bin 0 -> 866 bytes ...1api_1_1errors_1_1PolarDeviceNotFound.html | 94 + ..._1api_1_1errors_1_1PolarDeviceNotFound.png | Bin 0 -> 836 bytes ...errors_1_1PolarNotificationNotEnabled.html | 94 + ...1errors_1_1PolarNotificationNotEnabled.png | Bin 0 -> 898 bytes ...1errors_1_1PolarOperationNotSupported.html | 94 + ..._1errors_1_1PolarOperationNotSupported.png | Bin 0 -> 904 bytes ...1_1errors_1_1PolarServiceNotAvailable.html | 94 + ..._1_1errors_1_1PolarServiceNotAvailable.png | Bin 0 -> 883 bytes ...pi_1_1model_1_1PolarAccelerometerData.html | 191 ++ ...1api_1_1model_1_1PolarAccelerometerData.js | 6 + ...1sdk_1_1api_1_1model_1_1PolarBiozData.html | 178 ++ ...1_1sdk_1_1api_1_1model_1_1PolarBiozData.js | 6 + ...dk_1_1api_1_1model_1_1PolarDeviceInfo.html | 228 ++ ...1sdk_1_1api_1_1model_1_1PolarDeviceInfo.js | 8 + ..._1sdk_1_1api_1_1model_1_1PolarEcgData.html | 178 ++ ..._1_1sdk_1_1api_1_1model_1_1PolarEcgData.js | 6 + ..._1_1api_1_1model_1_1PolarExerciseData.html | 178 ++ ...dk_1_1api_1_1model_1_1PolarExerciseData.js | 6 + ...1_1api_1_1model_1_1PolarExerciseEntry.html | 203 ++ ...k_1_1api_1_1model_1_1PolarExerciseEntry.js | 7 + ...1api_1_1model_1_1PolarHrBroadcastData.html | 203 ++ ...1_1api_1_1model_1_1PolarHrBroadcastData.js | 7 + ...1_1sdk_1_1api_1_1model_1_1PolarHrData.html | 272 +++ ...m_1_1sdk_1_1api_1_1model_1_1PolarHrData.js | 10 + ...dk_1_1api_1_1model_1_1PolarOhrPPGData.html | 191 ++ ...1sdk_1_1api_1_1model_1_1PolarOhrPPGData.js | 6 + ...dk_1_1api_1_1model_1_1PolarOhrPPIData.html | 184 ++ ...1sdk_1_1api_1_1model_1_1PolarOhrPPIData.js | 6 + ...1_1api_1_1model_1_1PolarSensorSetting.html | 299 +++ ...k_1_1api_1_1model_1_1PolarSensorSetting.js | 10 + ...1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html | 1878 +++++++++++++++++ ...r_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.js | 51 + ..._1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.png | Bin 0 -> 762 bytes polar-sdk-android/docs/html/closed.png | Bin 0 -> 132 bytes .../dir_1ff65af9a4dc657909b37e4b73346a08.html | 87 + .../dir_505f0308430f86f31e1193b50b0d8658.html | 87 + .../dir_57f0ca8c420846e7d0426b6adce5936e.html | 87 + .../dir_5eb159725f84c66aafd839904a4acdd0.html | 87 + .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 87 + .../dir_7d958c2b373af03670a0a28f80d9d1e8.html | 107 + .../dir_a4ff2217a86ad9c20729a6d968041af8.html | 97 + .../dir_b936df1acb3136008a04b697d550213c.html | 98 + .../dir_fac840b1a3a552bfa17e24a7f5dc9555.html | 89 + .../dir_fd3f6763802dee1ad875f6c80eac0bda.html | 87 + polar-sdk-android/docs/html/doc.png | Bin 0 -> 746 bytes polar-sdk-android/docs/html/doxygen.css | 1764 ++++++++++++++++ polar-sdk-android/docs/html/doxygen.png | Bin 0 -> 3779 bytes polar-sdk-android/docs/html/dynsections.js | 127 ++ ...i_1_1PolarBleApi_1_1RecordingInterval.html | 228 ++ ...api_1_1PolarBleApi_1_1RecordingInterval.js | 8 + ...k_1_1api_1_1PolarBleApi_1_1SampleType.html | 132 ++ ...sdk_1_1api_1_1PolarBleApi_1_1SampleType.js | 5 + ..._1_1PolarSensorSetting_1_1SettingType.html | 246 +++ ...el_1_1PolarSensorSetting_1_1SettingType.js | 9 + polar-sdk-android/docs/html/files.html | 105 + polar-sdk-android/docs/html/files_dup.js | 70 + polar-sdk-android/docs/html/folderclosed.png | Bin 0 -> 616 bytes polar-sdk-android/docs/html/folderopen.png | Bin 0 -> 597 bytes polar-sdk-android/docs/html/functions.html | 548 +++++ .../docs/html/functions_func.html | 399 ++++ .../docs/html/functions_vars.html | 273 +++ polar-sdk-android/docs/html/hierarchy.html | 110 + polar-sdk-android/docs/html/hierarchy.js | 31 + polar-sdk-android/docs/html/index.html | 80 + ..._1_1sdk_1_1api_1_1PolarBleApiCallback.html | 493 +++++ ...om_1_1sdk_1_1api_1_1PolarBleApiCallback.js | 17 + ...i_1_1PolarBleApi_1_1PolarBleApiLogger.html | 121 ++ ...api_1_1PolarBleApi_1_1PolarBleApiLogger.js | 4 + polar-sdk-android/docs/html/jquery.js | 87 + polar-sdk-android/docs/html/menu.js | 50 + polar-sdk-android/docs/html/menudata.js | 85 + .../docs/html/namespacepolar.html | 89 + polar-sdk-android/docs/html/namespacepolar.js | 4 + .../docs/html/namespacepolar_1_1com.html | 89 + .../docs/html/namespacepolar_1_1com.js | 4 + .../html/namespacepolar_1_1com_1_1sdk.html | 91 + .../docs/html/namespacepolar_1_1com_1_1sdk.js | 5 + .../namespacepolar_1_1com_1_1sdk_1_1api.html | 101 + .../namespacepolar_1_1com_1_1sdk_1_1api.js | 8 + ...epolar_1_1com_1_1sdk_1_1api_1_1errors.html | 99 + ...acepolar_1_1com_1_1sdk_1_1api_1_1errors.js | 9 + ...cepolar_1_1com_1_1sdk_1_1api_1_1model.html | 109 + ...pacepolar_1_1com_1_1sdk_1_1api_1_1model.js | 14 + .../namespacepolar_1_1com_1_1sdk_1_1impl.html | 89 + .../namespacepolar_1_1com_1_1sdk_1_1impl.js | 4 + polar-sdk-android/docs/html/namespaces.html | 91 + polar-sdk-android/docs/html/namespaces_dup.js | 4 + polar-sdk-android/docs/html/nav_f.png | Bin 0 -> 153 bytes polar-sdk-android/docs/html/nav_g.png | Bin 0 -> 95 bytes polar-sdk-android/docs/html/nav_h.png | Bin 0 -> 98 bytes polar-sdk-android/docs/html/navtree.css | 146 ++ polar-sdk-android/docs/html/navtree.js | 540 +++++ polar-sdk-android/docs/html/navtreedata.js | 52 + polar-sdk-android/docs/html/navtreeindex0.js | 245 +++ polar-sdk-android/docs/html/open.png | Bin 0 -> 123 bytes polar-sdk-android/docs/html/resize.js | 136 ++ polar-sdk-android/docs/html/splitbar.png | Bin 0 -> 314 bytes polar-sdk-android/docs/html/sync_off.png | Bin 0 -> 853 bytes polar-sdk-android/docs/html/sync_on.png | Bin 0 -> 845 bytes polar-sdk-android/docs/html/tab_a.png | Bin 0 -> 142 bytes polar-sdk-android/docs/html/tab_b.png | Bin 0 -> 169 bytes polar-sdk-android/docs/html/tab_h.png | Bin 0 -> 177 bytes polar-sdk-android/docs/html/tab_s.png | Bin 0 -> 184 bytes polar-sdk-android/docs/html/tabs.css | 1 + .../docs/API Default Implementation.html | 213 ++ polar-sdk-ios/docs/API.html | 417 ++++ .../docs/Classes/PolarBleApiDefaultImpl.html | 285 +++ polar-sdk-ios/docs/Enums/Features.html | 355 ++++ polar-sdk-ios/docs/Enums/SampleType.html | 246 +++ .../docs/Extensions/PolarBleApiImpl.html | 530 +++++ polar-sdk-ios/docs/Other Enums.html | 269 +++ polar-sdk-ios/docs/Other Extensions.html | 214 ++ polar-sdk-ios/docs/Other Typealiases.html | 463 ++++ polar-sdk-ios/docs/PolarErrors.html | 482 +++++ polar-sdk-ios/docs/Protocols/PolarBleApi.html | 1584 ++++++++++++++ .../PolarBleApiDeviceFeaturesObserver.html | 469 ++++ .../PolarBleApiDeviceHrObserver.html | 271 +++ .../PolarBleApiDeviceInfoObserver.html | 277 +++ .../docs/Protocols/PolarBleApiLogger.html | 238 +++ .../docs/Protocols/PolarBleApiObserver.html | 331 +++ .../PolarBleApiPowerStateObserver.html | 246 +++ .../docs/Structs/PolarSensorSetting.html | 324 +++ .../PolarSensorSetting/SettingType.html | 300 +++ polar-sdk-ios/docs/badge.svg | 28 + polar-sdk-ios/docs/css/highlight.css | 200 ++ polar-sdk-ios/docs/css/jazzy.css | 340 +++ .../docs/docsets/.docset/Contents/Info.plist | 20 + .../Documents/API Default Implementation.html | 213 ++ .../Contents/Resources/Documents/API.html | 417 ++++ .../Classes/PolarBleApiDefaultImpl.html | 285 +++ .../Resources/Documents/Enums/Features.html | 355 ++++ .../Resources/Documents/Enums/SampleType.html | 246 +++ .../Documents/Extensions/PolarBleApiImpl.html | 530 +++++ .../Resources/Documents/Other Enums.html | 269 +++ .../Resources/Documents/Other Extensions.html | 214 ++ .../Documents/Other Typealiases.html | 463 ++++ .../Resources/Documents/PolarErrors.html | 482 +++++ .../Documents/Protocols/PolarBleApi.html | 1584 ++++++++++++++ .../PolarBleApiDeviceFeaturesObserver.html | 469 ++++ .../PolarBleApiDeviceHrObserver.html | 271 +++ .../PolarBleApiDeviceInfoObserver.html | 277 +++ .../Protocols/PolarBleApiLogger.html | 238 +++ .../Protocols/PolarBleApiObserver.html | 331 +++ .../PolarBleApiPowerStateObserver.html | 246 +++ .../Documents/Structs/PolarSensorSetting.html | 324 +++ .../PolarSensorSetting/SettingType.html | 300 +++ .../Resources/Documents/css/highlight.css | 200 ++ .../Resources/Documents/css/jazzy.css | 340 +++ .../Resources/Documents/img/carat.png | Bin 0 -> 274 bytes .../Contents/Resources/Documents/img/dash.png | Bin 0 -> 1338 bytes .../Contents/Resources/Documents/img/gh.png | Bin 0 -> 1571 bytes .../Contents/Resources/Documents/index.html | 179 ++ .../Contents/Resources/Documents/js/jazzy.js | 46 + .../Resources/Documents/js/jquery.min.js | 4 + .../Contents/Resources/Documents/search.json | 1 + .../.docset/Contents/Resources/docSet.dsidx | Bin 0 -> 49152 bytes polar-sdk-ios/docs/docsets/.tgz | Bin 0 -> 74874 bytes polar-sdk-ios/docs/img/carat.png | Bin 0 -> 274 bytes polar-sdk-ios/docs/img/dash.png | Bin 0 -> 1338 bytes polar-sdk-ios/docs/img/gh.png | Bin 0 -> 1571 bytes polar-sdk-ios/docs/index.html | 179 ++ polar-sdk-ios/docs/js/jazzy.js | 46 + polar-sdk-ios/docs/js/jquery.min.js | 4 + polar-sdk-ios/docs/search.json | 1 + polar-sdk-ios/docs/undocumented.json | 47 + .../H10_ECG_Explained.docx | Bin 0 -> 125261 bytes .../Polar_Measurement_Data_Specification.pdf | Bin 0 -> 169217 bytes 388 files changed, 43677 insertions(+) create mode 100644 .gitignore create mode 100644 Polar_SDK_License.txt create mode 100644 README.md create mode 100644 ThirdPartySoftwareListing.txt create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/.gitignore create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/.gitignore create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/build.gradle create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/proguard-rules.pro create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/androidTest/java/com/polar/polarsdkbroadcastdemo/ExampleInstrumentedTest.java create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/AndroidManifest.xml create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/java/com/polar/polarsdkbroadcastdemo/BroadcastActivity.java create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/java/com/polar/polarsdkbroadcastdemo/MainActivity.java create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/java/com/polar/polarsdkbroadcastdemo/PolarDeviceAdapter.java create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/layout/activity_br.xml create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/layout/activity_main.xml create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/layout/layout_card.xml create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/values/colors.xml create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/values/strings.xml create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/values/styles.xml create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/test/java/com/polar/polarsdkbroadcastdemo/ExampleUnitTest.java create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/build.gradle create mode 100644 demos/Android-Demos/PolarSDK-Broadcast-Demo/settings.gradle create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/.gitignore create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/.gitignore create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/build.gradle create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/proguard-rules.pro create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/androidTest/java/com/polar/polarsdkecghrdemo/ExampleInstrumentedTest.java create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/AndroidManifest.xml create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/java/com/polar/polarsdkecghrdemo/ECGActivity.java create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/java/com/polar/polarsdkecghrdemo/MainActivity.java create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/java/com/polar/polarsdkecghrdemo/Plotter.java create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/java/com/polar/polarsdkecghrdemo/PlotterListener.java create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/layout/activity_ecg.xml create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/layout/activity_main.xml create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/layout/device_id_dialog_layout.xml create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/values/colors.xml create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/values/strings.xml create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/main/res/values/styles.xml create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/app/src/test/java/com/polar/polarsdkecghrdemo/ExampleUnitTest.java create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/build.gradle create mode 100644 demos/Android-Demos/PolarSDK-ECG-HR-Demo/settings.gradle create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/.gitignore create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/.gitignore create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/build.gradle create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/proguard-rules.pro create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/androidTest/java/com/polar/polarsdkexercisedemo/ExampleInstrumentedTest.java create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/AndroidManifest.xml create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/java/com/polar/polarsdkexercisedemo/ExerciseActivity.java create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/java/com/polar/polarsdkexercisedemo/ExerciseAdapter.java create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/java/com/polar/polarsdkexercisedemo/ItemClickListener.java create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/java/com/polar/polarsdkexercisedemo/MainActivity.java create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/java/com/polar/polarsdkexercisedemo/Plotter.java create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/java/com/polar/polarsdkexercisedemo/PlotterListener.java create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/layout/activity_exe.xml create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/layout/activity_main.xml create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/layout/list_item.xml create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/values/colors.xml create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/values/strings.xml create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/main/res/values/styles.xml create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/app/src/test/java/com/polar/polarsdkexercisedemo/ExampleUnitTest.java create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/build.gradle create mode 100644 demos/Android-Demos/PolarSDK-Exercise-Demo/settings.gradle create mode 100644 demos/iOS-Demos/PolarSDK-ACC-Demo/Cartfile create mode 100644 demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo.xcodeproj/project.pbxproj create mode 100644 demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo/AppDelegate.swift create mode 100644 demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo/Assets.xcassets/Contents.json create mode 100644 demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo/Base.lproj/LaunchScreen.storyboard create mode 100644 demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo/Base.lproj/Main.storyboard create mode 100644 demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo/Info.plist create mode 100644 demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo/ViewController.swift create mode 100644 demos/iOS-Demos/PolarSDK-Broadcast-Demo/Cartfile create mode 100644 demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo.xcodeproj/project.pbxproj create mode 100644 demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/AppDelegate.swift create mode 100644 demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Assets.xcassets/Contents.json create mode 100644 demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Base.lproj/LaunchScreen.storyboard create mode 100644 demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Base.lproj/Main.storyboard create mode 100644 demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Info.plist create mode 100644 demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/PolarCollectionViewCell.swift create mode 100644 demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/ViewController.swift create mode 100644 demos/iOS-Demos/PolarSDK-Exercise-Demo/Cartfile create mode 100644 demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo.xcodeproj/project.pbxproj create mode 100644 demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/AppDelegate.swift create mode 100644 demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Assets.xcassets/Contents.json create mode 100644 demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Base.lproj/LaunchScreen.storyboard create mode 100644 demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Base.lproj/Main.storyboard create mode 100644 demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Info.plist create mode 100644 demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/PolarTableViewCell.swift create mode 100644 demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/ViewController.swift create mode 100644 examples/example-android/androidBleSdkTestApp/app/build.gradle create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/AndroidManifest.xml create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/java/polar/com/androidblesdk/MainActivity.java create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/layout/activity_main.xml create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/values/colors.xml create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/values/strings.xml create mode 100644 examples/example-android/androidBleSdkTestApp/app/src/main/res/values/styles.xml create mode 100644 examples/example-android/androidBleSdkTestApp/build.gradle create mode 100644 examples/example-android/androidBleSdkTestApp/settings.gradle create mode 100644 examples/example-ios/Cartfile create mode 100644 examples/example-ios/polarBleSdkTestApp.xcodeproj/project.pbxproj create mode 100644 examples/example-ios/polarBleSdkTestApp/ApiWrapperSwift.swift create mode 100644 examples/example-ios/polarBleSdkTestApp/AppDelegate.swift create mode 100644 examples/example-ios/polarBleSdkTestApp/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/example-ios/polarBleSdkTestApp/Base.lproj/LaunchScreen.storyboard create mode 100644 examples/example-ios/polarBleSdkTestApp/Base.lproj/Main.storyboard create mode 100644 examples/example-ios/polarBleSdkTestApp/Info.plist create mode 100644 examples/example-ios/polarBleSdkTestApp/ViewController.swift create mode 100644 examples/example-ios/polarBleSdkTestApp/polarBleSdkTestApp-Bridging-Header.h create mode 100644 polar-sdk-android/docs/html/BDBleApiImpl_8java.html create mode 100644 polar-sdk-android/docs/html/BDBleApiImpl_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarAccelerometerData_8java.html create mode 100644 polar-sdk-android/docs/html/PolarAccelerometerData_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarBiozData_8java.html create mode 100644 polar-sdk-android/docs/html/PolarBiozData_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarBleApiCallback_8java.html create mode 100644 polar-sdk-android/docs/html/PolarBleApiCallback_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarBleApiDefaultImpl_8java.html create mode 100644 polar-sdk-android/docs/html/PolarBleApiDefaultImpl_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarBleApi_8java.html create mode 100644 polar-sdk-android/docs/html/PolarBleApi_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarDeviceDisconnected_8java.html create mode 100644 polar-sdk-android/docs/html/PolarDeviceDisconnected_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarDeviceInfo_8java.html create mode 100644 polar-sdk-android/docs/html/PolarDeviceInfo_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarDeviceNotConnected_8java.html create mode 100644 polar-sdk-android/docs/html/PolarDeviceNotConnected_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarDeviceNotFound_8java.html create mode 100644 polar-sdk-android/docs/html/PolarDeviceNotFound_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarEcgData_8java.html create mode 100644 polar-sdk-android/docs/html/PolarEcgData_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarExerciseData_8java.html create mode 100644 polar-sdk-android/docs/html/PolarExerciseData_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarExerciseEntry_8java.html create mode 100644 polar-sdk-android/docs/html/PolarExerciseEntry_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarHrBroadcastData_8java.html create mode 100644 polar-sdk-android/docs/html/PolarHrBroadcastData_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarHrData_8java.html create mode 100644 polar-sdk-android/docs/html/PolarHrData_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarNotificationNotEnabled_8java.html create mode 100644 polar-sdk-android/docs/html/PolarNotificationNotEnabled_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarOhrPPGData_8java.html create mode 100644 polar-sdk-android/docs/html/PolarOhrPPGData_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarOhrPPIData_8java.html create mode 100644 polar-sdk-android/docs/html/PolarOhrPPIData_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarOperationNotSupported_8java.html create mode 100644 polar-sdk-android/docs/html/PolarOperationNotSupported_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarSensorSetting_8java.html create mode 100644 polar-sdk-android/docs/html/PolarSensorSetting_8java_source.html create mode 100644 polar-sdk-android/docs/html/PolarServiceNotAvailable_8java.html create mode 100644 polar-sdk-android/docs/html/PolarServiceNotAvailable_8java_source.html create mode 100644 polar-sdk-android/docs/html/annotated.html create mode 100644 polar-sdk-android/docs/html/annotated_dup.js create mode 100644 polar-sdk-android/docs/html/bc_s.png create mode 100644 polar-sdk-android/docs/html/bdwn.png create mode 100644 polar-sdk-android/docs/html/classes.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.js create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.png create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiDefaultImpl.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceDisconnected.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceDisconnected.png create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotConnected.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotConnected.png create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotFound.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotFound.png create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarNotificationNotEnabled.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarNotificationNotEnabled.png create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarOperationNotSupported.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarOperationNotSupported.png create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarServiceNotAvailable.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarServiceNotAvailable.png create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData.js create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData.js create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.js create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData.js create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData.js create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.js create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.js create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.js create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData.js create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData.js create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.js create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.js create mode 100644 polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.png create mode 100644 polar-sdk-android/docs/html/closed.png create mode 100644 polar-sdk-android/docs/html/dir_1ff65af9a4dc657909b37e4b73346a08.html create mode 100644 polar-sdk-android/docs/html/dir_505f0308430f86f31e1193b50b0d8658.html create mode 100644 polar-sdk-android/docs/html/dir_57f0ca8c420846e7d0426b6adce5936e.html create mode 100644 polar-sdk-android/docs/html/dir_5eb159725f84c66aafd839904a4acdd0.html create mode 100644 polar-sdk-android/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html create mode 100644 polar-sdk-android/docs/html/dir_7d958c2b373af03670a0a28f80d9d1e8.html create mode 100644 polar-sdk-android/docs/html/dir_a4ff2217a86ad9c20729a6d968041af8.html create mode 100644 polar-sdk-android/docs/html/dir_b936df1acb3136008a04b697d550213c.html create mode 100644 polar-sdk-android/docs/html/dir_fac840b1a3a552bfa17e24a7f5dc9555.html create mode 100644 polar-sdk-android/docs/html/dir_fd3f6763802dee1ad875f6c80eac0bda.html create mode 100644 polar-sdk-android/docs/html/doc.png create mode 100644 polar-sdk-android/docs/html/doxygen.css create mode 100644 polar-sdk-android/docs/html/doxygen.png create mode 100644 polar-sdk-android/docs/html/dynsections.js create mode 100644 polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval.html create mode 100644 polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval.js create mode 100644 polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType.html create mode 100644 polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType.js create mode 100644 polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.html create mode 100644 polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.js create mode 100644 polar-sdk-android/docs/html/files.html create mode 100644 polar-sdk-android/docs/html/files_dup.js create mode 100644 polar-sdk-android/docs/html/folderclosed.png create mode 100644 polar-sdk-android/docs/html/folderopen.png create mode 100644 polar-sdk-android/docs/html/functions.html create mode 100644 polar-sdk-android/docs/html/functions_func.html create mode 100644 polar-sdk-android/docs/html/functions_vars.html create mode 100644 polar-sdk-android/docs/html/hierarchy.html create mode 100644 polar-sdk-android/docs/html/hierarchy.js create mode 100644 polar-sdk-android/docs/html/index.html create mode 100644 polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html create mode 100644 polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.js create mode 100644 polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger.html create mode 100644 polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger.js create mode 100644 polar-sdk-android/docs/html/jquery.js create mode 100644 polar-sdk-android/docs/html/menu.js create mode 100644 polar-sdk-android/docs/html/menudata.js create mode 100644 polar-sdk-android/docs/html/namespacepolar.html create mode 100644 polar-sdk-android/docs/html/namespacepolar.js create mode 100644 polar-sdk-android/docs/html/namespacepolar_1_1com.html create mode 100644 polar-sdk-android/docs/html/namespacepolar_1_1com.js create mode 100644 polar-sdk-android/docs/html/namespacepolar_1_1com_1_1sdk.html create mode 100644 polar-sdk-android/docs/html/namespacepolar_1_1com_1_1sdk.js create mode 100644 polar-sdk-android/docs/html/namespacepolar_1_1com_1_1sdk_1_1api.html create mode 100644 polar-sdk-android/docs/html/namespacepolar_1_1com_1_1sdk_1_1api.js create mode 100644 polar-sdk-android/docs/html/namespacepolar_1_1com_1_1sdk_1_1api_1_1errors.html create mode 100644 polar-sdk-android/docs/html/namespacepolar_1_1com_1_1sdk_1_1api_1_1errors.js create mode 100644 polar-sdk-android/docs/html/namespacepolar_1_1com_1_1sdk_1_1api_1_1model.html create mode 100644 polar-sdk-android/docs/html/namespacepolar_1_1com_1_1sdk_1_1api_1_1model.js create mode 100644 polar-sdk-android/docs/html/namespacepolar_1_1com_1_1sdk_1_1impl.html create mode 100644 polar-sdk-android/docs/html/namespacepolar_1_1com_1_1sdk_1_1impl.js create mode 100644 polar-sdk-android/docs/html/namespaces.html create mode 100644 polar-sdk-android/docs/html/namespaces_dup.js create mode 100644 polar-sdk-android/docs/html/nav_f.png create mode 100644 polar-sdk-android/docs/html/nav_g.png create mode 100644 polar-sdk-android/docs/html/nav_h.png create mode 100644 polar-sdk-android/docs/html/navtree.css create mode 100644 polar-sdk-android/docs/html/navtree.js create mode 100644 polar-sdk-android/docs/html/navtreedata.js create mode 100644 polar-sdk-android/docs/html/navtreeindex0.js create mode 100644 polar-sdk-android/docs/html/open.png create mode 100644 polar-sdk-android/docs/html/resize.js create mode 100644 polar-sdk-android/docs/html/splitbar.png create mode 100644 polar-sdk-android/docs/html/sync_off.png create mode 100644 polar-sdk-android/docs/html/sync_on.png create mode 100644 polar-sdk-android/docs/html/tab_a.png create mode 100644 polar-sdk-android/docs/html/tab_b.png create mode 100644 polar-sdk-android/docs/html/tab_h.png create mode 100644 polar-sdk-android/docs/html/tab_s.png create mode 100644 polar-sdk-android/docs/html/tabs.css create mode 100644 polar-sdk-ios/docs/API Default Implementation.html create mode 100644 polar-sdk-ios/docs/API.html create mode 100644 polar-sdk-ios/docs/Classes/PolarBleApiDefaultImpl.html create mode 100644 polar-sdk-ios/docs/Enums/Features.html create mode 100644 polar-sdk-ios/docs/Enums/SampleType.html create mode 100644 polar-sdk-ios/docs/Extensions/PolarBleApiImpl.html create mode 100644 polar-sdk-ios/docs/Other Enums.html create mode 100644 polar-sdk-ios/docs/Other Extensions.html create mode 100644 polar-sdk-ios/docs/Other Typealiases.html create mode 100644 polar-sdk-ios/docs/PolarErrors.html create mode 100644 polar-sdk-ios/docs/Protocols/PolarBleApi.html create mode 100644 polar-sdk-ios/docs/Protocols/PolarBleApiDeviceFeaturesObserver.html create mode 100644 polar-sdk-ios/docs/Protocols/PolarBleApiDeviceHrObserver.html create mode 100644 polar-sdk-ios/docs/Protocols/PolarBleApiDeviceInfoObserver.html create mode 100644 polar-sdk-ios/docs/Protocols/PolarBleApiLogger.html create mode 100644 polar-sdk-ios/docs/Protocols/PolarBleApiObserver.html create mode 100644 polar-sdk-ios/docs/Protocols/PolarBleApiPowerStateObserver.html create mode 100644 polar-sdk-ios/docs/Structs/PolarSensorSetting.html create mode 100644 polar-sdk-ios/docs/Structs/PolarSensorSetting/SettingType.html create mode 100644 polar-sdk-ios/docs/badge.svg create mode 100644 polar-sdk-ios/docs/css/highlight.css create mode 100644 polar-sdk-ios/docs/css/jazzy.css create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Info.plist create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/API Default Implementation.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/API.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Classes/PolarBleApiDefaultImpl.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Enums/Features.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Enums/SampleType.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Extensions/PolarBleApiImpl.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Other Enums.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Other Extensions.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Other Typealiases.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/PolarErrors.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Protocols/PolarBleApi.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Protocols/PolarBleApiDeviceFeaturesObserver.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Protocols/PolarBleApiDeviceHrObserver.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Protocols/PolarBleApiDeviceInfoObserver.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Protocols/PolarBleApiLogger.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Protocols/PolarBleApiObserver.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Protocols/PolarBleApiPowerStateObserver.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Structs/PolarSensorSetting.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/Structs/PolarSensorSetting/SettingType.html create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css create mode 100755 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png create mode 100755 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png create mode 100755 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/index.html create mode 100755 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js create mode 100755 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/Documents/search.json create mode 100644 polar-sdk-ios/docs/docsets/.docset/Contents/Resources/docSet.dsidx create mode 100644 polar-sdk-ios/docs/docsets/.tgz create mode 100755 polar-sdk-ios/docs/img/carat.png create mode 100755 polar-sdk-ios/docs/img/dash.png create mode 100755 polar-sdk-ios/docs/img/gh.png create mode 100644 polar-sdk-ios/docs/index.html create mode 100755 polar-sdk-ios/docs/js/jazzy.js create mode 100755 polar-sdk-ios/docs/js/jquery.min.js create mode 100644 polar-sdk-ios/docs/search.json create mode 100644 polar-sdk-ios/docs/undocumented.json create mode 100644 technical_documentation/H10_ECG_Explained.docx create mode 100644 technical_documentation/Polar_Measurement_Data_Specification.pdf diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..10e9e996 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +.DS_Store +*.iml +examples/example-android/androidBleSdkTestApp/app/libs/ +demos/**/libs/ +build +.gradle +gradle +gradlew +gradlew.bat +.idea +local.properties +project.xcworkspace +xcuserdata diff --git a/Polar_SDK_License.txt b/Polar_SDK_License.txt new file mode 100644 index 00000000..d2f20162 --- /dev/null +++ b/Polar_SDK_License.txt @@ -0,0 +1,92 @@ +PLEASE READ THE FOLLOWING LICENSE AGREEMENT TERMS AND CONDITIONS CAREFULY BEFORE DOWNLOADING OR USING THE POLAR SOFTWARE DEVELOPMENT KIT SOFTWARE. THESE TERMS AND CONDITIONS CONSTITUTE A LEGAL AGREEMENT BETWEEN YOU AND POLAR ELECTRO. + +SOFTWARE DEVELOPMENT KIT LIMITED LICENSE AGREEMENT + +Quick Summary / Your rights to use the SDK +You may use, copy and modify the SDK as long as you include the original copyright and license notice in any copy of the software/source and you comply with the license terms. You are allowed to use the SDK for the development of software for your private as well as for commercial use for as long as you use the SDK in compliance with the license terms. + +1 Purpose +You would like to use the Licensed Material (as defined below) to develop one or more Licensee Product(s) (as defined below). Polar is willing to grant You a limited license to use the Polar Software Development Kit software to develop, test and commercialize (if You so select) Your Licensee Software on the terms and conditions set forth herein. + +2 Definitions +In this Agreement, unless the context requires otherwise, the following words and phrases shall have the following meanings: +"Affiliate" shall mean an entity (i) which is directly or indirectly controlling such Party; (ii) which is under the same direct or indirect ownership or control as such Party; or (iii) which is directly or indirectly owned or controlled by such Party. For the purposes of this Agreement, an entity shall be treated as being controlled by another if that other entity; (i) has fifty percent (50%) or more of the votes in such entity; or (ii) is able to direct its affairs and/or to control the composition of its board of directors or equivalent body. +"Agreement" shall mean this Limited License Agreement, its Appendices and any amendments and extensions thereof. +"Confidential Information" shall mean all material and information in any form received from a Party hereto, its business partners including, but not limited to, know-how and/or information on any Intellectual Property Rights, technical or commercial matters, business operations, facilities, products, techniques and processes, Licensed Materials and its copies, as well as all translations of computer programs contained in the Licensed Materials to different computer programming languages and/or spoken languages. +"Data" shall mean data made available through any Polar devices or services to Licensee. Data may consist of but is not limited to heart rate training data, activity data, program data and/or user settings and/or personal data of the end-user is using a Polar device from which the data is being transferred to Licensee Product. Data may consist data which is proprietary to Polar. +"Effective Date" shall mean the date when You have accepted these terms and conditions and/or accessed the Licensed Materials. +"Intellectual Property Rights" shall mean any and all patent, copyright, trademark, design right, petty patent, chip topography, service mark, domain-name or any other right or trade secret whether registered or not. +"Licensed Materials" shall mean Polar's software development kit, as amended from time to time, enabling development of applications which read Data directly from Polar's devices. +"Licensee Products" means Licensee's products that interoperate with the Licensed Materials or parts of Licensed Materials and Polar's products. +"Logos" shall mean a graphic design, stylized name, unique symbol, brand name, "Polar", Polar logo, Polar's product names or any other trademarks or trade names, whether registered or not, of Polar. +"Polar" shall mean Polar Electro Oy, a company organized under the laws of Finland and having its registered office at Professorintie 5, 90440 Kempele, Finland. +"You" and "Your" shall mean and refers to the person(s) or legal entity (including but not limited to a company, organization, educational institution, or governmental agency, instrumentality or department) using the Licensed Materials or otherwise exercising rights under this Agreement. + +3 Grant of License + 3.1 Under the terms of this Agreement, POLAR grants You a worldwide, non-exclusive, non-transferable limited license to use the Licensed Materials and copy and distribute object code form of the Licensed Materials together with Developer Software to End-Users solely for purpose of enabling Data transfer between POLAR product and Developer Software. + 3.2 Licensed Materials and Polar's devices are not intended to be used in life critical, life supporting or medical purpose. Consequently, use of any Data in any life critical, life supporting or medical purpose or develop or have developed any application to enable such use of the Data, or develop any applications which would modify or use the Data for any purposes other than described in this Agreement shall be at Your own risk. Polar specifically denies any and all liability on whatever ground for the use of Licensed Materials and/or Data for above mentioned purposes, and you shall indemnify and hold harmless Polar and its Affiliates for any claims, suits, actions, demands, liabilities, costs, fees, penalties and damages of whatever nature related to such use of the Licensed Materials and/or Data. + 3.3 You shall be responsible of the proper handling of Data, taking into consideration all applicable laws and regulations, including but not limited to the applicable privacy and data protection laws. It is on Your responsibility and you represent and warrant to Polar that you will be handling personal data (including Data) in compliance with applicable data protection laws. + +4 Ownership, Copyright and Trademarks + 4.1 Polar and its licensors shall continue to own all right, title and interest, including copyright and all other intellectual property rights in and to the Licensed Materials, other Confidential Information and Logos. + 4.2 You may give feedback on Licensed Materials to Polar. Any input, suggestions or feedback of a technical nature on Licensed Materials, Polar products or any service offered by Polar ("Feedback") shall be given on non-confidential basis to Polar and You hereby waive any confidentiality restrictions for such Feedback. In addition, You shall grant to Polar and its affiliates a worldwide, non-exclusive, perpetual, irrevocable, sub-licensable, royalty-free right and license under Your copyrights to copy, reproduce, modify, create derivative works and directly or indirectly distribute, make available and communicate to public the Feedback in or in connection to any Polar products, software and/or services. For the avoidance of doubt, Feedback to Polar shall be considered as Confidential Information of Polar. + 4.3 You agree to make adequate copyright markings to the Licensee Products regarding the use of the Licensed Materials. + 4.4 You may not use POLAR, Polar logo, POLAR's product names or any other trademarks or trade names, whether registered or not, of POLAR, or any similar mark or name, as a Developer Software trademark or trade name or for its marketing or advertising purposes, or indicate any association with Polar, express or implied, without Polar's specific written consent. + 4.5 You will not at any time do or cause to be done any such act or thing which in any way impairs, or intends to impair, any right, title, interest or any Intellectual Property Right of POLAR or it's licensors. You shall not in any manner represent that it has any ownership of any kind in any of the above mentioned Intellectual Property Rights. + +5 Technical Support and Updates + 5.1 This Agreement does not contain any technical support or maintenance services. + 5.2 Polar shall not have any obligations to provide any updates or new versions of the Licensed Materials, or maintenance or support for the Licensed Materials. Polar shall, however, have the right, within its sole discretion, to provide updates or new versions and offer support services. In such case, payable fees and/or separate terms of use, if any, shall be agreed separately. Polar may also choose, at is sole discretion, to make available support services to selected licensees of the Licensed Materials, for charge or free of charge. + +6 Fees +Licensed Materials shall be offered free of charge, subject to You being in compliance with the terms of this Agreement at all times. + +7 No Warranty +THE LICENSED MATERIALS AND CONFIDENTIAL INFORMATION ARE PROVIDED ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, AND NEITHER POLAR, ITS LICENSORS, SUPPLIERS OR AFFILIATES NOR THE TITLE AND/OR INTELLECTUAL PROPERTY RIGHT HOLDERS MAKE ANY REPRESENTATIONS OR WARRANTIES, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR THAT THE LICENSED MATERIALS OR CONFIDENTIAL INFORMATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR ANY OTHER RIGHTS. THERE IS NO WARRANTY BY POLAR OR BY ANY OTHER PARTY THAT THE FUNCTIONS AND SOLUTIONS CONTAINED OR OUTLINED IN THE LICENSED MATERIALS OR CONFIDENTIAL INFORMATION WILL MEET YOUR REQUIREMENTS OR WILL OPERATE UNINTERRUPTED OR ERROR-FREE. YOU ASSUME ALL RESPONSIBILITY AND RISK FOR THE SELECTION OF THE LICENSED MATERIALS TO ACHIEVE YOUR INTENDED RESULTS AND FOR THE INSTALLATION, USE AND RESULTS OBTAINED FROM IT. IN THE EVENT THE WARRANTY EXCLUSION IS NOT VALID IN SOME JURISDICTION, YOU HEREBY ACKNOWLEDGE AND AGREE THAT THE WARRANTY EXCLUSION SET FORTH IN THIS SECTION 6 SHALL BE APPLIED TO THE MAXIMUM EXTENT PERMITTED BY THE APPLICABLE LAW. + +8 Limitation of Liability +EXCEPT FOR DAMAGES CAUSED BY WILFUL ACTS OR GROSS NEGLIGENCE, IN NO EVENT SHALL POLAR, ITS EMPLOYEES, DIRECTORS, SUPPLIERS, LICENSORS OR THEIR AFFILIATES BE LIABLE FOR ANY LOST PROFITS, REVENUE, SALES, DATA OR COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, PROPERTY DAMAGE, PERSONAL INJURY, INTERRUPTION OF BUSINESS, LOSS OF BUSINESS INFORMATION OR FOR ANY SPECIAL, DIRECT, INDIRECT, INCIDENTAL, ECONOMIC, PUNITIVE, SPECIAL OR CONSEQUENTIAL DAMAGES, HOWEVER CAUSED OR ANY DAMAGES ARISING OUT OF OR RELATING TO AN INFRINGEMENT OR ALLEGED INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS OR CONFIDENTIAL INFORMATION, AND WHETHER ARISING UNDER CONTRACT, TORT, NEGLIGENCE, OR OTHER THEORY OF LIABILITY ARISING HEREUNDER OR OUT OF THE USE OF OR INABILITY TO USE THE LICENSED MATERIALS OR CONFIDENTIAL INFORMATION, EVEN IF POLAR OR ITS EMPLOYEES OR SUPPLIERS, LICENSORS OR AFFILIATES ARE ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN THE EVENT THE ABOVE LIMITATION OF LIABILITY WOULD NOT BE ENFORCEABLE, POLAR'S, ITS EMPLOYEES', DIRECTORS' OR SUPPLIERS', LICENSORS' OR AFFILIATES' LIABILITY SHALL BE LIMITED TO THE MAXIMUM EXTENT PERMITTED BY THE APPLICABLE LAW. TO THE EXTENT PERMITTED BY APPLICABLE LAW, POLAR LIABILITY UNDER THIS AGREEMENT SHALL BE LIMITED TO 50 EUROS. + +9 Confidentiality + 9.1 You shall not disclose to third parties nor use for any purpose other than for the proper fulfillment of the purpose of this Agreement any Confidential Information possibly received from Polar in whatever form under or in connection with this Agreement without the prior written permission of Polar save for Confidential Information which + a) was in the public domain at the time of disclosure or later became part of the public domain without breach of the confidentiality obligations herein contained; or + b) was disclosed by a third party without breach of any obligation of confidentiality owed to Polar; or + c) was independently developed by Your personnel having no access to the Information, or + d) was ordered to be disclosed by a court of competent jurisdiction after giving notice to Polar. + 9.2 You shall limit access to Confidential Information to those of Your personnel for whom such access is reasonably necessary for the proper performance of this Agreement and obtain written undertakings of confidentiality from them. + 9.3 In addition to above, You agree not to imply to third parties existence of any business relationship, partnership or affiliation with Polar or use Polar as a reference without Polar's prior written consent. + +10 Term and termination + 10.1 This Agreement and the licenses granted under this Agreement become effective on the Effective Date. + 10.2 This Agreement shall remain in force until terminated by Polar by either Party by providing a ninety (90) days prior written notice to the other Party. + 10.3 Polar has the right, in addition and without prejudice to any other rights or remedies, to terminate this Agreement immediately as follows: + 10.3.1 for any material breach of Agreement, that is not cured within seven (7) days of receipt by You of a written notice specifying the breach and requiring its cure; + 10.3.2 upon receiving a written notice, if (a) all or a substantial portion of that Your assets are transferred to an assignee for the benefit of creditors, or to a receiver or a trustee in bankruptcy, (b) a proceeding is commenced by or against You for relief under bankruptcy or similar laws and such proceeding is not dismissed within sixty (60) days, or (c) the You are adjudged bankrupt. + 10.4 If and when this Agreement is terminated due to any reason or cause whatsoever, then You shall cease the use of Licensed Materials and Confidential Information and any of its rights under Section 3, and destroy and delete all copies of the Licensed Materials and Confidential Information. + 10.5 Upon termination of this Agreement, provisions of the Agreement which, by their nature, are intended to survive its termination or expiration, shall survive its termination or expiration. + +11 Licensee Product and Indemnification + 11.1 Licensee Product + You will be solely responsible for developing Licensee Product and that Licensee Product and any related products are safe, free of defects in design, materials and workmanship, and comply with applicable laws and regulations; and for testing, labeling, distributing, promoting, selling, and if necessary, recalling its products; and any costs related to the aforementioned actions. Polar's possible approval of the Licensee Product will not constitute endorsement of the fitness for a particular purpose or that it will work properly. + 11.2 Your Indemnification + You agree to indemnify, defend, and hold Polar its agents, affiliates, and licensors harmless from any liability incurred by Polar, or claims, causes of action, damages, costs, fines, fees or expenses (including reasonable attorney's fees) asserted against Polar, by reason of or related third party claims, suits, actions, demands and proceedings for: + i) product liability, product safety and security, personal injury and / or death; + ii) loss of and / or damage to property; and / or + iii) alleged and / or actual infringement of any patent, right of patent, trade marks, copyrights or designs or other industrial or intellectual property rights, + which are attributable to You, or the use of any Intellectual Property Rights of Polar by You. + You shall also indemnify, defend and hold Polar, its agents, affiliates, and licensors harmless from any claim, costs, losses, damages, liabilities, judgments and expenses (including reasonable fees of attorneys and other professionals), arising out of or in connection with any claims arising out of or related to: (i) the Licensee Product (ii) use of the Licensee Product; (iii) use of the Licensee Product in combination with Licensed Materials or any other Polar device or service; or (iv) Your (or any user of the Licensee Product) use of Data in any manner inconsistent with or in breach of the terms of this Agreement or applicable laws. + +12 Miscellaneous + 12.1 No Waiver + The failure of Polar to exercise any of its rights under this Agreement or to require the performance of any term or provision of this Agreement, or the waiver by Polar of such breach of this Agreement, shall not prevent a subsequent exercise or enforcement of such right or be deemed a waiver of any subsequent breach of the same or any other term or provision of this Agreement. Any waiver of the performance of any of the terms or conditions of this Agreement shall be effective only if in writing and signed by Polar. + 12.2 Headings + The headings in this Agreement are for the convenience only, and are not intended to define or limit the scope or interpretation of the Agreement or any provision hereof. + 12.3 Severability + If any term of this Agreement is invalid or unenforceable, such terms or provisions shall not invalidate the rest of the Agreement which shall remain in full force and effect as if such invalidated or unenforceable terms or conditions had not been made a part of this Agreement, and an invalid or unenforceable term must be replaced by a term which reflects the economic intent of the terms or provisions found invalid or unenforceable. + 12.4 Export Control + Licensed Material may be subject to import and export controls in other countries. You agree to strictly comply with all applicable import and export regulations and acknowledge that the Licensee has the responsibility to obtain licenses export, re-export, transfer or import the Licensed Material. + 12.5 Entire Agreement and Assignment + This Agreement sets forth the entire agreement between the You and Polar with respect to the subject matter hereof and supersedes any prior proposals and representations, whether written or oral. You shall not have the right to assign this Agreement to a third party without the prior written consent of Polar. Polar shall have the right to assign this Agreement and all of the rights and obligations contained therein to a Licensee belonging to the same group of companies as Polar, and also to a third party within the sole discretion of Polar. + 12.6 Applicable law and settlement of disputes + This Agreement and its terms and conditions shall be governed exclusively by and construed according to the laws of Finland. The official text of the Agreement or any notices given or accounts or statements required hereby shall be in English. + Any dispute or controversy or claim arising out of or relating to this Agreement involving the Parties, shall be settled in Finland, with Oulu court of justice as its first instance, in the English language and the process as well as the results of the proceedings shall be considered as confidential. Polar shall also have the right to seek for an injunction against You in any competent court of law in order to protect its rights and interests hereunder. diff --git a/README.md b/README.md new file mode 100644 index 00000000..182efc58 --- /dev/null +++ b/README.md @@ -0,0 +1,344 @@ + +# SDK for Polar sensors + +This is the official repository of Polar's software development kit. With this SDK you are able to develop your own applications for sensors made by Polar. + +This SDK uses ReactiveX. You can read more about ReactiveX from their website [reactivex](http://reactivex.io) + +3rd party software lincense listing [ThirdPartySoftwareListing](ThirdPartySoftwareListing.txt) + +By exploiting the SDK, you indicate your acceptance of [License](Polar_SDK_License.txt). + +If you wish to collaborate with Polar commercially, [click here](http://polar.com/developers) + +### Quick License Summary / Your rights to use the SDK +You may use, copy and modify the SDK as long as you +include the original copyright and license notice in any copy of the +software/source and you comply with the license terms. You are +allowed to use the SDK for the development of software for your +private as well as for commercial use for as long as you use the SDK +in compliance with the license terms. + +### H10 Heart rate sensor +Most accurate Heart rate sensor in the markets. The H10 is used in the Getting started section of this page. +[Store page](https://www.polar.com/en/products/accessories/H10_heart_rate_sensor) + +#### H10 heart rate sensor available data types +* From version 3.0.35 onwards. Available later. +* Heart rate as beats per minute. RR Interval in ms and 1/1024 format. +* Electrocardiography (ECG) data in µV. +* Accelerometer data with samplerates of 25Hz, 50Hz, 100Hz and 200Hz and range of 2G, 4G and 8G. Axis specific acceleration data in mG. +* Start and stop of internal recording and request for internal recording status. Recording supports RR, HR with one second sampletime or HR with five second sampletime. +* List, read and remove for stored internal recording (sensor supports only one recording at the time). + + +### OH1 Optical heart rate sensor +Optical heart rate sensor is a rechargeable device that measures user’s heart rate with LED technology. +[Store page](https://www.polar.com/us-en/products/accessories/oh1-optical-heart-rate-sensor) + +#### OH1 Optical heart rate sensor available data types +* From version 2.0.8 onwards. Available later. +* Heart rate as beats per minute. +* Photoplethysmograpy (PPG) values. +* PP interval (milliseconds) representing cardiac pulse-to-pulse interval extracted from PPG signal. +* Accelerometer data with samplerate of 50Hz and range of 8G. Axis specific acceleration data in mG. +* List, read and remove stored exercise. Recording of exercise requires that sensor is registered to Polar Flow account. + +### Project structure +* [polar-sdk-ios](polar-sdk-ios/) contains compiled iOS sdk, dependencies and documentation +* [polar-sdk-android](polar-sdk-android/) contains compiled Android sdk and documentation +* [demos](demos/) contains both Android and iOS demo applications using various subsets from sdk +* [examples](examples/) contains both android and ios example app utilizing all features from sdk +* [gatt specification](technical_documentation/Polar_Measurement_Data_Specification.pdf) contains gatt specification for polar measurement data streaming +* [H10 ecg technical document](technical_documentation/H10_ECG_Explained.docx) + +### Android proguard-rules +``` +-dontwarn rx.internal.util.** +-dontwarn com.google.protobuf.** +-keep class fi.polar.remote.representation.protobuf.** {public private protected *;} +-keep class protocol.** {public private protected *;} +-keep class data.** {public private protected *;} +-keep class com.androidcommunications.polar.api.ble.model.** {public private protected *;} +-keep class com.androidcommunications.polar.enpoints.ble.bluedroid.host.** +``` + +# Android: Getting started +Detailed documentation [Full Documentation](http://htmlpreview.github.com/?https://github.com/polarofficial/polar-ble-sdk/tree/develop/polar-sdk-android/docs/html/index.html). +## Installation +Compiled sdk and dependencies can be found from [polar-sdk-android](polar-sdk-android/libs/) + +1. In `build.gradle` make sure the __minSdkVersion__ is set to __19__ or higher. +``` +android { + ... + defaultConfig { + ... + minSdkVersion 19 + } +} +``` +2. Copy the contents of [polar-sdk-android](polar-sdk-android/libs) folder into your project's __libs__ folder e.g `YourProjectName/app/libs/` +The `YourProjectName/app/libs/` should now contain __two__ files +``` +polar-ble-sdk.aar +polar-protobuf-release.aar +``` + +3. Add the following dependencies to `build.gradle` inside the dependencies clause: +``` +dependencies { + implementation files('libs/polar-ble-sdk.aar') + // Only needed if FEATURE_POLAR_FILE_TRANSFER used + implementation files('libs/polar-protobuf-release.aar') + // Only needed if FEATURE_POLAR_FILE_TRANSFER used + implementation group: 'commons-io', name: 'commons-io', version: '2.4' + // Only needed if FEATURE_POLAR_FILE_TRANSFER used + implementation 'com.google.protobuf:protobuf-java:3.1.0' + implementation 'io.reactivex.rxjava2:rxjava:2.1.5' + implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' +} +``` +4. Finally, add the following permissions to `AndroidManifest.xml`: +``` + + + +``` + + +## Code example: Heart rate +See the [example](examples/example-android) folder for the full project. + +#### Key things +`String DEVICE_ID` is your Polar device's id. +This is not required if you are using automatic connection. + + 1. Import following packages. +``` +import io.reactivex.CompletableObserver; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Action; +import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; +import polar.com.sdk.api.PolarBleApi; +import polar.com.sdk.api.PolarBleApiCallback; +import polar.com.sdk.api.PolarBleApiDefaultImpl; +import polar.com.sdk.api.model.PolarAccelerometerData; +import polar.com.sdk.api.model.PolarDeviceInfo; +import polar.com.sdk.api.model.PolarEcgData; +import polar.com.sdk.api.model.PolarExerciseData; +import polar.com.sdk.api.model.PolarExerciseEntry; +import polar.com.sdk.api.model.PolarHrBroadcastData; +import polar.com.sdk.api.model.PolarHrData; +import polar.com.sdk.api.model.PolarOhrPPGData; +import polar.com.sdk.api.model.PolarOhrPPIData; +import polar.com.sdk.api.model.PolarSensorSetting; +``` + +2. Load the default api implementation and add callback. +``` +// NOTICE only FEATURE_HR is enabled, to enable more features like battery info +// e.g. PolarBleApiDefaultImpl.defaultImplementation(this, PolarBleApi.FEATURE_HR | +// PolarBleApi.FEATURE_BATTERY_INFO); +// batteryLevelReceived callback is invoked after connection +PolarBleApi api = PolarBleApiDefaultImpl.defaultImplementation(this, PolarBleApi.FEATURE_HR); + +api.setApiCallback(new PolarBleApiCallback() { + @Override + public void blePowerStateChanged(boolean powered) { + Log.d("MyApp","BLE power: " + powered); + } + + @Override + public void polarDeviceConnected(PolarDeviceInfo polarDeviceInfo) { + Log.d("MyApp","CONNECTED: " + polarDeviceInfo.deviceId); + } + + @Override + public void polarDeviceConnecting(PolarDeviceInfo polarDeviceInfo) { + Log.d("MyApp","CONNECTING: " + polarDeviceInfo.deviceId); + } + + @Override + public void polarDeviceDisconnected(PolarDeviceInfo polarDeviceInfo) { + Log.d("MyApp","DISCONNECTED: " + polarDeviceInfo.deviceId); + } + + @Override + public void ecgFeatureReady(String identifier) { + } + + @Override + public void accelerometerFeatureReady(String identifier) { + } + + @Override + public void ppgFeatureReady(String identifier) { + } + + @Override + public void ppiFeatureReady(String identifier) { + } + + @Override + public void biozFeatureReady(String identifier) { + } + + @Override + public void hrFeatureReady(String identifier) { + Log.d("MyApp","HR READY: " + identifier); + } + + @Override + public void fwInformationReceived(String identifier, String fwVersion) { + } + + @Override + public void batteryLevelReceived(String identifier, int level) { + } + + @Override + public void hrNotificationReceived(String identifier, PolarHrData data) { + Log.d("MyApp","HR: " + data.hr); + } + + @Override + public void polarFtpFeatureReady(String s) { + } +}); +``` +3. Request permissions if needed +``` +if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + this.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 1); +} +// callback is invoked after granted or denied permissions +@Override +public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { +} +``` + +4. Add background, foreground and cleanup functionality on desired callbacks e.g. +``` +@Override +public void onPause() { + super.onPause(); + api.backgroundEntered(); +} + +@Override +public void onResume() { + super.onResume(); + api.foregroundEntered(); +} + +@Override +public void onDestroy() { + super.onDestroy(); + api.shutDown(); +} +``` + +5. Connect to a Polar device using `api.connectToPolarDevice(DEVICE_ID)` , + `api.autoConnectToPolarDevice(-50, null).subscribe()` to connect nearby device or `api.searchForPolarDevice()` to scan and select the device + +# iOS: Getting started +Detailed documentation [Full Documentation](http://htmlpreview.github.com/?https://github.com/polarofficial/polar-ble-sdk/tree/develop/polar-sdk-ios/docs/index.html). Minimum iOS version is 10. +## Installation +Compiled Sdk and dependencys can be found from [polar-sdk-ios](polar-sdk-ios/) +Precompiled 4.4.0 RxSwift and RxAtomic is added to sdk package. All iOS demos and examples contains Cartfile if you desire to compile +dependencies yourself. + +1. In the project properties __General__ tab, add `PolarBleSdk.framework` , `RxSwift.framework` and `RxAtomic.framework` to __Embedded binaries__ and __Linked Frameworks and Libraries__. + +2. In project target settings enable __Background Modes__, add __External accessory communication__ and __Uses Bluetooth LE accessories__ + +## Code example: Heart rate +See the [example](examples/example-ios) folder for the full project + +### Key things +`deviceId` is your Polar device's id. +This is not required if you are using automatic connection. + +1. Import needed packages. +``` +import PolarBleSdk +import RxSwift +``` + +2. Load the default api implementation and implement desired protocols. +``` + +class MyController: UIViewController, + PolarBleApiObserver, + PolarBleApiPowerStateObserver, + PolarBleApiDeviceFeaturesObserver, + PolarBleApiDeviceHrObserver { + // NOTICE only FEATURE_HR is enabled, to enable more features like battery info + // e.g. PolarBleApiDefaultImpl.polarImplementation(DispatchQueue.main, features: Features.hr.rawValue | + // Features.batteryStatus.rawValue) + // batteryLevelReceived callback is invoked after connection + var api = PolarBleApiDefaultImpl.polarImplementation(DispatchQueue.main, features: Features.hr.rawValue) + var deviceId = "0A3BA92B" // TODO replace this with your device id + + override func viewDidLoad() { + super.viewDidLoad() + api.observer = self + api.deviceHrObserver = self + api.powerStateObserver = self + api.deviceFeaturesObserver = self + } + + func polarDeviceConnecting(_ polarDeviceInfo: PolarDeviceInfo) { + print("DEVICE CONNECTING: \(polarDeviceInfo)") + } + + func polarDeviceConnected(_ polarDeviceInfo: PolarDeviceInfo) { + print("DEVICE CONNECTED: \(polarDeviceInfo)") + deviceId = polarDeviceInfo.deviceId + } + + func polarDeviceDisconnected(_ polarDeviceInfo: PolarDeviceInfo) { + print("DISCONNECTED: \(polarDeviceInfo)") + } + + func batteryLevelReceived(_ identifier: String, batteryLevel: UInt) { + print("battery level updated: \(batteryLevel)") + } + + func hrValueReceived(_ identifier: String, data: PolarHrData) { + print("HR notification: \(data.hr) rrs: \(data.rrs)") + } + + func hrFeatureReady(_ identifier: String) { + print("HR READY") + } + + func ecgFeatureReady(_ identifier: String) { + } + + func accFeatureReady(_ identifier: String) { + } + + func ohrPPGFeatureReady(_ identifier: String) { + } + + func blePowerOn() { + print("BLE ON") + } + + func blePowerOff() { + print("BLE OFF") + } + + func ohrPPIFeatureReady(_ identifier: String) { + } + + func ftpFeatureReady(_ identifier: String) { + } +} +``` + +3. Connect to a Polar device using `api.connectToPolarDevice(id)` , `api.startAutoConnectToPolarDevice(_ rssi: Int, polarDeviceType: String?)` to connect nearby device or `api.searchForPolarDevice()` to scan and select the device diff --git a/ThirdPartySoftwareListing.txt b/ThirdPartySoftwareListing.txt new file mode 100644 index 00000000..9f15ac54 --- /dev/null +++ b/ThirdPartySoftwareListing.txt @@ -0,0 +1,288 @@ +============================================================================ +Protocol Buffers +============================================================================ + +// Protocol Buffers - Google's data interchange format +// Copyright 2015 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============================================================================ +RxSwift,RxAtomic +============================================================================ + +The MIT License Copyright © 2015 Krunoslav Zaher All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +============================================================================ +RxJava +============================================================================ + +Copyright (c) 2016-present, RxJava Contributors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +============================================================================ +RxAndroid +============================================================================ + +Copyright 2015 The RxAndroid authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +============================================================================ +Apache 2.0 +============================================================================ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/demos/Android-Demos/PolarSDK-Broadcast-Demo/.gitignore b/demos/Android-Demos/PolarSDK-Broadcast-Demo/.gitignore new file mode 100644 index 00000000..7706fa0d --- /dev/null +++ b/demos/Android-Demos/PolarSDK-Broadcast-Demo/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/ +/gradle/ +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/.gitignore b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/build.gradle b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/build.gradle new file mode 100644 index 00000000..aef14e93 --- /dev/null +++ b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/build.gradle @@ -0,0 +1,42 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "com.polar.polarsdkbroadcastdemo" + minSdkVersion 24 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +task copySdk { + copy { + from("$projectDir/../../../../polar-sdk-android/libs") + into("$projectDir/libs") + } +} + +preBuild.dependsOn copySdk + +dependencies { + implementation files('libs/polar-ble-sdk.aar') + implementation 'io.reactivex.rxjava2:rxjava:2.1.5' + implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + implementation 'com.android.support:cardview-v7:28.0.0' + implementation 'com.android.support:recyclerview-v7:28.0.0' +} diff --git a/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/proguard-rules.pro b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/androidTest/java/com/polar/polarsdkbroadcastdemo/ExampleInstrumentedTest.java b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/androidTest/java/com/polar/polarsdkbroadcastdemo/ExampleInstrumentedTest.java new file mode 100644 index 00000000..81b46731 --- /dev/null +++ b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/androidTest/java/com/polar/polarsdkbroadcastdemo/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.polar.polarsdkbroadcastdemo; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.polar.polarsdkbroadcastdemo", appContext.getPackageName()); + } +} diff --git a/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/AndroidManifest.xml b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..c9412a36 --- /dev/null +++ b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/java/com/polar/polarsdkbroadcastdemo/BroadcastActivity.java b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/java/com/polar/polarsdkbroadcastdemo/BroadcastActivity.java new file mode 100644 index 00000000..bda5ab0f --- /dev/null +++ b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/java/com/polar/polarsdkbroadcastdemo/BroadcastActivity.java @@ -0,0 +1,158 @@ +package com.polar.polarsdkbroadcastdemo; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Action; +import io.reactivex.functions.Consumer; +import polar.com.sdk.api.PolarBleApi; +import polar.com.sdk.api.PolarBleApiCallback; +import polar.com.sdk.api.PolarBleApiDefaultImpl; +import polar.com.sdk.api.model.PolarDeviceInfo; +import polar.com.sdk.api.model.PolarHrBroadcastData; +import polar.com.sdk.api.model.PolarHrData; + +public class BroadcastActivity extends AppCompatActivity { + + private PolarBleApi api; + private String TAG = "Polar_MainActivity"; + private Disposable broadcastDisposable; + + private PolarDeviceAdapter polarDeviceAdapter; + private Map broadcastData; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_br); + broadcastData = new LinkedHashMap<>(); + + api = PolarBleApiDefaultImpl.defaultImplementation(this, 0); + api.setApiCallback(new PolarBleApiCallback() { + @Override + public void blePowerStateChanged(boolean b) { + Log.d(TAG,"BluetoothStateChanged " + b); + } + + @Override + public void polarDeviceConnected(PolarDeviceInfo s) { + } + + @Override + public void polarDeviceConnecting(PolarDeviceInfo polarDeviceInfo) { + + } + + @Override + public void polarDeviceDisconnected(PolarDeviceInfo s) { + } + + @Override + public void ecgFeatureReady(String s) { + } + + @Override + public void accelerometerFeatureReady(String s) { + } + + @Override + public void ppgFeatureReady(String s) { + } + + @Override + public void ppiFeatureReady(String s) { + } + + @Override + public void biozFeatureReady(String s) { + + } + + @Override + public void hrFeatureReady(String s) { + } + + @Override + public void fwInformationReceived(String s, String s1) { + } + + @Override + public void batteryLevelReceived(String s, int i) { + } + + @Override + public void hrNotificationReceived(String s, PolarHrData polarHrData) { + } + + @Override + public void polarFtpFeatureReady(String s) { + } + }); + + + RecyclerView rView = findViewById(R.id.recyclerView); + RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this,2); + rView.setLayoutManager(layoutManager); + polarDeviceAdapter = new PolarDeviceAdapter(broadcastData); + + rView.setAdapter(polarDeviceAdapter); + + broadcast(); + } + + public void broadcast(){ + if(broadcastDisposable == null){ + broadcastDisposable = api.startListenForPolarHrBroadcasts(null).observeOn(AndroidSchedulers.mainThread()).subscribe( + new Consumer() { + @Override + public void accept(PolarHrBroadcastData polarHrBroadcastData) throws Exception { + String deviceID = polarHrBroadcastData.polarDeviceInfo.deviceId; + Log.d(TAG, deviceID); + + if(broadcastData.containsKey(deviceID)){ + if(Objects.requireNonNull(broadcastData.get(deviceID)).hr != polarHrBroadcastData.hr){ + broadcastData.replace(deviceID, polarHrBroadcastData); + polarDeviceAdapter.notifyDataSetChanged(); + } + } else { + broadcastData.put(deviceID, polarHrBroadcastData); + polarDeviceAdapter.notifyDataSetChanged(); + } + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e("Polar_Broadcast", throwable.getLocalizedMessage()); + } + }, + new Action() { + @Override + public void run() throws Exception { + Log.e(TAG, "complete"); + } + } + ); + } else { + Log.e("Polar_Broadcast", "Broadcast disposed"); + broadcastDisposable.dispose(); + broadcastDisposable = null; + } + } + + @Override + public void onDestroy(){ + super.onDestroy(); + api.shutDown(); + api = null; + } +} diff --git a/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/java/com/polar/polarsdkbroadcastdemo/MainActivity.java b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/java/com/polar/polarsdkbroadcastdemo/MainActivity.java new file mode 100644 index 00000000..d694c409 --- /dev/null +++ b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/java/com/polar/polarsdkbroadcastdemo/MainActivity.java @@ -0,0 +1,42 @@ +package com.polar.polarsdkbroadcastdemo; + +import android.Manifest; +import android.bluetooth.BluetoothAdapter; +import android.content.Intent; +import android.os.Build; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.View; +import android.widget.Toast; + +public class MainActivity extends AppCompatActivity { + + BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + checkBT(); + } + + public void onClickConnect(View view) { + if(mBluetoothAdapter.isEnabled()){ + Toast.makeText(this,getString(R.string.searching),Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(this, BroadcastActivity.class); + startActivity(intent); + } + else{ + checkBT(); + } + } + + public void checkBT(){ + if (mBluetoothAdapter != null && !mBluetoothAdapter.isEnabled()) { + Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); + startActivityForResult(enableBtIntent, 2); + } + + this.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION},1); + } +} diff --git a/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/java/com/polar/polarsdkbroadcastdemo/PolarDeviceAdapter.java b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/java/com/polar/polarsdkbroadcastdemo/PolarDeviceAdapter.java new file mode 100644 index 00000000..b29a2196 --- /dev/null +++ b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/java/com/polar/polarsdkbroadcastdemo/PolarDeviceAdapter.java @@ -0,0 +1,56 @@ +package com.polar.polarsdkbroadcastdemo; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.Map; + +import polar.com.sdk.api.model.PolarHrBroadcastData; + + +public class PolarDeviceAdapter extends RecyclerView.Adapter { + + private String TAG = "Polar_DeviceAdapter"; + + private Map broadcastData; + + public PolarDeviceAdapter(Map broadcastData){ + this.broadcastData = broadcastData; + } + + public class DeviceViewHolder extends RecyclerView.ViewHolder{ + private TextView textViewDeviceID; + private TextView textViewHR; + + public DeviceViewHolder(View v){ + super(v); + textViewDeviceID = v.findViewById(R.id.textViewDeviceID); + textViewHR = v.findViewById(R.id.textViewHR); + } + } + + @NonNull + @Override + public DeviceViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { + LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); + View itemView = inflater.inflate(R.layout.layout_card, viewGroup, false); + return new DeviceViewHolder(itemView); + } + + @Override + public void onBindViewHolder(@NonNull DeviceViewHolder deviceViewHolder, int i) { + deviceViewHolder.textViewDeviceID.setText(String.valueOf(new ArrayList<>(broadcastData.values()).get(i).polarDeviceInfo.deviceId)); + deviceViewHolder.textViewHR.setText(String.valueOf(new ArrayList<>(broadcastData.values()).get(i).hr)); + } + + @Override + public int getItemCount() { + return broadcastData.size(); + } +} diff --git a/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..1f6bb290 --- /dev/null +++ b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/drawable/ic_launcher_background.xml b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..0d025f9b --- /dev/null +++ b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/layout/activity_br.xml b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/layout/activity_br.xml new file mode 100644 index 00000000..e847087d --- /dev/null +++ b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/layout/activity_br.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/layout/activity_main.xml b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..cacb372e --- /dev/null +++ b/demos/Android-Demos/PolarSDK-Broadcast-Demo/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo/Info.plist b/demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo/Info.plist new file mode 100644 index 00000000..89d7858b --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo/Info.plist @@ -0,0 +1,43 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo/ViewController.swift b/demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo/ViewController.swift new file mode 100644 index 00000000..ca8aa333 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-ACC-Demo/PolarSDK-ACC-Demo/ViewController.swift @@ -0,0 +1,121 @@ +import UIKit +import PolarBleSdk +import RxSwift + +class ViewController: UIViewController, PolarBleApiObserver, PolarBleApiPowerStateObserver, PolarBleApiDeviceFeaturesObserver, PolarBleApiLogger { + func message(_ str: String) { + NSLog(str) + } + + + @IBOutlet weak var textX: UILabel! + @IBOutlet weak var textY: UILabel! + @IBOutlet weak var textZ: UILabel! + @IBOutlet weak var connectionStatus: UILabel! + @IBOutlet weak var buttonStart: UIButton! + + var deviceId: String = "" + var api: PolarBleApi! + var accToggle: Disposable? + var multiplier: Double? + + //Bluetooth state check + let alertMessage = "Please enable Bluetooth in your device's Settings" + let alertTitle = "Bluetooth is off" + var btIsOn = false + + func showBtAlert(){ + let btAlert = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: UIAlertController.Style.alert) + btAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) + self.present(btAlert, animated: true, completion: nil) + } + + override func viewDidLoad() { + super.viewDidLoad() + api = PolarBleApiDefaultImpl.polarImplementation(DispatchQueue.main, features: Features.polarSensorStreaming.rawValue) + api.observer = self + api.powerStateObserver = self + api.deviceFeaturesObserver = self + //api.logger = self + _ = api.startAutoConnectToPolarDevice(-50, polarDeviceType: nil).subscribe() + connectionStatus.text = "" + } + + @IBAction func streamACC(_ sender: Any){ + if accToggle == nil && btIsOn { + buttonStart.setTitle("Stop ACC", for: .normal) + accToggle = api.requestAccSettings(deviceId).asObservable().flatMap({ (settings) -> Observable in + return self.api.startAccStreaming(self.deviceId, settings: settings.maxSettings()) + }).observeOn(MainScheduler.instance).subscribe{ e in + switch e { + case .next(let data): + for item in data.samples { + self.textX.text = String(format: "%.2f", ((Float(item.x) / 1000.0))) + self.textY.text = String(format: "%.2f", ((Float(item.y) / 1000.0))) + self.textZ.text = String(format: "%.2f", ((Float(item.z) / 1000.0))) + } + case .error(let err): + print("ACC error: \(err)") + self.accToggle = nil + case .completed: + break + } + } + } else { + if(!btIsOn){ + showBtAlert() + } + accToggle?.dispose() + accToggle = nil + buttonStart.setTitle("Start ACC", for: .normal) + } + } + + func hrFeatureReady(_ identifier: String) { + NSLog("HR CONNECTED") + } + + func ecgFeatureReady(_ identifier: String) { + NSLog("ECG CONNECTED") + } + + func accFeatureReady(_ identifier: String) { + NSLog("ACC CONNECTED") + } + + func ohrPPGFeatureReady(_ identifier: String) { + NSLog("PPG CONNECTED") + } + + func ohrPPIFeatureReady(_ identifier: String) { + NSLog("PPI CONNECTED") + } + + func ftpFeatureReady(_ identifier: String) { + NSLog("FTP CONNECTED") + } + + func polarDeviceConnecting(_ identifier: PolarDeviceInfo) { + connectionStatus.text = "Connecting" + } + + func polarDeviceConnected(_ identifier: PolarDeviceInfo) { + deviceId = identifier.deviceId + connectionStatus.text = "Connected" + } + + func polarDeviceDisconnected(_ identifier: PolarDeviceInfo) { + connectionStatus.text = "Disconnected" + } + + func blePowerOn() { + NSLog("Bluetooth on") + btIsOn = true + } + + func blePowerOff() { + NSLog("Bluetooth off") + btIsOn = false + } +} + diff --git a/demos/iOS-Demos/PolarSDK-Broadcast-Demo/Cartfile b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/Cartfile new file mode 100644 index 00000000..ce434dc6 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/Cartfile @@ -0,0 +1 @@ +github "ReactiveX/RxSwift" "4.4.0" diff --git a/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo.xcodeproj/project.pbxproj b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo.xcodeproj/project.pbxproj new file mode 100644 index 00000000..2cc15d90 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo.xcodeproj/project.pbxproj @@ -0,0 +1,402 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 6C2409152212ED24001C1A84 /* RxAtomic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C2409142212ED24001C1A84 /* RxAtomic.framework */; }; + 6C2409162212ED29001C1A84 /* RxAtomic.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 6C2409142212ED24001C1A84 /* RxAtomic.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 6C32C6BB2204664C006615C3 /* PolarBleSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C32C6B92204664C006615C3 /* PolarBleSdk.framework */; }; + 6C32C6BC2204664C006615C3 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C32C6BA2204664C006615C3 /* RxSwift.framework */; }; + 6C32C6BD22046653006615C3 /* PolarBleSdk.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 6C32C6B92204664C006615C3 /* PolarBleSdk.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 6C32C6BE22046653006615C3 /* RxSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 6C32C6BA2204664C006615C3 /* RxSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + E30BE8D521A82D9B0006AEB4 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E30BE8D421A82D9B0006AEB4 /* AppDelegate.swift */; }; + E30BE8D721A82D9B0006AEB4 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E30BE8D621A82D9B0006AEB4 /* ViewController.swift */; }; + E30BE8DA21A82D9B0006AEB4 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E30BE8D821A82D9B0006AEB4 /* Main.storyboard */; }; + E30BE8DC21A82D9C0006AEB4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E30BE8DB21A82D9C0006AEB4 /* Assets.xcassets */; }; + E30BE8DF21A82D9C0006AEB4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E30BE8DD21A82D9C0006AEB4 /* LaunchScreen.storyboard */; }; + E30BE8EE21A834DD0006AEB4 /* PolarCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E30BE8ED21A834DD0006AEB4 /* PolarCollectionViewCell.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + E30BE8EC21A82E1A0006AEB4 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 6C2409162212ED29001C1A84 /* RxAtomic.framework in Embed Frameworks */, + 6C32C6BD22046653006615C3 /* PolarBleSdk.framework in Embed Frameworks */, + 6C32C6BE22046653006615C3 /* RxSwift.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 6C2409142212ED24001C1A84 /* RxAtomic.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxAtomic.framework; path = "../../../polar-sdk-ios/RxAtomic.framework"; sourceTree = ""; }; + 6C32C6B92204664C006615C3 /* PolarBleSdk.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PolarBleSdk.framework; path = "../../../polar-sdk-ios/PolarBleSdk.framework"; sourceTree = ""; }; + 6C32C6BA2204664C006615C3 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = "../../../polar-sdk-ios/RxSwift.framework"; sourceTree = ""; }; + E30BE8D121A82D9B0006AEB4 /* PolarSDK-Broadcast-Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "PolarSDK-Broadcast-Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + E30BE8D421A82D9B0006AEB4 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + E30BE8D621A82D9B0006AEB4 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + E30BE8D921A82D9B0006AEB4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + E30BE8DB21A82D9C0006AEB4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + E30BE8DE21A82D9C0006AEB4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + E30BE8E021A82D9C0006AEB4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E30BE8ED21A834DD0006AEB4 /* PolarCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolarCollectionViewCell.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + E30BE8CE21A82D9B0006AEB4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6C2409152212ED24001C1A84 /* RxAtomic.framework in Frameworks */, + 6C32C6BB2204664C006615C3 /* PolarBleSdk.framework in Frameworks */, + 6C32C6BC2204664C006615C3 /* RxSwift.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 6C32C6B82204664C006615C3 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6C2409142212ED24001C1A84 /* RxAtomic.framework */, + 6C32C6B92204664C006615C3 /* PolarBleSdk.framework */, + 6C32C6BA2204664C006615C3 /* RxSwift.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + E30BE8C821A82D9B0006AEB4 = { + isa = PBXGroup; + children = ( + E30BE8D321A82D9B0006AEB4 /* PolarSDK-Broadcast-Demo */, + E30BE8D221A82D9B0006AEB4 /* Products */, + 6C32C6B82204664C006615C3 /* Frameworks */, + ); + sourceTree = ""; + }; + E30BE8D221A82D9B0006AEB4 /* Products */ = { + isa = PBXGroup; + children = ( + E30BE8D121A82D9B0006AEB4 /* PolarSDK-Broadcast-Demo.app */, + ); + name = Products; + sourceTree = ""; + }; + E30BE8D321A82D9B0006AEB4 /* PolarSDK-Broadcast-Demo */ = { + isa = PBXGroup; + children = ( + E30BE8D421A82D9B0006AEB4 /* AppDelegate.swift */, + E30BE8D621A82D9B0006AEB4 /* ViewController.swift */, + E30BE8ED21A834DD0006AEB4 /* PolarCollectionViewCell.swift */, + E30BE8D821A82D9B0006AEB4 /* Main.storyboard */, + E30BE8DB21A82D9C0006AEB4 /* Assets.xcassets */, + E30BE8DD21A82D9C0006AEB4 /* LaunchScreen.storyboard */, + E30BE8E021A82D9C0006AEB4 /* Info.plist */, + ); + path = "PolarSDK-Broadcast-Demo"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + E30BE8D021A82D9B0006AEB4 /* PolarSDK-Broadcast-Demo */ = { + isa = PBXNativeTarget; + buildConfigurationList = E30BE8E321A82D9C0006AEB4 /* Build configuration list for PBXNativeTarget "PolarSDK-Broadcast-Demo" */; + buildPhases = ( + E30BE8CD21A82D9B0006AEB4 /* Sources */, + E30BE8CE21A82D9B0006AEB4 /* Frameworks */, + E30BE8CF21A82D9B0006AEB4 /* Resources */, + E30BE8EC21A82E1A0006AEB4 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "PolarSDK-Broadcast-Demo"; + productName = "PolarSDK-Broadcast-Demo"; + productReference = E30BE8D121A82D9B0006AEB4 /* PolarSDK-Broadcast-Demo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + E30BE8C921A82D9B0006AEB4 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1010; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = Polar; + TargetAttributes = { + E30BE8D021A82D9B0006AEB4 = { + CreatedOnToolsVersion = 10.1; + SystemCapabilities = { + com.apple.BackgroundModes = { + enabled = 1; + }; + }; + }; + }; + }; + buildConfigurationList = E30BE8CC21A82D9B0006AEB4 /* Build configuration list for PBXProject "PolarSDK-Broadcast-Demo" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = E30BE8C821A82D9B0006AEB4; + productRefGroup = E30BE8D221A82D9B0006AEB4 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + E30BE8D021A82D9B0006AEB4 /* PolarSDK-Broadcast-Demo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + E30BE8CF21A82D9B0006AEB4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E30BE8DF21A82D9C0006AEB4 /* LaunchScreen.storyboard in Resources */, + E30BE8DC21A82D9C0006AEB4 /* Assets.xcassets in Resources */, + E30BE8DA21A82D9B0006AEB4 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + E30BE8CD21A82D9B0006AEB4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E30BE8D721A82D9B0006AEB4 /* ViewController.swift in Sources */, + E30BE8D521A82D9B0006AEB4 /* AppDelegate.swift in Sources */, + E30BE8EE21A834DD0006AEB4 /* PolarCollectionViewCell.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + E30BE8D821A82D9B0006AEB4 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E30BE8D921A82D9B0006AEB4 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + E30BE8DD21A82D9C0006AEB4 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E30BE8DE21A82D9C0006AEB4 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + E30BE8E121A82D9C0006AEB4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + E30BE8E221A82D9C0006AEB4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + E30BE8E421A82D9C0006AEB4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/../../../polar-sdk-ios", + ); + INFOPLIST_FILE = "PolarSDK-Broadcast-Demo/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.polar.PolarSDK-Broadcast-Demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + E30BE8E521A82D9C0006AEB4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/../../../polar-sdk-ios", + ); + INFOPLIST_FILE = "PolarSDK-Broadcast-Demo/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.polar.PolarSDK-Broadcast-Demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + E30BE8CC21A82D9B0006AEB4 /* Build configuration list for PBXProject "PolarSDK-Broadcast-Demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E30BE8E121A82D9C0006AEB4 /* Debug */, + E30BE8E221A82D9C0006AEB4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E30BE8E321A82D9C0006AEB4 /* Build configuration list for PBXNativeTarget "PolarSDK-Broadcast-Demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E30BE8E421A82D9C0006AEB4 /* Debug */, + E30BE8E521A82D9C0006AEB4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = E30BE8C921A82D9B0006AEB4 /* Project object */; +} diff --git a/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/AppDelegate.swift b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/AppDelegate.swift new file mode 100644 index 00000000..2c6c5036 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// PolarSDK-Broadcast-Demo +// +// Created by Mikko Jokinen on 23/11/2018. +// Copyright © 2018 Polar. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Assets.xcassets/AppIcon.appiconset/Contents.json b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d8db8d65 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Assets.xcassets/Contents.json b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Base.lproj/LaunchScreen.storyboard b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..bfa36129 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Base.lproj/Main.storyboard b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Base.lproj/Main.storyboard new file mode 100644 index 00000000..a0225b24 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Base.lproj/Main.storyboard @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Info.plist b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Info.plist new file mode 100644 index 00000000..dcf8ae11 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIBackgroundModes + + bluetooth-central + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/PolarCollectionViewCell.swift b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/PolarCollectionViewCell.swift new file mode 100644 index 00000000..cd9d3892 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/PolarCollectionViewCell.swift @@ -0,0 +1,14 @@ +// +// PolarCollectionViewCell.swift +// PolarSDK-Broadcast-Demo +// +// Created by Mikko Jokinen on 23/11/2018. +// Copyright © 2018 Polar. All rights reserved. +// + +import UIKit + +class PolarCollectionViewCell: UICollectionViewCell { + @IBOutlet weak var idLabel: UILabel! + @IBOutlet weak var hrLabel: UILabel! +} diff --git a/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/ViewController.swift b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/ViewController.swift new file mode 100644 index 00000000..36c484b0 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Broadcast-Demo/PolarSDK-Broadcast-Demo/ViewController.swift @@ -0,0 +1,93 @@ + +import UIKit +import PolarBleSdk +import RxSwift + +class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, PolarBleApiPowerStateObserver, PolarBleApiLogger +{ + func message(_ str: String) { + NSLog(str) + } + + + @IBOutlet weak var buttonBR: UIButton! + @IBOutlet weak var collectionView: UICollectionView! + var api: PolarBleApi! + var brToggle: Disposable? + var deviceArray: [String:PolarHrBroadcastData] = [:] + let reuseID = "reuseID" + + //Bluetooth state check + let alertMessage = "Please enable Bluetooth in your device's Settings" + let alertTitle = "Bluetooth is off" + var btIsOn = false + + func showBtAlert(){ + let btAlert = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: UIAlertController.Style.alert) + btAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) + self.present(btAlert, animated: true, completion: nil) + } + + override func viewDidLoad() { + super.viewDidLoad() + api = PolarBleApiDefaultImpl.polarImplementation(DispatchQueue.main, features: 0) + api.powerStateObserver = self + //api.logger = self + } + + @IBAction func startBR(_ sender: Any) { + if brToggle == nil && btIsOn { + buttonBR.setTitle("Stop broadcast", for: .normal) + brToggle = api.startListenForPolarHrBroadcasts(nil).observeOn(MainScheduler.instance).subscribe { e in + switch e { + case .completed: + break + case .error(let err): + print("\(err)") + case .next(let broadcast): + NSLog("\(broadcast.deviceInfo.deviceId) HR BROADCAST: \(broadcast.hr) battery: \(broadcast.batteryStatus)") + let receivedID = broadcast.deviceInfo.deviceId + + if(self.deviceArray[receivedID] != nil){ + if(self.deviceArray[receivedID]?.hr != broadcast.hr){ + self.deviceArray[receivedID] = broadcast + } + } else { + self.deviceArray[receivedID] = broadcast + } + self.collectionView.reloadData() + } + } + } else { + if(!btIsOn){ + showBtAlert() + } + brToggle?.dispose() + brToggle = nil + buttonBR.setTitle("Start broadcast", for: .normal) + } + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return deviceArray.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseID, for: indexPath as IndexPath) as! PolarCollectionViewCell + + cell.idLabel.text = Array(self.deviceArray.keys)[indexPath.item] + cell.hrLabel.text = String(Array(self.deviceArray.values)[indexPath.item].hr) + return cell + } + + func blePowerOn() { + NSLog("Bluetooth on") + btIsOn = true + } + + func blePowerOff() { + NSLog("Bluetooth off") + btIsOn = false + } +} + diff --git a/demos/iOS-Demos/PolarSDK-Exercise-Demo/Cartfile b/demos/iOS-Demos/PolarSDK-Exercise-Demo/Cartfile new file mode 100644 index 00000000..ce434dc6 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Exercise-Demo/Cartfile @@ -0,0 +1 @@ +github "ReactiveX/RxSwift" "4.4.0" diff --git a/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo.xcodeproj/project.pbxproj b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo.xcodeproj/project.pbxproj new file mode 100644 index 00000000..afa25f85 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo.xcodeproj/project.pbxproj @@ -0,0 +1,397 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 6C2409122212ECFF001C1A84 /* RxAtomic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C2409112212ECFF001C1A84 /* RxAtomic.framework */; }; + 6C2409132212ED03001C1A84 /* RxAtomic.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 6C2409112212ECFF001C1A84 /* RxAtomic.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 6C32C6C222046D42006615C3 /* PolarBleSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C32C6C022046D42006615C3 /* PolarBleSdk.framework */; }; + 6C32C6C322046D42006615C3 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C32C6C122046D42006615C3 /* RxSwift.framework */; }; + 6C32C6C422046D47006615C3 /* PolarBleSdk.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 6C32C6C022046D42006615C3 /* PolarBleSdk.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 6C32C6C522046D47006615C3 /* RxSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 6C32C6C122046D42006615C3 /* RxSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + E36BD3A721A809D200908397 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E36BD3A621A809D200908397 /* AppDelegate.swift */; }; + E36BD3A921A809D200908397 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E36BD3A821A809D200908397 /* ViewController.swift */; }; + E36BD3AC21A809D200908397 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E36BD3AA21A809D200908397 /* Main.storyboard */; }; + E36BD3AE21A809D300908397 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E36BD3AD21A809D300908397 /* Assets.xcassets */; }; + E36BD3B121A809D300908397 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E36BD3AF21A809D300908397 /* LaunchScreen.storyboard */; }; + E384D50721AC0B7A00509D12 /* PolarTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E384D50621AC0B7A00509D12 /* PolarTableViewCell.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + E36BD3BE21A80A2200908397 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 6C2409132212ED03001C1A84 /* RxAtomic.framework in Embed Frameworks */, + 6C32C6C422046D47006615C3 /* PolarBleSdk.framework in Embed Frameworks */, + 6C32C6C522046D47006615C3 /* RxSwift.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 6C2409112212ECFF001C1A84 /* RxAtomic.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxAtomic.framework; path = "../../../polar-sdk-ios/RxAtomic.framework"; sourceTree = ""; }; + 6C32C6C022046D42006615C3 /* PolarBleSdk.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PolarBleSdk.framework; path = "../../../polar-sdk-ios/PolarBleSdk.framework"; sourceTree = ""; }; + 6C32C6C122046D42006615C3 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = "../../../polar-sdk-ios/RxSwift.framework"; sourceTree = ""; }; + E36BD3A321A809D200908397 /* PolarSDK-Exercise-Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "PolarSDK-Exercise-Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + E36BD3A621A809D200908397 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + E36BD3A821A809D200908397 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + E36BD3AB21A809D200908397 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + E36BD3AD21A809D300908397 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + E36BD3B021A809D300908397 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + E36BD3B221A809D300908397 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E384D50621AC0B7A00509D12 /* PolarTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PolarTableViewCell.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + E36BD3A021A809D200908397 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6C2409122212ECFF001C1A84 /* RxAtomic.framework in Frameworks */, + 6C32C6C222046D42006615C3 /* PolarBleSdk.framework in Frameworks */, + 6C32C6C322046D42006615C3 /* RxSwift.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 6C32C6BF22046D41006615C3 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6C2409112212ECFF001C1A84 /* RxAtomic.framework */, + 6C32C6C022046D42006615C3 /* PolarBleSdk.framework */, + 6C32C6C122046D42006615C3 /* RxSwift.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + E36BD39A21A809D200908397 = { + isa = PBXGroup; + children = ( + E36BD3A521A809D200908397 /* PolarSDK-Exercise-Demo */, + E36BD3A421A809D200908397 /* Products */, + 6C32C6BF22046D41006615C3 /* Frameworks */, + ); + sourceTree = ""; + }; + E36BD3A421A809D200908397 /* Products */ = { + isa = PBXGroup; + children = ( + E36BD3A321A809D200908397 /* PolarSDK-Exercise-Demo.app */, + ); + name = Products; + sourceTree = ""; + }; + E36BD3A521A809D200908397 /* PolarSDK-Exercise-Demo */ = { + isa = PBXGroup; + children = ( + E36BD3A621A809D200908397 /* AppDelegate.swift */, + E36BD3A821A809D200908397 /* ViewController.swift */, + E36BD3AA21A809D200908397 /* Main.storyboard */, + E36BD3AD21A809D300908397 /* Assets.xcassets */, + E36BD3AF21A809D300908397 /* LaunchScreen.storyboard */, + E36BD3B221A809D300908397 /* Info.plist */, + E384D50621AC0B7A00509D12 /* PolarTableViewCell.swift */, + ); + path = "PolarSDK-Exercise-Demo"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + E36BD3A221A809D200908397 /* PolarSDK-Exercise-Demo */ = { + isa = PBXNativeTarget; + buildConfigurationList = E36BD3B521A809D300908397 /* Build configuration list for PBXNativeTarget "PolarSDK-Exercise-Demo" */; + buildPhases = ( + E36BD39F21A809D200908397 /* Sources */, + E36BD3A021A809D200908397 /* Frameworks */, + E36BD3A121A809D200908397 /* Resources */, + E36BD3BE21A80A2200908397 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "PolarSDK-Exercise-Demo"; + productName = "PolarSDK-Exercise-Demo"; + productReference = E36BD3A321A809D200908397 /* PolarSDK-Exercise-Demo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + E36BD39B21A809D200908397 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1010; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = Polar; + TargetAttributes = { + E36BD3A221A809D200908397 = { + CreatedOnToolsVersion = 10.1; + }; + }; + }; + buildConfigurationList = E36BD39E21A809D200908397 /* Build configuration list for PBXProject "PolarSDK-Exercise-Demo" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = E36BD39A21A809D200908397; + productRefGroup = E36BD3A421A809D200908397 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + E36BD3A221A809D200908397 /* PolarSDK-Exercise-Demo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + E36BD3A121A809D200908397 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E36BD3B121A809D300908397 /* LaunchScreen.storyboard in Resources */, + E36BD3AE21A809D300908397 /* Assets.xcassets in Resources */, + E36BD3AC21A809D200908397 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + E36BD39F21A809D200908397 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E384D50721AC0B7A00509D12 /* PolarTableViewCell.swift in Sources */, + E36BD3A921A809D200908397 /* ViewController.swift in Sources */, + E36BD3A721A809D200908397 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + E36BD3AA21A809D200908397 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E36BD3AB21A809D200908397 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + E36BD3AF21A809D300908397 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E36BD3B021A809D300908397 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + E36BD3B321A809D300908397 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + E36BD3B421A809D300908397 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + E36BD3B621A809D300908397 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/../../../polar-sdk-ios", + ); + INFOPLIST_FILE = "PolarSDK-Exercise-Demo/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.polar.PolarSDK-Exercise-Demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + E36BD3B721A809D300908397 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/../../../polar-sdk-ios", + ); + INFOPLIST_FILE = "PolarSDK-Exercise-Demo/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.polar.PolarSDK-Exercise-Demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + E36BD39E21A809D200908397 /* Build configuration list for PBXProject "PolarSDK-Exercise-Demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E36BD3B321A809D300908397 /* Debug */, + E36BD3B421A809D300908397 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E36BD3B521A809D300908397 /* Build configuration list for PBXNativeTarget "PolarSDK-Exercise-Demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E36BD3B621A809D300908397 /* Debug */, + E36BD3B721A809D300908397 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = E36BD39B21A809D200908397 /* Project object */; +} diff --git a/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/AppDelegate.swift b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/AppDelegate.swift new file mode 100644 index 00000000..adf9e58f --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// PolarSDK-Exercise-Demo +// +// Created by Mikko Jokinen on 23/11/2018. +// Copyright © 2018 Polar. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Assets.xcassets/AppIcon.appiconset/Contents.json b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d8db8d65 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Assets.xcassets/Contents.json b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Base.lproj/LaunchScreen.storyboard b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..bfa36129 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Base.lproj/Main.storyboard b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Base.lproj/Main.storyboard new file mode 100644 index 00000000..b4313ca1 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Base.lproj/Main.storyboard @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Info.plist b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Info.plist new file mode 100644 index 00000000..16be3b68 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/PolarTableViewCell.swift b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/PolarTableViewCell.swift new file mode 100644 index 00000000..c7e06204 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/PolarTableViewCell.swift @@ -0,0 +1,25 @@ +// +// PolarTableViewCell.swift +// PolarSDK-Exercise-Demo +// +// Created by Mikko Jokinen on 26/11/2018. +// Copyright © 2018 Polar. All rights reserved. +// + +import UIKit + +class PolarTableViewCell: UITableViewCell { + + @IBOutlet weak var infoLabel: UILabel! + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/ViewController.swift b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/ViewController.swift new file mode 100644 index 00000000..bbe35950 --- /dev/null +++ b/demos/iOS-Demos/PolarSDK-Exercise-Demo/PolarSDK-Exercise-Demo/ViewController.swift @@ -0,0 +1,150 @@ + + +import UIKit +import PolarBleSdk +import RxSwift + +class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, PolarBleApiObserver, PolarBleApiPowerStateObserver, PolarBleApiDeviceInfoObserver, PolarBleApiDeviceFeaturesObserver { + + var api: PolarBleApi! + var deviceId: String? + @IBOutlet weak var connectionStatus: UILabel! + @IBOutlet weak var exeTable: UITableView! + var exerciseArray: [PolarExerciseEntry] = [] + + let cellReuseID = "cellReuseID" + + //Bluetooth state check + let alertMessage = "Please enable Bluetooth in your device's Settings" + let alertTitle = "Bluetooth is off" + var btIsOn = false + + func showBtAlert(){ + let btAlert = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: UIAlertController.Style.alert) + btAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) + self.present(btAlert, animated: true, completion: nil) + } + + override func viewDidLoad() { + super.viewDidLoad() + api = PolarBleApiDefaultImpl.polarImplementation(DispatchQueue.main, features: Features.batteryStatus.rawValue | Features.deviceInfo.rawValue | Features.polarFileTransfer.rawValue) + api.observer = self + api.powerStateObserver = self + api.deviceInfoObserver = self + api.deviceFeaturesObserver = self + _ = api.startAutoConnectToPolarDevice(-50, polarDeviceType: "OH1").subscribe() + connectionStatus.text = "Disconnected" + } + @IBAction func listExercises(_ sender: Any) { + if(btIsOn && deviceId != nil){ + self.exerciseArray.removeAll() + _ = api.fetchStoredExerciseList(deviceId!).observeOn(MainScheduler.instance).subscribe { e in + switch e { + case .completed: + break + case .next(let entry): + print("entry: \(entry.date.description)") + self.exerciseArray.append(entry) + self.exeTable.reloadData() + case .error(let err): + print("ERROR: \(err)") + } + } + } else { + showBtAlert() + } + } + + func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return exerciseArray.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) + -> UITableViewCell + { + let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseID, for: indexPath as IndexPath) as! PolarTableViewCell + let text = exerciseArray[indexPath.row] + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "dd/MM/yyyy hh:mm" + cell.infoLabel.text = dateFormatter.string(for: text.date) + + return cell + } + + func hrFeatureReady(_ identifier: String) { + NSLog("HR CONNECTED") + } + + func ecgFeatureReady(_ identifier: String) { + NSLog("ECG CONNECTED") + } + + func accFeatureReady(_ identifier: String) { + NSLog("ACC CONNECTED") + } + + func ohrPPGFeatureReady(_ identifier: String) { + NSLog("PPG CONNECTED") + } + + func ohrPPIFeatureReady(_ identifier: String) { + NSLog("PPI CONNECTED") + } + + func ftpFeatureReady(_ identifier: String) { + NSLog("FTP CONNECTED") + self.exerciseArray.removeAll() + _ = api.fetchStoredExerciseList(identifier).observeOn(MainScheduler.instance).subscribe { e in + switch e { + case .completed: + break + case .next(let entry): + print("entry: \(entry.date.description)") + self.exerciseArray.append(entry) + self.exeTable.reloadData() + case .error(let err): + print("ERROR: \(err)") + } + } + } + + func polarDeviceConnected(_ identifier: PolarDeviceInfo) { + NSLog("Device connected " + identifier.deviceId) + deviceId = identifier.deviceId + connectionStatus.text = "Connected" + } + + func polarDeviceConnecting(_ identifier: PolarDeviceInfo) { + NSLog("Device connecting " + identifier.deviceId) + connectionStatus.text = "Connecting" + } + + func polarDeviceDisconnected(_ identifier: PolarDeviceInfo) { + NSLog("Device disconnected " + identifier.deviceId) + connectionStatus.text = "Disconnected" + deviceId = nil + } + + func blePowerOn() { + NSLog("Bluetooth on") + btIsOn = true + } + + func blePowerOff() { + NSLog("Bluetooth off") + btIsOn = false + } + + func batteryLevelReceived(_ identifier: String, batteryLevel: UInt) { + NSLog("Battery level \(identifier): \(batteryLevel) ") + } + + func fwVersionReceived(_ identifier: String, fwVersion: String) { + NSLog("Firmware version \(identifier): \(fwVersion) ") + } +} + diff --git a/examples/example-android/androidBleSdkTestApp/app/build.gradle b/examples/example-android/androidBleSdkTestApp/app/build.gradle new file mode 100644 index 00000000..e59ccd0a --- /dev/null +++ b/examples/example-android/androidBleSdkTestApp/app/build.gradle @@ -0,0 +1,51 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 27 + defaultConfig { + applicationId "polar.com.androidblesdk" + minSdkVersion 19 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + defaultConfig { + multiDexEnabled true + } + dexOptions { + javaMaxHeapSize "2g" + } +} + +task copySdk { + copy { + from("$projectDir/../../../../polar-sdk-android/libs") + into("$projectDir/libs") + } +} + +preBuild.dependsOn copySdk + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation files('libs/polar-ble-sdk.aar') + implementation files('libs/polar-protobuf-release.aar') + implementation 'com.google.protobuf:protobuf-java:3.1.0' + implementation 'io.reactivex.rxjava2:rxjava:2.1.5' + implementation group: 'commons-io', name: 'commons-io', version: '2.4' + implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' + implementation 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support.constraint:constraint-layout:1.0.2' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.1' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' +} diff --git a/examples/example-android/androidBleSdkTestApp/app/src/main/AndroidManifest.xml b/examples/example-android/androidBleSdkTestApp/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..97c350e8 --- /dev/null +++ b/examples/example-android/androidBleSdkTestApp/app/src/main/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/example-android/androidBleSdkTestApp/app/src/main/java/polar/com/androidblesdk/MainActivity.java b/examples/example-android/androidBleSdkTestApp/app/src/main/java/polar/com/androidblesdk/MainActivity.java new file mode 100644 index 00000000..b8e046d7 --- /dev/null +++ b/examples/example-android/androidBleSdkTestApp/app/src/main/java/polar/com/androidblesdk/MainActivity.java @@ -0,0 +1,607 @@ +package polar.com.androidblesdk; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.os.Build; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.util.Pair; +import android.view.View; +import android.widget.Button; + +import org.reactivestreams.Publisher; + +import java.util.Date; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Action; +import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; +import polar.com.sdk.api.PolarBleApi; +import polar.com.sdk.api.PolarBleApiCallback; +import polar.com.sdk.api.PolarBleApiDefaultImpl; +import polar.com.sdk.api.model.PolarAccelerometerData; +import polar.com.sdk.api.model.PolarDeviceInfo; +import polar.com.sdk.api.model.PolarEcgData; +import polar.com.sdk.api.model.PolarExerciseData; +import polar.com.sdk.api.model.PolarExerciseEntry; +import polar.com.sdk.api.model.PolarHrBroadcastData; +import polar.com.sdk.api.model.PolarHrData; +import polar.com.sdk.api.model.PolarOhrPPGData; +import polar.com.sdk.api.model.PolarOhrPPIData; +import polar.com.sdk.api.model.PolarSensorSetting; + +public class MainActivity extends AppCompatActivity { + private final static String TAG = MainActivity.class.getSimpleName(); + PolarBleApi api; + Disposable broadcastDisposable; + Disposable ecgDisposable; + Disposable accDisposable; + Disposable ppgDisposable; + Disposable ppiDisposable; + Disposable scanDisposable; + String DEVICE_ID = "24FDA820"; // TODO replace with your device id + Disposable autoConnectDisposable; + PolarExerciseEntry exerciseEntry; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + // Notice PolarBleApi.ALL_FEATURES are enabled + api = PolarBleApiDefaultImpl.defaultImplementation(this, PolarBleApi.ALL_FEATURES); + + final Button broadcast = this.findViewById(R.id.broadcast_button); + final Button connect = this.findViewById(R.id.connect_button); + final Button disconnect = this.findViewById(R.id.disconnect_button); + final Button autoConnect = this.findViewById(R.id.auto_connect_button); + final Button ecg = this.findViewById(R.id.ecg_button); + final Button acc = this.findViewById(R.id.acc_button); + final Button ppg = this.findViewById(R.id.ohr_ppg_button); + final Button ppi = this.findViewById(R.id.ohr_ppi_button); + final Button scan = this.findViewById(R.id.scan_button); + final Button list = this.findViewById(R.id.list_exercises); + final Button read = this.findViewById(R.id.read_exercise); + final Button remove = this.findViewById(R.id.remove_exercise); + final Button startH10Recording = this.findViewById(R.id.start_h10_recording); + final Button stopH10Recording = this.findViewById(R.id.stop_h10_recording); + final Button H10RecordingStatus = this.findViewById(R.id.h10_recording_status); + final Button setTime = this.findViewById(R.id.set_time); + + api.setApiLogger(new PolarBleApi.PolarBleApiLogger() { + @Override + public void message(String s) { + Log.d(TAG,s); + } + }); + + Log.d(TAG,"version: " + PolarBleApiDefaultImpl.versionInfo()); + + api.setApiCallback(new PolarBleApiCallback() { + @Override + public void blePowerStateChanged(boolean powered) { + Log.d(TAG,"BLE power: " + powered); + } + + @Override + public void polarDeviceConnected(PolarDeviceInfo polarDeviceInfo) { + Log.d(TAG,"CONNECTED: " + polarDeviceInfo.deviceId); + DEVICE_ID = polarDeviceInfo.deviceId; + } + + @Override + public void polarDeviceConnecting(PolarDeviceInfo polarDeviceInfo) { + Log.d(TAG,"CONNECTING: " + polarDeviceInfo.deviceId); + DEVICE_ID = polarDeviceInfo.deviceId; + } + + @Override + public void polarDeviceDisconnected(PolarDeviceInfo polarDeviceInfo) { + Log.d(TAG,"DISCONNECTED: " + polarDeviceInfo.deviceId); + ecgDisposable = null; + accDisposable = null; + ppgDisposable = null; + ppiDisposable = null; + } + + @Override + public void ecgFeatureReady(String identifier) { + Log.d(TAG,"ECG READY: " + identifier); + // ecg streaming can be started now if needed + } + + @Override + public void accelerometerFeatureReady(String identifier) { + Log.d(TAG,"ACC READY: " + identifier); + // acc streaming can be started now if needed + } + + @Override + public void ppgFeatureReady(String identifier) { + Log.d(TAG,"PPG READY: " + identifier); + // ohr ppg can be started + } + + @Override + public void ppiFeatureReady(String identifier) { + Log.d(TAG,"PPI READY: " + identifier); + // ohr ppi can be started + } + + @Override + public void biozFeatureReady(String identifier) { + Log.d(TAG,"BIOZ READY: " + identifier); + // ohr ppi can be started + } + + @Override + public void hrFeatureReady(String identifier) { + Log.d(TAG,"HR READY: " + identifier); + // hr notifications are about to start + } + + @Override + public void fwInformationReceived(String identifier, String fwVersion) { + Log.d(TAG,"FW: " + fwVersion); + + } + + @Override + public void batteryLevelReceived(String identifier, int level) { + Log.d(TAG,"BATTERY LEVEL: " + level); + + } + + @Override + public void hrNotificationReceived(String identifier, PolarHrData data) { + Log.d(TAG,"HR value: " + data.hr + " rrsMs: " + data.rrsMs + " rr: " + data.rrs + " contact: " + data.contactStatus + "," + data.contactStatusSupported); + } + + @Override + public void polarFtpFeatureReady(String s) { + Log.d(TAG,"FTP ready"); + } + }); + + list.setOnClickListener(new View.OnClickListener() { + @SuppressLint("CheckResult") + @Override + public void onClick(View v) { + api.listExercises(DEVICE_ID).observeOn(AndroidSchedulers.mainThread()).subscribe( + new Consumer() { + @Override + public void accept(PolarExerciseEntry polarExerciseEntry) throws Exception { + Log.d(TAG,"next: " + polarExerciseEntry.date + " path: " + polarExerciseEntry.path + " id: " +polarExerciseEntry.identifier); + exerciseEntry = polarExerciseEntry; + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG,"fetch exercises failed: " + throwable.getLocalizedMessage()); + } + }, + new Action() { + @Override + public void run() throws Exception { + Log.d(TAG,"complete"); + } + } + ); + } + }); + + read.setOnClickListener(new View.OnClickListener() { + @SuppressLint("CheckResult") + @Override + public void onClick(View v) { + if(exerciseEntry != null) { + api.fetchExercise(DEVICE_ID, exerciseEntry).observeOn(AndroidSchedulers.mainThread()).subscribe( + new Consumer() { + @Override + public void accept(PolarExerciseData polarExerciseData) throws Exception { + Log.d(TAG,"exercise data count: " + polarExerciseData.hrSamples.size() + " samples: " + polarExerciseData.hrSamples); + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG,"Failed to read exercise: " + throwable.getLocalizedMessage()); + } + } + ); + } + } + }); + + remove.setOnClickListener(new View.OnClickListener() { + @SuppressLint("CheckResult") + @Override + public void onClick(View v) { + if(exerciseEntry != null) { + api.removeExercise(DEVICE_ID,exerciseEntry).observeOn(AndroidSchedulers.mainThread()).subscribe( + new Action() { + @Override + public void run() throws Exception { + Log.d(TAG,"ex removed ok"); + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.d(TAG,"ex remove failed: " + throwable.getLocalizedMessage()); + } + } + ); + } + } + }); + + broadcast.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(broadcastDisposable == null) { + broadcastDisposable = api.startListenForPolarHrBroadcasts(null).subscribe( + new Consumer() { + @Override + public void accept(PolarHrBroadcastData polarBroadcastData) throws Exception { + Log.d(TAG,"HR BROADCAST " + + polarBroadcastData.polarDeviceInfo.deviceId + " HR: " + + polarBroadcastData.hr + " batt: " + + polarBroadcastData.batteryStatus); + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG,""+throwable.getLocalizedMessage()); + } + }, + new Action() { + @Override + public void run() throws Exception { + Log.d(TAG,"complete"); + } + } + ); + }else{ + broadcastDisposable.dispose(); + broadcastDisposable = null; + } + } + }); + + connect.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + api.connectToPolarDevice(DEVICE_ID); + } + }); + + disconnect.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + api.disconnectFromPolarDevice(DEVICE_ID); + } + }); + + autoConnect.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(autoConnectDisposable != null) { + autoConnectDisposable.dispose(); + autoConnectDisposable = null; + } + autoConnectDisposable = api.autoConnectToPolarDevice(-50, null).subscribe( + new Action() { + @Override + public void run() throws Exception { + + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + + } + } + ); + } + }); + + ecg.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(ecgDisposable == null) { + ecgDisposable = api.requestEcgSettings(DEVICE_ID).toFlowable().flatMap(new Function>() { + @Override + public Publisher apply(PolarSensorSetting polarEcgSettings) throws Exception { + return api.startEcgStreaming(DEVICE_ID,polarEcgSettings.maxSettings()); + } + }).subscribe( + new Consumer() { + @Override + public void accept(PolarEcgData polarEcgData) throws Exception { + for( Integer microVolts : polarEcgData.samples ){ + Log.d(TAG," yV: " + microVolts); + } + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG, ""+throwable.getLocalizedMessage()); + } + }, + new Action() { + @Override + public void run() throws Exception { + Log.d(TAG, "complete"); + } + } + ); + } else { + // NOTE stops streaming if it is "running" + ecgDisposable.dispose(); + ecgDisposable = null; + } + } + }); + + acc.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(accDisposable == null) { + accDisposable = api.requestAccSettings(DEVICE_ID).toFlowable().flatMap(new Function>() { + @Override + public Publisher apply(PolarSensorSetting settings) throws Exception { + return api.startAccStreaming(DEVICE_ID,settings.maxSettings()); + } + }).observeOn(AndroidSchedulers.mainThread()).subscribe( + new Consumer() { + @Override + public void accept(PolarAccelerometerData polarAccelerometerData) throws Exception { + for( PolarAccelerometerData.PolarAccelerometerSample data : polarAccelerometerData.samples ){ + Log.d(TAG," x: " + data.x + " y: " + data.y + " z: "+ data.z); + } + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG,""+throwable.getLocalizedMessage()); + } + }, + new Action() { + @Override + public void run() throws Exception { + Log.d(TAG,"complete"); + } + } + ); + } else { + // NOTE dispose will stop streaming if it is "running" + accDisposable.dispose(); + accDisposable = null; + } + } + }); + + ppg.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(ppgDisposable == null) { + ppgDisposable = api.requestPpgSettings(DEVICE_ID).toFlowable().flatMap(new Function>() { + @Override + public Publisher apply(PolarSensorSetting polarPPGSettings) throws Exception { + return api.startOhrPPGStreaming(DEVICE_ID,polarPPGSettings.maxSettings()); + } + }).subscribe( + new Consumer() { + @Override + public void accept(PolarOhrPPGData polarOhrPPGData) throws Exception { + for( PolarOhrPPGData.PolarOhrPPGSample data : polarOhrPPGData.samples ){ + Log.d(TAG," ppg0: " + data.ppg0 + " ppg1: " + data.ppg1 + " ppg2: " + data.ppg2 + "ambient: " + data.ambient); + } + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG,""+throwable.getLocalizedMessage()); + } + }, + new Action() { + @Override + public void run() throws Exception { + Log.d(TAG,"complete"); + } + } + ); + } else { + ppgDisposable.dispose(); + ppgDisposable = null; + } + } + }); + + ppi.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(ppiDisposable == null) { + ppiDisposable = api.startOhrPPIStreaming(DEVICE_ID).observeOn(AndroidSchedulers.mainThread()).subscribe( + new Consumer() { + @Override + public void accept(PolarOhrPPIData ppiData) throws Exception { + for(PolarOhrPPIData.PolarOhrPPISample sample : ppiData.samples) { + Log.d(TAG, "ppi: " + sample.ppi + + " blocker: " + sample.blockerBit + " errorEstimate: " + sample.errorEstimate); + } + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG,""+throwable.getLocalizedMessage()); + } + }, + new Action() { + @Override + public void run() throws Exception { + Log.d(TAG,"complete"); + } + } + ); + } else { + ppiDisposable.dispose(); + ppiDisposable = null; + } + } + }); + + scan.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(scanDisposable == null) { + scanDisposable = api.searchForPolarDevice().observeOn(AndroidSchedulers.mainThread()).subscribe( + new Consumer() { + @Override + public void accept(PolarDeviceInfo polarDeviceInfo) throws Exception { + Log.d(TAG, "polar device found id: " + polarDeviceInfo.deviceId + " rssi: " + polarDeviceInfo.rssi + " name: " + polarDeviceInfo.name + " isConnectable: " + polarDeviceInfo.isConnectable); + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.d(TAG, "" + throwable.getLocalizedMessage()); + } + }, + new Action() { + @Override + public void run() throws Exception { + Log.d(TAG, "complete"); + } + } + ); + }else{ + scanDisposable.dispose(); + scanDisposable = null; + } + } + }); + + startH10Recording.setOnClickListener(new View.OnClickListener() { + @SuppressLint("CheckResult") + @Override + public void onClick(View view) { + api.startRecording(DEVICE_ID,"TEST_APP_ID", PolarBleApi.RecordingInterval.INTERVAL_1S, PolarBleApi.SampleType.HR).subscribe( + new Action() { + @Override + public void run() throws Exception { + Log.d(TAG,"recording started"); + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG,"recording start failed: " + throwable.getLocalizedMessage()); + } + } + ); + } + }); + + stopH10Recording.setOnClickListener(new View.OnClickListener() { + @SuppressLint("CheckResult") + @Override + public void onClick(View view) { + api.stopRecording(DEVICE_ID).subscribe( + new Action() { + @Override + public void run() throws Exception { + Log.d(TAG,"recording stopped"); + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG,"recording stop failed: " + throwable.getLocalizedMessage()); + } + } + ); + } + }); + + H10RecordingStatus.setOnClickListener(new View.OnClickListener() { + @SuppressLint("CheckResult") + @Override + public void onClick(View view) { + api.requestRecordingStatus(DEVICE_ID).subscribe( + new Consumer>() { + @Override + public void accept(Pair pair) throws Exception { + Log.d(TAG,"recording on: " + pair.first + " ID: " + pair.second); + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.e(TAG, "recording status failed: " + throwable.getLocalizedMessage()); + } + } + ); + } + }); + + setTime.setOnClickListener(new View.OnClickListener() { + @SuppressLint("CheckResult") + @Override + public void onClick(View v) { + api.setLocalTime(DEVICE_ID,new Date()).subscribe( + new Action() { + @Override + public void run() throws Exception { + Log.d(TAG,"time set to device"); + } + }, + new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + Log.d(TAG,"set time failed: " + throwable.getLocalizedMessage()); + } + }); + } + }); + + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && savedInstanceState == null) { + this.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 1); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { + if(requestCode == 1) { + Log.d(TAG,"bt ready"); + } + } + + @Override + public void onPause() { + super.onPause(); + api.backgroundEntered(); + } + + @Override + public void onResume() { + super.onResume(); + api.foregroundEntered(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + api.shutDown(); + } +} diff --git a/examples/example-android/androidBleSdkTestApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/examples/example-android/androidBleSdkTestApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..c7bd21db --- /dev/null +++ b/examples/example-android/androidBleSdkTestApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/examples/example-android/androidBleSdkTestApp/app/src/main/res/drawable/ic_launcher_background.xml b/examples/example-android/androidBleSdkTestApp/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..d5fccc53 --- /dev/null +++ b/examples/example-android/androidBleSdkTestApp/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/example-android/androidBleSdkTestApp/app/src/main/res/layout/activity_main.xml b/examples/example-android/androidBleSdkTestApp/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..7ef0d278 --- /dev/null +++ b/examples/example-android/androidBleSdkTestApp/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/example-ios/polarBleSdkTestApp/Info.plist b/examples/example-ios/polarBleSdkTestApp/Info.plist new file mode 100644 index 00000000..dcf8ae11 --- /dev/null +++ b/examples/example-ios/polarBleSdkTestApp/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIBackgroundModes + + bluetooth-central + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/examples/example-ios/polarBleSdkTestApp/ViewController.swift b/examples/example-ios/polarBleSdkTestApp/ViewController.swift new file mode 100644 index 00000000..0f2b08d4 --- /dev/null +++ b/examples/example-ios/polarBleSdkTestApp/ViewController.swift @@ -0,0 +1,331 @@ + +import UIKit +import PolarBleSdk +import RxSwift + +class ViewController: UIViewController, + PolarBleApiObserver, + PolarBleApiPowerStateObserver, + PolarBleApiDeviceHrObserver, + PolarBleApiDeviceInfoObserver, + PolarBleApiDeviceFeaturesObserver, + PolarBleApiLogger { + // NOTICE this example utilizes all available features + var api = PolarBleApiDefaultImpl.polarImplementation(DispatchQueue.main, features: Features.allFeatures.rawValue) + var broadcast: Disposable? + var ecgToggle: Disposable? + var accToggle: Disposable? + var ppgToggle: Disposable? + var ppiToggle: Disposable? + var searchToggle: Disposable? + var autoConnect: Disposable? + var entry: PolarExerciseEntry? + var deviceId = "0A3BA92B" // TODO replace this with your device id + + override func viewDidLoad() { + super.viewDidLoad() + api.observer = self + api.deviceHrObserver = self + api.deviceInfoObserver = self + api.powerStateObserver = self + api.deviceFeaturesObserver = self + api.logger = self + NSLog("\(PolarBleApiDefaultImpl.versionInfo())") + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + @IBAction func autoConnect(_ sender: Any) { + autoConnect?.dispose() + autoConnect = api.startAutoConnectToPolarDevice(-45, polarDeviceType: nil).subscribe{ e in + switch e { + case .completed: + NSLog("auto connect search complete") + case .error(let err): + NSLog("auto connect failed: \(err)") + } + } + } + + @IBAction func broadcastToggle(_ sender: Any) { + if broadcast == nil { + broadcast = api.startListenForPolarHrBroadcasts(nil).observeOn(MainScheduler.instance).subscribe{ e in + switch e { + case .completed: + NSLog("completed") + case .error(let err): + NSLog("listening error: \(err)") + case .next(let broadcast): + NSLog("\(broadcast.deviceInfo.name) HR BROADCAST: \(broadcast.hr)") + } + } + } else { + broadcast?.dispose() + broadcast = nil + } + } + + @IBAction func connectToDevice(_ sender: Any) { + api.connectToPolarDevice(deviceId) + } + + @IBAction func disconnectFromDevice(_ sender: Any) { + api.disconnectFromPolarDevice(deviceId) + } + + @IBAction func accToggle(_ sender: Any) { + if accToggle == nil { + accToggle = api.requestAccSettings(deviceId).asObservable().flatMap({ (settings) -> Observable in + NSLog("settings: \(settings.settings)") + return self.api.startAccStreaming(self.deviceId, settings: settings.maxSettings()) + }).observeOn(MainScheduler.instance).subscribe{ e in + switch e { + case .next(let data): + for item in data.samples { + NSLog(" x: \(item.x) y: \(item.y) z: \(item.z)") + } + case .error(let err): + NSLog("ACC error: \(err)") + self.accToggle = nil + case .completed: + break + } + } + } else { + accToggle?.dispose() + accToggle = nil + } + } + + @IBAction func ecgToggle(_ sender: Any) { + if ecgToggle == nil { + ecgToggle = api.requestEcgSettings(deviceId).asObservable().flatMap({ (settings) -> Observable in + return self.api.startEcgStreaming(self.deviceId, settings: settings.maxSettings()) + }).observeOn(MainScheduler.instance).subscribe{ e in + switch e { + case .next(let data): + for µv in data.samples { + NSLog(" µV: \(µv)") + } + case .error(let err): + NSLog("start ecg error: \(err)") + self.ecgToggle = nil + case .completed: + break + } + } + } else { + ecgToggle?.dispose() + ecgToggle = nil + } + } + + @IBAction func listFilesToggle(_ sender: Any) { + _ = api.fetchStoredExerciseList(deviceId).observeOn(MainScheduler.instance).subscribe{ e in + switch e { + case .completed: + NSLog("list files done") + case .error(let err): + NSLog("list files: \(err)") + case .next(let e): + NSLog("entry: \(e.date.description) id: \(e.entryId)") + self.entry = e + } + } + + } + + @IBAction func ppgToggle(_ sender: Any) { + if ppgToggle == nil { + ppgToggle = api.requestPpgSettings(deviceId).asObservable().flatMap({ (settings) -> Observable in + return self.api.startOhrPPGStreaming(self.deviceId, settings: settings.maxSettings()) + }).observeOn(MainScheduler.instance).subscribe{ e in + switch e { + case .completed: + NSLog("ppg finished") + case .error(let err): + NSLog("start ppg error: \(err)") + self.ppgToggle = nil + case .next(let data): + for item in data.samples { + NSLog(" ppg0: \(item.ppg0) ppg1: \(item.ppg1) ppg2: \(item.ppg2)") + } + } + } + } else { + ppgToggle?.dispose() + ppgToggle = nil + } + } + + @IBAction func ppiToggle(_ sender: Any) { + if ppiToggle == nil { + ppiToggle = api.startOhrPPIStreaming(deviceId).observeOn(MainScheduler.instance).subscribe{ e in + switch e { + case .completed: + NSLog("ppi complete") + case .error(let err): + NSLog("start ppi error: \(err)") + self.ppiToggle = nil + case .next(let data): + for item in data.samples { + NSLog("PPI: \(item.ppInMs)") + } + } + } + } else { + ppiToggle?.dispose() + ppiToggle = nil + } + } + + @IBAction func searchToggle(_ sender: Any) { + if searchToggle == nil { + searchToggle = api.searchForPolarDevice().observeOn(MainScheduler.instance).subscribe{ e in + switch e { + case .completed: + NSLog("search complete") + case .error(let err): + NSLog("search error: \(err)") + case .next(let item): + NSLog("polar device found: \(item.name) connectable: \(item.connectable)") + } + } + } else { + searchToggle?.dispose() + searchToggle = nil + } + } + + @IBAction func readExercise(_ sender: Any) { + guard let e = entry else { + return + } + _ = api.fetchExercise(deviceId, entry: e).observeOn(MainScheduler.instance).subscribe{ e in + switch e { + case .error(let err): + NSLog("read ex error: \(err)") + case .success(let data): + NSLog("\(data.samples)") + } + } + } + + @IBAction func removeExercise(_ sender: Any) { + guard let e = entry else { + return + } + _ = api.removeExercise(deviceId, entry: e).observeOn(MainScheduler.instance).subscribe{ e in + switch e { + case .completed: + NSLog("remove completed") + case .error(let err): + NSLog("remove failed: \(err)") + } + } + } + + @IBAction func startH10Recording(_ sender: Any) { + _ = api.startRecording(deviceId, exerciseId: "TEST_APP_ID", interval: .interval_1s, sampleType: .hr).observeOn(MainScheduler.instance).subscribe{ e in + switch e { + case .completed: + NSLog("recording started") + case .error(let err): + NSLog("recording start fail: \(err)") + } + } + } + + @IBAction func stopH10Recording(_ sender: Any) { + _ = api.stopRecording(deviceId).observeOn(MainScheduler.instance).subscribe{ e in + switch e { + case .completed: + NSLog("recording stopped") + case .error(let err): + NSLog("recording stop fail: \(err)") + } + } + } + + @IBAction func H10RecordingStatus(_ sender: Any) { + _ = api.requestRecordingStatus(deviceId).observeOn(MainScheduler.instance).subscribe{ e in + switch e { + case .error(let err): + NSLog("recording status request failed: \(err)") + case .success(let pair): + NSLog("recording on: \(pair.ongoing) id: \(pair.entryId)") + } + } + } + + // PolarBleApiObserver + func polarDeviceConnecting(_ polarDeviceInfo: PolarDeviceInfo) { + NSLog("DEVICE CONNECTING: \(polarDeviceInfo)") + } + + func polarDeviceConnected(_ polarDeviceInfo: PolarDeviceInfo) { + NSLog("DEVICE CONNECTED: \(polarDeviceInfo)") + deviceId = polarDeviceInfo.deviceId + } + + func polarDeviceDisconnected(_ polarDeviceInfo: PolarDeviceInfo) { + NSLog("DISCONNECTED: \(polarDeviceInfo)") + } + + // PolarBleApiDeviceInfoObserver + func batteryLevelReceived(_ identifier: String, batteryLevel: UInt) { + NSLog("battery level updated: \(batteryLevel)") + } + + func fwVersionReceived(_ identifier: String, fwVersion: String) { + NSLog("fw version updated: \(fwVersion)") + } + + // PolarBleApiDeviceHrObserver + func hrValueReceived(_ identifier: String, data: PolarHrData) { + NSLog("HR notification: \(data.hr) rrs: \(data.rrs) rrsMs: \(data.rrsMs) c: \(data.contact) s: \(data.contactSupported)") + } + + func hrFeatureReady(_ identifier: String) { + NSLog("HR READY") + } + + // PolarBleApiDeviceEcgObserver + func ecgFeatureReady(_ identifier: String) { + NSLog("ECG READY \(identifier)") + } + + // PolarBleApiDeviceAccelerometerObserver + func accFeatureReady(_ identifier: String) { + NSLog("ACC READY") + } + + func ohrPPGFeatureReady(_ identifier: String) { + NSLog("OHR PPG ready") + } + + // PolarBleApiPowerStateObserver + func blePowerOn() { + NSLog("BLE ON") + } + + func blePowerOff() { + NSLog("BLE OFF") + } + + // PPI + func ohrPPIFeatureReady(_ identifier: String) { + NSLog("PPI Feature ready") + } + + func ftpFeatureReady(_ identifier: String) { + NSLog("FTP ready") + } + + func message(_ str: String) { + NSLog(str) + } +} diff --git a/examples/example-ios/polarBleSdkTestApp/polarBleSdkTestApp-Bridging-Header.h b/examples/example-ios/polarBleSdkTestApp/polarBleSdkTestApp-Bridging-Header.h new file mode 100644 index 00000000..e11d920b --- /dev/null +++ b/examples/example-ios/polarBleSdkTestApp/polarBleSdkTestApp-Bridging-Header.h @@ -0,0 +1,3 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// diff --git a/polar-sdk-android/docs/html/BDBleApiImpl_8java.html b/polar-sdk-android/docs/html/BDBleApiImpl_8java.html new file mode 100644 index 00000000..967bc792 --- /dev/null +++ b/polar-sdk-android/docs/html/BDBleApiImpl_8java.html @@ -0,0 +1,99 @@ + + + + + + + +SDK for Polar sensors: BDBleApiImpl.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ + + + diff --git a/polar-sdk-android/docs/html/BDBleApiImpl_8java_source.html b/polar-sdk-android/docs/html/BDBleApiImpl_8java_source.html new file mode 100644 index 00000000..9d431896 --- /dev/null +++ b/polar-sdk-android/docs/html/BDBleApiImpl_8java_source.html @@ -0,0 +1,187 @@ + + + + + + + +SDK for Polar sensors: BDBleApiImpl.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
BDBleApiImpl.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.impl;
3 
4 import android.annotation.SuppressLint;
5 import android.bluetooth.le.ScanFilter;
6 import android.content.Context;
7 import android.os.Build;
8 import android.os.ParcelUuid;
9 import android.support.annotation.Nullable;
10 import android.util.Log;
11 import android.util.Pair;
12 
13 import com.androidcommunications.polar.api.ble.BleDeviceListener;
14 import com.androidcommunications.polar.api.ble.BleLogger;
15 import com.androidcommunications.polar.api.ble.exceptions.BleDisconnected;
16 import com.androidcommunications.polar.api.ble.model.BleDeviceSession;
17 import com.androidcommunications.polar.api.ble.model.advertisement.BleAdvertisementContent;
18 import com.androidcommunications.polar.api.ble.model.advertisement.BlePolarHrAdvertisement;
19 import com.androidcommunications.polar.api.ble.model.gatt.BleGattBase;
20 import com.androidcommunications.polar.api.ble.model.gatt.client.BleBattClient;
21 import com.androidcommunications.polar.api.ble.model.gatt.client.BleDisClient;
22 import com.androidcommunications.polar.api.ble.model.gatt.client.BleHrClient;
23 import com.androidcommunications.polar.api.ble.model.gatt.client.BlePMDClient;
24 import com.androidcommunications.polar.api.ble.model.gatt.client.psftp.BlePsFtpClient;
25 import com.androidcommunications.polar.api.ble.model.gatt.client.psftp.BlePsFtpUtils;
26 import com.androidcommunications.polar.common.ble.BleUtils;
27 import com.androidcommunications.polar.enpoints.ble.bluedroid.host.BDDeviceListenerImpl;
28 
29 import org.reactivestreams.Publisher;
30 
31 import java.io.ByteArrayOutputStream;
32 import java.text.SimpleDateFormat;
33 import java.util.ArrayList;
34 import java.util.Calendar;
35 import java.util.Collections;
36 import java.util.Comparator;
37 import java.util.Date;
38 import java.util.HashMap;
39 import java.util.HashSet;
40 import java.util.List;
41 import java.util.Locale;
42 import java.util.Map;
43 import java.util.Observable;
44 import java.util.Set;
45 import java.util.UUID;
46 import java.util.concurrent.TimeUnit;
47 import java.util.concurrent.atomic.AtomicInteger;
48 
49 import fi.polar.remote.representation.protobuf.ExerciseSamples;
50 import fi.polar.remote.representation.protobuf.Types;
51 import io.reactivex.Completable;
52 import io.reactivex.CompletableSource;
53 import io.reactivex.Flowable;
54 import io.reactivex.Scheduler;
55 import io.reactivex.Single;
56 import io.reactivex.SingleSource;
57 import io.reactivex.android.schedulers.AndroidSchedulers;
58 import io.reactivex.disposables.Disposable;
59 import io.reactivex.functions.Action;
60 import io.reactivex.functions.BiFunction;
61 import io.reactivex.functions.Consumer;
62 import io.reactivex.functions.Function;
63 import io.reactivex.functions.Predicate;
64 import io.reactivex.schedulers.Timed;
65 import polar.com.sdk.api.PolarBleApi;
83 import protocol.PftpNotification;
84 import protocol.PftpRequest;
85 import protocol.PftpResponse;
86 
90 public class BDBleApiImpl extends PolarBleApi {
91  private final static String TAG = BDBleApiImpl.class.getSimpleName();
92  private BleDeviceListener listener;
93  private Map<String,Disposable> connectSubscriptions = new HashMap<>();
94  private Scheduler scheduler;
97  private static final int ANDROID_VERSION_O = 26;
98 
99  @SuppressLint({"NewApi", "CheckResult"})
100  public BDBleApiImpl(final Context context, int features) {
101  super(features);
102  List<Class<? extends BleGattBase>> clients = new ArrayList<>();
103  if((this.features & PolarBleApi.FEATURE_HR)!=0){
104  clients.add(BleHrClient.class);
105  }
106  if((this.features & PolarBleApi.FEATURE_DEVICE_INFO)!=0){
107  clients.add(BleDisClient.class);
108  }
109  if((this.features & PolarBleApi.FEATURE_BATTERY_INFO)!=0){
110  clients.add(BleBattClient.class);
111  }
112  if((this.features & PolarBleApi.FEATURE_POLAR_SENSOR_STREAMING)!=0){
113  clients.add(BlePMDClient.class);
114  }
115  if((this.features & PolarBleApi.FEATURE_POLAR_FILE_TRANSFER)!=0){
116  clients.add(BlePsFtpClient.class);
117  }
118  listener = new BDDeviceListenerImpl(context, clients);
119  BleDeviceListener.BleSearchPreFilter filter = new BleDeviceListener.BleSearchPreFilter() {
120  @Override
121  public boolean process(BleAdvertisementContent content) {
122  return content.getPolarDeviceId().length() != 0 && !content.getPolarDeviceType().equals("mobile");
123  }
124  };
125  listener.setScanPreFilter(filter);
126  scheduler = AndroidSchedulers.from(context.getMainLooper());
127  listener.monitorDeviceSessionState(null).observeOn(scheduler).subscribe(
128  new Consumer<Pair<BleDeviceSession, BleDeviceSession.DeviceSessionState>>() {
129  @Override
130  public void accept(Pair<BleDeviceSession, BleDeviceSession.DeviceSessionState> pair) throws Exception {
131  PolarDeviceInfo info = new PolarDeviceInfo(pair.first.getPolarDeviceId(),
132  pair.first.getRssi(),pair.first.getName(),true);
133  switch (pair.second){
134  case SESSION_OPEN:
135  if(callback!=null){
137  }
138  setupDevice(pair.first);
139  break;
140  case SESSION_CLOSED:
141  if( callback != null ) {
142  if (pair.first.getPreviousState() == BleDeviceSession.DeviceSessionState.SESSION_OPEN ||
143  pair.first.getPreviousState() == BleDeviceSession.DeviceSessionState.SESSION_CLOSING){
145  }
146  }
147  break;
148  case SESSION_OPENING:
149  if(callback != null){
151  }
152  break;
153  }
154  }
155  },
156  new Consumer<Throwable>() {
157  @Override
158  public void accept(Throwable throwable) throws Exception {
159  logError(throwable.getMessage());
160  }
161  },
162  new Action() {
163  @Override
164  public void run() throws Exception {
165 
166  }
167  }
168  );
169  listener.monitorBleState().observeOn(scheduler).subscribe(
170  new Consumer<Boolean>() {
171  @Override
172  public void accept(Boolean aBoolean) throws Exception {
173  if(callback != null){
174  callback.blePowerStateChanged(aBoolean);
175  }
176  }
177  },
178  new Consumer<Throwable>() {
179  @Override
180  public void accept(Throwable throwable) throws Exception {
181  logError(throwable.getMessage());
182  }
183  },
184  new Action() {
185  @Override
186  public void run() throws Exception {
187 
188  }
189  }
190  );
191  BleLogger.setLoggerInterface(new BleLogger.BleLoggerInterface() {
192  @Override
193  public void d(String tag, String msg) {
194  log(tag+"/"+msg);
195  }
196 
197  @Override
198  public void e(String tag, String msg) {
199  logError(tag+"/"+msg);
200  }
201 
202  @Override
203  public void w(String tag, String msg) {
204  }
205 
206  @Override
207  public void i(String tag, String msg) {
208  }
209  });
210  }
211 
212  @SuppressLint("NewApi")
213  private void enableAndroidScanFilter() {
214  if (Build.VERSION.SDK_INT >= ANDROID_VERSION_O) {
215  List<ScanFilter> filter = new ArrayList<>();
216  filter.add(new ScanFilter.Builder().setServiceUuid(
217  ParcelUuid.fromString(BleHrClient.HR_SERVICE.toString())).build());
218  filter.add(new ScanFilter.Builder().setServiceUuid(
219  ParcelUuid.fromString(BlePsFtpUtils.RFC77_PFTP_SERVICE.toString())).build());
220  listener.setScanFilters(filter);
221  }
222  }
223 
224  @Override
225  public void shutDown() {
226  listener.shutDown();
227  }
228 
229  @Override
230  public boolean isFeatureReady(final String deviceId, int feature) {
231  try {
232  switch (feature) {
234  return sessionPsFtpClientReady(deviceId) != null;
236  return sessionPmdClientReady(deviceId) != null;
237  }
238  } catch (Throwable ignored) {
239  }
240  return false;
241  }
242 
243  @Override
245  this.callback = callback;
247  }
248 
249  @Override
250  public void setApiLogger(@Nullable PolarBleApiLogger logger) {
251  this.logger = logger;
252  }
253 
254  @Override
255  public void setAutomaticReconnection(boolean disable) {
256  listener.setAutomaticReconnection(disable);
257  }
258 
259  @Override
260  public Completable setLocalTime(String identifier, Date local) {
261  try {
262  final BleDeviceSession session = sessionPsFtpClientReady(identifier);
263  final BlePsFtpClient client = (BlePsFtpClient) session.fetchClient(BlePsFtpUtils.RFC77_PFTP_SERVICE);
264  PftpRequest.PbPFtpSetLocalTimeParams.Builder builder = PftpRequest.PbPFtpSetLocalTimeParams.newBuilder();
265  Calendar cal = Calendar.getInstance();
266  cal.setTime(local);
267  Types.PbDate date = Types.PbDate.newBuilder()
268  .setYear(cal.get(Calendar.YEAR))
269  .setMonth(cal.get(Calendar.MONTH) + 1)
270  .setDay(cal.get(Calendar.DAY_OF_MONTH)).build();
271  Types.PbTime time = Types.PbTime.newBuilder()
272  .setHour(cal.get(Calendar.HOUR))
273  .setMinute(cal.get(Calendar.MINUTE))
274  .setSeconds(cal.get(Calendar.SECOND))
275  .setMillis(cal.get(Calendar.MILLISECOND)).build();
276  builder.setDate(date).setTime(time).setTzOffset(cal.get(Calendar.ZONE_OFFSET));
277  return client.query(PftpRequest.PbPFtpQuery.SET_LOCAL_TIME_VALUE,builder.build().toByteArray()).toObservable().ignoreElements();
278  } catch (Throwable error){
279  return Completable.error(error);
280  }
281  }
282 
283  @Override
284  public Single<PolarSensorSetting> requestAccSettings(String identifier) {
285  return querySettings(identifier,BlePMDClient.PmdMeasurementType.ACC);
286  }
287 
288  @Override
289  public Single<PolarSensorSetting> requestEcgSettings(String identifier) {
290  return querySettings(identifier,BlePMDClient.PmdMeasurementType.ECG);
291  }
292 
293  @Override
294  public Single<PolarSensorSetting> requestPpgSettings(String identifier) {
295  return querySettings(identifier,BlePMDClient.PmdMeasurementType.PPG);
296  }
297 
298  @Override
299  public Single<PolarSensorSetting> requestBiozSettings(final String identifier){
300  return querySettings(identifier,BlePMDClient.PmdMeasurementType.BIOZ);
301  }
302 
303  private Single<PolarSensorSetting> querySettings(final String identifier, final BlePMDClient.PmdMeasurementType type) {
304  try {
305  final BleDeviceSession session = sessionPmdClientReady(identifier);
306  final BlePMDClient client = (BlePMDClient) session.fetchClient(BlePMDClient.PMD_SERVICE);
307  return client.querySettings(type).map(new Function<BlePMDClient.PmdSetting, PolarSensorSetting>() {
308  @Override
309  public PolarSensorSetting apply(BlePMDClient.PmdSetting setting) throws Exception {
310  return new PolarSensorSetting(setting.settings, type);
311  }
312  });
313  } catch (Throwable e){
314  return Single.error(e);
315  }
316  }
317 
318  @Override
319  public void backgroundEntered() {
321  }
322 
323  @Override
324  public void foregroundEntered() {
325  listener.setScanFilters(null);
326  }
327 
328  @Override
329  public Completable autoConnectToPolarDevice(final int rssiLimit, final int timeout, final TimeUnit unit, final String polarDeviceType) {
330  final long[] start = {0};
331  return listener.search(false).filter(new Predicate<BleDeviceSession>() {
332  @Override
333  public boolean test(BleDeviceSession bleDeviceSession) throws Exception {
334  if( bleDeviceSession.getMedianRssi() >= rssiLimit &&
335  bleDeviceSession.getPolarDeviceId().length() != 0 &&
336  bleDeviceSession.isConnectableAdvertisement() &&
337  (polarDeviceType == null || polarDeviceType.equals(bleDeviceSession.getPolarDeviceType())) ) {
338  if(start[0] == 0){
339  start[0] = System.currentTimeMillis();
340  }
341  return true;
342  }
343  return false;
344  }
345  }).timestamp().takeUntil(new Predicate<Timed<BleDeviceSession>>() {
346  @Override
347  public boolean test(Timed<BleDeviceSession> bleDeviceSessionTimed) throws Exception {
348  long diff = bleDeviceSessionTimed.time(TimeUnit.MILLISECONDS) - start[0];
349  return (diff >= unit.toMillis(timeout));
350  }
351  }).reduce(new HashSet<BleDeviceSession>(), new BiFunction<Set<BleDeviceSession>, Timed<BleDeviceSession>, Set<BleDeviceSession>>() {
352  @Override
353  public Set<BleDeviceSession> apply(Set<BleDeviceSession> objects, Timed<BleDeviceSession> bleDeviceSessionTimed) throws Exception {
354  objects.add(bleDeviceSessionTimed.value());
355  return objects;
356  }
357  }).doOnSuccess(new Consumer<Set<BleDeviceSession>>() {
358  @Override
359  public void accept(Set<BleDeviceSession> set) throws Exception {
360  List<BleDeviceSession> list = new ArrayList<>(set);
361  Collections.sort(list, new Comparator<BleDeviceSession>() {
362  @Override
363  public int compare(BleDeviceSession o1, BleDeviceSession o2) {
364  return o1.getRssi() > o2.getRssi() ? -1 : 1;
365  }
366  });
367  listener.openSessionDirect(list.get(0));
368  log("auto connect search complete");
369  }
370  }).toObservable().ignoreElements();
371  }
372 
373  @Override
374  public Completable autoConnectToPolarDevice(final int rssiLimit, final String polarDeviceType) {
375  return autoConnectToPolarDevice(rssiLimit, 2, TimeUnit.SECONDS, polarDeviceType);
376  }
377 
378  @Override
379  public void connectToPolarDevice(final String identifier) {
380  BleDeviceSession session = sessionByDeviceId(identifier);
381  if( session == null || session.getSessionState() == BleDeviceSession.DeviceSessionState.SESSION_CLOSED ){
382  if( connectSubscriptions.containsKey(identifier) ){
383  connectSubscriptions.get(identifier).dispose();
384  }
385  connectSubscriptions.put(identifier,listener.search(false).filter(new Predicate<BleDeviceSession>() {
386  @Override
387  public boolean test(BleDeviceSession bleDeviceSession) throws Exception {
388  return bleDeviceSession.getPolarDeviceId().equals(identifier);
389  }
390  }).take(1).observeOn(scheduler).subscribe(
391  new Consumer<BleDeviceSession>() {
392  @Override
393  public void accept(BleDeviceSession bleDeviceSession) throws Exception {
394  listener.openSessionDirect(bleDeviceSession);
395  }
396  },
397  new Consumer<Throwable>() {
398  @Override
399  public void accept(Throwable throwable) throws Exception {
400  logError(throwable.getMessage());
401  }
402  },
403  new Action() {
404  @Override
405  public void run() throws Exception {
406  log("connect search complete");
407  }
408  }
409  ));
410  }
411  }
412 
413  @Override
414  public void disconnectFromPolarDevice(String identifier) {
415  BleDeviceSession session = sessionByDeviceId(identifier);
416  if( session != null ){
417  if( session.getSessionState() == BleDeviceSession.DeviceSessionState.SESSION_OPEN ||
418  session.getSessionState() == BleDeviceSession.DeviceSessionState.SESSION_OPENING ||
419  session.getSessionState() == BleDeviceSession.DeviceSessionState.SESSION_OPEN_PARK ) {
420  listener.closeSessionDirect(session);
421  }
422  }
423  if (connectSubscriptions.containsKey(identifier)){
424  connectSubscriptions.get(identifier).dispose();
425  connectSubscriptions.remove(identifier);
426  }
427  }
428 
429  @Override
430  public Completable startRecording(String identifier, String exerciseId, RecordingInterval interval, SampleType type) {
431  try {
432  final BleDeviceSession session = sessionPsFtpClientReady(identifier);
433  final BlePsFtpClient client = (BlePsFtpClient) session.fetchClient(BlePsFtpUtils.RFC77_PFTP_SERVICE);
434  if(session.getPolarDeviceType().equals("H10")) {
435  Types.PbSampleType t = type == SampleType.HR ?
436  Types.PbSampleType.SAMPLE_TYPE_HEART_RATE :
437  Types.PbSampleType.SAMPLE_TYPE_RR_INTERVAL;
438  Types.PbDuration duration = Types.PbDuration.newBuilder().setSeconds(interval.getValue()).build();
439  PftpRequest.PbPFtpRequestStartRecordingParams params = PftpRequest.PbPFtpRequestStartRecordingParams.newBuilder().
440  setSampleDataIdentifier(exerciseId).setSampleType(t).setRecordingInterval(duration).build();
441  return client.query(PftpRequest.PbPFtpQuery.REQUEST_START_RECORDING_VALUE, params.toByteArray()).toObservable().ignoreElements().onErrorResumeNext(new Function<Throwable, CompletableSource>() {
442  @Override
443  public CompletableSource apply(Throwable throwable) throws Exception {
444  return Completable.error(throwable);
445  }
446  });
447  }
448  return Completable.error(new PolarOperationNotSupported());
449  } catch (Throwable error){
450  return Completable.error(error);
451  }
452  }
453 
454  @Override
455  public Completable stopRecording(String identifier) {
456  try {
457  final BleDeviceSession session = sessionPsFtpClientReady(identifier);
458  final BlePsFtpClient client = (BlePsFtpClient) session.fetchClient(BlePsFtpUtils.RFC77_PFTP_SERVICE);
459  if(session.getPolarDeviceType().equals("H10")) {
460  return client.query(PftpRequest.PbPFtpQuery.REQUEST_STOP_RECORDING_VALUE, null).toObservable().ignoreElements().onErrorResumeNext(new Function<Throwable, CompletableSource>() {
461  @Override
462  public CompletableSource apply(Throwable throwable) throws Exception {
463  return Completable.error(handleError(throwable));
464  }
465  });
466  }
467  return Completable.error(new PolarOperationNotSupported());
468  } catch (Throwable error){
469  return Completable.error(error);
470  }
471  }
472 
473  @Override
474  public Single<Pair<Boolean,String>> requestRecordingStatus(String identifier) {
475  try {
476  final BleDeviceSession session = sessionPsFtpClientReady(identifier);
477  final BlePsFtpClient client = (BlePsFtpClient) session.fetchClient(BlePsFtpUtils.RFC77_PFTP_SERVICE);
478  if(session.getPolarDeviceType().equals("H10")) {
479  return client.query(PftpRequest.PbPFtpQuery.REQUEST_RECORDING_STATUS_VALUE, null).map(new Function<ByteArrayOutputStream, Pair<Boolean,String>>() {
480  @Override
481  public Pair<Boolean,String> apply(ByteArrayOutputStream byteArrayOutputStream) throws Exception {
482  PftpResponse.PbRequestRecordingStatusResult result = PftpResponse.PbRequestRecordingStatusResult.parseFrom(byteArrayOutputStream.toByteArray());
483  return new Pair<>(result.getRecordingOn(),result.hasSampleDataIdentifier() ? result.getSampleDataIdentifier() : "");
484  }
485  }).onErrorResumeNext(new Function<Throwable, SingleSource<? extends Pair<Boolean, String>>>() {
486  @Override
487  public SingleSource<? extends Pair<Boolean, String>> apply(Throwable throwable) throws Exception {
488  return Single.error(handleError(throwable));
489  }
490  });
491  }
492  return Single.error(new PolarOperationNotSupported());
493  } catch (Throwable error){
494  return Single.error(error);
495  }
496  }
497 
498  @Override
499  public Flowable<PolarExerciseEntry> listExercises(String identifier) {
500  try{
501  final BleDeviceSession session = sessionPsFtpClientReady(identifier);
502  final BlePsFtpClient client = (BlePsFtpClient) session.fetchClient(BlePsFtpUtils.RFC77_PFTP_SERVICE);
503  switch (session.getPolarDeviceType()) {
504  case "OH1":
505  return fetchRecursively(client, "/U/0/", new FetchRecursiveCondition() {
506  @Override
507  public boolean include(String entry) {
508  return entry.matches("^([0-9]{8})(\\/)") ||
509  entry.matches("^([0-9]{6})(\\/)") ||
510  entry.equals("E/") ||
511  entry.equals("SAMPLES.BPB") ||
512  entry.equals("00/");
513  }
514  }).map(new Function<String, PolarExerciseEntry>() {
515  @Override
516  public PolarExerciseEntry apply(String p) throws Exception {
517  String components[] = p.split("/");
518  SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd HHmmss", Locale.getDefault());
519  Date date = format.parse(components[3] + " " + components[5]);
520  return new PolarExerciseEntry(p, date, components[3] + components[5]);
521  }
522  }).onErrorResumeNext(new Function<Throwable, Publisher<? extends PolarExerciseEntry>>() {
523  @Override
524  public Publisher<? extends PolarExerciseEntry> apply(Throwable throwable) throws Exception {
525  return Flowable.error(handleError(throwable));
526  }
527  });
528  case "H10":
529  return fetchRecursively(client, "/", new FetchRecursiveCondition() {
530  @Override
531  public boolean include(String entry) {
532  return entry.endsWith("/") || entry.equals("SAMPLES.BPB");
533  }
534  }).map(new Function<String, PolarExerciseEntry>() {
535  @Override
536  public PolarExerciseEntry apply(String p) throws Exception {
537  String components[] = p.split("/");
538  return new PolarExerciseEntry(p, new Date(), components[1]);
539  }
540  }).onErrorResumeNext(new Function<Throwable, Publisher<? extends PolarExerciseEntry>>() {
541  @Override
542  public Publisher<? extends PolarExerciseEntry> apply(Throwable throwable) throws Exception {
543  return Flowable.error(handleError(throwable));
544  }
545  });
546  default:
547  return Flowable.error(new PolarOperationNotSupported());
548  }
549  } catch (Throwable error){
550  return Flowable.error(error);
551  }
552  }
553 
554  @Override
555  public Single<PolarExerciseData> fetchExercise(String identifier, PolarExerciseEntry entry) {
556  try{
557  final BleDeviceSession session = sessionPsFtpClientReady(identifier);
558  final BlePsFtpClient client = (BlePsFtpClient) session.fetchClient(BlePsFtpUtils.RFC77_PFTP_SERVICE);
559  protocol.PftpRequest.PbPFtpOperation.Builder builder = protocol.PftpRequest.PbPFtpOperation.newBuilder();
560  builder.setCommand(PftpRequest.PbPFtpOperation.Command.GET);
561  builder.setPath(entry.path);
562  if(session.getPolarDeviceType().equals("OH1") || session.getPolarDeviceType().equals("H10")) {
563  return client.request(builder.build().toByteArray()).map(new Function<ByteArrayOutputStream, PolarExerciseData>() {
564  @Override
565  public PolarExerciseData apply(ByteArrayOutputStream byteArrayOutputStream) throws Exception {
566  ExerciseSamples.PbExerciseSamples samples = ExerciseSamples.PbExerciseSamples.parseFrom(byteArrayOutputStream.toByteArray());
567  return new PolarExerciseData(samples.getRecordingInterval().getSeconds(), samples.getHeartRateSamplesList());
568  }
569  }).onErrorResumeNext(new Function<Throwable, SingleSource<? extends PolarExerciseData>>() {
570  @Override
571  public SingleSource<? extends PolarExerciseData> apply(Throwable throwable) throws Exception {
572  return Single.error(handleError(throwable));
573  }
574  });
575  }
576  return Single.error(new PolarOperationNotSupported());
577  } catch (Throwable error){
578  return Single.error(error);
579  }
580  }
581 
582  @Override
583  public Completable removeExercise(String identifier, PolarExerciseEntry entry) {
584  try{
585  final BleDeviceSession session = sessionPsFtpClientReady(identifier);
586  final BlePsFtpClient client = (BlePsFtpClient) session.fetchClient(BlePsFtpUtils.RFC77_PFTP_SERVICE);
587  if(session.getPolarDeviceType().equals("OH1")){
588  protocol.PftpRequest.PbPFtpOperation.Builder builder = protocol.PftpRequest.PbPFtpOperation.newBuilder();
589  builder.setCommand(PftpRequest.PbPFtpOperation.Command.GET);
590  final String components[] = entry.path.split("/");
591  final String exerciseParent = "/U/0/" + components[3] + "/E/";
592  builder.setPath(exerciseParent);
593  return client.request(builder.build().toByteArray()).flatMap(new Function<ByteArrayOutputStream, SingleSource<?>>() {
594  @Override
595  public SingleSource<?> apply(ByteArrayOutputStream byteArrayOutputStream) throws Exception {
596  PftpResponse.PbPFtpDirectory directory = PftpResponse.PbPFtpDirectory.parseFrom(byteArrayOutputStream.toByteArray());
597  protocol.PftpRequest.PbPFtpOperation.Builder removeBuilder = protocol.PftpRequest.PbPFtpOperation.newBuilder();
598  removeBuilder.setCommand(PftpRequest.PbPFtpOperation.Command.REMOVE);
599  if( directory.getEntriesCount() <= 1 ){
600  // remove entire directory
601  removeBuilder.setPath("/U/0/" + components[3] + "/");
602  } else {
603  // remove only exercise
604  removeBuilder.setPath("/U/0/" + components[3] + "/E/" + components[5] + "/");
605  }
606  return client.request(removeBuilder.build().toByteArray());
607  }
608  }).toObservable().ignoreElements().onErrorResumeNext(new Function<Throwable, CompletableSource>() {
609  @Override
610  public CompletableSource apply(Throwable throwable) throws Exception {
611  return Completable.error(handleError(throwable));
612  }
613  });
614  } else if(session.getPolarDeviceType().equals("H10")){
615  protocol.PftpRequest.PbPFtpOperation.Builder builder = protocol.PftpRequest.PbPFtpOperation.newBuilder();
616  builder.setCommand(PftpRequest.PbPFtpOperation.Command.REMOVE);
617  builder.setPath(entry.path);
618  return client.request(builder.build().toByteArray()).toObservable().ignoreElements().onErrorResumeNext(new Function<Throwable, CompletableSource>() {
619  @Override
620  public CompletableSource apply(Throwable throwable) throws Exception {
621  return Completable.error(handleError(throwable));
622  }
623  });
624  }
625  return Completable.error(new PolarOperationNotSupported());
626  } catch (Throwable error){
627  return Completable.error(error);
628  }
629  }
630 
631  @Override
632  public Flowable<PolarDeviceInfo> searchForPolarDevice() {
633  return listener.search(false).filter(new Predicate<BleDeviceSession>() {
634  @Override
635  public boolean test(BleDeviceSession bleDeviceSession) throws Exception {
636  return bleDeviceSession.getAdvertisementContent().getPolarDeviceId().length() != 0;
637  }
638  }).distinct().map(new Function<BleDeviceSession, PolarDeviceInfo>() {
639  @Override
640  public PolarDeviceInfo apply(BleDeviceSession bleDeviceSession) throws Exception {
641  return new PolarDeviceInfo(bleDeviceSession.getPolarDeviceId(),bleDeviceSession.getRssi(),bleDeviceSession.getName(), bleDeviceSession.isConnectableAdvertisement());
642  }
643  });
644  }
645 
646  @Override
647  public Flowable<PolarHrBroadcastData> startListenForPolarHrBroadcasts(final Set<String> deviceIds) {
648  // set filter to null, NOTE this disables reconnection in background
649  return listener.search(false).filter(new Predicate<BleDeviceSession>() {
650  @Override
651  public boolean test(BleDeviceSession bleDeviceSession) throws Exception {
652  return (deviceIds == null || deviceIds.contains(bleDeviceSession.getPolarDeviceId())) &&
653  bleDeviceSession.getAdvertisementContent().getPolarHrAdvertisement().isPresent();
654  }
655  }).map(new Function<BleDeviceSession, PolarHrBroadcastData>() {
656  @Override
657  public PolarHrBroadcastData apply(BleDeviceSession bleDeviceSession) throws Exception {
658  BlePolarHrAdvertisement advertisement = bleDeviceSession.getBlePolarHrAdvertisement();
659  return new PolarHrBroadcastData( new PolarDeviceInfo(bleDeviceSession.getPolarDeviceId(),
660  bleDeviceSession.getRssi(), bleDeviceSession.getName(), bleDeviceSession.isConnectableAdvertisement()),
661  advertisement.getHrForDisplay(), advertisement.getBatteryStatus() != 0);
662  }
663  });
664  }
665 
666  @Override
667  public Flowable<PolarEcgData> startEcgStreaming(String identifier,
668  PolarSensorSetting setting) {
669  try {
670  final BleDeviceSession session = sessionPmdClientReady(identifier);
671  final BlePMDClient client = (BlePMDClient) session.fetchClient(BlePMDClient.PMD_SERVICE);
672  return client.startMeasurement(BlePMDClient.PmdMeasurementType.ECG, setting.map2PmdSettings()).andThen(
673  client.monitorEcgNotifications(true).map(new Function<BlePMDClient.EcgData, PolarEcgData>() {
674  @Override
675  public PolarEcgData apply(BlePMDClient.EcgData ecgData) throws Exception {
676  List<Integer> samples = new ArrayList<>();
677  for( BlePMDClient.EcgData.EcgSample s : ecgData.ecgSamples ){
678  samples.add(s.microVolts);
679  }
680  return new PolarEcgData(samples,ecgData.timeStamp);
681  }
682  }).onErrorResumeNext(new Function<Throwable, Publisher<? extends PolarEcgData>>() {
683  @Override
684  public Publisher<? extends PolarEcgData> apply(Throwable throwable) throws Exception {
685  return Flowable.error(handleError(throwable));
686  }
687  }).doFinally(new Action() {
688  @Override
689  public void run() throws Exception {
690  stopPmdStreaming(session,client, BlePMDClient.PmdMeasurementType.ECG);
691  }
692  }));
693  } catch (Throwable t){
694  return Flowable.error(t);
695  }
696  }
697 
698  @Override
699  public Flowable<PolarAccelerometerData> startAccStreaming(String identifier,
700  PolarSensorSetting setting) {
701  try {
702  final BleDeviceSession session = sessionPmdClientReady(identifier);
703  final BlePMDClient client = (BlePMDClient) session.fetchClient(BlePMDClient.PMD_SERVICE);
704  return client.startMeasurement(BlePMDClient.PmdMeasurementType.ACC, setting.map2PmdSettings()).andThen(
705  client.monitorAccNotifications(true).map(new Function<BlePMDClient.AccData, PolarAccelerometerData>() {
706  @Override
707  public PolarAccelerometerData apply(BlePMDClient.AccData accData) throws Exception {
708  List<PolarAccelerometerData.PolarAccelerometerSample> samples = new ArrayList<>();
709  for( BlePMDClient.AccData.AccSample s : accData.accSamples ){
710  samples.add(new PolarAccelerometerData.PolarAccelerometerSample(s.x,s.y,s.z));
711  }
712  return new PolarAccelerometerData(samples,accData.timeStamp);
713  }
714  }).onErrorResumeNext(new Function<Throwable, Publisher<? extends PolarAccelerometerData>>() {
715  @Override
716  public Publisher<? extends PolarAccelerometerData> apply(Throwable throwable) throws Exception {
717  return Flowable.error(handleError(throwable));
718  }
719  }).doFinally(new Action() {
720  @Override
721  public void run() throws Exception {
722  stopPmdStreaming(session,client, BlePMDClient.PmdMeasurementType.ACC);
723  }
724  }));
725  } catch (Throwable t){
726  return Flowable.error(t);
727  }
728  }
729 
730  @Override
731  public Flowable<PolarOhrPPGData> startOhrPPGStreaming(String identifier,
732  PolarSensorSetting setting) {
733  try {
734  final BleDeviceSession session = sessionPmdClientReady(identifier);
735  final BlePMDClient client = (BlePMDClient) session.fetchClient(BlePMDClient.PMD_SERVICE);
736  return client.startMeasurement(BlePMDClient.PmdMeasurementType.PPG, setting.map2PmdSettings()).andThen(
737  client.monitorPpgNotifications(true).map(new Function<BlePMDClient.PpgData, PolarOhrPPGData>() {
738  @Override
739  public PolarOhrPPGData apply(BlePMDClient.PpgData ppgData) throws Exception {
740  List<PolarOhrPPGData.PolarOhrPPGSample> samples = new ArrayList<>();
741  for( BlePMDClient.PpgData.PpgSample s : ppgData.ppgSamples ){
742  samples.add(new PolarOhrPPGData.PolarOhrPPGSample(s.ppg0,s.ppg1,s.ppg2,s.ambient));
743  }
744  return new PolarOhrPPGData(samples,ppgData.timeStamp);
745  }
746  }).doFinally(new Action() {
747  @Override
748  public void run() throws Exception {
749  stopPmdStreaming(session,client, BlePMDClient.PmdMeasurementType.PPG);
750  }
751  })).onErrorResumeNext(new Function<Throwable, Publisher<? extends PolarOhrPPGData>>() {
752  @Override
753  public Publisher<? extends PolarOhrPPGData> apply(Throwable throwable) throws Exception {
754  return Flowable.error(handleError(throwable));
755  }
756  });
757  } catch (Throwable t){
758  return Flowable.error(t);
759  }
760  }
761 
762  @Override
763  public Flowable<PolarOhrPPIData> startOhrPPIStreaming(String identifier) {
764  try {
765  final BleDeviceSession session = sessionPmdClientReady(identifier);
766  final BlePMDClient client = (BlePMDClient) session.fetchClient(BlePMDClient.PMD_SERVICE);
767  return client.startMeasurement(BlePMDClient.PmdMeasurementType.PPI, new BlePMDClient.PmdSetting(new HashMap<BlePMDClient.PmdSetting.PmdSettingType, Integer>())).andThen(
768  client.monitorPpiNotifications(true).map(new Function<BlePMDClient.PpiData, PolarOhrPPIData>() {
769  @Override
770  public PolarOhrPPIData apply(BlePMDClient.PpiData ppiData) throws Exception {
771  List<PolarOhrPPIData.PolarOhrPPISample> samples = new ArrayList<>();
772  for(BlePMDClient.PpiData.PPSample ppSample : ppiData.ppSamples){
773  samples.add(new PolarOhrPPIData.PolarOhrPPISample(ppSample.ppInMs,
774  ppSample.ppErrorEstimate,
775  ppSample.hr,
776  ppSample.blockerBit != 0,
777  ppSample.skinContactStatus != 0,
778  ppSample.skinContactSupported != 0));
779  }
780  return new PolarOhrPPIData(ppiData.timestamp,samples);
781  }
782  }).doFinally(new Action() {
783  @Override
784  public void run() throws Exception {
785  stopPmdStreaming(session,client, BlePMDClient.PmdMeasurementType.PPI);
786  }
787  })).onErrorResumeNext(new Function<Throwable, Publisher<? extends PolarOhrPPIData>>() {
788  @Override
789  public Publisher<? extends PolarOhrPPIData> apply(Throwable throwable) throws Exception {
790  return Flowable.error(handleError(throwable));
791  }
792  });
793  } catch (Throwable t){
794  return Flowable.error(t);
795  }
796  }
797 
798  @Override
799  public Flowable<PolarBiozData> startBiozStreaming(final String identifier, PolarSensorSetting setting){
800  try {
801  final BleDeviceSession session = sessionPmdClientReady(identifier);
802  final BlePMDClient client = (BlePMDClient) session.fetchClient(BlePMDClient.PMD_SERVICE);
803  return client.startMeasurement(BlePMDClient.PmdMeasurementType.BIOZ, setting.map2PmdSettings()).andThen(
804  client.monitorBiozNotifications(true).map(new Function<BlePMDClient.BiozData, PolarBiozData>() {
805  @Override
806  public PolarBiozData apply(BlePMDClient.BiozData biozData) throws Exception {
807  return new PolarBiozData(biozData.timeStamp,biozData.samples);
808  }
809  }).doFinally(new Action() {
810  @Override
811  public void run() throws Exception {
812  stopPmdStreaming(session,client, BlePMDClient.PmdMeasurementType.PPG);
813  }
814  })).onErrorResumeNext(new Function<Throwable, Publisher<? extends PolarBiozData>>() {
815  @Override
816  public Publisher<? extends PolarBiozData> apply(Throwable throwable) throws Exception {
817  return Flowable.error(handleError(throwable));
818  }
819  });
820  } catch (Throwable t){
821  return Flowable.error(t);
822  }
823  }
824 
825  private BleDeviceSession sessionByDeviceId(final String deviceId) {
826  for ( BleDeviceSession session : listener.deviceSessions() ){
827  if( session.getAdvertisementContent().getPolarDeviceId().equals(deviceId) ){
828  return session;
829  }
830  }
831  return null;
832  }
833 
834  private BleDeviceSession sessionServiceReady(final String identifier, UUID service) throws Throwable {
835  BleDeviceSession session = sessionByDeviceId(identifier);
836  if(session != null){
837  if(session.getSessionState() == BleDeviceSession.DeviceSessionState.SESSION_OPEN) {
838  BleGattBase client = session.fetchClient(service);
839  if (client.isServiceDiscovered()) {
840  return session;
841  }
842  throw new PolarServiceNotAvailable();
843  }
844  throw new PolarDeviceDisconnected();
845  }
846  throw new PolarDeviceNotFound();
847  }
848 
849  public BleDeviceSession sessionPmdClientReady(final String identifier) throws Throwable {
850  BleDeviceSession session = sessionServiceReady(identifier, BlePMDClient.PMD_SERVICE);
851  BlePMDClient client = (BlePMDClient) session.fetchClient(BlePMDClient.PMD_SERVICE);
852  final AtomicInteger pair = client.getNotificationAtomicInteger(BlePMDClient.PMD_CP);
853  final AtomicInteger pairData = client.getNotificationAtomicInteger(BlePMDClient.PMD_DATA);
854  if (pair != null && pairData != null &&
855  pair.get() == BleGattBase.ATT_SUCCESS &&
856  pairData.get() == BleGattBase.ATT_SUCCESS) {
857  return session;
858  }
859  throw new PolarNotificationNotEnabled();
860  }
861 
862  private BleDeviceSession sessionPsFtpClientReady(final String identifier) throws Throwable {
863  BleDeviceSession session = sessionServiceReady(identifier, BlePsFtpUtils.RFC77_PFTP_SERVICE);
864  BlePsFtpClient client = (BlePsFtpClient) session.fetchClient(BlePsFtpUtils.RFC77_PFTP_SERVICE);
865  final AtomicInteger pair = client.getNotificationAtomicInteger(BlePsFtpUtils.RFC77_PFTP_MTU_CHARACTERISTIC);
866  if (pair != null && pair.get() == BleGattBase.ATT_SUCCESS ) {
867  return session;
868  }
869  throw new PolarNotificationNotEnabled();
870  }
871 
872  @SuppressLint("CheckResult")
873  private void stopPmdStreaming(BleDeviceSession session, BlePMDClient client, BlePMDClient.PmdMeasurementType type) {
874  if( session.getSessionState() == BleDeviceSession.DeviceSessionState.SESSION_OPEN ){
875  // stop streaming
876  client.stopMeasurement(type).subscribe(
877  new Action() {
878  @Override
879  public void run() throws Exception {
880 
881  }
882  },
883  new Consumer<Throwable>() {
884  @Override
885  public void accept(Throwable throwable) throws Exception {
886  logError("failed to stop pmd stream: " + throwable.getLocalizedMessage());
887  }
888  }
889  );
890  }
891  }
892 
893  @SuppressLint("CheckResult")
894  private void setupDevice(final BleDeviceSession session){
895  final String deviceId = session.getPolarDeviceId();
896  session.monitorServicesDiscovered(true).observeOn(scheduler).toFlowable().flatMapIterable(
897  new Function<List<UUID>, Iterable<UUID>>() {
898  @Override
899  public Iterable<UUID> apply(List<UUID> uuids) throws Exception {
900  return uuids;
901  }
902  }
903  ).flatMap(new Function<UUID, Publisher<?>>() {
904  @Override
905  public Publisher<?> apply(UUID uuid) throws Exception {
906  if(session.fetchClient(uuid) != null) {
907  if (uuid.equals(BleHrClient.HR_SERVICE)) {
908  if (callback != null) {
909  callback.hrFeatureReady(deviceId);
910  }
911  final BleHrClient client = (BleHrClient) session.fetchClient(BleHrClient.HR_SERVICE);
912  client.observeHrNotifications(true).observeOn(scheduler).subscribe(
913  new Consumer<BleHrClient.HrNotificationData>() {
914  @Override
915  public void accept(BleHrClient.HrNotificationData hrNotificationData) throws Exception {
916  if (callback != null) {
918  new PolarHrData(hrNotificationData.hrValue,
919  hrNotificationData.rrs,
920  hrNotificationData.sensorContact,
921  hrNotificationData.sensorContactSupported,
922  hrNotificationData.rrPresent));
923  }
924  }
925  },
926  new Consumer<Throwable>() {
927  @Override
928  public void accept(Throwable throwable) throws Exception {
929  logError(throwable.getMessage());
930  }
931  },
932  new Action() {
933  @Override
934  public void run() throws Exception {
935 
936  }
937  }
938  );
939  } else if (uuid.equals(BleBattClient.BATTERY_SERVICE)) {
940  BleBattClient client = (BleBattClient) session.fetchClient(BleBattClient.BATTERY_SERVICE);
941  return client.waitBatteryLevelUpdate(true).observeOn(scheduler).doOnSuccess(new Consumer<Integer>() {
942  @Override
943  public void accept(Integer integer) throws Exception {
944  if (callback != null) {
945  callback.batteryLevelReceived(deviceId, integer);
946  }
947  }
948  }).toFlowable();
949  } else if (uuid.equals(BlePMDClient.PMD_SERVICE)) {
950  final BlePMDClient client = (BlePMDClient) session.fetchClient(BlePMDClient.PMD_SERVICE);
951  return client.waitNotificationEnabled(BlePMDClient.PMD_CP, true).
952  concatWith(client.waitNotificationEnabled(BlePMDClient.PMD_DATA, true)).andThen(client.readFeature(true).doOnSuccess(new Consumer<BlePMDClient.PmdFeature>() {
953  @Override
954  public void accept(BlePMDClient.PmdFeature pmdFeature) {
955  if (callback != null) {
956  if (pmdFeature.ecgSupported) {
957  callback.ecgFeatureReady(deviceId);
958  }
959  if (pmdFeature.accSupported) {
961  }
962  if (pmdFeature.ppgSupported) {
963  callback.ppgFeatureReady(deviceId);
964  }
965  if (pmdFeature.ppiSupported) {
966  callback.ppiFeatureReady(deviceId);
967  }
968  if (pmdFeature.bioZSupported) {
969  callback.biozFeatureReady(deviceId);
970  }
971  }
972  }
973  })).toFlowable();
974  } else if (uuid.equals(BleDisClient.DIS_SERVICE)) {
975  BleDisClient client = (BleDisClient) session.fetchClient(BleDisClient.DIS_SERVICE);
976  return client.observeDisInfo(true).takeUntil(new Predicate<HashMap<UUID, String>>() {
977  @Override
978  public boolean test(HashMap<UUID, String> map) throws Exception {
979  return map.containsKey(BleDisClient.SOFTWARE_REVISION_STRING);
980  }
981  }).observeOn(scheduler).doOnNext(new Consumer<HashMap<UUID, String>>() {
982  @Override
983  public void accept(HashMap<UUID, String> uuidStringHashMap) throws Exception {
984  if (callback != null && uuidStringHashMap.containsKey(BleDisClient.SOFTWARE_REVISION_STRING)) {
985  callback.fwInformationReceived(deviceId, uuidStringHashMap.get(BleDisClient.SOFTWARE_REVISION_STRING));
986  }
987  }
988  });
989  } else if (uuid.equals(BlePsFtpUtils.RFC77_PFTP_SERVICE)) {
990  BlePsFtpClient client = (BlePsFtpClient) session.fetchClient(BlePsFtpUtils.RFC77_PFTP_SERVICE);
991  return client.waitPsFtpClientReady(true).observeOn(scheduler).doOnComplete(new Action() {
992  @Override
993  public void run() throws Exception {
994  if (callback != null &&
995  (session.getPolarDeviceType().equals("OH1") || session.getPolarDeviceType().equals("H10"))) {
996  callback.polarFtpFeatureReady(deviceId);
997  }
998  }
999  }).toFlowable();
1000  }
1001  }
1002  return Flowable.empty();
1003  }
1004  }).subscribe(
1005  new Consumer<Object>() {
1006  @Override
1007  public void accept(Object o) throws Exception {
1008 
1009  }
1010  },
1011  new Consumer<Throwable>() {
1012  @Override
1013  public void accept(Throwable throwable) throws Exception {
1014  logError(throwable.getMessage());
1015  }
1016  },
1017  new Action() {
1018  @Override
1019  public void run() throws Exception {
1020  log("complete");
1021  }
1022  });
1023  }
1024 
1025  private Exception handleError(Throwable throwable) {
1026  if( throwable instanceof BleDisconnected ){
1027  return new PolarDeviceDisconnected();
1028  } else {
1029  return new Exception("Unknown Error: " + throwable.getLocalizedMessage());
1030  }
1031  }
1032 
1033  interface FetchRecursiveCondition {
1034  boolean include(String entry);
1035  }
1036 
1037  private Flowable<String> fetchRecursively(final BlePsFtpClient client, final String path, final FetchRecursiveCondition condition) {
1038  protocol.PftpRequest.PbPFtpOperation.Builder builder = protocol.PftpRequest.PbPFtpOperation.newBuilder();
1039  builder.setCommand(PftpRequest.PbPFtpOperation.Command.GET);
1040  builder.setPath(path);
1041  return client.request(builder.build().toByteArray()).toFlowable().flatMap(new Function<ByteArrayOutputStream, Publisher<String>>() {
1042  @Override
1043  public Publisher<String> apply(ByteArrayOutputStream byteArrayOutputStream) throws Exception {
1044  PftpResponse.PbPFtpDirectory dir = PftpResponse.PbPFtpDirectory.parseFrom(byteArrayOutputStream.toByteArray());
1045  Set<String> entrys = new HashSet<>();
1046  for( int i=0; i < dir.getEntriesCount(); ++i ){
1047  PftpResponse.PbPFtpEntry entry = dir.getEntries(i);
1048  if( condition.include(entry.getName()) ){
1049  BleUtils.validate(entrys.add(path + entry.getName()),"duplicate entry");
1050  }
1051  }
1052  if(entrys.size()!=0) {
1053  return Flowable.fromIterable(entrys).flatMap(new Function<String, Publisher<String>>() {
1054  @Override
1055  public Publisher<String> apply(String s) {
1056  if (s.endsWith("/")) {
1057  return fetchRecursively(client, s, condition);
1058  } else {
1059  return Flowable.just(s);
1060  }
1061  }
1062  });
1063  }
1064  return Flowable.empty();
1065  }
1066  });
1067  }
1068 
1069  @SuppressLint("CheckResult")
1070  private void sendNotification(BlePsFtpClient client, int notification){
1071  client.sendNotification(notification,null).subscribe(
1072  new Action() {
1073  @Override
1074  public void run() throws Exception {
1075  }
1076  },
1077  new Consumer<Throwable>() {
1078  @Override
1079  public void accept(Throwable throwable) throws Exception {
1080  logError("failed to send notification: " + throwable.getLocalizedMessage());
1081  }
1082  }
1083  );
1084  }
1085 
1086  private void log(final String message) {
1087  if(logger != null){
1088  logger.message("" + message);
1089  }
1090  }
1091 
1092  private void logError(final String message) {
1093  if(logger != null){
1094  logger.message("Error: "+message);
1095  }
1096  }
1097 }
+
void log(final String message)
+
Flowable< PolarDeviceInfo > searchForPolarDevice()
+ +
static final int ANDROID_VERSION_O
+
Single< PolarExerciseData > fetchExercise(String identifier, PolarExerciseEntry entry)
+ +
Completable startRecording(String identifier, String exerciseId, RecordingInterval interval, SampleType type)
+ +
void setAutomaticReconnection(boolean disable)
+
Single< PolarSensorSetting > requestAccSettings(String identifier)
+
PolarBleApiCallback callback
+
Exception handleError(Throwable throwable)
+ + +
void accelerometerFeatureReady(@NonNull final String identifier)
+
Flowable< PolarOhrPPIData > startOhrPPIStreaming(String identifier)
+ + +
void hrFeatureReady(@NonNull final String identifier)
+ +
void fwInformationReceived(@NonNull final String identifier, @NonNull final String fwVersion)
+
Flowable< PolarHrBroadcastData > startListenForPolarHrBroadcasts(final Set< String > deviceIds)
+ + +
void ecgFeatureReady(@NonNull final String identifier)
+ + +
Single< PolarSensorSetting > querySettings(final String identifier, final BlePMDClient.PmdMeasurementType type)
+ +
static final int FEATURE_POLAR_SENSOR_STREAMING
+ + +
Map< String, Disposable > connectSubscriptions
+
void ppgFeatureReady(@NonNull final String identifier)
+
Completable autoConnectToPolarDevice(final int rssiLimit, final String polarDeviceType)
+
Single< PolarSensorSetting > requestBiozSettings(final String identifier)
+
void disconnectFromPolarDevice(String identifier)
+ +
Single< PolarSensorSetting > requestEcgSettings(String identifier)
+
BleDeviceSession sessionServiceReady(final String identifier, UUID service)
+
Single< Pair< Boolean, String > > requestRecordingStatus(String identifier)
+ + + +
static final int FEATURE_BATTERY_INFO
+ + +
boolean isFeatureReady(final String deviceId, int feature)
+
void polarDeviceConnecting(@NonNull final PolarDeviceInfo polarDeviceInfo)
+ +
Flowable< PolarAccelerometerData > startAccStreaming(String identifier, PolarSensorSetting setting)
+ +
BDBleApiImpl(final Context context, int features)
+
Single< PolarSensorSetting > requestPpgSettings(String identifier)
+ + + +
BleDeviceSession sessionPmdClientReady(final String identifier)
+ +
Flowable< String > fetchRecursively(final BlePsFtpClient client, final String path, final FetchRecursiveCondition condition)
+
Completable stopRecording(String identifier)
+
void ppiFeatureReady(@NonNull final String identifier)
+
Completable setLocalTime(String identifier, Date local)
+
void polarDeviceDisconnected(@NonNull final PolarDeviceInfo polarDeviceInfo)
+ +
void batteryLevelReceived(@NonNull final String identifier, final int level)
+
void sendNotification(BlePsFtpClient client, int notification)
+
static final int FEATURE_DEVICE_INFO
+
void setupDevice(final BleDeviceSession session)
+ +
Flowable< PolarBiozData > startBiozStreaming(final String identifier, PolarSensorSetting setting)
+
Flowable< PolarExerciseEntry > listExercises(String identifier)
+ + +
BleDeviceSession sessionByDeviceId(final String deviceId)
+
void hrNotificationReceived(@NonNull final String identifier, @NonNull final PolarHrData data)
+
void blePowerStateChanged(final boolean powered)
+
static final int FEATURE_POLAR_FILE_TRANSFER
+
Completable removeExercise(String identifier, PolarExerciseEntry entry)
+
void polarFtpFeatureReady(@NonNull final String identifier)
+
void polarDeviceConnected(@NonNull final PolarDeviceInfo polarDeviceInfo)
+ + +
void stopPmdStreaming(BleDeviceSession session, BlePMDClient client, BlePMDClient.PmdMeasurementType type)
+ +
void setApiLogger(@Nullable PolarBleApiLogger logger)
+
Completable autoConnectToPolarDevice(final int rssiLimit, final int timeout, final TimeUnit unit, final String polarDeviceType)
+
Flowable< PolarOhrPPGData > startOhrPPGStreaming(String identifier, PolarSensorSetting setting)
+
Flowable< PolarEcgData > startEcgStreaming(String identifier, PolarSensorSetting setting)
+
void biozFeatureReady(@NonNull final String identifier)
+ + + + + + + +
void setApiCallback(PolarBleApiCallback callback)
+ +
BleDeviceSession sessionPsFtpClientReady(final String identifier)
+
void logError(final String message)
+ + + +
void connectToPolarDevice(final String identifier)
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarAccelerometerData_8java.html b/polar-sdk-android/docs/html/PolarAccelerometerData_8java.html new file mode 100644 index 00000000..97a1970e --- /dev/null +++ b/polar-sdk-android/docs/html/PolarAccelerometerData_8java.html @@ -0,0 +1,99 @@ + + + + + + + +SDK for Polar sensors: PolarAccelerometerData.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarAccelerometerData.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + +

+Data Structures

class  polar.com.sdk.api.model.PolarAccelerometerData
 
class  polar.com.sdk.api.model.PolarAccelerometerData.PolarAccelerometerSample
 
+ + + +

+Packages

package  polar.com.sdk.api.model
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarAccelerometerData_8java_source.html b/polar-sdk-android/docs/html/PolarAccelerometerData_8java_source.html new file mode 100644 index 00000000..5f2f8c38 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarAccelerometerData_8java_source.html @@ -0,0 +1,85 @@ + + + + + + + +SDK for Polar sensors: PolarAccelerometerData.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarAccelerometerData.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.model;
3 
4 import java.util.List;
5 
9 public class PolarAccelerometerData {
10 
14  public static class PolarAccelerometerSample {
18  public int x;
19 
23  public int y;
24 
28  public int z;
29 
30  public PolarAccelerometerSample(int x, int y, int z) {
31  this.x = x;
32  this.y = y;
33  this.z = z;
34  }
35  }
36 
40  public List<PolarAccelerometerSample> samples;
41 
45  public long timeStamp;
46 
52  public PolarAccelerometerData(List<PolarAccelerometerSample> samples, long timeStamp) {
53  this.samples = samples;
54  this.timeStamp = timeStamp;
55  }
56 }
+
PolarAccelerometerData(List< PolarAccelerometerSample > samples, long timeStamp)
+ + +
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarBiozData_8java.html b/polar-sdk-android/docs/html/PolarBiozData_8java.html new file mode 100644 index 00000000..0c18f941 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarBiozData_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarBiozData.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarBiozData.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Data Structures

class  polar.com.sdk.api.model.PolarBiozData
 
+ + + +

+Packages

package  polar.com.sdk.api.model
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarBiozData_8java_source.html b/polar-sdk-android/docs/html/PolarBiozData_8java_source.html new file mode 100644 index 00000000..e33ec596 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarBiozData_8java_source.html @@ -0,0 +1,85 @@ + + + + + + + +SDK for Polar sensors: PolarBiozData.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarBiozData.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.model;
3 
4 import java.util.List;
5 
9 public class PolarBiozData {
10 
14  public long timeStamp;
15 
19  public List<Integer> samples;
20 
21  public PolarBiozData(long timeStamp, List<Integer> samples) {
22  this.timeStamp = timeStamp;
23  this.samples = samples;
24  }
25 }
+
PolarBiozData(long timeStamp, List< Integer > samples)
+ + +
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarBleApiCallback_8java.html b/polar-sdk-android/docs/html/PolarBleApiCallback_8java.html new file mode 100644 index 00000000..d758626a --- /dev/null +++ b/polar-sdk-android/docs/html/PolarBleApiCallback_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarBleApiCallback.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarBleApiCallback.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Data Structures

interface  polar.com.sdk.api.PolarBleApiCallback
 
+ + + +

+Packages

package  polar.com.sdk.api
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarBleApiCallback_8java_source.html b/polar-sdk-android/docs/html/PolarBleApiCallback_8java_source.html new file mode 100644 index 00000000..8b43d92f --- /dev/null +++ b/polar-sdk-android/docs/html/PolarBleApiCallback_8java_source.html @@ -0,0 +1,103 @@ + + + + + + + +SDK for Polar sensors: PolarBleApiCallback.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarBleApiCallback.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api;
3 
4 import io.reactivex.annotations.NonNull;
7 
11 public interface PolarBleApiCallback {
12 
16  void blePowerStateChanged(final boolean powered);
17 
22  void polarDeviceConnected(@NonNull final PolarDeviceInfo polarDeviceInfo);
23 
28  void polarDeviceConnecting(@NonNull final PolarDeviceInfo polarDeviceInfo);
29 
35  void polarDeviceDisconnected(@NonNull final PolarDeviceInfo polarDeviceInfo);
36 
42  void ecgFeatureReady(@NonNull final String identifier);
43 
49  void accelerometerFeatureReady(@NonNull final String identifier);
50 
56  void ppgFeatureReady(@NonNull final String identifier);
57 
63  void ppiFeatureReady(@NonNull final String identifier);
64 
69  void biozFeatureReady(@NonNull final String identifier);
70 
75  void hrFeatureReady(@NonNull final String identifier);
76 
83  void fwInformationReceived(@NonNull final String identifier,@NonNull final String fwVersion);
84 
91  void batteryLevelReceived(@NonNull final String identifier, final int level);
92 
98  void hrNotificationReceived(@NonNull final String identifier,@NonNull final PolarHrData data);
99 
105  void polarFtpFeatureReady(@NonNull final String identifier);
106 }
+ +
void accelerometerFeatureReady(@NonNull final String identifier)
+
void hrFeatureReady(@NonNull final String identifier)
+
void fwInformationReceived(@NonNull final String identifier, @NonNull final String fwVersion)
+
void ecgFeatureReady(@NonNull final String identifier)
+ +
void ppgFeatureReady(@NonNull final String identifier)
+ +
void polarDeviceConnecting(@NonNull final PolarDeviceInfo polarDeviceInfo)
+ + +
void ppiFeatureReady(@NonNull final String identifier)
+
void polarDeviceDisconnected(@NonNull final PolarDeviceInfo polarDeviceInfo)
+ +
void batteryLevelReceived(@NonNull final String identifier, final int level)
+
void hrNotificationReceived(@NonNull final String identifier, @NonNull final PolarHrData data)
+
void blePowerStateChanged(final boolean powered)
+
void polarFtpFeatureReady(@NonNull final String identifier)
+
void polarDeviceConnected(@NonNull final PolarDeviceInfo polarDeviceInfo)
+
void biozFeatureReady(@NonNull final String identifier)
+ +
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarBleApiDefaultImpl_8java.html b/polar-sdk-android/docs/html/PolarBleApiDefaultImpl_8java.html new file mode 100644 index 00000000..0ceb8930 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarBleApiDefaultImpl_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarBleApiDefaultImpl.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarBleApiDefaultImpl.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Data Structures

class  polar.com.sdk.api.PolarBleApiDefaultImpl
 
+ + + +

+Packages

package  polar.com.sdk.api
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarBleApiDefaultImpl_8java_source.html b/polar-sdk-android/docs/html/PolarBleApiDefaultImpl_8java_source.html new file mode 100644 index 00000000..62a275f6 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarBleApiDefaultImpl_8java_source.html @@ -0,0 +1,90 @@ + + + + + + + +SDK for Polar sensors: PolarBleApiDefaultImpl.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarBleApiDefaultImpl.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api;
3 
4 import android.content.Context;
5 
6 import com.androidcommunications.polar.api.ble.BleRefApiVersion;
7 
9 
13 public class PolarBleApiDefaultImpl {
20  public static PolarBleApi defaultImplementation(final Context context, int features){
21  return new BDBleApiImpl(context,features);
22  }
23 
27  public static String versionInfo(){
28  return "13.0.0";//BleRefApiVersion.major() + "." + BleRefApiVersion.minor() + "." + BleRefApiVersion.patch();
29  }
30 }
+ + + + +
static PolarBleApi defaultImplementation(final Context context, int features)
+ + + +
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarBleApi_8java.html b/polar-sdk-android/docs/html/PolarBleApi_8java.html new file mode 100644 index 00000000..c5a4a344 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarBleApi_8java.html @@ -0,0 +1,103 @@ + + + + + + + +SDK for Polar sensors: PolarBleApi.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarBleApi.java File Reference
+
+ +
+ + + + diff --git a/polar-sdk-android/docs/html/PolarBleApi_8java_source.html b/polar-sdk-android/docs/html/PolarBleApi_8java_source.html new file mode 100644 index 00000000..193cd020 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarBleApi_8java_source.html @@ -0,0 +1,145 @@ + + + + + + + +SDK for Polar sensors: PolarBleApi.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarBleApi.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api;
3 
4 import android.support.annotation.Nullable;
5 import android.support.annotation.Size;
6 import android.util.Pair;
7 
8 import com.androidcommunications.polar.api.ble.model.gatt.client.BlePMDClient;
9 
10 import java.util.Date;
11 import java.util.Set;
12 import java.util.concurrent.TimeUnit;
13 
14 import io.reactivex.Completable;
15 import io.reactivex.Flowable;
16 import io.reactivex.Single;
17 import io.reactivex.annotations.NonNull;
18 import io.reactivex.disposables.Disposable;
29 
33 public abstract class PolarBleApi {
34 
38  public interface PolarBleApiLogger {
43  void message(final String str);
44  }
45 
49  public enum RecordingInterval {
53  private int value;
54 
55  RecordingInterval(int value) {
56  this.value = value;
57  }
58 
59  public int getValue() {
60  return value;
61  }
62  };
63 
67  public enum SampleType {
68  HR,
69  RR;
70  };
71 
75  public static final int FEATURE_HR = 1;
79  public static final int FEATURE_DEVICE_INFO = 2;
83  public static final int FEATURE_BATTERY_INFO = 4;
87  public static final int FEATURE_POLAR_SENSOR_STREAMING = 8;
91  public static final int FEATURE_POLAR_FILE_TRANSFER = 16;
95  public static final int ALL_FEATURES = 0xff;
96 
97  protected int features;
98 
103  protected PolarBleApi(final int features) {
104  this.features = features;
105  }
106 
110  public abstract void shutDown();
111 
118  public abstract boolean isFeatureReady(@NonNull final String deviceId, final int feature);
119 
123  public abstract void backgroundEntered();
124 
128  public abstract void foregroundEntered();
129 
133  public abstract void setApiCallback(@Nullable PolarBleApiCallback callback);
134 
138  public abstract void setApiLogger(@Nullable PolarBleApiLogger logger);
139 
144  public abstract void setAutomaticReconnection(boolean enable);
145 
153  public abstract Completable setLocalTime(@NonNull final String identifier,@NonNull final Date time);
154 
160  public abstract Single<PolarSensorSetting> requestAccSettings(@NonNull final String identifier);
161 
167  public abstract Single<PolarSensorSetting> requestEcgSettings(@NonNull final String identifier);
168 
174  public abstract Single<PolarSensorSetting> requestPpgSettings(@NonNull final String identifier);
175 
176  public abstract Single<PolarSensorSetting> requestBiozSettings(@NonNull final String identifier);
177 
188  public abstract Completable autoConnectToPolarDevice(int rssiLimit, int timeout,@NonNull TimeUnit unit,@Nullable final String polarDeviceType);
189  public abstract Completable autoConnectToPolarDevice(int rssiLimit, final String polarDeviceType);
190 
195  public abstract void connectToPolarDevice(@NonNull final String identifier);
196 
201  public abstract void disconnectFromPolarDevice(@NonNull final String identifier);
202 
211  public abstract Completable startRecording(@NonNull final String identifier,
212  @NonNull @Size(min = 1, max = 64) final String exerciseId,
213  @NonNull RecordingInterval interval,
214  @NonNull SampleType type);
215 
221  public abstract Completable stopRecording(@NonNull final String identifier);
222 
228  public abstract Single<Pair<Boolean,String>> requestRecordingStatus(@NonNull final String identifier);
229 
235  public abstract Flowable<PolarExerciseEntry> listExercises(@NonNull final String identifier);
236 
243  public abstract Single<PolarExerciseData> fetchExercise(@NonNull final String identifier, @NonNull final PolarExerciseEntry entry);
244 
251  public abstract Completable removeExercise(@NonNull final String identifier, @NonNull final PolarExerciseEntry entry);
252 
261  public abstract Flowable<PolarDeviceInfo> searchForPolarDevice();
262 
272  public abstract Flowable<PolarHrBroadcastData> startListenForPolarHrBroadcasts(@Nullable final Set<String> deviceIds);
273 
286  public abstract Flowable<PolarEcgData> startEcgStreaming(@NonNull final String identifier,
287  @NonNull PolarSensorSetting sensorSetting);
288 
301  public abstract Flowable<PolarAccelerometerData> startAccStreaming(@NonNull final String identifier,
302  @NonNull PolarSensorSetting sensorSetting);
303 
316  public abstract Flowable<PolarOhrPPGData> startOhrPPGStreaming(@NonNull final String identifier,
317  @NonNull PolarSensorSetting sensorSetting);
318 
319  public abstract Flowable<PolarBiozData> startBiozStreaming(@NonNull final String identifier,
320  @NonNull PolarSensorSetting sensorSetting);
321 
332  public abstract Flowable<PolarOhrPPIData> startOhrPPIStreaming(@NonNull final String identifier);
333 }
+
abstract Single< PolarSensorSetting > requestEcgSettings(@NonNull final String identifier)
+
abstract Flowable< PolarOhrPPIData > startOhrPPIStreaming(@NonNull final String identifier)
+ + +
abstract Flowable< PolarDeviceInfo > searchForPolarDevice()
+
abstract Flowable< PolarAccelerometerData > startAccStreaming(@NonNull final String identifier, @NonNull PolarSensorSetting sensorSetting)
+ + +
abstract void setApiLogger(@Nullable PolarBleApiLogger logger)
+ +
abstract Completable stopRecording(@NonNull final String identifier)
+ +
abstract Single< PolarSensorSetting > requestAccSettings(@NonNull final String identifier)
+
abstract void setAutomaticReconnection(boolean enable)
+
abstract void foregroundEntered()
+
static final int FEATURE_POLAR_SENSOR_STREAMING
+ +
abstract Flowable< PolarHrBroadcastData > startListenForPolarHrBroadcasts(@Nullable final Set< String > deviceIds)
+ +
static final int ALL_FEATURES
+ +
abstract boolean isFeatureReady(@NonNull final String deviceId, final int feature)
+ + +
static final int FEATURE_BATTERY_INFO
+ + + +
abstract void backgroundEntered()
+
abstract Completable setLocalTime(@NonNull final String identifier, @NonNull final Date time)
+
abstract Completable startRecording(@NonNull final String identifier, @NonNull @Size(min=1, max=64) final String exerciseId, @NonNull RecordingInterval interval, @NonNull SampleType type)
+
abstract Flowable< PolarOhrPPGData > startOhrPPGStreaming(@NonNull final String identifier, @NonNull PolarSensorSetting sensorSetting)
+
abstract void disconnectFromPolarDevice(@NonNull final String identifier)
+
abstract Single< PolarSensorSetting > requestBiozSettings(@NonNull final String identifier)
+
PolarBleApi(final int features)
+ +
abstract Flowable< PolarExerciseEntry > listExercises(@NonNull final String identifier)
+ + + +
abstract Single< Pair< Boolean, String > > requestRecordingStatus(@NonNull final String identifier)
+ + +
static final int FEATURE_DEVICE_INFO
+ + +
abstract Completable removeExercise(@NonNull final String identifier, @NonNull final PolarExerciseEntry entry)
+
static final int FEATURE_POLAR_FILE_TRANSFER
+
abstract Flowable< PolarEcgData > startEcgStreaming(@NonNull final String identifier, @NonNull PolarSensorSetting sensorSetting)
+
abstract void connectToPolarDevice(@NonNull final String identifier)
+
abstract Single< PolarSensorSetting > requestPpgSettings(@NonNull final String identifier)
+ +
abstract Completable autoConnectToPolarDevice(int rssiLimit, int timeout, @NonNull TimeUnit unit, @Nullable final String polarDeviceType)
+ + + + + +
abstract void setApiCallback(@Nullable PolarBleApiCallback callback)
+ + +
abstract Flowable< PolarBiozData > startBiozStreaming(@NonNull final String identifier, @NonNull PolarSensorSetting sensorSetting)
+
abstract Single< PolarExerciseData > fetchExercise(@NonNull final String identifier, @NonNull final PolarExerciseEntry entry)
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarDeviceDisconnected_8java.html b/polar-sdk-android/docs/html/PolarDeviceDisconnected_8java.html new file mode 100644 index 00000000..018b7827 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarDeviceDisconnected_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarDeviceDisconnected.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarDeviceDisconnected.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Data Structures

class  polar.com.sdk.api.errors.PolarDeviceDisconnected
 
+ + + +

+Packages

package  polar.com.sdk.api.errors
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarDeviceDisconnected_8java_source.html b/polar-sdk-android/docs/html/PolarDeviceDisconnected_8java_source.html new file mode 100644 index 00000000..050c5a3b --- /dev/null +++ b/polar-sdk-android/docs/html/PolarDeviceDisconnected_8java_source.html @@ -0,0 +1,82 @@ + + + + + + + +SDK for Polar sensors: PolarDeviceDisconnected.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarDeviceDisconnected.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.errors;
3 
7 public class PolarDeviceDisconnected extends Exception {
8 }
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarDeviceInfo_8java.html b/polar-sdk-android/docs/html/PolarDeviceInfo_8java.html new file mode 100644 index 00000000..46917d01 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarDeviceInfo_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarDeviceInfo.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarDeviceInfo.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Data Structures

class  polar.com.sdk.api.model.PolarDeviceInfo
 
+ + + +

+Packages

package  polar.com.sdk.api.model
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarDeviceInfo_8java_source.html b/polar-sdk-android/docs/html/PolarDeviceInfo_8java_source.html new file mode 100644 index 00000000..4674768f --- /dev/null +++ b/polar-sdk-android/docs/html/PolarDeviceInfo_8java_source.html @@ -0,0 +1,87 @@ + + + + + + + +SDK for Polar sensors: PolarDeviceInfo.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarDeviceInfo.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.model;
3 
8 public class PolarDeviceInfo {
9 
13  public String deviceId;
14 
18  public int rssi;
19 
23  public String name;
24 
28  public boolean isConnectable;
29 
30  public PolarDeviceInfo(String deviceId, int rssi, String name, boolean isConnectable) {
31  this.deviceId = deviceId;
32  this.rssi = rssi;
33  this.name = name;
34  this.isConnectable = isConnectable;
35  }
36 }
+
PolarDeviceInfo(String deviceId, int rssi, String name, boolean isConnectable)
+ + + + +
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarDeviceNotConnected_8java.html b/polar-sdk-android/docs/html/PolarDeviceNotConnected_8java.html new file mode 100644 index 00000000..cf94d56f --- /dev/null +++ b/polar-sdk-android/docs/html/PolarDeviceNotConnected_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarDeviceNotConnected.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarDeviceNotConnected.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Data Structures

class  polar.com.sdk.api.errors.PolarDeviceNotConnected
 
+ + + +

+Packages

package  polar.com.sdk.api.errors
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarDeviceNotConnected_8java_source.html b/polar-sdk-android/docs/html/PolarDeviceNotConnected_8java_source.html new file mode 100644 index 00000000..2cde168e --- /dev/null +++ b/polar-sdk-android/docs/html/PolarDeviceNotConnected_8java_source.html @@ -0,0 +1,82 @@ + + + + + + + +SDK for Polar sensors: PolarDeviceNotConnected.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarDeviceNotConnected.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.errors;
3 
7 public class PolarDeviceNotConnected extends Exception {
8 }
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarDeviceNotFound_8java.html b/polar-sdk-android/docs/html/PolarDeviceNotFound_8java.html new file mode 100644 index 00000000..accd3ea3 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarDeviceNotFound_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarDeviceNotFound.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarDeviceNotFound.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Data Structures

class  polar.com.sdk.api.errors.PolarDeviceNotFound
 
+ + + +

+Packages

package  polar.com.sdk.api.errors
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarDeviceNotFound_8java_source.html b/polar-sdk-android/docs/html/PolarDeviceNotFound_8java_source.html new file mode 100644 index 00000000..3f2e5efc --- /dev/null +++ b/polar-sdk-android/docs/html/PolarDeviceNotFound_8java_source.html @@ -0,0 +1,82 @@ + + + + + + + +SDK for Polar sensors: PolarDeviceNotFound.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarDeviceNotFound.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.errors;
3 
7 public class PolarDeviceNotFound extends Exception {
8 }
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarEcgData_8java.html b/polar-sdk-android/docs/html/PolarEcgData_8java.html new file mode 100644 index 00000000..6be50cbd --- /dev/null +++ b/polar-sdk-android/docs/html/PolarEcgData_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarEcgData.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarEcgData.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Data Structures

class  polar.com.sdk.api.model.PolarEcgData
 
+ + + +

+Packages

package  polar.com.sdk.api.model
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarEcgData_8java_source.html b/polar-sdk-android/docs/html/PolarEcgData_8java_source.html new file mode 100644 index 00000000..38e9c3af --- /dev/null +++ b/polar-sdk-android/docs/html/PolarEcgData_8java_source.html @@ -0,0 +1,85 @@ + + + + + + + +SDK for Polar sensors: PolarEcgData.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarEcgData.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.model;
3 
4 import java.util.List;
5 
10 public class PolarEcgData {
11 
15  public List<Integer> samples;
16 
20  public long timeStamp;
21 
22  public PolarEcgData(List<Integer> samples, long timeStamp) {
23  this.samples = samples;
24  this.timeStamp = timeStamp;
25  }
26 }
+
PolarEcgData(List< Integer > samples, long timeStamp)
+ + +
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarExerciseData_8java.html b/polar-sdk-android/docs/html/PolarExerciseData_8java.html new file mode 100644 index 00000000..78ca7217 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarExerciseData_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarExerciseData.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarExerciseData.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Data Structures

class  polar.com.sdk.api.model.PolarExerciseData
 
+ + + +

+Packages

package  polar.com.sdk.api.model
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarExerciseData_8java_source.html b/polar-sdk-android/docs/html/PolarExerciseData_8java_source.html new file mode 100644 index 00000000..9976c567 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarExerciseData_8java_source.html @@ -0,0 +1,85 @@ + + + + + + + +SDK for Polar sensors: PolarExerciseData.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarExerciseData.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.model;
3 
4 import java.util.List;
5 
9 public class PolarExerciseData {
13  public int recordingInterval;
17  public List<Integer> hrSamples;
18 
19  public PolarExerciseData(int recordingInterval, List<Integer> hrSamples) {
20  this.recordingInterval = recordingInterval;
21  this.hrSamples = hrSamples;
22  }
23 }
PolarExerciseData(int recordingInterval, List< Integer > hrSamples)
+ + + +
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarExerciseEntry_8java.html b/polar-sdk-android/docs/html/PolarExerciseEntry_8java.html new file mode 100644 index 00000000..c053b64c --- /dev/null +++ b/polar-sdk-android/docs/html/PolarExerciseEntry_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarExerciseEntry.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarExerciseEntry.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Data Structures

class  polar.com.sdk.api.model.PolarExerciseEntry
 
+ + + +

+Packages

package  polar.com.sdk.api.model
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarExerciseEntry_8java_source.html b/polar-sdk-android/docs/html/PolarExerciseEntry_8java_source.html new file mode 100644 index 00000000..642889f1 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarExerciseEntry_8java_source.html @@ -0,0 +1,86 @@ + + + + + + + +SDK for Polar sensors: PolarExerciseEntry.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarExerciseEntry.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.model;
3 
4 import java.util.Date;
5 
9 public class PolarExerciseEntry {
13  public String path;
17  public Date date;
21  public String identifier;
22 
23  public PolarExerciseEntry(String path, Date date, String identifier) {
24  this.path = path;
25  this.date = date;
26  this.identifier = identifier;
27  }
28 }
+ + + +
PolarExerciseEntry(String path, Date date, String identifier)
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarHrBroadcastData_8java.html b/polar-sdk-android/docs/html/PolarHrBroadcastData_8java.html new file mode 100644 index 00000000..354ae80d --- /dev/null +++ b/polar-sdk-android/docs/html/PolarHrBroadcastData_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarHrBroadcastData.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarHrBroadcastData.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Data Structures

class  polar.com.sdk.api.model.PolarHrBroadcastData
 
+ + + +

+Packages

package  polar.com.sdk.api.model
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarHrBroadcastData_8java_source.html b/polar-sdk-android/docs/html/PolarHrBroadcastData_8java_source.html new file mode 100644 index 00000000..4791f627 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarHrBroadcastData_8java_source.html @@ -0,0 +1,87 @@ + + + + + + + +SDK for Polar sensors: PolarHrBroadcastData.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarHrBroadcastData.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.model;
3 
7 public class PolarHrBroadcastData {
8 
13 
17  public int hr;
18 
23  public boolean batteryStatus;
24 
25  public PolarHrBroadcastData(PolarDeviceInfo deviceInfo, int hr, boolean batteryStatus) {
26  this.polarDeviceInfo = deviceInfo;
27  this.hr = hr;
28  this.batteryStatus = batteryStatus;
29  }
30 }
PolarHrBroadcastData(PolarDeviceInfo deviceInfo, int hr, boolean batteryStatus)
+ + + + + +
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarHrData_8java.html b/polar-sdk-android/docs/html/PolarHrData_8java.html new file mode 100644 index 00000000..936e8437 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarHrData_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarHrData.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarHrData.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Data Structures

class  polar.com.sdk.api.model.PolarHrData
 
+ + + +

+Packages

package  polar.com.sdk.api.model
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarHrData_8java_source.html b/polar-sdk-android/docs/html/PolarHrData_8java_source.html new file mode 100644 index 00000000..8fea67eb --- /dev/null +++ b/polar-sdk-android/docs/html/PolarHrData_8java_source.html @@ -0,0 +1,89 @@ + + + + + + + +SDK for Polar sensors: PolarHrData.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarHrData.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.model;
3 
4 import java.util.ArrayList;
5 import java.util.List;
6 
10 public class PolarHrData {
11 
15  public int hr;
16 
21  public List<Integer> rrs;
22 
26  public List<Integer> rrsMs;
27 
31  public boolean contactStatus;
32 
36  public boolean contactStatusSupported;
37 
41  public boolean rrAvailable;
42 
43  public PolarHrData(int hr, List<Integer> rrs, boolean contactStatus, boolean contactStatusSupported, boolean rrAvailable) {
44  this.hr = hr;
45  this.rrs = rrs;
46  this.contactStatus = contactStatus;
47  this.contactStatusSupported = contactStatusSupported;
48  this.rrAvailable = rrAvailable;
49  rrsMs = new ArrayList<>();
50  for( int rrRaw : rrs ){
51  rrsMs.add((int)(Math.round(((float) rrRaw /1024.0)*1000.0)));
52  }
53  }
54 }
+ + + + + +
PolarHrData(int hr, List< Integer > rrs, boolean contactStatus, boolean contactStatusSupported, boolean rrAvailable)
+ +
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarNotificationNotEnabled_8java.html b/polar-sdk-android/docs/html/PolarNotificationNotEnabled_8java.html new file mode 100644 index 00000000..9057e5db --- /dev/null +++ b/polar-sdk-android/docs/html/PolarNotificationNotEnabled_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarNotificationNotEnabled.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarNotificationNotEnabled.java File Reference
+
+ +
+ + + + diff --git a/polar-sdk-android/docs/html/PolarNotificationNotEnabled_8java_source.html b/polar-sdk-android/docs/html/PolarNotificationNotEnabled_8java_source.html new file mode 100644 index 00000000..ef37cd6e --- /dev/null +++ b/polar-sdk-android/docs/html/PolarNotificationNotEnabled_8java_source.html @@ -0,0 +1,82 @@ + + + + + + + +SDK for Polar sensors: PolarNotificationNotEnabled.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarNotificationNotEnabled.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.errors;
3 
7 public class PolarNotificationNotEnabled extends Exception {
8 }
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarOhrPPGData_8java.html b/polar-sdk-android/docs/html/PolarOhrPPGData_8java.html new file mode 100644 index 00000000..50e6f9e7 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarOhrPPGData_8java.html @@ -0,0 +1,99 @@ + + + + + + + +SDK for Polar sensors: PolarOhrPPGData.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarOhrPPGData.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + +

+Data Structures

class  polar.com.sdk.api.model.PolarOhrPPGData
 
class  polar.com.sdk.api.model.PolarOhrPPGData.PolarOhrPPGSample
 
+ + + +

+Packages

package  polar.com.sdk.api.model
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarOhrPPGData_8java_source.html b/polar-sdk-android/docs/html/PolarOhrPPGData_8java_source.html new file mode 100644 index 00000000..0b48c019 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarOhrPPGData_8java_source.html @@ -0,0 +1,85 @@ + + + + + + + +SDK for Polar sensors: PolarOhrPPGData.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarOhrPPGData.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.model;
3 
4 import java.util.List;
5 
9 public class PolarOhrPPGData {
10 
14  public static class PolarOhrPPGSample {
18  public int ppg0;
22  public int ppg1;
26  public int ppg2;
30  public int ambient;
31 
32  public PolarOhrPPGSample(int ppg0, int ppg1, int ppg2, int ambient) {
33  this.ppg0 = ppg0;
34  this.ppg1 = ppg1;
35  this.ppg2 = ppg2;
36  this.ambient = ambient;
37  }
38  }
39 
43  public List<PolarOhrPPGSample> samples;
44 
48  public long timeStamp;
49 
55  public PolarOhrPPGData(List<PolarOhrPPGSample> samples, long timeStamp) {
56  this.samples = samples;
57  this.timeStamp = timeStamp;
58  }
59 }
+ + +
PolarOhrPPGData(List< PolarOhrPPGSample > samples, long timeStamp)
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarOhrPPIData_8java.html b/polar-sdk-android/docs/html/PolarOhrPPIData_8java.html new file mode 100644 index 00000000..ed990ee0 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarOhrPPIData_8java.html @@ -0,0 +1,99 @@ + + + + + + + +SDK for Polar sensors: PolarOhrPPIData.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarOhrPPIData.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + +

+Data Structures

class  polar.com.sdk.api.model.PolarOhrPPIData
 
class  polar.com.sdk.api.model.PolarOhrPPIData.PolarOhrPPISample
 
+ + + +

+Packages

package  polar.com.sdk.api.model
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarOhrPPIData_8java_source.html b/polar-sdk-android/docs/html/PolarOhrPPIData_8java_source.html new file mode 100644 index 00000000..443cc8eb --- /dev/null +++ b/polar-sdk-android/docs/html/PolarOhrPPIData_8java_source.html @@ -0,0 +1,85 @@ + + + + + + + +SDK for Polar sensors: PolarOhrPPIData.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarOhrPPIData.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.model;
3 
4 import java.util.List;
5 
10 public class PolarOhrPPIData {
11 
12  public static class PolarOhrPPISample {
13 
17  public int ppi;
18 
22  public int errorEstimate;
23 
27  public int hr;
28 
32  public boolean blockerBit;
33 
37  public boolean skinContactStatus;
38 
42  public boolean skinContactSupported;
43 
44  public PolarOhrPPISample(int ppi, int errorEstimate, int hr, boolean blockerBit, boolean skinContactStatus, boolean skinContactSupported) {
45  this.ppi = ppi;
46  this.errorEstimate = errorEstimate;
47  this.hr = hr;
48  this.blockerBit = blockerBit;
49  this.skinContactStatus = skinContactStatus;
50  this.skinContactSupported = skinContactSupported;
51  }
52  }
53 
57  public long timeStamp;
58 
59 
65  public List<PolarOhrPPISample> samples;
66 
67  public PolarOhrPPIData(long timeStamp, List<PolarOhrPPISample> samples) {
68  this.timeStamp = timeStamp;
69  this.samples = samples;
70  }
71 }
+ +
PolarOhrPPIData(long timeStamp, List< PolarOhrPPISample > samples)
+ +
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarOperationNotSupported_8java.html b/polar-sdk-android/docs/html/PolarOperationNotSupported_8java.html new file mode 100644 index 00000000..e515bbfb --- /dev/null +++ b/polar-sdk-android/docs/html/PolarOperationNotSupported_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarOperationNotSupported.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarOperationNotSupported.java File Reference
+
+ +
+ + + + diff --git a/polar-sdk-android/docs/html/PolarOperationNotSupported_8java_source.html b/polar-sdk-android/docs/html/PolarOperationNotSupported_8java_source.html new file mode 100644 index 00000000..b1216ceb --- /dev/null +++ b/polar-sdk-android/docs/html/PolarOperationNotSupported_8java_source.html @@ -0,0 +1,82 @@ + + + + + + + +SDK for Polar sensors: PolarOperationNotSupported.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarOperationNotSupported.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.errors;
3 
7 public class PolarOperationNotSupported extends Exception {
8 }
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarSensorSetting_8java.html b/polar-sdk-android/docs/html/PolarSensorSetting_8java.html new file mode 100644 index 00000000..9f6ac0c9 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarSensorSetting_8java.html @@ -0,0 +1,101 @@ + + + + + + + +SDK for Polar sensors: PolarSensorSetting.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarSensorSetting.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + + + +

+Data Structures

class  polar.com.sdk.api.model.PolarSensorSetting
 
enum  polar.com.sdk.api.model.PolarSensorSetting.SettingType
 
class  polar.com.sdk.api.model.PolarSensorSetting.Builder
 
+ + + +

+Packages

package  polar.com.sdk.api.model
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarSensorSetting_8java_source.html b/polar-sdk-android/docs/html/PolarSensorSetting_8java_source.html new file mode 100644 index 00000000..9cb187bb --- /dev/null +++ b/polar-sdk-android/docs/html/PolarSensorSetting_8java_source.html @@ -0,0 +1,95 @@ + + + + + + + +SDK for Polar sensors: PolarSensorSetting.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarSensorSetting.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.model;
3 
4 import com.androidcommunications.polar.api.ble.model.gatt.client.BlePMDClient;
5 
6 import java.util.Arrays;
7 import java.util.Collections;
8 import java.util.HashMap;
9 import java.util.HashSet;
10 import java.util.List;
11 import java.util.Map;
12 import java.util.Set;
13 
14 public class PolarSensorSetting {
15 
16  public enum SettingType {
19  RANGE(2);
21  private int numVal;
22  SettingType(int numVal) {
23  this.numVal = numVal;
24  }
25  public int getNumVal() {
26  return numVal;
27  }
28  }
29 
30  public Map<SettingType,Set<Integer>> settings;
31  private BlePMDClient.PmdMeasurementType type;
32 
38  public PolarSensorSetting(Map<BlePMDClient.PmdSetting.PmdSettingType,Set<Integer>> settings,
39  BlePMDClient.PmdMeasurementType type) {
40  this.settings = new HashMap<>();
41  this.type = type;
42  for(Map.Entry<BlePMDClient.PmdSetting.PmdSettingType,Set<Integer>> e : settings.entrySet()){
43  this.settings.put(SettingType.values()[e.getKey().getNumVal()],e.getValue());
44  }
45  }
46 
51  public PolarSensorSetting(Map<SettingType, Integer> settings) {
52  this.settings = new HashMap<>();
53  for(Map.Entry<SettingType,Integer> e : settings.entrySet()) {
54  this.settings.put(e.getKey(), new HashSet<>(Collections.singletonList(e.getValue())));
55  }
56  }
57 
62  public BlePMDClient.PmdSetting map2PmdSettings(){
63  Map<BlePMDClient.PmdSetting.PmdSettingType,Integer> selected = new HashMap<>();
64  for(Map.Entry<SettingType,Set<Integer>> e : settings.entrySet()){
65  selected.put(BlePMDClient.PmdSetting.PmdSettingType.values()[e.getKey().numVal],
66  Collections.max(e.getValue()));
67  }
68  return new BlePMDClient.PmdSetting(selected);
69  }
70 
76  Map<SettingType,Integer> selected = new HashMap<>();
77  for(Map.Entry<SettingType,Set<Integer>> e : settings.entrySet()){
78  selected.put(e.getKey(), Collections.max(e.getValue()));
79  }
80  return new PolarSensorSetting(selected);
81  }
82 
83  public static class Builder {
84  public Map<SettingType,Integer> selected = new HashMap<>();
85 
86  private Builder() {
87  }
88 
89  public static Builder newBuilder() {
90  return new Builder();
91  }
92 
93  public Builder setSampleRate(int rate){
94  selected.put(SettingType.SAMPLE_RATE,rate);
95  return this;
96  }
97 
98  public Builder setResolution(int resolution){
99  selected.put(SettingType.RESOLUTION,resolution);
100  return this;
101  }
102 
103  public Builder setRange(int range){
104  selected.put(SettingType.RANGE,range);
105  return this;
106  }
107 
108  public PolarSensorSetting build() {
109  return new PolarSensorSetting(selected);
110  }
111  }
112 }
+ + + +
Map< SettingType, Set< Integer > > settings
+ + + +
PolarSensorSetting(Map< BlePMDClient.PmdSetting.PmdSettingType, Set< Integer >> settings, BlePMDClient.PmdMeasurementType type)
+ + +
PolarSensorSetting(Map< SettingType, Integer > settings)
+ + +
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarServiceNotAvailable_8java.html b/polar-sdk-android/docs/html/PolarServiceNotAvailable_8java.html new file mode 100644 index 00000000..a8299f87 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarServiceNotAvailable_8java.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: PolarServiceNotAvailable.java File Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
PolarServiceNotAvailable.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + +

+Data Structures

class  polar.com.sdk.api.errors.PolarServiceNotAvailable
 
+ + + +

+Packages

package  polar.com.sdk.api.errors
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/PolarServiceNotAvailable_8java_source.html b/polar-sdk-android/docs/html/PolarServiceNotAvailable_8java_source.html new file mode 100644 index 00000000..6a522628 --- /dev/null +++ b/polar-sdk-android/docs/html/PolarServiceNotAvailable_8java_source.html @@ -0,0 +1,82 @@ + + + + + + + +SDK for Polar sensors: PolarServiceNotAvailable.java Source File + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
PolarServiceNotAvailable.java
+
+
+Go to the documentation of this file.
1 // Copyright © 2019 Polar Electro Oy. All rights reserved.
2 package polar.com.sdk.api.errors;
3 
7 public class PolarServiceNotAvailable extends Exception {
8 }
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/annotated.html b/polar-sdk-android/docs/html/annotated.html new file mode 100644 index 00000000..18cf2b8d --- /dev/null +++ b/polar-sdk-android/docs/html/annotated.html @@ -0,0 +1,116 @@ + + + + + + + +SDK for Polar sensors: Data Structures + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/polar-sdk-android/docs/html/annotated_dup.js b/polar-sdk-android/docs/html/annotated_dup.js new file mode 100644 index 00000000..edc69a6b --- /dev/null +++ b/polar-sdk-android/docs/html/annotated_dup.js @@ -0,0 +1,4 @@ +var annotated_dup = +[ + [ "polar", "namespacepolar.html", "namespacepolar" ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/bc_s.png b/polar-sdk-android/docs/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/polar-sdk-android/docs/html/bdwn.png b/polar-sdk-android/docs/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + +SDK for Polar sensors: Data Structure Index + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html new file mode 100644 index 00000000..a52037ad --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html @@ -0,0 +1,1494 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.PolarBleApi Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.PolarBleApi Class Referenceabstract
+
+
+
+Inheritance diagram for polar.com.sdk.api.PolarBleApi:
+
+
+ + +polar.com.sdk.impl.BDBleApiImpl + +
+ + + + + + + + +

+Data Structures

interface  PolarBleApiLogger
 
enum  RecordingInterval
 
enum  SampleType
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

abstract void shutDown ()
 
abstract boolean isFeatureReady (@NonNull final String deviceId, final int feature)
 
abstract void backgroundEntered ()
 
abstract void foregroundEntered ()
 
abstract void setApiCallback (@Nullable PolarBleApiCallback callback)
 
abstract void setApiLogger (@Nullable PolarBleApiLogger logger)
 
abstract void setAutomaticReconnection (boolean enable)
 
abstract Completable setLocalTime (@NonNull final String identifier, @NonNull final Date time)
 
abstract Single< PolarSensorSettingrequestAccSettings (@NonNull final String identifier)
 
abstract Single< PolarSensorSettingrequestEcgSettings (@NonNull final String identifier)
 
abstract Single< PolarSensorSettingrequestPpgSettings (@NonNull final String identifier)
 
abstract Single< PolarSensorSettingrequestBiozSettings (@NonNull final String identifier)
 
abstract Completable autoConnectToPolarDevice (int rssiLimit, int timeout, @NonNull TimeUnit unit, @Nullable final String polarDeviceType)
 
abstract Completable autoConnectToPolarDevice (int rssiLimit, final String polarDeviceType)
 
abstract void connectToPolarDevice (@NonNull final String identifier)
 
abstract void disconnectFromPolarDevice (@NonNull final String identifier)
 
abstract Completable startRecording (@NonNull final String identifier, @NonNull @Size(min=1, max=64) final String exerciseId, @NonNull RecordingInterval interval, @NonNull SampleType type)
 
abstract Completable stopRecording (@NonNull final String identifier)
 
abstract Single< Pair< Boolean, String > > requestRecordingStatus (@NonNull final String identifier)
 
abstract Flowable< PolarExerciseEntrylistExercises (@NonNull final String identifier)
 
abstract Single< PolarExerciseDatafetchExercise (@NonNull final String identifier, @NonNull final PolarExerciseEntry entry)
 
abstract Completable removeExercise (@NonNull final String identifier, @NonNull final PolarExerciseEntry entry)
 
abstract Flowable< PolarDeviceInfosearchForPolarDevice ()
 
abstract Flowable< PolarHrBroadcastDatastartListenForPolarHrBroadcasts (@Nullable final Set< String > deviceIds)
 
abstract Flowable< PolarEcgDatastartEcgStreaming (@NonNull final String identifier, @NonNull PolarSensorSetting sensorSetting)
 
abstract Flowable< PolarAccelerometerDatastartAccStreaming (@NonNull final String identifier, @NonNull PolarSensorSetting sensorSetting)
 
abstract Flowable< PolarOhrPPGDatastartOhrPPGStreaming (@NonNull final String identifier, @NonNull PolarSensorSetting sensorSetting)
 
abstract Flowable< PolarBiozDatastartBiozStreaming (@NonNull final String identifier, @NonNull PolarSensorSetting sensorSetting)
 
abstract Flowable< PolarOhrPPIDatastartOhrPPIStreaming (@NonNull final String identifier)
 
+ + + + + + + + + + + + + +

+Static Public Attributes

static final int FEATURE_HR = 1
 
static final int FEATURE_DEVICE_INFO = 2
 
static final int FEATURE_BATTERY_INFO = 4
 
static final int FEATURE_POLAR_SENSOR_STREAMING = 8
 
static final int FEATURE_POLAR_FILE_TRANSFER = 16
 
static final int ALL_FEATURES = 0xff
 
+ + + +

+Protected Member Functions

 PolarBleApi (final int features)
 
+ + + +

+Protected Attributes

int features
 
+

Detailed Description

+

Main class of the API.

+ +

Definition at line 33 of file PolarBleApi.java.

+

Constructor & Destructor Documentation

+ +

◆ PolarBleApi()

+ +
+
+ + + + + +
+ + + + + + + + +
polar.com.sdk.api.PolarBleApi.PolarBleApi (final int features)
+
+inlineprotected
+
+

Class constructor

Parameters
+ + +
featuresset of feature(s) or PolarBleApi::ALL_FEATURES
+
+
+ +

Definition at line 103 of file PolarBleApi.java.

+ +
+
+

Member Function Documentation

+ +

◆ autoConnectToPolarDevice() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
abstract Completable polar.com.sdk.api.PolarBleApi.autoConnectToPolarDevice (int rssiLimit,
int timeout,
@NonNull TimeUnit unit,
@Nullable final String polarDeviceType 
)
+
+abstract
+
+

Start connecting to a nearby Polar device. PolarBleApiCallback::polarDeviceConnected callback is invoked when connection to a nearby device is established.

Parameters
+ + + + + +
rssiLimitRSSI (Received Signal Strength Indication) value is typically from -40 to -60 (dBm), depends on the used Bluetooth chipset and/or antenna tuning
timeoutmin time to search nearby device default = 2s
unittime unit to be used
polarDeviceTypelike H10, OH1 etc... or null for any polar device
+
+
+
Returns
rx Completable, complete invoked when nearby device found, and connection attempt started. polarDeviceConnectionAttemptStarted callback invoked to inform connection attempt
+ +
+
+ +

◆ autoConnectToPolarDevice() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
abstract Completable polar.com.sdk.api.PolarBleApi.autoConnectToPolarDevice (int rssiLimit,
final String polarDeviceType 
)
+
+abstract
+
+ +
+
+ +

◆ backgroundEntered()

+ +
+
+ + + + + +
+ + + + + + + +
abstract void polar.com.sdk.api.PolarBleApi.backgroundEntered ()
+
+abstract
+
+

enables scan filter while on background

+ +
+
+ +

◆ connectToPolarDevice()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract void polar.com.sdk.api.PolarBleApi.connectToPolarDevice (@NonNull final String identifier)
+
+abstract
+
+

Request a connection to a Polar device. Invokes PolarBleApiCallback::polarDeviceConnected callback.

Parameters
+ + +
identifierPolar device id found printed on the sensor/device
+
+
+ +
+
+ +

◆ disconnectFromPolarDevice()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract void polar.com.sdk.api.PolarBleApi.disconnectFromPolarDevice (@NonNull final String identifier)
+
+abstract
+
+

Request disconnecting from a Polar device. Invokes PolarBleApiCallback::polarDeviceDisconnected callback.

Parameters
+ + +
identifierPolar device id found printed on the sensor/device
+
+
+ +
+
+ +

◆ fetchExercise()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
abstract Single<PolarExerciseData> polar.com.sdk.api.PolarBleApi.fetchExercise (@NonNull final String identifier,
@NonNull final PolarExerciseEntry entry 
)
+
+abstract
+
+

Fetch single exercise data requires feature PolarBleApi::FEATURE_POLAR_FILE_TRANSFER

Parameters
+ + + +
identifierPolar device id found printed on the sensor/device
entryPolarExerciseEntry object
+
+
+
Returns
Single stream
+
See also
polar.com.sdk.api.model.PolarExerciseData for details
+ +
+
+ +

◆ foregroundEntered()

+ +
+
+ + + + + +
+ + + + + + + +
abstract void polar.com.sdk.api.PolarBleApi.foregroundEntered ()
+
+abstract
+
+

disables scan filter while on foreground

+ +
+
+ +

◆ isFeatureReady()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
abstract boolean polar.com.sdk.api.PolarBleApi.isFeatureReady (@NonNull final String deviceId,
final int feature 
)
+
+abstract
+
+
Parameters
+ + + +
deviceIdpolar device id
featurefeature to be requested
+
+
+
Returns
true if feature is ready for use, FEATURE_POLAR_SENSOR_STREAMING or FEATURE_POLAR_FILE_TRANSFER is supported by this api function
+ +
+
+ +

◆ listExercises()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract Flowable<PolarExerciseEntry> polar.com.sdk.api.PolarBleApi.listExercises (@NonNull final String identifier)
+
+abstract
+
+

List all exercises stored in the device OH1/H10 requires feature PolarBleApi::FEATURE_POLAR_FILE_TRANSFER

Parameters
+ + +
identifierPolar device id found printed on the sensor/device
+
+
+
Returns
Flowable stream of entrys
+
See also
polar.com.sdk.api.model.PolarExerciseEntry for details
+ +
+
+ +

◆ removeExercise()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
abstract Completable polar.com.sdk.api.PolarBleApi.removeExercise (@NonNull final String identifier,
@NonNull final PolarExerciseEntry entry 
)
+
+abstract
+
+

Request to remove single exercise requires feature PolarBleApi::FEATURE_POLAR_FILE_TRANSFER

Parameters
+ + + +
identifierPolar device id
entryentry to be removed
+
+
+
Returns
Completable stream
+ +
+
+ +

◆ requestAccSettings()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract Single<PolarSensorSetting> polar.com.sdk.api.PolarBleApi.requestAccSettings (@NonNull final String identifier)
+
+abstract
+
+

request available acc settings requires feature PolarBleApi::FEATURE_POLAR_SENSOR_STREAMING

Parameters
+ + +
identifierpolar device id
+
+
+
Returns
Single stream
+ +
+
+ +

◆ requestBiozSettings()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract Single<PolarSensorSetting> polar.com.sdk.api.PolarBleApi.requestBiozSettings (@NonNull final String identifier)
+
+abstract
+
+ +
+
+ +

◆ requestEcgSettings()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract Single<PolarSensorSetting> polar.com.sdk.api.PolarBleApi.requestEcgSettings (@NonNull final String identifier)
+
+abstract
+
+

request available ecg settings requires feature PolarBleApi::FEATURE_POLAR_SENSOR_STREAMING

Parameters
+ + +
identifierpolar device id
+
+
+
Returns
Single stream
+ +
+
+ +

◆ requestPpgSettings()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract Single<PolarSensorSetting> polar.com.sdk.api.PolarBleApi.requestPpgSettings (@NonNull final String identifier)
+
+abstract
+
+

request available ppg settings requires feature PolarBleApi::FEATURE_POLAR_SENSOR_STREAMING

Parameters
+ + +
identifierpolar device id
+
+
+
Returns
Single stream
+ +
+
+ +

◆ requestRecordingStatus()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract Single<Pair<Boolean,String> > polar.com.sdk.api.PolarBleApi.requestRecordingStatus (@NonNull final String identifier)
+
+abstract
+
+

request current recording status only supported by H10, requires feature PolarBleApi::FEATURE_POLAR_FILE_TRANSFER

Parameters
+ + +
identifierpolar device id
+
+
+
Returns
Single stream Pair first recording status, second entryId if available
+ +
+
+ +

◆ searchForPolarDevice()

+ +
+
+ + + + + +
+ + + + + + + +
abstract Flowable<PolarDeviceInfo> polar.com.sdk.api.PolarBleApi.searchForPolarDevice ()
+
+abstract
+
+

Start searching for Polar device(s)

Returns
Flowable stream of polarDeviceInfo(s) Produces:
+ - onNext for any new Polar device detected
+ - onError if scan start fails
+ - onComplete non produced unless stream is further configured
+ +
+
+ +

◆ setApiCallback()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract void polar.com.sdk.api.PolarBleApi.setApiCallback (@Nullable PolarBleApiCallback callback)
+
+abstract
+
+
Parameters
+ + +
callback
+
+
+
See also
polar.com.sdk.api.PolarBleApiCallback
+ +
+
+ +

◆ setApiLogger()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract void polar.com.sdk.api.PolarBleApi.setApiLogger (@Nullable PolarBleApiLogger logger)
+
+abstract
+
+
Parameters
+ + +
logger
+
+
+
See also
polar.com.sdk.api.PolarBleApi.PolarBleApiLogger
+ +
+
+ +

◆ setAutomaticReconnection()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract void polar.com.sdk.api.PolarBleApi.setAutomaticReconnection (boolean enable)
+
+abstract
+
+

enable or disable automatic reconnection feature

Parameters
+ + +
enabletrue = automatic reconnection is enabled, false = automatic reconnection is disabled
+
+
+ +
+
+ +

◆ setLocalTime()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
abstract Completable polar.com.sdk.api.PolarBleApi.setLocalTime (@NonNull final String identifier,
@NonNull final Date time 
)
+
+abstract
+
+

set time to device affects on sensor data stream(s) timestamps requires feature PolarBleApi::FEATURE_POLAR_FILE_TRANSFER

Parameters
+ + + +
identifierpolar device id
timetime to set
+
+
+
Returns
Completable stream
+ +
+
+ +

◆ shutDown()

+ +
+
+ + + + + +
+ + + + + + + +
abstract void polar.com.sdk.api.PolarBleApi.shutDown ()
+
+abstract
+
+

Must be called when application is destroyed.

+ +
+
+ +

◆ startAccStreaming()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
abstract Flowable<PolarAccelerometerData> polar.com.sdk.api.PolarBleApi.startAccStreaming (@NonNull final String identifier,
@NonNull PolarSensorSetting sensorSetting 
)
+
+abstract
+
+

Start ACC (Accelerometer) stream. Stops ACC stream if the connection is closed, error occured during start or stream is disposed. Requires feature PolarBleApi::FEATURE_POLAR_SENSOR_STREAMING. Query available settings before stream start PolarBleApi::requestAccSettings

Parameters
+ + + +
identifierPolar device id
sensorSettingsettings to be used to start streaming
+
+
+
Returns
Flowable stream of Accelerometer data. Produces:
+ - onNext
+
See also
PolarAccelerometerData for details
+ - onError
+
+errors package for possible errors invoked
+ - onComplete non produced unless stream is further configured
+ +
+
+ +

◆ startBiozStreaming()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
abstract Flowable<PolarBiozData> polar.com.sdk.api.PolarBleApi.startBiozStreaming (@NonNull final String identifier,
@NonNull PolarSensorSetting sensorSetting 
)
+
+abstract
+
+ +
+
+ +

◆ startEcgStreaming()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
abstract Flowable<PolarEcgData> polar.com.sdk.api.PolarBleApi.startEcgStreaming (@NonNull final String identifier,
@NonNull PolarSensorSetting sensorSetting 
)
+
+abstract
+
+

Start the ECG (Electrocardiography) stream. Stops the ECG stream if the connection is closed, error occured during start or stream is disposed. Requires feature PolarBleApi::FEATURE_POLAR_SENSOR_STREAMING. Query available settings before stream start PolarBleApi::requestEcgSettings

Parameters
+ + + +
identifierPolar device id
sensorSettingsettings to be used to start streaming
+
+
+
Returns
Flowable stream of ECG data. Produces:
+ - onNext
+
See also
PolarEcgData.java for details
+ - onError
+
+errors package for possible errors invoked
+ - onComplete non produced unless stream is further configured
+ +
+
+ +

◆ startListenForPolarHrBroadcasts()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract Flowable<PolarHrBroadcastData> polar.com.sdk.api.PolarBleApi.startListenForPolarHrBroadcasts (@Nullable final Set< String > deviceIds)
+
+abstract
+
+

Starts listening to heart rate broadcast stream

Parameters
+ + +
deviceIdsset of Polar device ids. Null for a single Polar device
+
+
+
Returns
Flowable stream of heart rate broadcasts. Produces:
+ - onNext when new advertisement is detected based on deviceId list as filter
+ - onError if scan start fails
+ - onComplete non produced unless stream is further configured
+ +
+
+ +

◆ startOhrPPGStreaming()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
abstract Flowable<PolarOhrPPGData> polar.com.sdk.api.PolarBleApi.startOhrPPGStreaming (@NonNull final String identifier,
@NonNull PolarSensorSetting sensorSetting 
)
+
+abstract
+
+

Start OHR (Optical heart rate) PPG (Photoplethysmography) stream. Stops PPG stream if the connection is closed, error occured during start or stream is disposed. Requires feature PolarBleApi::FEATURE_POLAR_SENSOR_STREAMING. Query available settings before stream start PolarBleApi::requestPpgSettings

Parameters
+ + + +
identifierPolar device id
sensorSettingsettings to be used to start streaming
+
+
+
Returns
Flowable stream of OHR PPG data. Produces:
+ - onNext
+
See also
PolarOhrPPGData for details
+ - onError
+
+errors package for possible errors invoked
+ - onComplete non produced unless the stream is further configured
+ +
+
+ +

◆ startOhrPPIStreaming()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract Flowable<PolarOhrPPIData> polar.com.sdk.api.PolarBleApi.startOhrPPIStreaming (@NonNull final String identifier)
+
+abstract
+
+

Start OHR (Optical heart rate) PPI (Pulse to Pulse interval) stream. Notice that there is a delay before PPI data stream starts Requires feature PolarBleApi::FEATURE_POLAR_SENSOR_STREAMING.

Parameters
+ + +
identifierPolar device id
+
+
+
Returns
Flowable stream of OHR PPI data. Produces:
+ - onNext
+
See also
PolarOhrPPIData for details
+ - onError
+
+errors package for possible errors invoked
+ - onComplete non produced unless the stream is further configured
+ +
+
+ +

◆ startRecording()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
abstract Completable polar.com.sdk.api.PolarBleApi.startRecording (@NonNull final String identifier,
@NonNull @Size(min=1, max=64) final String exerciseId,
@NonNull RecordingInterval interval,
@NonNull SampleType type 
)
+
+abstract
+
+

request start recording only supported by H10, requires feature PolarBleApi::FEATURE_POLAR_FILE_TRANSFER

Parameters
+ + + + + +
identifierpolar device id
exerciseIdunique id for exercise entry
intervalrecording interval to be used
typesample type to be used
+
+
+
Returns
Completable stream
+ +
+
+ +

◆ stopRecording()

+ +
+
+ + + + + +
+ + + + + + + + +
abstract Completable polar.com.sdk.api.PolarBleApi.stopRecording (@NonNull final String identifier)
+
+abstract
+
+

request stop recording only supported by H10, requires feature PolarBleApi::FEATURE_POLAR_FILE_TRANSFER

Parameters
+ + +
identifierpolar device id
+
+
+
Returns
Completable stream
+ +
+
+

Field Documentation

+ +

◆ ALL_FEATURES

+ +
+
+ + + + + +
+ + + + +
final int polar.com.sdk.api.PolarBleApi.ALL_FEATURES = 0xff
+
+static
+
+

all features mask

+ +

Definition at line 95 of file PolarBleApi.java.

+ +
+
+ +

◆ FEATURE_BATTERY_INFO

+ +
+
+ + + + + +
+ + + + +
final int polar.com.sdk.api.PolarBleApi.FEATURE_BATTERY_INFO = 4
+
+static
+
+

bas feature to receive battery level info.

+ +

Definition at line 83 of file PolarBleApi.java.

+ +
+
+ +

◆ FEATURE_DEVICE_INFO

+ +
+
+ + + + + +
+ + + + +
final int polar.com.sdk.api.PolarBleApi.FEATURE_DEVICE_INFO = 2
+
+static
+
+

dis feature to receive sw information.

+ +

Definition at line 79 of file PolarBleApi.java.

+ +
+
+ +

◆ FEATURE_HR

+ +
+
+ + + + + +
+ + + + +
final int polar.com.sdk.api.PolarBleApi.FEATURE_HR = 1
+
+static
+
+

hr feature to receive hr and rr data.

+ +

Definition at line 75 of file PolarBleApi.java.

+ +
+
+ +

◆ FEATURE_POLAR_FILE_TRANSFER

+ +
+
+ + + + + +
+ + + + +
final int polar.com.sdk.api.PolarBleApi.FEATURE_POLAR_FILE_TRANSFER = 16
+
+static
+
+

polar file transfer feature to read exercises from device

+ +

Definition at line 91 of file PolarBleApi.java.

+ +
+
+ +

◆ FEATURE_POLAR_SENSOR_STREAMING

+ +
+
+ + + + + +
+ + + + +
final int polar.com.sdk.api.PolarBleApi.FEATURE_POLAR_SENSOR_STREAMING = 8
+
+static
+
+

polar sensor streaming for ecg, acc, ppg, ppi, etc...

+ +

Definition at line 87 of file PolarBleApi.java.

+ +
+
+ +

◆ features

+ +
+
+ + + + + +
+ + + + +
int polar.com.sdk.api.PolarBleApi.features
+
+protected
+
+ +

Definition at line 97 of file PolarBleApi.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.js b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.js new file mode 100644 index 00000000..be575377 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.js @@ -0,0 +1,37 @@ +var classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi = +[ + [ "PolarBleApiLogger", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger.html", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger" ], + [ "RecordingInterval", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval.html", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval" ], + [ "SampleType", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType.html", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType" ], + [ "PolarBleApi", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#afa663962cfcfa76ea7140315074ba39f", null ], + [ "autoConnectToPolarDevice", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#aed92cfd7807194a6a82d708bdee2a313", null ], + [ "autoConnectToPolarDevice", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#ab8f30183f9ee4d1a0cc229e06f4f5d5b", null ], + [ "backgroundEntered", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a5397f7034f2f36820910b65d84b45b1c", null ], + [ "connectToPolarDevice", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a1d83a0eec58e4a36f095207dcee71a6c", null ], + [ "disconnectFromPolarDevice", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a90a6c60c7f16506e93745cd4111a5b25", null ], + [ "fetchExercise", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a63713c5d8a89dee1d2e769068e803bed", null ], + [ "foregroundEntered", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#aede0baa6824966c902f5981a3d2e3f72", null ], + [ "isFeatureReady", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a551ad9f20c37fba8d7e1ad08c6c1b258", null ], + [ "listExercises", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a8fadd778436185235f0d579077504d0b", null ], + [ "removeExercise", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a914fe430c1ab1cd41f9a3ed72ccacda6", null ], + [ "requestAccSettings", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a08884e4115932e7917d190daf15ddff1", null ], + [ "requestBiozSettings", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#aa29e34cea992198209979e5c780b0d81", null ], + [ "requestEcgSettings", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#ab3027dbef46fdc8d3bc15348b494d6bc", null ], + [ "requestPpgSettings", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#ae34d02d96a9fac60edde6d7b3f61a2d5", null ], + [ "requestRecordingStatus", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a2f95d2c9b7c9963c3b7fa5d7c2949e43", null ], + [ "searchForPolarDevice", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a19008b45f93c7ef985a4e47df77674dc", null ], + [ "setApiCallback", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a4682d9318c9ac41927694421bde349a5", null ], + [ "setApiLogger", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#ac92b34d91563bb7a208818dd4358b260", null ], + [ "setAutomaticReconnection", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a32484f5b3bacdde45573298a4e1d12a5", null ], + [ "setLocalTime", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a29176c44198372ae4215d9de9a89c5b7", null ], + [ "shutDown", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#ab6dec221f95ea5dce6118cadeb362006", null ], + [ "startAccStreaming", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a11aa139fffa100c346c13a23fdedfe71", null ], + [ "startBiozStreaming", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a36bcd4eb256abc810de32d3dbdfdf9e2", null ], + [ "startEcgStreaming", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a24e95523c086c9c3818dabc81358d54c", null ], + [ "startListenForPolarHrBroadcasts", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a6cfd8b8ffa6ccf0a1763d54017825814", null ], + [ "startOhrPPGStreaming", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a72fb1fff72cefb0a594537439e77ce30", null ], + [ "startOhrPPIStreaming", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#ac2737c48f2aad83fd535d34134e43d17", null ], + [ "startRecording", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a20700bbdf15b3ea25c632814d3bde8a2", null ], + [ "stopRecording", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#afe25cdd5414973383db68bffc75d492f", null ], + [ "features", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html#a6b3b45f899b318df179c9779f9faaf48", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.png b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.png new file mode 100644 index 0000000000000000000000000000000000000000..d2cb18cea9fc51d61da2f8539f2483ee2e1d4644 GIT binary patch literal 771 zcmeAS@N?(olHy`uVBq!ia0vp^M}atigBeK9^K~==QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;IbjkbwCthE> zMa3ce`uocZ{mQDBOHG>K%P)+%y<-fsQOM^#zy4xHU%10xz@80qHCD?k@@bfz1>nHx!OkE`Qz-}tn+Y_In zF5M{VzN)jZ)cECmpz(g5tIk`@f9dM{aMs)D7oV+lo_aoaeOc+R)5cs4o$%05lYlGz0eUiFpLf7V(5*qhPcvw!ignzwzEmYBc%`sJ}lJ};N2)oT7g tk4vedB9lzoo17*+yD(Sj`JDCZ + + + + + + +SDK for Polar sensors: polar.com.sdk.api.PolarBleApiDefaultImpl Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.PolarBleApiDefaultImpl Class Reference
+
+
+ + + + + + +

+Static Public Member Functions

static PolarBleApi defaultImplementation (final Context context, int features)
 
static String versionInfo ()
 
+

Detailed Description

+

Simply returns a new default implementation of the API.

+ +

Definition at line 13 of file PolarBleApiDefaultImpl.java.

+

Member Function Documentation

+ +

◆ defaultImplementation()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static PolarBleApi polar.com.sdk.api.PolarBleApiDefaultImpl.defaultImplementation (final Context context,
int features 
)
+
+inlinestatic
+
+

Default implementation constructor for the API.

Parameters
+ + + +
contextwhere API implementation callbacks are run
features
+
+
+
See also
polar.com.sdk.api.PolarBleApi feature flags
+
Returns
default Polar API implementation
+ +

Definition at line 20 of file PolarBleApiDefaultImpl.java.

+ +
+
+ +

◆ versionInfo()

+ +
+
+ + + + + +
+ + + + + + + +
static String polar.com.sdk.api.PolarBleApiDefaultImpl.versionInfo ()
+
+inlinestatic
+
+
Returns
SDK version number in format major.minor.patch
+ +

Definition at line 27 of file PolarBleApiDefaultImpl.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceDisconnected.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceDisconnected.html new file mode 100644 index 00000000..d6cdb19b --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceDisconnected.html @@ -0,0 +1,94 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.errors.PolarDeviceDisconnected Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
polar.com.sdk.api.errors.PolarDeviceDisconnected Class Reference
+
+
+
+Inheritance diagram for polar.com.sdk.api.errors.PolarDeviceDisconnected:
+
+
+ +
+

Detailed Description

+

Polar device disconnected

+ +

Definition at line 7 of file PolarDeviceDisconnected.java.

+

The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceDisconnected.png b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceDisconnected.png new file mode 100644 index 0000000000000000000000000000000000000000..5dafb971eb71d35eced6e2982667bf5910a44a29 GIT binary patch literal 854 zcmeAS@N?(olHy`uVBq!ia0y~yVAKP$12~w0pTdOA+JCmcH|1sQ*ij6I#H>=`V#)clvT z{TlB{>vmp$vcGj*`X}4oX*0K}eD#?A{CV_bbx-+6a+|Xw3%e)iYOdTn%f|B;kNM5r zamDGyH%?m5n6l)2!Q{QGFK^Z8(er#|p?7Svr&#Rr=)D`u{}#obKD66Ha)18YlRs9M zdS2>@J|+rvLveiUq!Q~z-ji~WvD_}Oa~TiF{$%1{;Je8B;L}&pcm_2PV*`*Ocaimj zxQkeWZwccK7jf!RXJbo4Lt9sAv2!Uf>`~vvkh6&UfEt8KTl9K4pZwc2-~a1QKb4qe zD(AI){*70E6KrZHU%&nTGV23lo}w$M$9@EdzAv?vn|5yg$;n^)BeTDVMj2P zHh)hQ8pgfKlIE4nFYW#RW9qtnFK-64&$PH)8ueDfe|e((v4`5udoSNK@BUEID_MO# z=fmSYb8~|y@6FyMQ5)Mny|cmjNLkU&^0{++?y9$QwLeZ+e}7KU`FQgyUmI?VC;YbY znfFUY{>>u9$%JZSVQ;%Wx3#JV>&l@%{6gZ;9=UM0Q f(9jjDjD9ee>h3%y$`B9@%mfUcu6{1-oD!M<`zeWi literal 0 HcmV?d00001 diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotConnected.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotConnected.html new file mode 100644 index 00000000..86c9805b --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotConnected.html @@ -0,0 +1,94 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.errors.PolarDeviceNotConnected Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
polar.com.sdk.api.errors.PolarDeviceNotConnected Class Reference
+
+
+
+Inheritance diagram for polar.com.sdk.api.errors.PolarDeviceNotConnected:
+
+
+ +
+

Detailed Description

+

Polar device is not currently connected

+ +

Definition at line 7 of file PolarDeviceNotConnected.java.

+

The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotConnected.png b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotConnected.png new file mode 100644 index 0000000000000000000000000000000000000000..aa57ee009a10b6b66263cdae912193f2612a5914 GIT binary patch literal 866 zcmeAS@N?(olHy`uVBq!ia0y~yU^E1>12~w0q+7}+K_Dd&;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|!1U46#WAFU@$KBZlRjw)xQ5?9Q}^He zUx*JAqf+gvG@q+Cm!4K>nV-h_MORQzO({vxX;P1hZesGJDF=_KXg2qH2C+#`Ucz(V zEbLOhif`qfy_fg@DovhLa`vp*LEoOedgqUZT#Md$mCuDz)9a*KFMMwQKTU zp`gEOPpQ20zVl3`di{dfWs}_$(L;VE!Ev&ASl=^0JNPG)s7hwzt>C2zfJQkj-9r~B)g`{T6U3$%+d9` z3!@v1bGLrKd|#3|V)>cetQ^B*iiMKsIu_U!V9Vf(`G zD%+Mu*S%`md(G}(pw01HE916r?bGOg^xS{x`rdVUQDh*lMzH0K@ z-H{nlCQ`HW?yvvWwC$G7yt_9vSL{oONEErdqq6q;`i;ett3Jxyb7y~_o%>K`c5gx4 z-p$I{MSZ?yPj_v6m#Fk$%em*Km!IFz2!FTuTjYxKeC~g>^7q=E%~?I={*vWdFU>M5 z1kP`h{C@1S#_c&#Z{Io2dOIurxmQE{!|zpWKZ>D|XkjGXz_ + + + + + + +SDK for Polar sensors: polar.com.sdk.api.errors.PolarDeviceNotFound Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
polar.com.sdk.api.errors.PolarDeviceNotFound Class Reference
+
+
+
+Inheritance diagram for polar.com.sdk.api.errors.PolarDeviceNotFound:
+
+
+ +
+

Detailed Description

+

Polar device is not known

+ +

Definition at line 7 of file PolarDeviceNotFound.java.

+

The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotFound.png b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotFound.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4b04020ea5e14be55dd0237103ddba9b1416e9 GIT binary patch literal 836 zcmeAS@N?(olHy`uVBq!ia0y~yV3Yu|12~w061g=hP+@nCRX%#ezcO3kBdv|1Qq3#GGfY}yvR6Tz*wx-(<-&{*Sq&$ z`3xtOoMrEM^u2TE{5UMX!+AATnJV{KCJPvfLxTXx=%# z&tpj{D-Qzk!^1~BE~O_JPP&4OH*|D%7zhfoHuOK_KEM#7!J z{mA(?T-QIXeI;eoE-8B4{0{fFsMqnc&)W%IdK{H~zDR%H-=%ZBPv2>E-v0f@&#cp? z`)gc09Iqw6&B+YRnYy9hJ=$??*}U^=&n8@nxe%7Id-ARV3B%(DR*I)~I4)W2_w>)j z*-tjlcl$r0IAGrKd+EDY5dD6F?K}UNy+V?%(FnNmA)McJV-8Z>z zZ=d2>Z<$o5@a%`^`Xgr!e=ica=DK9x@|9-KgWb;D>wT&Fzk9}I(`PzCp33VD-P`|4 z6&p>RCvJTAi|kqMNbP4I{_Kp+;Be9{)Ssk{dPgbz<=qkho(Q*7-wYH z%uBtycUkO8wY%@U81^4}@5=T=7aD7qmM|NLF&8uoJ1eWuh_qadE0X%b6}EZ N@O1TaS?83{1OWc1aclqp literal 0 HcmV?d00001 diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarNotificationNotEnabled.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarNotificationNotEnabled.html new file mode 100644 index 00000000..6d0864d5 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarNotificationNotEnabled.html @@ -0,0 +1,94 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.errors.PolarNotificationNotEnabled Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
polar.com.sdk.api.errors.PolarNotificationNotEnabled Class Reference
+
+
+
+Inheritance diagram for polar.com.sdk.api.errors.PolarNotificationNotEnabled:
+
+
+ +
+

Detailed Description

+

Characteristic notification is not enabled

+ +

Definition at line 7 of file PolarNotificationNotEnabled.java.

+

The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarNotificationNotEnabled.png b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarNotificationNotEnabled.png new file mode 100644 index 0000000000000000000000000000000000000000..1288c1d2ff9254303877b7b581365869ea75da00 GIT binary patch literal 898 zcmeAS@N?(olHy`uVBq!ia0y~yV6+6X12~w0Wa#EkPl1#~fKQ0)|NsAi%olIImi8Z- z0AzvjfddCvJMYK?xf~@ye!&btMIdnXREQA+1GAu~i(^OyjpXfKquJ~|sp>py1)5XPG|6bSoxMSP>_4UrPRca?&zuj4;GJAF% zXXYQC+(}>dWpsTIW@Z&n`Rbc}ej1Wvkm&X6l|ZV-)?KSk69O z`OZ1Fwyt;U)n_U%jlcJvd#19o>8xi^>+ac;msBSK9dQsU!U`1N;x85yR8x8+#jyP; z`vHcSBhMJP{``rMJy4p%x8Q*DoU4p6$DT1{-H>)*oz1)=p_oAwDBg6IF=T^f1D6?l zz`S~p}UkZi4<-3ahm747M8!LVP^to4ebr#+H zaJDJ)=AC=e|EF6veBP7hd4Ag7b9wXYCY}6Hd1d(-+qx}3f*C*`M(*``~9GLapj9QE6Z<|<>lSV zl|L_8ykG8#|Fb^7&sXjw&a<9neAfKg&fGVjZORLx{AWu~e)7`Be9cB_yYtV|Kiyfg z?OW=%t)=m<*Zw(A%nsF`-@N5{(cuWmpjy9=Je{R0O*CiO<*!ekyk=&5e&1ueFOP3= zeNg{%_Y6b)VMwgDZWUsZXedUF-$RFETv|Fib{w-`)_dUm`U8s$ff + + + + + + +SDK for Polar sensors: polar.com.sdk.api.errors.PolarOperationNotSupported Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
polar.com.sdk.api.errors.PolarOperationNotSupported Class Reference
+
+
+
+Inheritance diagram for polar.com.sdk.api.errors.PolarOperationNotSupported:
+
+
+ +
+

Detailed Description

+

Requested operation is not supported

+ +

Definition at line 7 of file PolarOperationNotSupported.java.

+

The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarOperationNotSupported.png b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarOperationNotSupported.png new file mode 100644 index 0000000000000000000000000000000000000000..e2a491da5c9276953e5385ad38d2825d66a6ec61 GIT binary patch literal 904 zcmeAS@N?(olHy`uVBq!ia0y~yV6+3W12~w0x|i~m2%%=1_BJJa9OM0auA z@>AUEep$`4{`A>z`@Y|~HAih`bEN05=)7&;RcpJ0UQb>UeC(+8>=vL+!bLB4Z1^5| zKjppk%01`jZ~GKAUnTazwV#nN%j;_=l|&;uC%JY~$g_p|N{3urL>P7$+cU5&X!^<+ z^7H3L`v#?J>;X>`&;Mh{ijY6>|G+1PQxWnGlCPOHl4}`K*YGds`N}wDqg{g$P}#9x zlt|u*jdyA3>{#KzAkpw1)x??1wV})VpZCfA)q4_jtxx{kcE+l-l{&oDpFh7UUJ}Xm zzW%?T{DIQAz)u$bdCXtVywh70bc1{1x);?kIuqlTe@{PYThxB-O4akbJGSM=UZ0RV zW9j41%X4p3nNChVlYV-q_ioM~e=_Ia-+XWOb-UZUZ}r9Ac-xq}VD6mUCoi+4FV;P` zJ!f{JYK_+=;ggwMzxQo5eUf+lr^)-d_wN|L+Eu#v#_{W=bJ}v1`ZurdzujZ%8{YBk zM6{Q6|iUojgn+)qG_cK%vHK{cgC2kO6<9DZ3+s#grmHVmGwelF{r G5}E)jT(+D5 literal 0 HcmV?d00001 diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarServiceNotAvailable.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarServiceNotAvailable.html new file mode 100644 index 00000000..dff82821 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarServiceNotAvailable.html @@ -0,0 +1,94 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.errors.PolarServiceNotAvailable Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
polar.com.sdk.api.errors.PolarServiceNotAvailable Class Reference
+
+
+
+Inheritance diagram for polar.com.sdk.api.errors.PolarServiceNotAvailable:
+
+
+ +
+

Detailed Description

+

GATT (Generic attributes) service not available

+ +

Definition at line 7 of file PolarServiceNotAvailable.java.

+

The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarServiceNotAvailable.png b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarServiceNotAvailable.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec8715d368baac20435d4254bafcdf5726422ef GIT binary patch literal 883 zcmeAS@N?(olHy`uVBq!ia0y~yVAKV&12~w0Wc9bpazz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-op(+sDFD=GQ7xG*|R>QUKyWSh#$u3XO`(c6=jXl+yV4851V zTGnKe$T}mX&w~7iTDk*UZFt9yPMYY3d?sMPtTafwq-^*0vHGXJz{N{ zm0FAT<)1xPH)qFY-KM#%#T>q10ZsJaz6`@@Ez#PKh>FVdQ&MBb@0KTlGlmGw# literal 0 HcmV?d00001 diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData.html new file mode 100644 index 00000000..19aa5079 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData.html @@ -0,0 +1,191 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.model.PolarAccelerometerData Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.model.PolarAccelerometerData Class Reference
+
+
+ + + + +

+Data Structures

class  PolarAccelerometerSample
 
+ + + +

+Public Member Functions

 PolarAccelerometerData (List< PolarAccelerometerSample > samples, long timeStamp)
 
+ + + + + +

+Data Fields

List< PolarAccelerometerSample > samples
 
long timeStamp
 
+

Detailed Description

+

For accelerometer data.

+ +

Definition at line 9 of file PolarAccelerometerData.java.

+

Constructor & Destructor Documentation

+ +

◆ PolarAccelerometerData()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
polar.com.sdk.api.model.PolarAccelerometerData.PolarAccelerometerData (List< PolarAccelerometerSample > samples,
long timeStamp 
)
+
+inline
+
+

Class constructor

Parameters
+ + + +
sampleslist of Accelerometer data samples
timeStampin nanoseconds
+
+
+ +

Definition at line 52 of file PolarAccelerometerData.java.

+ +
+
+

Field Documentation

+ +

◆ samples

+ +
+
+ + + + +
List<PolarAccelerometerSample> polar.com.sdk.api.model.PolarAccelerometerData.samples
+
+

Acceleration samples list. Each sample contains signed x,y,z axis value in millig

+ +

Definition at line 40 of file PolarAccelerometerData.java.

+ +
+
+ +

◆ timeStamp

+ +
+
+ + + + +
long polar.com.sdk.api.model.PolarAccelerometerData.timeStamp
+
+

Last sample timestamp in nanoseconds.

+ +

Definition at line 45 of file PolarAccelerometerData.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData.js b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData.js new file mode 100644 index 00000000..5c0479f5 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData.js @@ -0,0 +1,6 @@ +var classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData = +[ + [ "PolarAccelerometerData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData.html#a459dbae3911754eba000394aae8c7d28", null ], + [ "samples", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData.html#af1282a045b75ee338ac6ef33f0bd2726", null ], + [ "timeStamp", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData.html#a8c127680c13a42a3941f8a9f7decf198", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData.html new file mode 100644 index 00000000..d6913fad --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData.html @@ -0,0 +1,178 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.model.PolarBiozData Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.model.PolarBiozData Class Reference
+
+
+ + + + +

+Public Member Functions

 PolarBiozData (long timeStamp, List< Integer > samples)
 
+ + + + + +

+Data Fields

long timeStamp
 
List< Integer > samples
 
+

Detailed Description

+

For bioz data

+ +

Definition at line 9 of file PolarBiozData.java.

+

Constructor & Destructor Documentation

+ +

◆ PolarBiozData()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
polar.com.sdk.api.model.PolarBiozData.PolarBiozData (long timeStamp,
List< Integer > samples 
)
+
+inline
+
+ +

Definition at line 21 of file PolarBiozData.java.

+ +
+
+

Field Documentation

+ +

◆ samples

+ +
+
+ + + + +
List<Integer> polar.com.sdk.api.model.PolarBiozData.samples
+
+

Bioz sample list. Each sample in signed 20bit adc value.

+ +

Definition at line 19 of file PolarBiozData.java.

+ +
+
+ +

◆ timeStamp

+ +
+
+ + + + +
long polar.com.sdk.api.model.PolarBiozData.timeStamp
+
+

Last sample timestamp in nanoseconds.

+ +

Definition at line 14 of file PolarBiozData.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData.js b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData.js new file mode 100644 index 00000000..0519db49 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData.js @@ -0,0 +1,6 @@ +var classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData = +[ + [ "PolarBiozData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData.html#a73ace427af9328e21ff151fbf06f0e7a", null ], + [ "samples", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData.html#a829694108df47c3f5276f2dd845f398a", null ], + [ "timeStamp", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData.html#a8bb9752d020c3b3948ed97c334fc3858", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.html new file mode 100644 index 00000000..2735d3ba --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.html @@ -0,0 +1,228 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.model.PolarDeviceInfo Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.model.PolarDeviceInfo Class Reference
+
+
+ + + + +

+Public Member Functions

 PolarDeviceInfo (String deviceId, int rssi, String name, boolean isConnectable)
 
+ + + + + + + + + +

+Data Fields

String deviceId
 
int rssi
 
String name
 
boolean isConnectable
 
+

Detailed Description

+

Contains information about the current Polar device.

+ +

Definition at line 8 of file PolarDeviceInfo.java.

+

Constructor & Destructor Documentation

+ +

◆ PolarDeviceInfo()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
polar.com.sdk.api.model.PolarDeviceInfo.PolarDeviceInfo (String deviceId,
int rssi,
String name,
boolean isConnectable 
)
+
+inline
+
+ +

Definition at line 30 of file PolarDeviceInfo.java.

+ +
+
+

Field Documentation

+ +

◆ deviceId

+ +
+
+ + + + +
String polar.com.sdk.api.model.PolarDeviceInfo.deviceId
+
+

Polar device id.

+ +

Definition at line 13 of file PolarDeviceInfo.java.

+ +
+
+ +

◆ isConnectable

+ +
+
+ + + + +
boolean polar.com.sdk.api.model.PolarDeviceInfo.isConnectable
+
+

true adv type is connectable

+ +

Definition at line 28 of file PolarDeviceInfo.java.

+ +
+
+ +

◆ name

+ +
+
+ + + + +
String polar.com.sdk.api.model.PolarDeviceInfo.name
+
+

Device name.

+ +

Definition at line 23 of file PolarDeviceInfo.java.

+ +
+
+ +

◆ rssi

+ +
+
+ + + + +
int polar.com.sdk.api.model.PolarDeviceInfo.rssi
+
+

Received signal strength indication value in dBm.

+ +

Definition at line 18 of file PolarDeviceInfo.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.js b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.js new file mode 100644 index 00000000..ec5fa2ee --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.js @@ -0,0 +1,8 @@ +var classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo = +[ + [ "PolarDeviceInfo", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.html#aed416474c90f11ad82f64bd92b22abca", null ], + [ "deviceId", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.html#a2f7aa585b18928015513d7380ef1f262", null ], + [ "isConnectable", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.html#a54043fda62d448654f3da9af053cf992", null ], + [ "name", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.html#a9a04fb7bb773d7d8472a980ebd65f72c", null ], + [ "rssi", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.html#a5acb7f17a42b81d6770f0b9ea0e57d38", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData.html new file mode 100644 index 00000000..277da122 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData.html @@ -0,0 +1,178 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.model.PolarEcgData Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.model.PolarEcgData Class Reference
+
+
+ + + + +

+Public Member Functions

 PolarEcgData (List< Integer > samples, long timeStamp)
 
+ + + + + +

+Data Fields

List< Integer > samples
 
long timeStamp
 
+

Detailed Description

+

For electrocardiography data.

+ +

Definition at line 10 of file PolarEcgData.java.

+

Constructor & Destructor Documentation

+ +

◆ PolarEcgData()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
polar.com.sdk.api.model.PolarEcgData.PolarEcgData (List< Integer > samples,
long timeStamp 
)
+
+inline
+
+ +

Definition at line 22 of file PolarEcgData.java.

+ +
+
+

Field Documentation

+ +

◆ samples

+ +
+
+ + + + +
List<Integer> polar.com.sdk.api.model.PolarEcgData.samples
+
+

ECG samples in microVolts.

+ +

Definition at line 15 of file PolarEcgData.java.

+ +
+
+ +

◆ timeStamp

+ +
+
+ + + + +
long polar.com.sdk.api.model.PolarEcgData.timeStamp
+
+

Last sample timestamp in nanoseconds.

+ +

Definition at line 20 of file PolarEcgData.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData.js b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData.js new file mode 100644 index 00000000..17274c9f --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData.js @@ -0,0 +1,6 @@ +var classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData = +[ + [ "PolarEcgData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData.html#a9008b7c62e04b6a1ddc4c5185ac12c92", null ], + [ "samples", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData.html#ada1308240af27f3795129dd517cb715c", null ], + [ "timeStamp", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData.html#ab167047f571d957fb1fa15065f05a364", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData.html new file mode 100644 index 00000000..03ad5b85 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData.html @@ -0,0 +1,178 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.model.PolarExerciseData Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.model.PolarExerciseData Class Reference
+
+
+ + + + +

+Public Member Functions

 PolarExerciseData (int recordingInterval, List< Integer > hrSamples)
 
+ + + + + +

+Data Fields

int recordingInterval
 
List< Integer > hrSamples
 
+

Detailed Description

+

Polar exercise data container.

+ +

Definition at line 9 of file PolarExerciseData.java.

+

Constructor & Destructor Documentation

+ +

◆ PolarExerciseData()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
polar.com.sdk.api.model.PolarExerciseData.PolarExerciseData (int recordingInterval,
List< Integer > hrSamples 
)
+
+inline
+
+ +

Definition at line 19 of file PolarExerciseData.java.

+ +
+
+

Field Documentation

+ +

◆ hrSamples

+ +
+
+ + + + +
List<Integer> polar.com.sdk.api.model.PolarExerciseData.hrSamples
+
+

HR samples in BPM.

+ +

Definition at line 17 of file PolarExerciseData.java.

+ +
+
+ +

◆ recordingInterval

+ +
+
+ + + + +
int polar.com.sdk.api.model.PolarExerciseData.recordingInterval
+
+

Recording interval in seconds.

+ +

Definition at line 13 of file PolarExerciseData.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData.js b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData.js new file mode 100644 index 00000000..c06f869a --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData.js @@ -0,0 +1,6 @@ +var classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData = +[ + [ "PolarExerciseData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData.html#a054ceb339697d934793befcadc5960f5", null ], + [ "hrSamples", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData.html#a64e39bc12804552d9e6d9bcd95e3e742", null ], + [ "recordingInterval", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData.html#a07bbb11e5381157db31df1c002bd235c", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.html new file mode 100644 index 00000000..d873822b --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.html @@ -0,0 +1,203 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.model.PolarExerciseEntry Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.model.PolarExerciseEntry Class Reference
+
+
+ + + + +

+Public Member Functions

 PolarExerciseEntry (String path, Date date, String identifier)
 
+ + + + + + + +

+Data Fields

String path
 
Date date
 
String identifier
 
+

Detailed Description

+

Polar exercise entry container.

+ +

Definition at line 9 of file PolarExerciseEntry.java.

+

Constructor & Destructor Documentation

+ +

◆ PolarExerciseEntry()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
polar.com.sdk.api.model.PolarExerciseEntry.PolarExerciseEntry (String path,
Date date,
String identifier 
)
+
+inline
+
+ +

Definition at line 23 of file PolarExerciseEntry.java.

+ +
+
+

Field Documentation

+ +

◆ date

+ +
+
+ + + + +
Date polar.com.sdk.api.model.PolarExerciseEntry.date
+
+

Date object contains the date and time of the exercise. Only valid with OH1.

+ +

Definition at line 17 of file PolarExerciseEntry.java.

+ +
+
+ +

◆ identifier

+ +
+
+ + + + +
String polar.com.sdk.api.model.PolarExerciseEntry.identifier
+
+

unique identifier. Only valid with H10

+ +

Definition at line 21 of file PolarExerciseEntry.java.

+ +
+
+ +

◆ path

+ +
+
+ + + + +
String polar.com.sdk.api.model.PolarExerciseEntry.path
+
+

Resource path in device.

+ +

Definition at line 13 of file PolarExerciseEntry.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.js b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.js new file mode 100644 index 00000000..aea3084d --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.js @@ -0,0 +1,7 @@ +var classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry = +[ + [ "PolarExerciseEntry", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.html#a9114f51ab93a73a78065e3728b4fdcb7", null ], + [ "date", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.html#a588ed070a54fad113a9c096ff793d994", null ], + [ "identifier", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.html#abfe22d769315f9fe7e7d759f0d79c211", null ], + [ "path", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.html#a6868bc6edf522eeacf300a790a312464", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.html new file mode 100644 index 00000000..7a6f099e --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.html @@ -0,0 +1,203 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.model.PolarHrBroadcastData Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.model.PolarHrBroadcastData Class Reference
+
+
+ + + + +

+Public Member Functions

 PolarHrBroadcastData (PolarDeviceInfo deviceInfo, int hr, boolean batteryStatus)
 
+ + + + + + + +

+Data Fields

PolarDeviceInfo polarDeviceInfo
 
int hr
 
boolean batteryStatus
 
+

Detailed Description

+

For broadcasting heart rate data with signal strength and device info. Useful when using multiple sensors.

+ +

Definition at line 7 of file PolarHrBroadcastData.java.

+

Constructor & Destructor Documentation

+ +

◆ PolarHrBroadcastData()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
polar.com.sdk.api.model.PolarHrBroadcastData.PolarHrBroadcastData (PolarDeviceInfo deviceInfo,
int hr,
boolean batteryStatus 
)
+
+inline
+
+ +

Definition at line 25 of file PolarHrBroadcastData.java.

+ +
+
+

Field Documentation

+ +

◆ batteryStatus

+ +
+
+ + + + +
boolean polar.com.sdk.api.model.PolarHrBroadcastData.batteryStatus
+
+

Device battery status. False if the battery needs to be replaced or recharged.

+ +

Definition at line 23 of file PolarHrBroadcastData.java.

+ +
+
+ +

◆ hr

+ +
+
+ + + + +
int polar.com.sdk.api.model.PolarHrBroadcastData.hr
+
+

Heart rate in beats per minute.

+ +

Definition at line 17 of file PolarHrBroadcastData.java.

+ +
+
+ +

◆ polarDeviceInfo

+ +
+
+ + + + +
PolarDeviceInfo polar.com.sdk.api.model.PolarHrBroadcastData.polarDeviceInfo
+
+
See also
polar.com.sdk.api.model.PolarDeviceInfo
+ +

Definition at line 12 of file PolarHrBroadcastData.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.js b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.js new file mode 100644 index 00000000..09353381 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.js @@ -0,0 +1,7 @@ +var classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData = +[ + [ "PolarHrBroadcastData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.html#a66a4f51db6032888bf5e2b0c721af1ff", null ], + [ "batteryStatus", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.html#ac627b9126db84234f7203c3975f1d483", null ], + [ "hr", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.html#a641bea69b48115c09066ea15390aa2a4", null ], + [ "polarDeviceInfo", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.html#a91cf2757db3f5fb8444778d9530a10c3", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.html new file mode 100644 index 00000000..3f99d58d --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.html @@ -0,0 +1,272 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.model.PolarHrData Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.model.PolarHrData Class Reference
+
+
+ + + + +

+Public Member Functions

 PolarHrData (int hr, List< Integer > rrs, boolean contactStatus, boolean contactStatusSupported, boolean rrAvailable)
 
+ + + + + + + + + + + + + +

+Data Fields

int hr
 
List< Integer > rrs
 
List< Integer > rrsMs
 
boolean contactStatus
 
boolean contactStatusSupported
 
boolean rrAvailable
 
+

Detailed Description

+

For heart rate data.

+ +

Definition at line 10 of file PolarHrData.java.

+

Constructor & Destructor Documentation

+ +

◆ PolarHrData()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
polar.com.sdk.api.model.PolarHrData.PolarHrData (int hr,
List< Integer > rrs,
boolean contactStatus,
boolean contactStatusSupported,
boolean rrAvailable 
)
+
+inline
+
+ +

Definition at line 43 of file PolarHrData.java.

+ +
+
+

Field Documentation

+ +

◆ contactStatus

+ +
+
+ + + + +
boolean polar.com.sdk.api.model.PolarHrData.contactStatus
+
+

Equals true if the sensor has contact (with a measurable surface e.g. skin).

+ +

Definition at line 31 of file PolarHrData.java.

+ +
+
+ +

◆ contactStatusSupported

+ +
+
+ + + + +
boolean polar.com.sdk.api.model.PolarHrData.contactStatusSupported
+
+

Equals true if the sensor supports contact status

+ +

Definition at line 36 of file PolarHrData.java.

+ +
+
+ +

◆ hr

+ +
+
+ + + + +
int polar.com.sdk.api.model.PolarHrData.hr
+
+

Heart rate in BPM (beats per minute).

+ +

Definition at line 15 of file PolarHrData.java.

+ +
+
+ +

◆ rrAvailable

+ +
+
+ + + + +
boolean polar.com.sdk.api.model.PolarHrData.rrAvailable
+
+

Equals true if RR data is available.

+ +

Definition at line 41 of file PolarHrData.java.

+ +
+
+ +

◆ rrs

+ +
+
+ + + + +
List<Integer> polar.com.sdk.api.model.PolarHrData.rrs
+
+

R is the peak of the QRS complex in the ECG wave and RR is the interval between successive Rs. In 1/1024 format.

+ +

Definition at line 21 of file PolarHrData.java.

+ +
+
+ +

◆ rrsMs

+ +
+
+ + + + +
List<Integer> polar.com.sdk.api.model.PolarHrData.rrsMs
+
+

RRs in milliseconds.

+ +

Definition at line 26 of file PolarHrData.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.js b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.js new file mode 100644 index 00000000..bd810350 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.js @@ -0,0 +1,10 @@ +var classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData = +[ + [ "PolarHrData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.html#a5b15581bb14c1392b66d5cd649b2251b", null ], + [ "contactStatus", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.html#aab9b68c82ece7935c105f323c86b3b59", null ], + [ "contactStatusSupported", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.html#ab63465947499f26a7976fb8f9e73adfc", null ], + [ "hr", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.html#ad2735e8ed0cc5ae3fe5557e6de61e53f", null ], + [ "rrAvailable", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.html#a413f78c6bfd3fd2a579a84ff760007ed", null ], + [ "rrs", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.html#a3280c8db2510e5fc5e3489d6ab4b852c", null ], + [ "rrsMs", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.html#a178e50dae28b430d17f2e37a0c6c1c7f", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData.html new file mode 100644 index 00000000..570dd4ec --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData.html @@ -0,0 +1,191 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.model.PolarOhrPPGData Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.model.PolarOhrPPGData Class Reference
+
+
+ + + + +

+Data Structures

class  PolarOhrPPGSample
 
+ + + +

+Public Member Functions

 PolarOhrPPGData (List< PolarOhrPPGSample > samples, long timeStamp)
 
+ + + + + +

+Data Fields

List< PolarOhrPPGSample > samples
 
long timeStamp
 
+

Detailed Description

+

For photoplethysmography data.

+ +

Definition at line 9 of file PolarOhrPPGData.java.

+

Constructor & Destructor Documentation

+ +

◆ PolarOhrPPGData()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
polar.com.sdk.api.model.PolarOhrPPGData.PolarOhrPPGData (List< PolarOhrPPGSample > samples,
long timeStamp 
)
+
+inline
+
+

Class constructor

Parameters
+ + + +
sampleslist of PPG data samples
timeStampin nanoseconds
+
+
+ +

Definition at line 55 of file PolarOhrPPGData.java.

+ +
+
+

Field Documentation

+ +

◆ samples

+ +
+
+ + + + +
List<PolarOhrPPGSample> polar.com.sdk.api.model.PolarOhrPPGData.samples
+
+

PPG samples list. Each sample contains signed LED in ppg0, LED in ppg1, LED in ppg2 and ambient light value

+ +

Definition at line 43 of file PolarOhrPPGData.java.

+ +
+
+ +

◆ timeStamp

+ +
+
+ + + + +
long polar.com.sdk.api.model.PolarOhrPPGData.timeStamp
+
+

Last sample timestamp in nanoseconds

+ +

Definition at line 48 of file PolarOhrPPGData.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData.js b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData.js new file mode 100644 index 00000000..e2d3ad68 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData.js @@ -0,0 +1,6 @@ +var classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData = +[ + [ "PolarOhrPPGData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData.html#aceaffbeb580f9b25d1bcd3f9109f3591", null ], + [ "samples", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData.html#af2dc332a6a82b5e08a3d60875c0b2ea7", null ], + [ "timeStamp", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData.html#ac4ee5b66c866a5019c12322f94ce2dc1", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData.html new file mode 100644 index 00000000..27cedd25 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData.html @@ -0,0 +1,184 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.model.PolarOhrPPIData Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.model.PolarOhrPPIData Class Reference
+
+
+ + + + +

+Data Structures

class  PolarOhrPPISample
 
+ + + +

+Public Member Functions

 PolarOhrPPIData (long timeStamp, List< PolarOhrPPISample > samples)
 
+ + + + + +

+Data Fields

long timeStamp
 
List< PolarOhrPPISample > samples
 
+

Detailed Description

+

Class PolarOhrPPIData is used to output the peak-to-peak interval between heartbeats in milliseconds

+ +

Definition at line 10 of file PolarOhrPPIData.java.

+

Constructor & Destructor Documentation

+ +

◆ PolarOhrPPIData()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
polar.com.sdk.api.model.PolarOhrPPIData.PolarOhrPPIData (long timeStamp,
List< PolarOhrPPISample > samples 
)
+
+inline
+
+ +

Definition at line 67 of file PolarOhrPPIData.java.

+ +
+
+

Field Documentation

+ +

◆ samples

+ +
+
+ + + + +
List<PolarOhrPPISample> polar.com.sdk.api.model.PolarOhrPPIData.samples
+
+

PPI samples list. Sample with ppi in ms, errorEstimate in ms, hr in BPM, blockerBit = True if PPI measurement is invalid due to acceleration (or other reason) , skinContactSupported = True if the Sensor Contact feature is supported.

+ +

Definition at line 65 of file PolarOhrPPIData.java.

+ +
+
+ +

◆ timeStamp

+ +
+
+ + + + +
long polar.com.sdk.api.model.PolarOhrPPIData.timeStamp
+
+

Last sample timestamp in nanoseconds

+ +

Definition at line 57 of file PolarOhrPPIData.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData.js b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData.js new file mode 100644 index 00000000..50c054b2 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData.js @@ -0,0 +1,6 @@ +var classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData = +[ + [ "PolarOhrPPIData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData.html#a2c72e83271493a862262034a0e53fc2f", null ], + [ "samples", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData.html#abff4c9227f541591700fd7b16d38cbb6", null ], + [ "timeStamp", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData.html#a4a006360286bd2f3443ae3cbc0a655b7", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.html new file mode 100644 index 00000000..2b684eb4 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.html @@ -0,0 +1,299 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.model.PolarSensorSetting Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.model.PolarSensorSetting Class Reference
+
+
+ + + + + + +

+Data Structures

class  Builder
 
enum  SettingType
 
+ + + + + + + + + +

+Public Member Functions

 PolarSensorSetting (Map< BlePMDClient.PmdSetting.PmdSettingType, Set< Integer >> settings, BlePMDClient.PmdMeasurementType type)
 
 PolarSensorSetting (Map< SettingType, Integer > settings)
 
BlePMDClient.PmdSetting map2PmdSettings ()
 
PolarSensorSetting maxSettings ()
 
+ + + +

+Data Fields

Map< SettingType, Set< Integer > > settings
 
+ + + +

+Private Attributes

BlePMDClient.PmdMeasurementType type
 
+

Detailed Description

+
+

Definition at line 14 of file PolarSensorSetting.java.

+

Constructor & Destructor Documentation

+ +

◆ PolarSensorSetting() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
polar.com.sdk.api.model.PolarSensorSetting.PolarSensorSetting (Map< BlePMDClient.PmdSetting.PmdSettingType, Set< Integer >> settings,
BlePMDClient.PmdMeasurementType type 
)
+
+inline
+
+

Internal Constructor with PmdSetting and Type

Parameters
+ + + +
settingsavailable settings
typemeasurement type
+
+
+ +

Definition at line 38 of file PolarSensorSetting.java.

+ +
+
+ +

◆ PolarSensorSetting() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + +
polar.com.sdk.api.model.PolarSensorSetting.PolarSensorSetting (Map< SettingType, Integer > settings)
+
+inline
+
+

Constructor with selected settings

Parameters
+ + +
settingsselected
+
+
+ +

Definition at line 51 of file PolarSensorSetting.java.

+ +
+
+

Member Function Documentation

+ +

◆ map2PmdSettings()

+ +
+
+ + + + + +
+ + + + + + + +
BlePMDClient.PmdSetting polar.com.sdk.api.model.PolarSensorSetting.map2PmdSettings ()
+
+inline
+
+

Helper to map from PolarSensorSetting to PmdSetting

Returns
PmdSetting
+ +

Definition at line 62 of file PolarSensorSetting.java.

+ +
+
+ +

◆ maxSettings()

+ +
+
+ + + + + +
+ + + + + + + +
PolarSensorSetting polar.com.sdk.api.model.PolarSensorSetting.maxSettings ()
+
+inline
+
+

Helper to get max settings available

Returns
PolarSensorSetting with only max settings available
+ +

Definition at line 75 of file PolarSensorSetting.java.

+ +
+
+

Field Documentation

+ +

◆ settings

+ +
+
+ + + + +
Map<SettingType,Set<Integer> > polar.com.sdk.api.model.PolarSensorSetting.settings
+
+ +

Definition at line 30 of file PolarSensorSetting.java.

+ +
+
+ +

◆ type

+ +
+
+ + + + + +
+ + + + +
BlePMDClient.PmdMeasurementType polar.com.sdk.api.model.PolarSensorSetting.type
+
+private
+
+ +

Definition at line 31 of file PolarSensorSetting.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.js b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.js new file mode 100644 index 00000000..1188629d --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.js @@ -0,0 +1,10 @@ +var classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting = +[ + [ "SettingType", "enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.html", "enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType" ], + [ "PolarSensorSetting", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.html#ac87c6566895707f999315d370a410bb2", null ], + [ "PolarSensorSetting", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.html#a5e8c169d434732150045ebc890c7391c", null ], + [ "map2PmdSettings", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.html#a8861d81f7ca995e36dd8b1cddadb78c9", null ], + [ "maxSettings", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.html#a5d943bf35a75b76b4cf2bb7b7beb378a", null ], + [ "settings", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.html#ae59d938cc770438c06bbd16ea015c9ff", null ], + [ "type", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.html#a9dd8f3b32f3f73f2eaf1e3dd01ba186f", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html new file mode 100644 index 00000000..5ff13b32 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html @@ -0,0 +1,1878 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.impl.BDBleApiImpl Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.impl.BDBleApiImpl Class Reference
+
+
+
+Inheritance diagram for polar.com.sdk.impl.BDBleApiImpl:
+
+
+ + +polar.com.sdk.api.PolarBleApi + +
+ + + + +

+Data Structures

interface  FetchRecursiveCondition
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 BDBleApiImpl (final Context context, int features)
 
void shutDown ()
 
boolean isFeatureReady (final String deviceId, int feature)
 
void setApiCallback (PolarBleApiCallback callback)
 
void setApiLogger (@Nullable PolarBleApiLogger logger)
 
void setAutomaticReconnection (boolean disable)
 
Completable setLocalTime (String identifier, Date local)
 
Single< PolarSensorSettingrequestAccSettings (String identifier)
 
Single< PolarSensorSettingrequestEcgSettings (String identifier)
 
Single< PolarSensorSettingrequestPpgSettings (String identifier)
 
Single< PolarSensorSettingrequestBiozSettings (final String identifier)
 
void backgroundEntered ()
 
void foregroundEntered ()
 
Completable autoConnectToPolarDevice (final int rssiLimit, final int timeout, final TimeUnit unit, final String polarDeviceType)
 
Completable autoConnectToPolarDevice (final int rssiLimit, final String polarDeviceType)
 
void connectToPolarDevice (final String identifier)
 
void disconnectFromPolarDevice (String identifier)
 
Completable startRecording (String identifier, String exerciseId, RecordingInterval interval, SampleType type)
 
Completable stopRecording (String identifier)
 
Single< Pair< Boolean, String > > requestRecordingStatus (String identifier)
 
Flowable< PolarExerciseEntrylistExercises (String identifier)
 
Single< PolarExerciseDatafetchExercise (String identifier, PolarExerciseEntry entry)
 
Completable removeExercise (String identifier, PolarExerciseEntry entry)
 
Flowable< PolarDeviceInfosearchForPolarDevice ()
 
Flowable< PolarHrBroadcastDatastartListenForPolarHrBroadcasts (final Set< String > deviceIds)
 
Flowable< PolarEcgDatastartEcgStreaming (String identifier, PolarSensorSetting setting)
 
Flowable< PolarAccelerometerDatastartAccStreaming (String identifier, PolarSensorSetting setting)
 
Flowable< PolarOhrPPGDatastartOhrPPGStreaming (String identifier, PolarSensorSetting setting)
 
Flowable< PolarOhrPPIDatastartOhrPPIStreaming (String identifier)
 
Flowable< PolarBiozDatastartBiozStreaming (final String identifier, PolarSensorSetting setting)
 
BleDeviceSession sessionPmdClientReady (final String identifier) throws Throwable
 
- Public Member Functions inherited from polar.com.sdk.api.PolarBleApi
abstract void shutDown ()
 
abstract boolean isFeatureReady (@NonNull final String deviceId, final int feature)
 
abstract void backgroundEntered ()
 
abstract void foregroundEntered ()
 
abstract void setApiCallback (@Nullable PolarBleApiCallback callback)
 
abstract void setApiLogger (@Nullable PolarBleApiLogger logger)
 
abstract void setAutomaticReconnection (boolean enable)
 
abstract Completable setLocalTime (@NonNull final String identifier, @NonNull final Date time)
 
abstract Single< PolarSensorSettingrequestAccSettings (@NonNull final String identifier)
 
abstract Single< PolarSensorSettingrequestEcgSettings (@NonNull final String identifier)
 
abstract Single< PolarSensorSettingrequestPpgSettings (@NonNull final String identifier)
 
abstract Single< PolarSensorSettingrequestBiozSettings (@NonNull final String identifier)
 
abstract Completable autoConnectToPolarDevice (int rssiLimit, int timeout, @NonNull TimeUnit unit, @Nullable final String polarDeviceType)
 
abstract Completable autoConnectToPolarDevice (int rssiLimit, final String polarDeviceType)
 
abstract void connectToPolarDevice (@NonNull final String identifier)
 
abstract void disconnectFromPolarDevice (@NonNull final String identifier)
 
abstract Completable startRecording (@NonNull final String identifier, @NonNull @Size(min=1, max=64) final String exerciseId, @NonNull RecordingInterval interval, @NonNull SampleType type)
 
abstract Completable stopRecording (@NonNull final String identifier)
 
abstract Single< Pair< Boolean, String > > requestRecordingStatus (@NonNull final String identifier)
 
abstract Flowable< PolarExerciseEntrylistExercises (@NonNull final String identifier)
 
abstract Single< PolarExerciseDatafetchExercise (@NonNull final String identifier, @NonNull final PolarExerciseEntry entry)
 
abstract Completable removeExercise (@NonNull final String identifier, @NonNull final PolarExerciseEntry entry)
 
abstract Flowable< PolarDeviceInfosearchForPolarDevice ()
 
abstract Flowable< PolarHrBroadcastDatastartListenForPolarHrBroadcasts (@Nullable final Set< String > deviceIds)
 
abstract Flowable< PolarEcgDatastartEcgStreaming (@NonNull final String identifier, @NonNull PolarSensorSetting sensorSetting)
 
abstract Flowable< PolarAccelerometerDatastartAccStreaming (@NonNull final String identifier, @NonNull PolarSensorSetting sensorSetting)
 
abstract Flowable< PolarOhrPPGDatastartOhrPPGStreaming (@NonNull final String identifier, @NonNull PolarSensorSetting sensorSetting)
 
abstract Flowable< PolarBiozDatastartBiozStreaming (@NonNull final String identifier, @NonNull PolarSensorSetting sensorSetting)
 
abstract Flowable< PolarOhrPPIDatastartOhrPPIStreaming (@NonNull final String identifier)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Member Functions

void enableAndroidScanFilter ()
 
Single< PolarSensorSettingquerySettings (final String identifier, final BlePMDClient.PmdMeasurementType type)
 
BleDeviceSession sessionByDeviceId (final String deviceId)
 
BleDeviceSession sessionServiceReady (final String identifier, UUID service) throws Throwable
 
BleDeviceSession sessionPsFtpClientReady (final String identifier) throws Throwable
 
void stopPmdStreaming (BleDeviceSession session, BlePMDClient client, BlePMDClient.PmdMeasurementType type)
 
void setupDevice (final BleDeviceSession session)
 
Exception handleError (Throwable throwable)
 
Flowable< String > fetchRecursively (final BlePsFtpClient client, final String path, final FetchRecursiveCondition condition)
 
void sendNotification (BlePsFtpClient client, int notification)
 
void log (final String message)
 
void logError (final String message)
 
+ + + + + + + + + + + +

+Private Attributes

BleDeviceListener listener
 
Map< String, Disposable > connectSubscriptions = new HashMap<>()
 
Scheduler scheduler
 
PolarBleApiCallback callback
 
PolarBleApiLogger logger
 
+ + + + + +

+Static Private Attributes

static final String TAG = BDBleApiImpl.class.getSimpleName()
 
static final int ANDROID_VERSION_O = 26
 
+ + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Static Public Attributes inherited from polar.com.sdk.api.PolarBleApi
static final int FEATURE_HR = 1
 
static final int FEATURE_DEVICE_INFO = 2
 
static final int FEATURE_BATTERY_INFO = 4
 
static final int FEATURE_POLAR_SENSOR_STREAMING = 8
 
static final int FEATURE_POLAR_FILE_TRANSFER = 16
 
static final int ALL_FEATURES = 0xff
 
- Protected Member Functions inherited from polar.com.sdk.api.PolarBleApi
 PolarBleApi (final int features)
 
- Protected Attributes inherited from polar.com.sdk.api.PolarBleApi
int features
 
+

Detailed Description

+

The default implementation of the Polar API

+ +

Definition at line 90 of file BDBleApiImpl.java.

+

Constructor & Destructor Documentation

+ +

◆ BDBleApiImpl()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
polar.com.sdk.impl.BDBleApiImpl.BDBleApiImpl (final Context context,
int features 
)
+
+inline
+
+ +

Definition at line 100 of file BDBleApiImpl.java.

+ +
+
+

Member Function Documentation

+ +

◆ autoConnectToPolarDevice() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Completable polar.com.sdk.impl.BDBleApiImpl.autoConnectToPolarDevice (final int rssiLimit,
final int timeout,
final TimeUnit unit,
final String polarDeviceType 
)
+
+inline
+
+ +

Definition at line 329 of file BDBleApiImpl.java.

+ +
+
+ +

◆ autoConnectToPolarDevice() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Completable polar.com.sdk.impl.BDBleApiImpl.autoConnectToPolarDevice (final int rssiLimit,
final String polarDeviceType 
)
+
+inline
+
+ +

Definition at line 374 of file BDBleApiImpl.java.

+ +
+
+ +

◆ backgroundEntered()

+ +
+
+ + + + + +
+ + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.backgroundEntered ()
+
+inline
+
+ +

Definition at line 319 of file BDBleApiImpl.java.

+ +
+
+ +

◆ connectToPolarDevice()

+ +
+
+ + + + + +
+ + + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.connectToPolarDevice (final String identifier)
+
+inline
+
+ +

Definition at line 379 of file BDBleApiImpl.java.

+ +
+
+ +

◆ disconnectFromPolarDevice()

+ +
+
+ + + + + +
+ + + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.disconnectFromPolarDevice (String identifier)
+
+inline
+
+ +

Definition at line 414 of file BDBleApiImpl.java.

+ +
+
+ +

◆ enableAndroidScanFilter()

+ +
+
+ + + + + +
+ + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.enableAndroidScanFilter ()
+
+inlineprivate
+
+ +

Definition at line 213 of file BDBleApiImpl.java.

+ +
+
+ +

◆ fetchExercise()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Single<PolarExerciseData> polar.com.sdk.impl.BDBleApiImpl.fetchExercise (String identifier,
PolarExerciseEntry entry 
)
+
+inline
+
+ +

Definition at line 555 of file BDBleApiImpl.java.

+ +
+
+ +

◆ fetchRecursively()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Flowable<String> polar.com.sdk.impl.BDBleApiImpl.fetchRecursively (final BlePsFtpClient client,
final String path,
final FetchRecursiveCondition condition 
)
+
+inlineprivate
+
+ +

Definition at line 1037 of file BDBleApiImpl.java.

+ +
+
+ +

◆ foregroundEntered()

+ +
+
+ + + + + +
+ + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.foregroundEntered ()
+
+inline
+
+ +

Definition at line 324 of file BDBleApiImpl.java.

+ +
+
+ +

◆ handleError()

+ +
+
+ + + + + +
+ + + + + + + + +
Exception polar.com.sdk.impl.BDBleApiImpl.handleError (Throwable throwable)
+
+inlineprivate
+
+ +

Definition at line 1025 of file BDBleApiImpl.java.

+ +
+
+ +

◆ isFeatureReady()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
boolean polar.com.sdk.impl.BDBleApiImpl.isFeatureReady (final String deviceId,
int feature 
)
+
+inline
+
+ +

Definition at line 230 of file BDBleApiImpl.java.

+ +
+
+ +

◆ listExercises()

+ +
+
+ + + + + +
+ + + + + + + + +
Flowable<PolarExerciseEntry> polar.com.sdk.impl.BDBleApiImpl.listExercises (String identifier)
+
+inline
+
+ +

Definition at line 499 of file BDBleApiImpl.java.

+ +
+
+ +

◆ log()

+ +
+
+ + + + + +
+ + + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.log (final String message)
+
+inlineprivate
+
+ +

Definition at line 1086 of file BDBleApiImpl.java.

+ +
+
+ +

◆ logError()

+ +
+
+ + + + + +
+ + + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.logError (final String message)
+
+inlineprivate
+
+ +

Definition at line 1092 of file BDBleApiImpl.java.

+ +
+
+ +

◆ querySettings()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Single<PolarSensorSetting> polar.com.sdk.impl.BDBleApiImpl.querySettings (final String identifier,
final BlePMDClient.PmdMeasurementType type 
)
+
+inlineprivate
+
+ +

Definition at line 303 of file BDBleApiImpl.java.

+ +
+
+ +

◆ removeExercise()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Completable polar.com.sdk.impl.BDBleApiImpl.removeExercise (String identifier,
PolarExerciseEntry entry 
)
+
+inline
+
+ +

Definition at line 583 of file BDBleApiImpl.java.

+ +
+
+ +

◆ requestAccSettings()

+ +
+
+ + + + + +
+ + + + + + + + +
Single<PolarSensorSetting> polar.com.sdk.impl.BDBleApiImpl.requestAccSettings (String identifier)
+
+inline
+
+ +

Definition at line 284 of file BDBleApiImpl.java.

+ +
+
+ +

◆ requestBiozSettings()

+ +
+
+ + + + + +
+ + + + + + + + +
Single<PolarSensorSetting> polar.com.sdk.impl.BDBleApiImpl.requestBiozSettings (final String identifier)
+
+inline
+
+ +

Definition at line 299 of file BDBleApiImpl.java.

+ +
+
+ +

◆ requestEcgSettings()

+ +
+
+ + + + + +
+ + + + + + + + +
Single<PolarSensorSetting> polar.com.sdk.impl.BDBleApiImpl.requestEcgSettings (String identifier)
+
+inline
+
+ +

Definition at line 289 of file BDBleApiImpl.java.

+ +
+
+ +

◆ requestPpgSettings()

+ +
+
+ + + + + +
+ + + + + + + + +
Single<PolarSensorSetting> polar.com.sdk.impl.BDBleApiImpl.requestPpgSettings (String identifier)
+
+inline
+
+ +

Definition at line 294 of file BDBleApiImpl.java.

+ +
+
+ +

◆ requestRecordingStatus()

+ +
+
+ + + + + +
+ + + + + + + + +
Single<Pair<Boolean,String> > polar.com.sdk.impl.BDBleApiImpl.requestRecordingStatus (String identifier)
+
+inline
+
+ +

Definition at line 474 of file BDBleApiImpl.java.

+ +
+
+ +

◆ searchForPolarDevice()

+ +
+
+ + + + + +
+ + + + + + + +
Flowable<PolarDeviceInfo> polar.com.sdk.impl.BDBleApiImpl.searchForPolarDevice ()
+
+inline
+
+ +

Definition at line 632 of file BDBleApiImpl.java.

+ +
+
+ +

◆ sendNotification()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.sendNotification (BlePsFtpClient client,
int notification 
)
+
+inlineprivate
+
+ +

Definition at line 1070 of file BDBleApiImpl.java.

+ +
+
+ +

◆ sessionByDeviceId()

+ +
+
+ + + + + +
+ + + + + + + + +
BleDeviceSession polar.com.sdk.impl.BDBleApiImpl.sessionByDeviceId (final String deviceId)
+
+inlineprivate
+
+ +

Definition at line 825 of file BDBleApiImpl.java.

+ +
+
+ +

◆ sessionPmdClientReady()

+ +
+
+ + + + + +
+ + + + + + + + +
BleDeviceSession polar.com.sdk.impl.BDBleApiImpl.sessionPmdClientReady (final String identifier) throws Throwable
+
+inline
+
+ +

Definition at line 849 of file BDBleApiImpl.java.

+ +
+
+ +

◆ sessionPsFtpClientReady()

+ +
+
+ + + + + +
+ + + + + + + + +
BleDeviceSession polar.com.sdk.impl.BDBleApiImpl.sessionPsFtpClientReady (final String identifier) throws Throwable
+
+inlineprivate
+
+ +

Definition at line 862 of file BDBleApiImpl.java.

+ +
+
+ +

◆ sessionServiceReady()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
BleDeviceSession polar.com.sdk.impl.BDBleApiImpl.sessionServiceReady (final String identifier,
UUID service 
) throws Throwable
+
+inlineprivate
+
+ +

Definition at line 834 of file BDBleApiImpl.java.

+ +
+
+ +

◆ setApiCallback()

+ +
+
+ + + + + +
+ + + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.setApiCallback (PolarBleApiCallback callback)
+
+inline
+
+ +

Definition at line 244 of file BDBleApiImpl.java.

+ +
+
+ +

◆ setApiLogger()

+ +
+
+ + + + + +
+ + + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.setApiLogger (@Nullable PolarBleApiLogger logger)
+
+inline
+
+ +

Definition at line 250 of file BDBleApiImpl.java.

+ +
+
+ +

◆ setAutomaticReconnection()

+ +
+
+ + + + + +
+ + + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.setAutomaticReconnection (boolean disable)
+
+inline
+
+ +

Definition at line 255 of file BDBleApiImpl.java.

+ +
+
+ +

◆ setLocalTime()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Completable polar.com.sdk.impl.BDBleApiImpl.setLocalTime (String identifier,
Date local 
)
+
+inline
+
+ +

Definition at line 260 of file BDBleApiImpl.java.

+ +
+
+ +

◆ setupDevice()

+ +
+
+ + + + + +
+ + + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.setupDevice (final BleDeviceSession session)
+
+inlineprivate
+
+ +

Definition at line 894 of file BDBleApiImpl.java.

+ +
+
+ +

◆ shutDown()

+ +
+
+ + + + + +
+ + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.shutDown ()
+
+inline
+
+ +

Definition at line 225 of file BDBleApiImpl.java.

+ +
+
+ +

◆ startAccStreaming()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Flowable<PolarAccelerometerData> polar.com.sdk.impl.BDBleApiImpl.startAccStreaming (String identifier,
PolarSensorSetting setting 
)
+
+inline
+
+ +

Definition at line 699 of file BDBleApiImpl.java.

+ +
+
+ +

◆ startBiozStreaming()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Flowable<PolarBiozData> polar.com.sdk.impl.BDBleApiImpl.startBiozStreaming (final String identifier,
PolarSensorSetting setting 
)
+
+inline
+
+ +

Definition at line 799 of file BDBleApiImpl.java.

+ +
+
+ +

◆ startEcgStreaming()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Flowable<PolarEcgData> polar.com.sdk.impl.BDBleApiImpl.startEcgStreaming (String identifier,
PolarSensorSetting setting 
)
+
+inline
+
+ +

Definition at line 667 of file BDBleApiImpl.java.

+ +
+
+ +

◆ startListenForPolarHrBroadcasts()

+ +
+
+ + + + + +
+ + + + + + + + +
Flowable<PolarHrBroadcastData> polar.com.sdk.impl.BDBleApiImpl.startListenForPolarHrBroadcasts (final Set< String > deviceIds)
+
+inline
+
+ +

Definition at line 647 of file BDBleApiImpl.java.

+ +
+
+ +

◆ startOhrPPGStreaming()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Flowable<PolarOhrPPGData> polar.com.sdk.impl.BDBleApiImpl.startOhrPPGStreaming (String identifier,
PolarSensorSetting setting 
)
+
+inline
+
+ +

Definition at line 731 of file BDBleApiImpl.java.

+ +
+
+ +

◆ startOhrPPIStreaming()

+ +
+
+ + + + + +
+ + + + + + + + +
Flowable<PolarOhrPPIData> polar.com.sdk.impl.BDBleApiImpl.startOhrPPIStreaming (String identifier)
+
+inline
+
+ +

Definition at line 763 of file BDBleApiImpl.java.

+ +
+
+ +

◆ startRecording()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Completable polar.com.sdk.impl.BDBleApiImpl.startRecording (String identifier,
String exerciseId,
RecordingInterval interval,
SampleType type 
)
+
+inline
+
+ +

Definition at line 430 of file BDBleApiImpl.java.

+ +
+
+ +

◆ stopPmdStreaming()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void polar.com.sdk.impl.BDBleApiImpl.stopPmdStreaming (BleDeviceSession session,
BlePMDClient client,
BlePMDClient.PmdMeasurementType type 
)
+
+inlineprivate
+
+ +

Definition at line 873 of file BDBleApiImpl.java.

+ +
+
+ +

◆ stopRecording()

+ +
+
+ + + + + +
+ + + + + + + + +
Completable polar.com.sdk.impl.BDBleApiImpl.stopRecording (String identifier)
+
+inline
+
+ +

Definition at line 455 of file BDBleApiImpl.java.

+ +
+
+

Field Documentation

+ +

◆ ANDROID_VERSION_O

+ +
+
+ + + + + +
+ + + + +
final int polar.com.sdk.impl.BDBleApiImpl.ANDROID_VERSION_O = 26
+
+staticprivate
+
+ +

Definition at line 97 of file BDBleApiImpl.java.

+ +
+
+ +

◆ callback

+ +
+
+ + + + + +
+ + + + +
PolarBleApiCallback polar.com.sdk.impl.BDBleApiImpl.callback
+
+private
+
+ +

Definition at line 95 of file BDBleApiImpl.java.

+ +
+
+ +

◆ connectSubscriptions

+ +
+
+ + + + + +
+ + + + +
Map<String,Disposable> polar.com.sdk.impl.BDBleApiImpl.connectSubscriptions = new HashMap<>()
+
+private
+
+ +

Definition at line 93 of file BDBleApiImpl.java.

+ +
+
+ +

◆ listener

+ +
+
+ + + + + +
+ + + + +
BleDeviceListener polar.com.sdk.impl.BDBleApiImpl.listener
+
+private
+
+ +

Definition at line 92 of file BDBleApiImpl.java.

+ +
+
+ +

◆ logger

+ +
+
+ + + + + +
+ + + + +
PolarBleApiLogger polar.com.sdk.impl.BDBleApiImpl.logger
+
+private
+
+ +

Definition at line 96 of file BDBleApiImpl.java.

+ +
+
+ +

◆ scheduler

+ +
+
+ + + + + +
+ + + + +
Scheduler polar.com.sdk.impl.BDBleApiImpl.scheduler
+
+private
+
+ +

Definition at line 94 of file BDBleApiImpl.java.

+ +
+
+ +

◆ TAG

+ +
+
+ + + + + +
+ + + + +
final String polar.com.sdk.impl.BDBleApiImpl.TAG = BDBleApiImpl.class.getSimpleName()
+
+staticprivate
+
+ +

Definition at line 91 of file BDBleApiImpl.java.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.js b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.js new file mode 100644 index 00000000..1e665343 --- /dev/null +++ b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.js @@ -0,0 +1,51 @@ +var classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl = +[ + [ "BDBleApiImpl", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a49685140c9028f1d6f140977b03ab4ca", null ], + [ "autoConnectToPolarDevice", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a964a35d7b8b782183fad03aae73b99be", null ], + [ "autoConnectToPolarDevice", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#af8fe71975e2d06a5eac90781f5555d07", null ], + [ "backgroundEntered", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a24707fd78988e8b9f57d47a6d24cc7e3", null ], + [ "connectToPolarDevice", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a4736cc12d728a7a8ddcd15a883486765", null ], + [ "disconnectFromPolarDevice", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a4d8a6d2fd920b9140d071db665aa762a", null ], + [ "enableAndroidScanFilter", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#aea179b27f1dc4b7ed1ad3e2cb971a7a8", null ], + [ "fetchExercise", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a573753301ab6af12467792bc87fc19a2", null ], + [ "fetchRecursively", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#aae9728d213d59602f3c74b447c83c136", null ], + [ "foregroundEntered", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a1218a5c9c6a590b55f1d00c9a76d4a90", null ], + [ "handleError", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a31b079f8337863ff89f6f1d6dbce65b9", null ], + [ "isFeatureReady", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#af300d862a83d6f973d78081cde32ab99", null ], + [ "listExercises", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#aa7b05d48c5f57c4d66f1e1c182883739", null ], + [ "log", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a6170765b10eb5ecc9b6b9584b350fb1a", null ], + [ "logError", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#ae897ee6968f1b84641861cda05859a6a", null ], + [ "querySettings", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#af7371642d2f1d673a4d20fd05be9e983", null ], + [ "removeExercise", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#ac645b2eedd096132b613ed5c0b6ecc2f", null ], + [ "requestAccSettings", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a8bdd3c4c4bc2c98a5ff9ac7cd1385948", null ], + [ "requestBiozSettings", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#afc92150da6c98b93a9f86439a0d33e3d", null ], + [ "requestEcgSettings", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#abc85de0575973be85cc572460952b5d3", null ], + [ "requestPpgSettings", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#aa65443950ef837c869eb6199a643487c", null ], + [ "requestRecordingStatus", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#aded82e5731dc626c167ea7437551ad6d", null ], + [ "searchForPolarDevice", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a29b955b7813f2a1e6ebab906548964c8", null ], + [ "sendNotification", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a89db663f43bd488f631c5d76201171c9", null ], + [ "sessionByDeviceId", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a2ca3ebc9ca23822d2aca71a2002c1b73", null ], + [ "sessionPmdClientReady", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a568cbfd6e9548d54fff470a938cbf000", null ], + [ "sessionPsFtpClientReady", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#aed83b0c4e2180511a242f1ccedd3d03c", null ], + [ "sessionServiceReady", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a647db72c6f3a1cbd7587cac769cf0e2c", null ], + [ "setApiCallback", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#ac61c2b578af2d5563ef677172196d04d", null ], + [ "setApiLogger", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#ad239df6d03a59f3a85506346931b52a1", null ], + [ "setAutomaticReconnection", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a2c36d4ab6fbdc804df500d2a1d1c0e5d", null ], + [ "setLocalTime", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a32dd8f5e44596851f227b793113e9cd2", null ], + [ "setupDevice", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a4a711dc98144cb480f5b4e4ef3c2af5b", null ], + [ "shutDown", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#ae1296701871fe33af919ca9423cadd7a", null ], + [ "startAccStreaming", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a34b010c3844f564a377bfb430170e4a9", null ], + [ "startBiozStreaming", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a9863d8f3a3756b95cf030e821af4c21c", null ], + [ "startEcgStreaming", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a7700f8c34663e4f37e208c0b5c779582", null ], + [ "startListenForPolarHrBroadcasts", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#aed55c3ce811dbb765d761f3b90b8ff96", null ], + [ "startOhrPPGStreaming", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a1163224a654db6b5917ad81fc3aa2d23", null ], + [ "startOhrPPIStreaming", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a5d33c2910d8f2583ee44962c4bcac2bf", null ], + [ "startRecording", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a14a4d99e3a14c3e8dd2a9695e25ec9a8", null ], + [ "stopPmdStreaming", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a5e80e959cbc19490c9a1963e6914a092", null ], + [ "stopRecording", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a4eb11a28590fe41d76fdb88c28894ce2", null ], + [ "callback", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#a5ccfe3027f85d5b1262737b1160006b8", null ], + [ "connectSubscriptions", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#ac6df07abc427e5ad2ba3167a2d8c109b", null ], + [ "listener", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#ac08998b625def30d377e05abb8a80f8d", null ], + [ "logger", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#abb45392febb6f61abfe49ef9482f07bb", null ], + [ "scheduler", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html#ae46e26479d9e1d5c57605c97343fd0f4", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.png b/polar-sdk-android/docs/html/classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.png new file mode 100644 index 0000000000000000000000000000000000000000..d44154e3f10c5cfa019c034687f6ed2a39e1c078 GIT binary patch literal 762 zcmeAS@N?(olHy`uVBq!ia0vp^M}atigBeK9^K~==QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;_3>A@WxYZR9Y2u3<5cPS`+YW!BWcb%c! zzkj=!=dM+|^Z!#d*V{S8UR`aT5)soxs^48!I_o-Tb4pQNKWEjN&8lqYE4)H4&(@g5 zoY_@;HfT%S(pgI433f-hN>6{Z@+l6k=?ic2SjlzvN+j=+sOAodo06~Ax+bn`N{gSp zs&ul}u3Jf3;cx#`DO{CuS+cNPv#Z%`!HMi#&3SyKd!JUcX|K=bG2fW3+4GT`>-N^r z7Y&Q%d^l%yKCtBcQHIU6dR`CQLMMx?j86T0O?D|?Or`r(bBA-`+s}Nwe@pOe4B00%8LmwTW&j2hLxi&*hLVY3M!;)wGcB=<^n69iCg}=Baj@_nx}Bvj5;kO;)B00S%94F4o|?)1b8e zozBq=-LA?1?`wRC*|TUv?AN|u4T~b~f7jUc+$qq+NBa39KK}Erh3+$d`J89?`EqXe zHQ7`*EumG?3eVYB$nAd3wqN||#Es=4Z^PedH0Zx9{$1uTUCPxE`L~1V!6sNZym)_I exkW&4U45Xj=A8CZ=aYd6mBG{1&t;ucLK6V|%v{z0 literal 0 HcmV?d00001 diff --git a/polar-sdk-android/docs/html/closed.png b/polar-sdk-android/docs/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/polar-sdk-android/docs/html/dir_1ff65af9a4dc657909b37e4b73346a08.html b/polar-sdk-android/docs/html/dir_1ff65af9a4dc657909b37e4b73346a08.html new file mode 100644 index 00000000..bf6d5194 --- /dev/null +++ b/polar-sdk-android/docs/html/dir_1ff65af9a4dc657909b37e4b73346a08.html @@ -0,0 +1,87 @@ + + + + + + + +SDK for Polar sensors: com Directory Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
com Directory Reference
+
+
+ + + + +

+Directories

directory  sdk
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/dir_505f0308430f86f31e1193b50b0d8658.html b/polar-sdk-android/docs/html/dir_505f0308430f86f31e1193b50b0d8658.html new file mode 100644 index 00000000..bac76c13 --- /dev/null +++ b/polar-sdk-android/docs/html/dir_505f0308430f86f31e1193b50b0d8658.html @@ -0,0 +1,87 @@ + + + + + + + +SDK for Polar sensors: impl Directory Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
impl Directory Reference
+
+
+ + + + +

+Files

file  BDBleApiImpl.java [code]
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/dir_57f0ca8c420846e7d0426b6adce5936e.html b/polar-sdk-android/docs/html/dir_57f0ca8c420846e7d0426b6adce5936e.html new file mode 100644 index 00000000..f5a3070b --- /dev/null +++ b/polar-sdk-android/docs/html/dir_57f0ca8c420846e7d0426b6adce5936e.html @@ -0,0 +1,87 @@ + + + + + + + +SDK for Polar sensors: polar Directory Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
polar Directory Reference
+
+
+ + + + +

+Directories

directory  com
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/dir_5eb159725f84c66aafd839904a4acdd0.html b/polar-sdk-android/docs/html/dir_5eb159725f84c66aafd839904a4acdd0.html new file mode 100644 index 00000000..97ec219e --- /dev/null +++ b/polar-sdk-android/docs/html/dir_5eb159725f84c66aafd839904a4acdd0.html @@ -0,0 +1,87 @@ + + + + + + + +SDK for Polar sensors: main Directory Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
main Directory Reference
+
+
+ + + + +

+Directories

directory  java
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/polar-sdk-android/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 00000000..15f637c6 --- /dev/null +++ b/polar-sdk-android/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,87 @@ + + + + + + + +SDK for Polar sensors: src Directory Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
src Directory Reference
+
+
+ + + + +

+Directories

directory  main
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/dir_7d958c2b373af03670a0a28f80d9d1e8.html b/polar-sdk-android/docs/html/dir_7d958c2b373af03670a0a28f80d9d1e8.html new file mode 100644 index 00000000..f7114b95 --- /dev/null +++ b/polar-sdk-android/docs/html/dir_7d958c2b373af03670a0a28f80d9d1e8.html @@ -0,0 +1,107 @@ + + + + + + + +SDK for Polar sensors: model Directory Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
model Directory Reference
+
+ +
+ + + + diff --git a/polar-sdk-android/docs/html/dir_a4ff2217a86ad9c20729a6d968041af8.html b/polar-sdk-android/docs/html/dir_a4ff2217a86ad9c20729a6d968041af8.html new file mode 100644 index 00000000..9ee294bc --- /dev/null +++ b/polar-sdk-android/docs/html/dir_a4ff2217a86ad9c20729a6d968041af8.html @@ -0,0 +1,97 @@ + + + + + + + +SDK for Polar sensors: errors Directory Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/polar-sdk-android/docs/html/dir_b936df1acb3136008a04b697d550213c.html b/polar-sdk-android/docs/html/dir_b936df1acb3136008a04b697d550213c.html new file mode 100644 index 00000000..60d98d9c --- /dev/null +++ b/polar-sdk-android/docs/html/dir_b936df1acb3136008a04b697d550213c.html @@ -0,0 +1,98 @@ + + + + + + + +SDK for Polar sensors: api Directory Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
api Directory Reference
+
+
+ + + + + + +

+Directories

directory  errors
 
directory  model
 
+ + + + + + + +

+Files

file  PolarBleApi.java [code]
 
file  PolarBleApiCallback.java [code]
 
file  PolarBleApiDefaultImpl.java [code]
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/dir_fac840b1a3a552bfa17e24a7f5dc9555.html b/polar-sdk-android/docs/html/dir_fac840b1a3a552bfa17e24a7f5dc9555.html new file mode 100644 index 00000000..948ac5ce --- /dev/null +++ b/polar-sdk-android/docs/html/dir_fac840b1a3a552bfa17e24a7f5dc9555.html @@ -0,0 +1,89 @@ + + + + + + + +SDK for Polar sensors: sdk Directory Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
sdk Directory Reference
+
+
+ + + + + + +

+Directories

directory  api
 
directory  impl
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/dir_fd3f6763802dee1ad875f6c80eac0bda.html b/polar-sdk-android/docs/html/dir_fd3f6763802dee1ad875f6c80eac0bda.html new file mode 100644 index 00000000..fda834ff --- /dev/null +++ b/polar-sdk-android/docs/html/dir_fd3f6763802dee1ad875f6c80eac0bda.html @@ -0,0 +1,87 @@ + + + + + + + +SDK for Polar sensors: java Directory Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
java Directory Reference
+
+
+ + + + +

+Directories

directory  polar
 
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/doc.png b/polar-sdk-android/docs/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/polar-sdk-android/docs/html/doxygen.css b/polar-sdk-android/docs/html/doxygen.css new file mode 100644 index 00000000..e2515926 --- /dev/null +++ b/polar-sdk-android/docs/html/doxygen.css @@ -0,0 +1,1764 @@ +/* The standard CSS for doxygen 1.8.15 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #FFFFFF; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/polar-sdk-android/docs/html/doxygen.png b/polar-sdk-android/docs/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 GIT binary patch literal 3779 zcmV;!4m|ORP)tMIv#Q0*~7*`IBSO7_x;@a8#Zk6_PeKR_s92J&)(m+);m9Iz3blw)z#Gi zP!9lj4$%+*>Hz@HCmM9L9|8c+0u=!H$O3?R0Kgx|#WP<6fKfC8fM-CQZT|_r@`>VO zX^Hgb|9cJqpdJA5$MCEK`F_2@2Y@s>^+;pF`~jdI0Pvr|vl4`=C)EH@1IFe7pdJ8F zH(qGi004~QnF)Ggga~8v08kGAs2hKTATxr7pwfNk|4#_AaT>w8P6TV+R2kbS$v==} zAjf`s0g#V8lB+b3)5oEI*q+{Yt$MZDruD2^;$+(_%Qn+%v0X-bJO=;@kiJ^ygLBnC z?1OVv_%aex1M@jKU|Z~$eI?PoF4Vj>fDzyo zAiLfpXY*a^Sj-S5D0S3@#V$sRW)g)_1e#$%8xdM>Jm7?!h zu0P2X=xoN>^!4DoPRgph2(2va07yfpXF+WH7EOg1GY%Zn z7~1A<(z7Q$ktEXhW_?GMpHp9l_UL18F3KOsxu81pqoBiNbFSGsof-W z6~eloMoz=4?OOnl2J268x5rOY`dCk0us(uS#Ud4yqOr@?=Q57a}tit|BhY>}~frH1sP`ScHS_d)oqH^lYy zZ%VP`#10MlE~P?cE(%(#(AUSv_T{+;t@$U}El}(1ig`vZo`Rm;+5&(AYzJ^Ae=h2X z@Re%vHwZU>|f0NI&%$*4eJweC5OROQrpPMA@*w|o z()A==l}(@bv^&>H1Ob3C=<^|hob?0+xJ?QQ3-ueQC}zy&JQNib!OqSO@-=>XzxlSF zAZ^U*1l6EEmg3r};_HY>&Jo_{dOPEFTWPmt=U&F#+0(O59^UIlHbNX+eF8UzyDR*T z(=5X$VF3!gm@RooS-&iiUYGG^`hMR(07zr_xP`d!^BH?uD>Phl8Rdifx3Af^Zr`Ku ztL+~HkVeL#bJ)7;`=>;{KNRvjmc}1}c58Sr#Treq=4{xo!ATy|c>iRSp4`dzMMVd@ zL8?uwXDY}Wqgh4mH`|$BTXpUIu6A1-cSq%hJw;@^Zr8TP=GMh*p(m(tN7@!^D~sl$ zz^tf4II4|};+irE$Fnm4NTc5%p{PRA`%}Zk`CE5?#h3|xcyQsS#iONZ z6H(@^i9td!$z~bZiJLTax$o>r(p}3o@< zyD7%(>ZYvy=6$U3e!F{Z`uSaYy`xQyl?b{}eg|G3&fz*`QH@mDUn)1%#5u`0m$%D} z?;tZ0u(mWeMV0QtzjgN!lT*pNRj;6510Wwx?Yi_=tYw|J#7@(Xe7ifDzXuK;JB;QO z#bg~K$cgm$@{QiL_3yr}y&~wuv=P=#O&Tj=Sr)aCUlYmZMcw?)T?c%0rUe1cS+o!qs_ zQ6Gp)-{)V!;=q}llyK3|^WeLKyjf%y;xHku;9(vM!j|~<7w1c*Mk-;P{T&yG) z@C-8E?QPynNQ<8f01D`2qexcVEIOU?y}MG)TAE6&VT5`rK8s(4PE;uQ92LTXUQ<>^ ztyQ@=@kRdh@ebUG^Z6NWWIL;_IGJ2ST>$t!$m$qvtj0Qmw8moN6GUV^!QKNK zHBXCtUH8)RY9++gH_TUV4^=-j$t}dD3qsN7GclJ^Zc&(j6&a_!$jCf}%c5ey`pm~1)@{yI3 zTdWyB+*X{JFw#z;PwRr5evb2!ueWF;v`B0HoUu4-(~aL=z;OXUUEtG`_$)Oxw6FKg zEzY`CyKaSBK3xt#8gA|r_|Kehn_HYVBMpEwbn9-fI*!u*eTA1ef8Mkl1=!jV4oYwWYM}i`A>_F4nhmlCIC6WLa zY%;4&@AlnaG11ejl61Jev21|r*m+?Kru3;1tFDl}#!OzUp6c>go4{C|^erwpG*&h6bspUPJag}oOkN2912Y3I?(eRc@U9>z#HPBHC?nps7H5!zP``90!Q1n80jo+B3TWXp!8Pe zwuKuLLI6l3Gv@+QH*Y}2wPLPQ1^EZhT#+Ed8q8Wo z1pTmIBxv14-{l&QVKxAyQF#8Q@NeJwWdKk>?cpiJLkJr+aZ!Me+Cfp!?FWSRf^j2k z73BRR{WSKaMkJ>1Nbx5dan5hg^_}O{Tj6u%iV%#QGz0Q@j{R^Ik)Z*+(YvY2ziBG)?AmJa|JV%4UT$k`hcOg5r9R?5>?o~JzK zJCrj&{i#hG>N7!B4kNX(%igb%kDj0fOQThC-8mtfap82PNRXr1D>lbgg)dYTQ(kbx z`Ee5kXG~Bh+BHQBf|kJEy6(ga%WfhvdQNDuOfQoe377l#ht&DrMGeIsI5C<&ai zWG$|hop2@@q5YDa)_-A?B02W;#fH!%k`daQLEItaJJ8Yf1L%8x;kg?)k)00P-lH+w z)5$QNV6r2$YtnV(4o=0^3{kmaXn*Dm0F*fU(@o)yVVjk|ln8ea6BMy%vZAhW9|wvA z8RoDkVoMEz1d>|5(k0Nw>22ZT){V<3$^C-cN+|~hKt2)){+l-?3m@-$c?-dlzQ)q- zZ)j%n^gerV{|+t}9m1_&&Ly!9$rtG4XX|WQ8`xYzGC~U@nYh~g(z9)bdAl#xH)xd5a=@|qql z|FzEil{P5(@gy!4ek05i$>`E^G~{;pnf6ftpLh$h#W?^#4UkPfa;;?bsIe&kz!+40 zI|6`F2n020)-r`pFaZ38F!S-lJM-o&inOw|66=GMeP@xQU5ghQH{~5Uh~TMTd;I9` z>YhVB`e^EVj*S7JF39ZgNf}A-0DwOcTT63ydN$I3b?yBQtUI*_fae~kPvzoD$zjX3 zoqBe#>12im4WzZ=f^4+u=!lA|#r%1`WB0-6*3BL#at`47#ebPpR|D1b)3BjT34nYY z%Ds%d?5$|{LgOIaRO{{oC&RK`O91$fqwM0(C_TALcozu*fWHb%%q&p-q{_8*2Zsi^ zh1ZCnr^UYa;4vQEtHk{~zi>wwMC5o{S=$P0X681y`SXwFH?Ewn{x-MOZynmc)JT5v zuHLwh;tLfxRrr%|k370}GofLl7thg>ACWWY&msqaVu&ry+`7+Ss>NL^%T1|z{IGMA zW-SKl=V-^{(f!Kf^#3(|T2W47d(%JVCI4JgRrT1pNz>+ietmFToNv^`gzC@&O-)+i zPQ~RwK8%C_vf%;%e>NyTp~dM5;!C|N0Q^6|CEb7Bw=Vz~$1#FA;Z*?mKSC)Hl-20s t8QyHj(g6VK0RYbl8UjE)0O0w=e*@m04r>stuEhWV002ovPDHLkV1hl;dM*F} literal 0 HcmV?d00001 diff --git a/polar-sdk-android/docs/html/dynsections.js b/polar-sdk-android/docs/html/dynsections.js new file mode 100644 index 00000000..9bff51b8 --- /dev/null +++ b/polar-sdk-android/docs/html/dynsections.js @@ -0,0 +1,127 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +SDK for Polar sensors: polar.com.sdk.api.PolarBleApi.RecordingInterval Enum Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.PolarBleApi.RecordingInterval Enum Reference
+
+
+ + + + + + +

+Public Member Functions

 RecordingInterval (int value)
 
int getValue ()
 
+ + + + + +

+Data Fields

 INTERVAL_1S =(1)
 
 INTERVAL_5S =(5)
 
+ + + +

+Private Attributes

int value
 
+

Detailed Description

+

Recoding intervals for H10 recording start

+ +

Definition at line 49 of file PolarBleApi.java.

+

Constructor & Destructor Documentation

+ +

◆ RecordingInterval()

+ +
+
+ + + + + +
+ + + + + + + + +
polar.com.sdk.api.PolarBleApi.RecordingInterval.RecordingInterval (int value)
+
+inline
+
+ +

Definition at line 55 of file PolarBleApi.java.

+ +
+
+

Member Function Documentation

+ +

◆ getValue()

+ +
+
+ + + + + +
+ + + + + + + +
int polar.com.sdk.api.PolarBleApi.RecordingInterval.getValue ()
+
+inline
+
+ +

Definition at line 59 of file PolarBleApi.java.

+ +
+
+

Field Documentation

+ +

◆ INTERVAL_1S

+ +
+
+ + + + +
polar.com.sdk.api.PolarBleApi.RecordingInterval.INTERVAL_1S =(1)
+
+

1 second interval

+ +

Definition at line 50 of file PolarBleApi.java.

+ +
+
+ +

◆ INTERVAL_5S

+ +
+
+ + + + +
polar.com.sdk.api.PolarBleApi.RecordingInterval.INTERVAL_5S =(5)
+
+

5 second interval

+ +

Definition at line 51 of file PolarBleApi.java.

+ +
+
+ +

◆ value

+ +
+
+ + + + + +
+ + + + +
int polar.com.sdk.api.PolarBleApi.RecordingInterval.value
+
+private
+
+ +

Definition at line 53 of file PolarBleApi.java.

+ +
+
+
The documentation for this enum was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval.js b/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval.js new file mode 100644 index 00000000..7014aabe --- /dev/null +++ b/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval.js @@ -0,0 +1,8 @@ +var enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval = +[ + [ "RecordingInterval", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval.html#a4a931111cd9d6b0103000bbd7e9aee8a", null ], + [ "getValue", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval.html#ab8a6b3e4c40c2070da5e91b8e33dc240", null ], + [ "INTERVAL_1S", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval.html#a393dd3e19d57d5f0a9a256f275050f4b", null ], + [ "INTERVAL_5S", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval.html#a8da372e592004d8ce77ad37fadf098b9", null ], + [ "value", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval.html#a83a820a3d5fd170367ca5f4b53595acf", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType.html b/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType.html new file mode 100644 index 00000000..fb5f07c5 --- /dev/null +++ b/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType.html @@ -0,0 +1,132 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.PolarBleApi.SampleType Enum Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.PolarBleApi.SampleType Enum Reference
+
+
+ + + + + + +

+Data Fields

 HR
 
 RR
 
+

Detailed Description

+

Sample types for H10 recording start

+ +

Definition at line 67 of file PolarBleApi.java.

+

Field Documentation

+ +

◆ HR

+ +
+
+ + + + +
polar.com.sdk.api.PolarBleApi.SampleType.HR
+
+

HeartRate in BPM

+ +

Definition at line 68 of file PolarBleApi.java.

+ +
+
+ +

◆ RR

+ +
+
+ + + + +
polar.com.sdk.api.PolarBleApi.SampleType.RR
+
+ +

Definition at line 69 of file PolarBleApi.java.

+ +
+
+
The documentation for this enum was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType.js b/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType.js new file mode 100644 index 00000000..4b890c96 --- /dev/null +++ b/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType.js @@ -0,0 +1,5 @@ +var enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType = +[ + [ "HR", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType.html#a03e6d65a0a2c5e98ab9f79a1237fc328", null ], + [ "RR", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType.html#a58190d29e5522984295dff32da9b9e8a", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.html b/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.html new file mode 100644 index 00000000..fbf40640 --- /dev/null +++ b/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.html @@ -0,0 +1,246 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.model.PolarSensorSetting.SettingType Enum Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.model.PolarSensorSetting.SettingType Enum Reference
+
+
+ + + + + + +

+Public Member Functions

 SettingType (int numVal)
 
int getNumVal ()
 
+ + + + + + + +

+Data Fields

 SAMPLE_RATE =(0)
 
 RESOLUTION =(1)
 
 RANGE =(2)
 
+ + + +

+Private Attributes

int numVal
 
+

Detailed Description

+
+

Definition at line 16 of file PolarSensorSetting.java.

+

Constructor & Destructor Documentation

+ +

◆ SettingType()

+ +
+
+ + + + + +
+ + + + + + + + +
polar.com.sdk.api.model.PolarSensorSetting.SettingType.SettingType (int numVal)
+
+inline
+
+ +

Definition at line 22 of file PolarSensorSetting.java.

+ +
+
+

Member Function Documentation

+ +

◆ getNumVal()

+ +
+
+ + + + + +
+ + + + + + + +
int polar.com.sdk.api.model.PolarSensorSetting.SettingType.getNumVal ()
+
+inline
+
+ +

Definition at line 25 of file PolarSensorSetting.java.

+ +
+
+

Field Documentation

+ +

◆ numVal

+ +
+
+ + + + + +
+ + + + +
int polar.com.sdk.api.model.PolarSensorSetting.SettingType.numVal
+
+private
+
+ +

Definition at line 21 of file PolarSensorSetting.java.

+ +
+
+ +

◆ RANGE

+ +
+
+ + + + +
polar.com.sdk.api.model.PolarSensorSetting.SettingType.RANGE =(2)
+
+

range key in g's

+ +

Definition at line 19 of file PolarSensorSetting.java.

+ +
+
+ +

◆ RESOLUTION

+ +
+
+ + + + +
polar.com.sdk.api.model.PolarSensorSetting.SettingType.RESOLUTION =(1)
+
+

resolution key in bits

+ +

Definition at line 18 of file PolarSensorSetting.java.

+ +
+
+ +

◆ SAMPLE_RATE

+ +
+
+ + + + +
polar.com.sdk.api.model.PolarSensorSetting.SettingType.SAMPLE_RATE =(0)
+
+

sample rate key in hz

+ +

Definition at line 17 of file PolarSensorSetting.java.

+ +
+
+
The documentation for this enum was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.js b/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.js new file mode 100644 index 00000000..8f9b617c --- /dev/null +++ b/polar-sdk-android/docs/html/enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.js @@ -0,0 +1,9 @@ +var enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType = +[ + [ "SettingType", "enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.html#a79e7234362f8673d9b7d3b9eb94fce83", null ], + [ "getNumVal", "enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.html#a41ecb015e0d98e3af78679a6e47b5cae", null ], + [ "numVal", "enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.html#a407618216b6c46196e1b0cfb5fbe230f", null ], + [ "RANGE", "enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.html#a45b4b99e66eb8cf506cf80732b4fb29a", null ], + [ "RESOLUTION", "enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.html#adf551ddee8ca1b83283644d74af94391", null ], + [ "SAMPLE_RATE", "enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.html#a77bc2999fcb74f979cdaec328f81679f", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/files.html b/polar-sdk-android/docs/html/files.html new file mode 100644 index 00000000..aa186b9b --- /dev/null +++ b/polar-sdk-android/docs/html/files.html @@ -0,0 +1,105 @@ + + + + + + + +SDK for Polar sensors: File List + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/polar-sdk-android/docs/html/files_dup.js b/polar-sdk-android/docs/html/files_dup.js new file mode 100644 index 00000000..fcb13ef5 --- /dev/null +++ b/polar-sdk-android/docs/html/files_dup.js @@ -0,0 +1,70 @@ +var files_dup = +[ + [ "BDBleApiImpl.java", "BDBleApiImpl_8java.html", [ + [ "BDBleApiImpl", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl" ] + ] ], + [ "PolarAccelerometerData.java", "PolarAccelerometerData_8java.html", [ + [ "PolarAccelerometerData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData.html", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData" ] + ] ], + [ "PolarBiozData.java", "PolarBiozData_8java.html", [ + [ "PolarBiozData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData.html", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData" ] + ] ], + [ "PolarBleApi.java", "PolarBleApi_8java.html", [ + [ "PolarBleApi", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi" ], + [ "PolarBleApiLogger", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger.html", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger" ], + [ "RecordingInterval", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval.html", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval" ], + [ "SampleType", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType.html", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType" ] + ] ], + [ "PolarBleApiCallback.java", "PolarBleApiCallback_8java.html", [ + [ "PolarBleApiCallback", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback" ] + ] ], + [ "PolarBleApiDefaultImpl.java", "PolarBleApiDefaultImpl_8java.html", [ + [ "PolarBleApiDefaultImpl", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiDefaultImpl.html", null ] + ] ], + [ "PolarDeviceDisconnected.java", "PolarDeviceDisconnected_8java.html", [ + [ "PolarDeviceDisconnected", "classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceDisconnected.html", null ] + ] ], + [ "PolarDeviceInfo.java", "PolarDeviceInfo_8java.html", [ + [ "PolarDeviceInfo", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.html", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo" ] + ] ], + [ "PolarDeviceNotConnected.java", "PolarDeviceNotConnected_8java.html", [ + [ "PolarDeviceNotConnected", "classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotConnected.html", null ] + ] ], + [ "PolarDeviceNotFound.java", "PolarDeviceNotFound_8java.html", [ + [ "PolarDeviceNotFound", "classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotFound.html", null ] + ] ], + [ "PolarEcgData.java", "PolarEcgData_8java.html", [ + [ "PolarEcgData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData.html", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData" ] + ] ], + [ "PolarExerciseData.java", "PolarExerciseData_8java.html", [ + [ "PolarExerciseData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData.html", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData" ] + ] ], + [ "PolarExerciseEntry.java", "PolarExerciseEntry_8java.html", [ + [ "PolarExerciseEntry", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.html", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry" ] + ] ], + [ "PolarHrBroadcastData.java", "PolarHrBroadcastData_8java.html", [ + [ "PolarHrBroadcastData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.html", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData" ] + ] ], + [ "PolarHrData.java", "PolarHrData_8java.html", [ + [ "PolarHrData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.html", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData" ] + ] ], + [ "PolarNotificationNotEnabled.java", "PolarNotificationNotEnabled_8java.html", [ + [ "PolarNotificationNotEnabled", "classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarNotificationNotEnabled.html", null ] + ] ], + [ "PolarOhrPPGData.java", "PolarOhrPPGData_8java.html", [ + [ "PolarOhrPPGData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData.html", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData" ] + ] ], + [ "PolarOhrPPIData.java", "PolarOhrPPIData_8java.html", [ + [ "PolarOhrPPIData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData.html", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData" ] + ] ], + [ "PolarOperationNotSupported.java", "PolarOperationNotSupported_8java.html", [ + [ "PolarOperationNotSupported", "classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarOperationNotSupported.html", null ] + ] ], + [ "PolarSensorSetting.java", "PolarSensorSetting_8java.html", [ + [ "PolarSensorSetting", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.html", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting" ], + [ "SettingType", "enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.html", "enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType" ] + ] ], + [ "PolarServiceNotAvailable.java", "PolarServiceNotAvailable_8java.html", [ + [ "PolarServiceNotAvailable", "classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarServiceNotAvailable.html", null ] + ] ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/folderclosed.png b/polar-sdk-android/docs/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/polar-sdk-android/docs/html/functions.html b/polar-sdk-android/docs/html/functions.html new file mode 100644 index 00000000..be96e938 --- /dev/null +++ b/polar-sdk-android/docs/html/functions.html @@ -0,0 +1,548 @@ + + + + + + + +SDK for Polar sensors: Data Fields + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- q -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- v -

+
+
+ + + + diff --git a/polar-sdk-android/docs/html/functions_func.html b/polar-sdk-android/docs/html/functions_func.html new file mode 100644 index 00000000..eca368fa --- /dev/null +++ b/polar-sdk-android/docs/html/functions_func.html @@ -0,0 +1,399 @@ + + + + + + + +SDK for Polar sensors: Data Fields - Functions + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+  + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- p -

+ + +

- q -

+ + +

- r -

+ + +

- s -

+ + +

- v -

+
+
+ + + + diff --git a/polar-sdk-android/docs/html/functions_vars.html b/polar-sdk-android/docs/html/functions_vars.html new file mode 100644 index 00000000..c9c5fc2d --- /dev/null +++ b/polar-sdk-android/docs/html/functions_vars.html @@ -0,0 +1,273 @@ + + + + + + + +SDK for Polar sensors: Data Fields - Variables + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+  + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- f -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- v -

+
+
+ + + + diff --git a/polar-sdk-android/docs/html/hierarchy.html b/polar-sdk-android/docs/html/hierarchy.html new file mode 100644 index 00000000..df4b6e8b --- /dev/null +++ b/polar-sdk-android/docs/html/hierarchy.html @@ -0,0 +1,110 @@ + + + + + + + +SDK for Polar sensors: Class Hierarchy + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/polar-sdk-android/docs/html/hierarchy.js b/polar-sdk-android/docs/html/hierarchy.js new file mode 100644 index 00000000..f29a1558 --- /dev/null +++ b/polar-sdk-android/docs/html/hierarchy.js @@ -0,0 +1,31 @@ +var hierarchy = +[ + [ "Exception", null, [ + [ "polar.com.sdk.api.errors.PolarDeviceDisconnected", "classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceDisconnected.html", null ], + [ "polar.com.sdk.api.errors.PolarDeviceNotConnected", "classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotConnected.html", null ], + [ "polar.com.sdk.api.errors.PolarDeviceNotFound", "classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarDeviceNotFound.html", null ], + [ "polar.com.sdk.api.errors.PolarNotificationNotEnabled", "classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarNotificationNotEnabled.html", null ], + [ "polar.com.sdk.api.errors.PolarOperationNotSupported", "classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarOperationNotSupported.html", null ], + [ "polar.com.sdk.api.errors.PolarServiceNotAvailable", "classpolar_1_1com_1_1sdk_1_1api_1_1errors_1_1PolarServiceNotAvailable.html", null ] + ] ], + [ "polar.com.sdk.api.model.PolarAccelerometerData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarAccelerometerData.html", null ], + [ "polar.com.sdk.api.model.PolarBiozData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarBiozData.html", null ], + [ "polar.com.sdk.api.PolarBleApi", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi.html", [ + [ "polar.com.sdk.impl.BDBleApiImpl", "classpolar_1_1com_1_1sdk_1_1impl_1_1BDBleApiImpl.html", null ] + ] ], + [ "polar.com.sdk.api.PolarBleApiCallback", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html", null ], + [ "polar.com.sdk.api.PolarBleApiDefaultImpl", "classpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiDefaultImpl.html", null ], + [ "polar.com.sdk.api.PolarBleApi.PolarBleApiLogger", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger.html", null ], + [ "polar.com.sdk.api.model.PolarDeviceInfo", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarDeviceInfo.html", null ], + [ "polar.com.sdk.api.model.PolarEcgData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarEcgData.html", null ], + [ "polar.com.sdk.api.model.PolarExerciseData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseData.html", null ], + [ "polar.com.sdk.api.model.PolarExerciseEntry", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarExerciseEntry.html", null ], + [ "polar.com.sdk.api.model.PolarHrBroadcastData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrBroadcastData.html", null ], + [ "polar.com.sdk.api.model.PolarHrData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarHrData.html", null ], + [ "polar.com.sdk.api.model.PolarOhrPPGData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPGData.html", null ], + [ "polar.com.sdk.api.model.PolarOhrPPIData", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarOhrPPIData.html", null ], + [ "polar.com.sdk.api.model.PolarSensorSetting", "classpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting.html", null ], + [ "polar.com.sdk.api.PolarBleApi.RecordingInterval", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1RecordingInterval.html", null ], + [ "polar.com.sdk.api.PolarBleApi.SampleType", "enumpolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1SampleType.html", null ], + [ "polar.com.sdk.api.model.PolarSensorSetting.SettingType", "enumpolar_1_1com_1_1sdk_1_1api_1_1model_1_1PolarSensorSetting_1_1SettingType.html", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/index.html b/polar-sdk-android/docs/html/index.html new file mode 100644 index 00000000..1785f88b --- /dev/null +++ b/polar-sdk-android/docs/html/index.html @@ -0,0 +1,80 @@ + + + + + + + +SDK for Polar sensors: Main Page + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+
+
SDK for Polar sensors Documentation
+
+
+
+
+ + + + diff --git a/polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html b/polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html new file mode 100644 index 00000000..ed6348d1 --- /dev/null +++ b/polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html @@ -0,0 +1,493 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.PolarBleApiCallback Interface Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.PolarBleApiCallback Interface Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

void blePowerStateChanged (final boolean powered)
 
void polarDeviceConnected (@NonNull final PolarDeviceInfo polarDeviceInfo)
 
void polarDeviceConnecting (@NonNull final PolarDeviceInfo polarDeviceInfo)
 
void polarDeviceDisconnected (@NonNull final PolarDeviceInfo polarDeviceInfo)
 
void ecgFeatureReady (@NonNull final String identifier)
 
void accelerometerFeatureReady (@NonNull final String identifier)
 
void ppgFeatureReady (@NonNull final String identifier)
 
void ppiFeatureReady (@NonNull final String identifier)
 
void biozFeatureReady (@NonNull final String identifier)
 
void hrFeatureReady (@NonNull final String identifier)
 
void fwInformationReceived (@NonNull final String identifier, @NonNull final String fwVersion)
 
void batteryLevelReceived (@NonNull final String identifier, final int level)
 
void hrNotificationReceived (@NonNull final String identifier, @NonNull final PolarHrData data)
 
void polarFtpFeatureReady (@NonNull final String identifier)
 
+

Detailed Description

+

Contains the callbacks of the API.

+ +

Definition at line 11 of file PolarBleApiCallback.java.

+

Member Function Documentation

+ +

◆ accelerometerFeatureReady()

+ +
+
+ + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.accelerometerFeatureReady (@NonNull final String identifier)
+
+

Polar device's ACC feature is ready. Application may start ACC stream now if desired. requires feature PolarBleApi::FEATURE_POLAR_SENSOR_STREAMING

Parameters
+ + +
identifierPolar device id
+
+
+ +
+
+ +

◆ batteryLevelReceived()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.batteryLevelReceived (@NonNull final String identifier,
final int level 
)
+
+

Battery level received requires feature PolarBleApi::FEATURE_BATTERY_INFO

Parameters
+ + + +
identifierPolar device id
levelbattery level (value between 0-100%)
+
+
+ +
+
+ +

◆ biozFeatureReady()

+ +
+
+ + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.biozFeatureReady (@NonNull final String identifier)
+
+

Polar device's bioz feature is ready.

Parameters
+ + +
identifierPolar device id
+
+
+ +
+
+ +

◆ blePowerStateChanged()

+ +
+
+ + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.blePowerStateChanged (final boolean powered)
+
+
Parameters
+ + +
poweredtrue = Bluetooth power on, false = Bluetooth power off
+
+
+ +
+
+ +

◆ ecgFeatureReady()

+ +
+
+ + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.ecgFeatureReady (@NonNull final String identifier)
+
+

Polar device's ECG feature is ready. Application may start ECG stream now if desired. requires feature PolarBleApi::FEATURE_POLAR_SENSOR_STREAMING

Parameters
+ + +
identifierPolar device id
+
+
+ +
+
+ +

◆ fwInformationReceived()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.fwInformationReceived (@NonNull final String identifier,
@NonNull final String fwVersion 
)
+
+

Firmware version information received requires feature PolarBleApi::FEATURE_DEVICE_INFO

Parameters
+ + + +
identifierPolar device id
fwVersionversion in format major.minor.patch
+
+
+ +
+
+ +

◆ hrFeatureReady()

+ +
+
+ + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.hrFeatureReady (@NonNull final String identifier)
+
+

Polar device HR client is now ready and HR transmission is starting in a moment.

Parameters
+ + +
identifierPolar device id
+
+
+ +
+
+ +

◆ hrNotificationReceived()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.hrNotificationReceived (@NonNull final String identifier,
@NonNull final PolarHrData data 
)
+
+

HR notification data received from device

Parameters
+ + + +
identifierPolar device id
data
+
+
+
See also
polar.com.sdk.api.model.PolarHrData.java
+ +
+
+ +

◆ polarDeviceConnected()

+ +
+
+ + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.polarDeviceConnected (@NonNull final PolarDeviceInfo polarDeviceInfo)
+
+

Polar device is now connected

Parameters
+ + +
polarDeviceInfoPolar device information
+
+
+ +
+
+ +

◆ polarDeviceConnecting()

+ +
+
+ + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.polarDeviceConnecting (@NonNull final PolarDeviceInfo polarDeviceInfo)
+
+

connecting to polar device

Parameters
+ + +
polarDeviceInfoPolar device information
+
+
+ +
+
+ +

◆ polarDeviceDisconnected()

+ +
+
+ + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.polarDeviceDisconnected (@NonNull final PolarDeviceInfo polarDeviceInfo)
+
+

Polar device is now disconnected, no further action is needed from the application if polar.com.sdk.api.PolarBleApi::disconnectFromPolarDevice is not called. Device will be automatically reconnected

Parameters
+ + +
polarDeviceInfoPolar device information
+
+
+ +
+
+ +

◆ polarFtpFeatureReady()

+ +
+
+ + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.polarFtpFeatureReady (@NonNull final String identifier)
+
+

File transfer ready requires feature PolarBleApi::FEATURE_POLAR_FILE_TRANSFER

Parameters
+ + +
identifierPolar device id
+
+
+ +
+
+ +

◆ ppgFeatureReady()

+ +
+
+ + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.ppgFeatureReady (@NonNull final String identifier)
+
+

Polar device's PPG feature is ready. Application may start PPG stream now if desired. requires feature PolarBleApi::FEATURE_POLAR_SENSOR_STREAMING

Parameters
+ + +
identifierPolar device id
+
+
+ +
+
+ +

◆ ppiFeatureReady()

+ +
+
+ + + + + + + + +
void polar.com.sdk.api.PolarBleApiCallback.ppiFeatureReady (@NonNull final String identifier)
+
+

Polar device's PPI feature is ready. Application may start PPI stream now if desired. requires feature PolarBleApi::FEATURE_POLAR_SENSOR_STREAMING

Parameters
+ + +
identifierPolar device id
+
+
+ +
+
+
The documentation for this interface was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.js b/polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.js new file mode 100644 index 00000000..ab2d8baa --- /dev/null +++ b/polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.js @@ -0,0 +1,17 @@ +var interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback = +[ + [ "accelerometerFeatureReady", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#a2994bd2e8b3d80b4e4de9ad0bb0920e8", null ], + [ "batteryLevelReceived", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#ad98839ae9719804e7f93db93c03a3502", null ], + [ "biozFeatureReady", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#afec6d56715ba82b46129812be452f1ba", null ], + [ "blePowerStateChanged", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#a2e4e8f71a75eebf87be49751fcf4b4e8", null ], + [ "ecgFeatureReady", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#a3c2c3ff7eb76a8cba67057b60122b035", null ], + [ "fwInformationReceived", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#a535f9cd51fed5b5cb942043491805fce", null ], + [ "hrFeatureReady", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#a60b5030d4ee50f7cf9d50bcbe2229808", null ], + [ "hrNotificationReceived", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#aa9534a4ec9f2269d19a112f54d2ec0e0", null ], + [ "polarDeviceConnected", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#a2cb360c2635633d6e78affa9a19b71b9", null ], + [ "polarDeviceConnecting", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#a4cceddbd2d8d2933893509f35d4cb4f9", null ], + [ "polarDeviceDisconnected", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#a3ff1646ff47dcd2a3cc5df276c0d1f6d", null ], + [ "polarFtpFeatureReady", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#ad2055f89f0e3a0d1dfce7a444b507698", null ], + [ "ppgFeatureReady", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#a3541b2cec92744126a84ec207f3e1211", null ], + [ "ppiFeatureReady", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApiCallback.html#af5ab3ec3f17b4f32085e9e085b0f38c3", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger.html b/polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger.html new file mode 100644 index 00000000..3bca80bc --- /dev/null +++ b/polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger.html @@ -0,0 +1,121 @@ + + + + + + + +SDK for Polar sensors: polar.com.sdk.api.PolarBleApi.PolarBleApiLogger Interface Reference + + + + + + + + + + + +
+
+ + + + + + +
+
SDK for Polar sensors +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+
+ +
+
polar.com.sdk.api.PolarBleApi.PolarBleApiLogger Interface Reference
+
+
+ + + + +

+Public Member Functions

void message (final String str)
 
+

Detailed Description

+

Logger interface declaration

+ +

Definition at line 38 of file PolarBleApi.java.

+

Member Function Documentation

+ +

◆ message()

+ +
+
+ + + + + + + + +
void polar.com.sdk.api.PolarBleApi.PolarBleApiLogger.message (final String str)
+
+

message from sdk logging

Parameters
+ + +
strformatted string message
+
+
+ +
+
+
The documentation for this interface was generated from the following file: +
+
+ + + + diff --git a/polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger.js b/polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger.js new file mode 100644 index 00000000..35cc409f --- /dev/null +++ b/polar-sdk-android/docs/html/interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger.js @@ -0,0 +1,4 @@ +var interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger = +[ + [ "message", "interfacepolar_1_1com_1_1sdk_1_1api_1_1PolarBleApi_1_1PolarBleApiLogger.html#ae55d724f7a34d52fab2f781993d4efcc", null ] +]; \ No newline at end of file diff --git a/polar-sdk-android/docs/html/jquery.js b/polar-sdk-android/docs/html/jquery.js new file mode 100644 index 00000000..1ee895ca --- /dev/null +++ b/polar-sdk-android/docs/html/jquery.js @@ -0,0 +1,87 @@ +/*! + * jQuery JavaScript Library v1.7.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Wed Mar 21 12:46:34 2012 -0700 + */ +(function(bd,L){var av=bd.document,bu=bd.navigator,bm=bd.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bd.jQuery,bH=bd.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bd.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bd.attachEvent("onload",bF.ready);var b0=false;try{b0=bd.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0!=null&&b0==b0.window},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bd.JSON&&bd.JSON.parse){return bd.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){if(typeof b2!=="string"||!b2){return null}var b0,b1;try{if(bd.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bd.execScript||function(b1){bd["eval"].call(bd,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aK.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aK.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
a";bH=bv.getElementsByTagName("*");bE=bv.getElementsByTagName("a")[0];if(!bH||!bH.length||!bE){return{}}bF=av.createElement("select");bx=bF.appendChild(av.createElement("option"));bD=bv.getElementsByTagName("input")[0];bI={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bE.getAttribute("style")),hrefNormalized:(bE.getAttribute("href")==="/a"),opacity:/^0.55/.test(bE.style.opacity),cssFloat:!!bE.style.cssFloat,checkOn:(bD.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true,pixelMargin:true};b.boxModel=bI.boxModel=(av.compatMode==="CSS1Compat");bD.checked=true;bI.noCloneChecked=bD.cloneNode(true).checked;bF.disabled=true;bI.optDisabled=!bx.disabled;try{delete bv.test}catch(bB){bI.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bI.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bD=av.createElement("input");bD.value="t";bD.setAttribute("type","radio");bI.radioValue=bD.value==="t";bD.setAttribute("checked","checked");bD.setAttribute("name","t");bv.appendChild(bD);bC=av.createDocumentFragment();bC.appendChild(bv.lastChild);bI.checkClone=bC.cloneNode(true).cloneNode(true).lastChild.checked;bI.appendChecked=bD.checked;bC.removeChild(bD);bC.appendChild(bv);if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bA="on"+by;bw=(bA in bv);if(!bw){bv.setAttribute(bA,"return;");bw=(typeof bv[bA]==="function")}bI[by+"Bubbles"]=bw}}bC.removeChild(bv);bC=bF=bx=bv=bD=null;b(function(){var bM,bV,bW,bU,bO,bP,bR,bL,bK,bQ,bN,e,bT,bS=av.getElementsByTagName("body")[0];if(!bS){return}bL=1;bT="padding:0;margin:0;border:";bN="position:absolute;top:0;left:0;width:1px;height:1px;";e=bT+"0;visibility:hidden;";bK="style='"+bN+bT+"5px solid #000;";bQ="
";bM=av.createElement("div");bM.style.cssText=e+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bS.insertBefore(bM,bS.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
t
";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bI.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);if(bd.getComputedStyle){bv.innerHTML="";bR=av.createElement("div");bR.style.width="0";bR.style.marginRight="0";bv.style.width="2px";bv.appendChild(bR);bI.reliableMarginRight=(parseInt((bd.getComputedStyle(bR,null)||{marginRight:0}).marginRight,10)||0)===0}if(typeof bv.style.zoom!=="undefined"){bv.innerHTML="";bv.style.width=bv.style.padding="1px";bv.style.border=0;bv.style.overflow="hidden";bv.style.display="inline";bv.style.zoom=1;bI.inlineBlockNeedsLayout=(bv.offsetWidth===3);bv.style.display="block";bv.style.overflow="visible";bv.innerHTML="
";bI.shrinkWrapBlocks=(bv.offsetWidth!==3)}bv.style.cssText=bN+e;bv.innerHTML=bQ;bV=bv.firstChild;bW=bV.firstChild;bO=bV.nextSibling.firstChild.firstChild;bP={doesNotAddBorder:(bW.offsetTop!==5),doesAddBorderForTableAndCells:(bO.offsetTop===5)};bW.style.position="fixed";bW.style.top="20px";bP.fixedPosition=(bW.offsetTop===20||bW.offsetTop===15);bW.style.position=bW.style.top="";bV.style.overflow="hidden";bV.style.position="relative";bP.subtractsBorderForOverflowNotVisible=(bW.offsetTop===-5);bP.doesNotIncludeMarginInBodyOffset=(bS.offsetTop!==bL);if(bd.getComputedStyle){bv.style.marginTop="1%";bI.pixelMargin=(bd.getComputedStyle(bv,null)||{marginTop:0}).marginTop!=="1%"}if(typeof bM.style.zoom!=="undefined"){bM.style.zoom=1}bS.removeChild(bM);bR=bv=bM=null;b.extend(bI,bP)});return bI})();var aT=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA1,null,false)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a6(bx,bw,by){if(by===L&&bx.nodeType===1){var bv="data-"+bw.replace(aA,"-$1").toLowerCase();by=bx.getAttribute(bv);if(typeof by==="string"){try{by=by==="true"?true:by==="false"?false:by==="null"?null:b.isNumeric(by)?+by:aT.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e==="data"&&b.isEmptyObject(bv[e])){continue}if(e!=="toJSON"){return false}}return true}function bj(by,bx,bA){var bw=bx+"defer",bv=bx+"queue",e=bx+"mark",bz=b._data(by,bw);if(bz&&(bA==="queue"||!b._data(by,bv))&&(bA==="mark"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||"fx")+"mark";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||"fx";var e=bv+"mark",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bj(bx,bv,"mark")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||"fx")+"queue";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||"fx";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw==="inprogress"){bw=bv.shift()}if(bw){if(bx==="fx"){bv.unshift("inprogress")}b._data(by,bx+".run",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+"queue "+bx+".run",true);bj(by,bx,"queue")}}});b.fn.extend({queue:function(e,bv){var bw=2;if(typeof e!=="string"){bv=e;e="fx";bw--}if(arguments.length1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,b.prop,e,bv,arguments.length>1)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by==="string"){bA=by.split(ag);for(bw=0,bv=this.length;bw-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.type]||b.valHooks[bw.nodeName.toLowerCase()];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aV,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aZ:bf)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(by,bA){var bz,bB,bw,e,bv,bx=0;if(bA&&by.nodeType===1){bB=bA.toLowerCase().split(ag);e=bB.length;for(;bx=0)}}})});var be=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/(?:^|\s)hover(\.\S+)?\b/,aP=/^key/,bg=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler;by=bv.selector}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bd,bI])}}for(bC=0;bCbC){bv.push({elem:this,matches:bD.slice(bC)})}for(bJ=0;bJ0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aP.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bg.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}bE.match.globalPOS=bD;var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(B(bx[0])||B(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function B(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||bb.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aH(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aS.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aS="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ah=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,v=/]","i"),o=/checked\s*(?:[^=]|=\s*.checked.)/i,bn=/\/(java|ecma)script/i,aO=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
","
"]}b.fn.extend({text:function(e){return b.access(this,function(bv){return bv===L?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(bv))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(e){return b.access(this,function(by){var bx=this[0]||{},bw=0,bv=this.length;if(by===L){return bx.nodeType===1?bx.innerHTML.replace(ah,""):null}if(typeof by==="string"&&!ae.test(by)&&(b.support.leadingWhitespace||!ar.test(by))&&!ax[(d.exec(by)||["",""])[1].toLowerCase()]){by=by.replace(R,"<$1>");try{for(;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bh(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function D(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function am(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||b.isXMLDoc(by)||!ai.test("<"+by.nodeName+">")?by.cloneNode(true):am(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){aj(by,bz);e=bh(by);bv=bh(bz);for(bx=0;e[bx];++bx){if(bv[bx]){aj(e[bx],bv[bx])}}}if(bA){s(by,bz);if(bw){e=bh(by);bv=bh(bz);for(bx=0;e[bx];++bx){s(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bI,bw,bv,bx){var bA,bH,bD,bJ=[];bw=bw||av;if(typeof bw.createElement==="undefined"){bw=bw.ownerDocument||bw[0]&&bw[0].ownerDocument||av}for(var bE=0,bG;(bG=bI[bE])!=null;bE++){if(typeof bG==="number"){bG+=""}if(!bG){continue}if(typeof bG==="string"){if(!W.test(bG)){bG=bw.createTextNode(bG)}else{bG=bG.replace(R,"<$1>");var bN=(d.exec(bG)||["",""])[1].toLowerCase(),bz=ax[bN]||ax._default,bK=bz[0],bB=bw.createElement("div"),bL=ac.childNodes,bM;if(bw===av){ac.appendChild(bB)}else{a(bw).appendChild(bB)}bB.innerHTML=bz[1]+bG+bz[2];while(bK--){bB=bB.lastChild}if(!b.support.tbody){var by=v.test(bG),e=bN==="table"&&!by?bB.firstChild&&bB.firstChild.childNodes:bz[1]===""&&!by?bB.childNodes:[];for(bD=e.length-1;bD>=0;--bD){if(b.nodeName(e[bD],"tbody")&&!e[bD].childNodes.length){e[bD].parentNode.removeChild(e[bD])}}}if(!b.support.leadingWhitespace&&ar.test(bG)){bB.insertBefore(bw.createTextNode(ar.exec(bG)[0]),bB.firstChild)}bG=bB.childNodes;if(bB){bB.parentNode.removeChild(bB);if(bL.length>0){bM=bL[bL.length-1];if(bM&&bM.parentNode){bM.parentNode.removeChild(bM)}}}}}var bF;if(!b.support.appendChecked){if(bG[0]&&typeof(bF=bG.length)==="number"){for(bD=0;bD1)};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,"opacity");return e===""?"1":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC==="string"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC="number"}if(bD==null||bC==="number"&&isNaN(bD)){return}if(bC==="number"&&!b.cssNumber[bz]){bD+="px"}if(!bE||!("set" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&"get" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx==="cssFloat"){bx="float"}if(e&&"get" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(by,bx,bz){var e={},bw,bv;for(bv in bx){e[bv]=by.style[bv];by.style[bv]=bx[bv]}bw=bz.call(by);for(bv in bx){by.style[bv]=e[bv]}return bw}});b.curCSS=b.css;if(av.defaultView&&av.defaultView.getComputedStyle){aJ=function(bA,bw){var bv,bz,e,by,bx=bA.style;bw=bw.replace(y,"-$1").toLowerCase();if((bz=bA.ownerDocument.defaultView)&&(e=bz.getComputedStyle(bA,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(bA.ownerDocument.documentElement,bA)){bv=b.style(bA,bw)}}if(!b.support.pixelMargin&&e&&aE.test(bw)&&a1.test(bv)){by=bx.width;bx.width=bv;bv=e.width;bx.width=by}return bv}}if(av.documentElement.currentStyle){aY=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv==null&&bx&&(by=bx[bw])){bv=by}if(a1.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":bv;bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aJ||aY;function af(by,bw,bv){var bz=bw==="width"?by.offsetWidth:by.offsetHeight,bx=bw==="width"?1:0,e=4;if(bz>0){if(bv!=="border"){for(;bx=1&&b.trim(bw.replace(al,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=al.test(bw)?bw.replace(al,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bv,e){return b.swap(bv,{display:"inline-block"},function(){if(e){return Z(bv,"margin-right")}else{return bv.style.marginRight}})}}}});if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}b.each({margin:"",padding:"",border:"Width"},function(e,bv){b.cssHooks[e+bv]={expand:function(by){var bx,bz=typeof by==="string"?by.split(" "):[by],bw={};for(bx=0;bx<4;bx++){bw[e+G[bx]+bv]=bz[bx]||bz[bx-2]||bz[0]}return bw}}});var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,a0=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aN=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aR=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a7=/)<[^<]*)*<\/script>/gi,p=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,z=b.fn.load,aa={},q={},aF,r,aW=["*/"]+["*"];try{aF=bm.href}catch(aw){aF=av.createElement("a");aF.href="";aF=aF.href}r=K.exec(aF.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
").append(bD.replace(a7,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||p.test(this.nodeName)||a0.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){an(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}an(bv,e);return bv},ajaxSettings:{url:aF,isLocal:aN.test(r[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bd.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(q),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bk(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=F(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,r[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=r[1]||bI[2]!=r[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(r[3]||(r[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aX(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aR.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aW+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aX(q,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){u(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function u(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{u(bw+"["+(typeof bz==="object"?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&b.type(by)==="object"){for(var e in by){u(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bk(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function F(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!ba){ba=av.createElement("iframe");ba.frameBorder=ba.width=ba.height=0}e.appendChild(ba);if(!m||!ba.createElement){m=(ba.contentWindow||ba.contentDocument).document;m.write((b.support.boxModel?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(ba)}Q[bx]=bw}return Q[bx]}var a8,V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){a8=function(by,bH,bw,bB){try{bB=by.getBoundingClientRect()}catch(bF){}if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aL(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{a8=function(bz,bE,bx){var bC,bw=bz.offsetParent,bv=bz,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.fn.offset=function(e){if(arguments.length){return e===L?this:this.each(function(bx){b.offset.setOffset(this,e,bx)})}var bv=this[0],bw=bv&&bv.ownerDocument;if(!bw){return null}if(bv===bw.body){return b.offset.bodyOffset(bv)}return a8(bv,bw,bw.documentElement)};b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(bw,bv){var e=/Y/.test(bv);b.fn[bw]=function(bx){return b.access(this,function(by,bB,bA){var bz=aL(by);if(bA===L){return bz?(bv in bz)?bz[bv]:b.support.boxModel&&bz.document.documentElement[bB]||bz.document.body[bB]:by[bB]}if(bz){bz.scrollTo(!e?bA:b(bz).scrollLeft(),e?bA:b(bz).scrollTop())}else{by[bB]=bA}},bw,bx,arguments.length,null)}});function aL(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each({Height:"height",Width:"width"},function(bw,bx){var bv="client"+bw,e="scroll"+bw,by="offset"+bw;b.fn["inner"+bw]=function(){var bz=this[0];return bz?bz.style?parseFloat(b.css(bz,bx,"padding")):this[bx]():null};b.fn["outer"+bw]=function(bA){var bz=this[0];return bz?bz.style?parseFloat(b.css(bz,bx,bA?"margin":"border")):this[bx]():null};b.fn[bx]=function(bz){return b.access(this,function(bC,bB,bD){var bF,bE,bG,bA;if(b.isWindow(bC)){bF=bC.document;bE=bF.documentElement[bv];return b.support.boxModel&&bE||bF.body&&bF.body[bv]||bE}if(bC.nodeType===9){bF=bC.documentElement;if(bF[bv]>=bF[e]){return bF[bv]}return Math.max(bC.body[e],bF[e],bC.body[by],bF[by])}if(bD===L){bG=b.css(bC,bB);bA=parseFloat(bG);return b.isNumeric(bA)?bA:bG}b(bC).css(bB,bD)},bx,bz,arguments.length,null)}});bd.jQuery=bd.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('
+
+ +
+
BDBleApiImpl.java File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + +

+Data Structures

class  polar.com.sdk.impl.BDBleApiImpl
 
interface  polar.com.sdk.impl.BDBleApiImpl.FetchRecursiveCondition
 
+ + + +

+Packages

package  polar.com.sdk.impl
 
+
+