react-native-polar-bridge 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/PolarBridge.podspec +26 -0
- package/README.md +115 -0
- package/android/build.gradle +103 -0
- package/android/generated/java/com/polarbridge/NativePolarBridgeSpec.java +57 -0
- package/android/generated/jni/CMakeLists.txt +36 -0
- package/android/generated/jni/RNPolarBridgeSpec-generated.cpp +62 -0
- package/android/generated/jni/RNPolarBridgeSpec.h +31 -0
- package/android/generated/jni/react/renderer/components/RNPolarBridgeSpec/RNPolarBridgeSpecJSI-generated.cpp +66 -0
- package/android/generated/jni/react/renderer/components/RNPolarBridgeSpec/RNPolarBridgeSpecJSI.h +116 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/polarbridge/PolarBridgeModule.kt +182 -0
- package/android/src/main/java/com/polarbridge/PolarBridgePackage.kt +33 -0
- package/ios/PolarBridge.h +6 -0
- package/ios/PolarBridge.mm +18 -0
- package/ios/generated/RNPolarBridgeSpec/RNPolarBridgeSpec-generated.mm +74 -0
- package/ios/generated/RNPolarBridgeSpec/RNPolarBridgeSpec.h +68 -0
- package/ios/generated/RNPolarBridgeSpecJSI-generated.cpp +66 -0
- package/ios/generated/RNPolarBridgeSpecJSI.h +116 -0
- package/lib/module/NativePolarBridge.ts +13 -0
- package/lib/module/index.js +30 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/babel.config.d.ts +2 -0
- package/lib/typescript/babel.config.d.ts.map +1 -0
- package/lib/typescript/eslint.config.d.mts +3 -0
- package/lib/typescript/eslint.config.d.mts.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/react-native.config.d.ts +3 -0
- package/lib/typescript/react-native.config.d.ts.map +1 -0
- package/lib/typescript/src/NativePolarBridge.d.ts +12 -0
- package/lib/typescript/src/NativePolarBridge.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +15 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/package.json +169 -0
- package/react-native.config.js +12 -0
- package/src/NativePolarBridge.ts +13 -0
- package/src/index.tsx +34 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
package com.polarbridge
|
|
2
|
+
|
|
3
|
+
import android.util.Log
|
|
4
|
+
import com.facebook.react.bridge.*
|
|
5
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
6
|
+
import com.polar.sdk.api.PolarBleApi
|
|
7
|
+
import com.polar.sdk.api.PolarBleApiCallback
|
|
8
|
+
import com.polar.sdk.api.PolarBleApiDefaultImpl
|
|
9
|
+
import com.polar.sdk.api.PolarH10OfflineExerciseApi
|
|
10
|
+
import com.polar.sdk.api.errors.PolarInvalidArgument
|
|
11
|
+
import com.polar.sdk.api.model.*
|
|
12
|
+
import io.reactivex.rxjava3.disposables.Disposable
|
|
13
|
+
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
|
14
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
15
|
+
|
|
16
|
+
@ReactModule(name = PolarBridgeModule.NAME)
|
|
17
|
+
class PolarBridgeModule(reactContext: ReactApplicationContext) :
|
|
18
|
+
NativePolarBridgeSpec(reactContext) {
|
|
19
|
+
private val reactContext: ReactApplicationContext = reactContext
|
|
20
|
+
|
|
21
|
+
override fun getName(): String {
|
|
22
|
+
return NAME
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Example method
|
|
26
|
+
// See https://reactnative.dev/docs/native-modules-android
|
|
27
|
+
override fun multiply(a: Double, b: Double): Double {
|
|
28
|
+
return a * b
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ATTENTION! Replace with the device ID from your device.
|
|
32
|
+
private var deviceId = "B4291522"
|
|
33
|
+
|
|
34
|
+
private var hrDisposable: Disposable? = null
|
|
35
|
+
private var scanDisposable: Disposable? = null
|
|
36
|
+
|
|
37
|
+
private val api: PolarBleApi by lazy {
|
|
38
|
+
// Notice all features are enabled
|
|
39
|
+
PolarBleApiDefaultImpl.defaultImplementation(
|
|
40
|
+
reactApplicationContext.applicationContext,
|
|
41
|
+
setOf(
|
|
42
|
+
PolarBleApi.PolarBleSdkFeature.FEATURE_HR,
|
|
43
|
+
PolarBleApi.PolarBleSdkFeature.FEATURE_POLAR_SDK_MODE,
|
|
44
|
+
PolarBleApi.PolarBleSdkFeature.FEATURE_BATTERY_INFO,
|
|
45
|
+
PolarBleApi.PolarBleSdkFeature.FEATURE_POLAR_H10_EXERCISE_RECORDING,
|
|
46
|
+
PolarBleApi.PolarBleSdkFeature.FEATURE_POLAR_OFFLINE_RECORDING,
|
|
47
|
+
PolarBleApi.PolarBleSdkFeature.FEATURE_POLAR_ONLINE_STREAMING,
|
|
48
|
+
PolarBleApi.PolarBleSdkFeature.FEATURE_POLAR_DEVICE_TIME_SETUP,
|
|
49
|
+
PolarBleApi.PolarBleSdkFeature.FEATURE_DEVICE_INFO,
|
|
50
|
+
PolarBleApi.PolarBleSdkFeature.FEATURE_POLAR_LED_ANIMATION
|
|
51
|
+
)
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
override fun connectToDevice(deviceId: String) {
|
|
56
|
+
Log.e(TAG, "Connect device: $deviceId ")
|
|
57
|
+
try {
|
|
58
|
+
api.connectToDevice(deviceId)
|
|
59
|
+
} catch(polarInvalidArgument: PolarInvalidArgument){
|
|
60
|
+
Log.e(TAG, "Failed to connect to device. Reason $polarInvalidArgument ")
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
override fun disconnectFromDevice(deviceId: String) {
|
|
65
|
+
Log.e(TAG, "Disconnect device: $deviceId ")
|
|
66
|
+
try {
|
|
67
|
+
api.disconnectFromDevice(deviceId)
|
|
68
|
+
} catch(polarInvalidArgument: PolarInvalidArgument){
|
|
69
|
+
Log.e(TAG, "Failed to disconnect from device. Reason $polarInvalidArgument ")
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
override fun scanDevices() {
|
|
74
|
+
Log.e(TAG, "Scan Devices")
|
|
75
|
+
val isDisposed = scanDisposable?.isDisposed ?: true
|
|
76
|
+
if (isDisposed) {
|
|
77
|
+
scanDisposable = api.searchForDevice()
|
|
78
|
+
.observeOn(AndroidSchedulers.mainThread())
|
|
79
|
+
.subscribe(
|
|
80
|
+
{ polarDeviceInfo: PolarDeviceInfo ->
|
|
81
|
+
Log.d(TAG, "polar device found id: " + polarDeviceInfo.deviceId + " address: " + polarDeviceInfo.address + " rssi: " + polarDeviceInfo.rssi + " name: " + polarDeviceInfo.name + " isConnectable: " + polarDeviceInfo.isConnectable)
|
|
82
|
+
|
|
83
|
+
val device = Arguments.createMap().apply {
|
|
84
|
+
putString("deviceId", polarDeviceInfo.deviceId)
|
|
85
|
+
putString("address", polarDeviceInfo.address)
|
|
86
|
+
putInt("rssi", polarDeviceInfo.rssi)
|
|
87
|
+
putString("name", polarDeviceInfo.name)
|
|
88
|
+
putBoolean("isConnectable", polarDeviceInfo.isConnectable)
|
|
89
|
+
}
|
|
90
|
+
sendEvent("onDeviceFound", device)
|
|
91
|
+
},
|
|
92
|
+
{ error: Throwable ->
|
|
93
|
+
Log.e(TAG, "Device scan failed. Reason $error")
|
|
94
|
+
sendEvent("onScanError", Arguments.createMap().apply {
|
|
95
|
+
putString("message", error.message)
|
|
96
|
+
})
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
Log.d(TAG, "complete")
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
} else {
|
|
103
|
+
scanDisposable?.dispose()
|
|
104
|
+
Log.d(TAG, "Device scan stopped")
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
val isDisposed = hrDisposable?.isDisposed ?: true
|
|
109
|
+
override fun fetchHrData(deviceId: String) {
|
|
110
|
+
Log.e(TAG, "Fetch Heart Data called on: $deviceId ")
|
|
111
|
+
try{
|
|
112
|
+
if (isDisposed) {
|
|
113
|
+
hrDisposable = api.startHrStreaming(deviceId)
|
|
114
|
+
.observeOn(AndroidSchedulers.mainThread())
|
|
115
|
+
.subscribe(
|
|
116
|
+
{ hrData: PolarHrData ->
|
|
117
|
+
Log.i(TAG, "PolarHrData ${hrData.samples.size}")
|
|
118
|
+
for (sample in hrData.samples) {
|
|
119
|
+
Log.d(TAG, "HR bpm: ${sample.hr} " +
|
|
120
|
+
"rrs: ${sample.rrsMs} " +
|
|
121
|
+
"rrAvailable: ${sample.rrAvailable} " +
|
|
122
|
+
"contactStatus: ${sample.contactStatus} " +
|
|
123
|
+
"contactStatusSupported: ${sample.contactStatusSupported}")
|
|
124
|
+
|
|
125
|
+
val event: WritableMap = Arguments.createMap()
|
|
126
|
+
event.putInt("hr", sample.hr)
|
|
127
|
+
|
|
128
|
+
val rrsArray: WritableArray = Arguments.createArray()
|
|
129
|
+
sample.rrsMs.forEach { rrsValue ->
|
|
130
|
+
rrsArray.pushInt(rrsValue)
|
|
131
|
+
}
|
|
132
|
+
event.putArray("rrsMs", rrsArray)
|
|
133
|
+
event.putBoolean("rrAvailable", sample.rrAvailable)
|
|
134
|
+
event.putBoolean("contactStatus", sample.contactStatus)
|
|
135
|
+
event.putBoolean("contactStatusSupported", sample.contactStatusSupported)
|
|
136
|
+
|
|
137
|
+
sendEvent("PolarHrData", event)
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
{ error: Throwable ->
|
|
141
|
+
Log.e(TAG, "HR stream failed. Reason $error")
|
|
142
|
+
|
|
143
|
+
val errorEvent = Arguments.createMap()
|
|
144
|
+
errorEvent.putString("error", error.toString())
|
|
145
|
+
sendEvent("PolarHrError", errorEvent)
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
Log.d(TAG, "HR stream complete")
|
|
149
|
+
|
|
150
|
+
val completeEvent = Arguments.createMap()
|
|
151
|
+
completeEvent.putString("message", "HR stream complete")
|
|
152
|
+
sendEvent("PolarHrComplete", completeEvent)
|
|
153
|
+
}
|
|
154
|
+
)
|
|
155
|
+
} else {
|
|
156
|
+
// NOTE dispose will stop streaming if it is "running"
|
|
157
|
+
hrDisposable?.dispose()
|
|
158
|
+
Log.d(TAG, "HR stream stopped")
|
|
159
|
+
}
|
|
160
|
+
} catch(polarInvalidArgument: PolarInvalidArgument){
|
|
161
|
+
Log.e(TAG, "Failed to fetch HR Data. Reason $polarInvalidArgument ")
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
override fun disposeHrStream(){
|
|
166
|
+
hrDisposable?.dispose()
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
private fun sendEvent(eventName: String, params: WritableMap?) {
|
|
170
|
+
reactContext
|
|
171
|
+
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
172
|
+
.emit(eventName, params)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
companion object {
|
|
177
|
+
const val NAME = "PolarBridge"
|
|
178
|
+
private const val TAG = "PolarBridgeModule"
|
|
179
|
+
private const val API_LOGGER_TAG = "API LOGGER"
|
|
180
|
+
private const val PERMISSION_REQUEST_CODE = 1
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
package com.polarbridge
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.BaseReactPackage
|
|
4
|
+
import com.facebook.react.bridge.NativeModule
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
+
import com.facebook.react.module.model.ReactModuleInfo
|
|
7
|
+
import com.facebook.react.module.model.ReactModuleInfoProvider
|
|
8
|
+
import java.util.HashMap
|
|
9
|
+
|
|
10
|
+
class PolarBridgePackage : BaseReactPackage() {
|
|
11
|
+
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
|
|
12
|
+
return if (name == PolarBridgeModule.NAME) {
|
|
13
|
+
PolarBridgeModule(reactContext)
|
|
14
|
+
} else {
|
|
15
|
+
null
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
|
|
20
|
+
return ReactModuleInfoProvider {
|
|
21
|
+
val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
|
|
22
|
+
moduleInfos[PolarBridgeModule.NAME] = ReactModuleInfo(
|
|
23
|
+
PolarBridgeModule.NAME,
|
|
24
|
+
PolarBridgeModule.NAME,
|
|
25
|
+
false, // canOverrideExistingModule
|
|
26
|
+
false, // needsEagerInit
|
|
27
|
+
false, // isCxxModule
|
|
28
|
+
true // isTurboModule
|
|
29
|
+
)
|
|
30
|
+
moduleInfos
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#import "PolarBridge.h"
|
|
2
|
+
|
|
3
|
+
@implementation PolarBridge
|
|
4
|
+
RCT_EXPORT_MODULE()
|
|
5
|
+
|
|
6
|
+
- (NSNumber *)multiply:(double)a b:(double)b {
|
|
7
|
+
NSNumber *result = @(a * b);
|
|
8
|
+
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
|
13
|
+
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
14
|
+
{
|
|
15
|
+
return std::make_shared<facebook::react::NativePolarBridgeSpecJSI>(params);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
3
|
+
*
|
|
4
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
5
|
+
* once the code is regenerated.
|
|
6
|
+
*
|
|
7
|
+
* @generated by codegen project: GenerateModuleObjCpp
|
|
8
|
+
*
|
|
9
|
+
* We create an umbrella header (and corresponding implementation) here since
|
|
10
|
+
* Cxx compilation in BUCK has a limitation: source-code producing genrule()s
|
|
11
|
+
* must have a single output. More files => more genrule()s => slower builds.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
#import "RNPolarBridgeSpec.h"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@implementation NativePolarBridgeSpecBase
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper
|
|
21
|
+
{
|
|
22
|
+
_eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback);
|
|
23
|
+
}
|
|
24
|
+
@end
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
namespace facebook::react {
|
|
28
|
+
|
|
29
|
+
static facebook::jsi::Value __hostFunction_NativePolarBridgeSpecJSI_multiply(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
30
|
+
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, NumberKind, "multiply", @selector(multiply:b:), args, count);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
static facebook::jsi::Value __hostFunction_NativePolarBridgeSpecJSI_connectToDevice(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
34
|
+
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, VoidKind, "connectToDevice", @selector(connectToDevice:), args, count);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
static facebook::jsi::Value __hostFunction_NativePolarBridgeSpecJSI_disconnectFromDevice(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
38
|
+
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, VoidKind, "disconnectFromDevice", @selector(disconnectFromDevice:), args, count);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
static facebook::jsi::Value __hostFunction_NativePolarBridgeSpecJSI_fetchHrData(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
42
|
+
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, VoidKind, "fetchHrData", @selector(fetchHrData:), args, count);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static facebook::jsi::Value __hostFunction_NativePolarBridgeSpecJSI_scanDevices(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
46
|
+
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, VoidKind, "scanDevices", @selector(scanDevices), args, count);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static facebook::jsi::Value __hostFunction_NativePolarBridgeSpecJSI_disposeHrStream(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
50
|
+
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, VoidKind, "disposeHrStream", @selector(disposeHrStream), args, count);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
NativePolarBridgeSpecJSI::NativePolarBridgeSpecJSI(const ObjCTurboModule::InitParams ¶ms)
|
|
54
|
+
: ObjCTurboModule(params) {
|
|
55
|
+
|
|
56
|
+
methodMap_["multiply"] = MethodMetadata {2, __hostFunction_NativePolarBridgeSpecJSI_multiply};
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
methodMap_["connectToDevice"] = MethodMetadata {1, __hostFunction_NativePolarBridgeSpecJSI_connectToDevice};
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
methodMap_["disconnectFromDevice"] = MethodMetadata {1, __hostFunction_NativePolarBridgeSpecJSI_disconnectFromDevice};
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
methodMap_["fetchHrData"] = MethodMetadata {1, __hostFunction_NativePolarBridgeSpecJSI_fetchHrData};
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
methodMap_["scanDevices"] = MethodMetadata {0, __hostFunction_NativePolarBridgeSpecJSI_scanDevices};
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
methodMap_["disposeHrStream"] = MethodMetadata {0, __hostFunction_NativePolarBridgeSpecJSI_disposeHrStream};
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
3
|
+
*
|
|
4
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
5
|
+
* once the code is regenerated.
|
|
6
|
+
*
|
|
7
|
+
* @generated by codegen project: GenerateModuleObjCpp
|
|
8
|
+
*
|
|
9
|
+
* We create an umbrella header (and corresponding implementation) here since
|
|
10
|
+
* Cxx compilation in BUCK has a limitation: source-code producing genrule()s
|
|
11
|
+
* must have a single output. More files => more genrule()s => slower builds.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
#ifndef __cplusplus
|
|
15
|
+
#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm.
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
// Avoid multiple includes of RNPolarBridgeSpec symbols
|
|
19
|
+
#ifndef RNPolarBridgeSpec_H
|
|
20
|
+
#define RNPolarBridgeSpec_H
|
|
21
|
+
|
|
22
|
+
#import <Foundation/Foundation.h>
|
|
23
|
+
#import <RCTRequired/RCTRequired.h>
|
|
24
|
+
#import <RCTTypeSafety/RCTConvertHelpers.h>
|
|
25
|
+
#import <RCTTypeSafety/RCTTypedModuleConstants.h>
|
|
26
|
+
#import <React/RCTBridgeModule.h>
|
|
27
|
+
#import <React/RCTCxxConvert.h>
|
|
28
|
+
#import <React/RCTManagedPointer.h>
|
|
29
|
+
#import <ReactCommon/RCTTurboModule.h>
|
|
30
|
+
#import <optional>
|
|
31
|
+
#import <vector>
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
35
|
+
|
|
36
|
+
@protocol NativePolarBridgeSpec <RCTBridgeModule, RCTTurboModule>
|
|
37
|
+
|
|
38
|
+
- (NSNumber *)multiply:(double)a
|
|
39
|
+
b:(double)b;
|
|
40
|
+
- (void)connectToDevice:(NSString *)deviceId;
|
|
41
|
+
- (void)disconnectFromDevice:(NSString *)deviceId;
|
|
42
|
+
- (void)fetchHrData:(NSString *)deviceId;
|
|
43
|
+
- (void)scanDevices;
|
|
44
|
+
- (void)disposeHrStream;
|
|
45
|
+
|
|
46
|
+
@end
|
|
47
|
+
|
|
48
|
+
@interface NativePolarBridgeSpecBase : NSObject {
|
|
49
|
+
@protected
|
|
50
|
+
facebook::react::EventEmitterCallback _eventEmitterCallback;
|
|
51
|
+
}
|
|
52
|
+
- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper;
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@end
|
|
56
|
+
|
|
57
|
+
namespace facebook::react {
|
|
58
|
+
/**
|
|
59
|
+
* ObjC++ class for module 'NativePolarBridge'
|
|
60
|
+
*/
|
|
61
|
+
class JSI_EXPORT NativePolarBridgeSpecJSI : public ObjCTurboModule {
|
|
62
|
+
public:
|
|
63
|
+
NativePolarBridgeSpecJSI(const ObjCTurboModule::InitParams ¶ms);
|
|
64
|
+
};
|
|
65
|
+
} // namespace facebook::react
|
|
66
|
+
|
|
67
|
+
NS_ASSUME_NONNULL_END
|
|
68
|
+
#endif // RNPolarBridgeSpec_H
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
3
|
+
*
|
|
4
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
5
|
+
* once the code is regenerated.
|
|
6
|
+
*
|
|
7
|
+
* @generated by codegen project: GenerateModuleCpp.js
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#include "RNPolarBridgeSpecJSI.h"
|
|
11
|
+
|
|
12
|
+
namespace facebook::react {
|
|
13
|
+
|
|
14
|
+
static jsi::Value __hostFunction_NativePolarBridgeCxxSpecJSI_multiply(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
15
|
+
return static_cast<NativePolarBridgeCxxSpecJSI *>(&turboModule)->multiply(
|
|
16
|
+
rt,
|
|
17
|
+
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(),
|
|
18
|
+
count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber()
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
static jsi::Value __hostFunction_NativePolarBridgeCxxSpecJSI_connectToDevice(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
22
|
+
static_cast<NativePolarBridgeCxxSpecJSI *>(&turboModule)->connectToDevice(
|
|
23
|
+
rt,
|
|
24
|
+
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt)
|
|
25
|
+
);
|
|
26
|
+
return jsi::Value::undefined();
|
|
27
|
+
}
|
|
28
|
+
static jsi::Value __hostFunction_NativePolarBridgeCxxSpecJSI_disconnectFromDevice(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
29
|
+
static_cast<NativePolarBridgeCxxSpecJSI *>(&turboModule)->disconnectFromDevice(
|
|
30
|
+
rt,
|
|
31
|
+
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt)
|
|
32
|
+
);
|
|
33
|
+
return jsi::Value::undefined();
|
|
34
|
+
}
|
|
35
|
+
static jsi::Value __hostFunction_NativePolarBridgeCxxSpecJSI_fetchHrData(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
36
|
+
static_cast<NativePolarBridgeCxxSpecJSI *>(&turboModule)->fetchHrData(
|
|
37
|
+
rt,
|
|
38
|
+
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt)
|
|
39
|
+
);
|
|
40
|
+
return jsi::Value::undefined();
|
|
41
|
+
}
|
|
42
|
+
static jsi::Value __hostFunction_NativePolarBridgeCxxSpecJSI_scanDevices(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
43
|
+
static_cast<NativePolarBridgeCxxSpecJSI *>(&turboModule)->scanDevices(
|
|
44
|
+
rt
|
|
45
|
+
);
|
|
46
|
+
return jsi::Value::undefined();
|
|
47
|
+
}
|
|
48
|
+
static jsi::Value __hostFunction_NativePolarBridgeCxxSpecJSI_disposeHrStream(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
49
|
+
static_cast<NativePolarBridgeCxxSpecJSI *>(&turboModule)->disposeHrStream(
|
|
50
|
+
rt
|
|
51
|
+
);
|
|
52
|
+
return jsi::Value::undefined();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
NativePolarBridgeCxxSpecJSI::NativePolarBridgeCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
|
56
|
+
: TurboModule("PolarBridge", jsInvoker) {
|
|
57
|
+
methodMap_["multiply"] = MethodMetadata {2, __hostFunction_NativePolarBridgeCxxSpecJSI_multiply};
|
|
58
|
+
methodMap_["connectToDevice"] = MethodMetadata {1, __hostFunction_NativePolarBridgeCxxSpecJSI_connectToDevice};
|
|
59
|
+
methodMap_["disconnectFromDevice"] = MethodMetadata {1, __hostFunction_NativePolarBridgeCxxSpecJSI_disconnectFromDevice};
|
|
60
|
+
methodMap_["fetchHrData"] = MethodMetadata {1, __hostFunction_NativePolarBridgeCxxSpecJSI_fetchHrData};
|
|
61
|
+
methodMap_["scanDevices"] = MethodMetadata {0, __hostFunction_NativePolarBridgeCxxSpecJSI_scanDevices};
|
|
62
|
+
methodMap_["disposeHrStream"] = MethodMetadata {0, __hostFunction_NativePolarBridgeCxxSpecJSI_disposeHrStream};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
3
|
+
*
|
|
4
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
5
|
+
* once the code is regenerated.
|
|
6
|
+
*
|
|
7
|
+
* @generated by codegen project: GenerateModuleH.js
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#pragma once
|
|
11
|
+
|
|
12
|
+
#include <ReactCommon/TurboModule.h>
|
|
13
|
+
#include <react/bridging/Bridging.h>
|
|
14
|
+
|
|
15
|
+
namespace facebook::react {
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class JSI_EXPORT NativePolarBridgeCxxSpecJSI : public TurboModule {
|
|
19
|
+
protected:
|
|
20
|
+
NativePolarBridgeCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker);
|
|
21
|
+
|
|
22
|
+
public:
|
|
23
|
+
virtual double multiply(jsi::Runtime &rt, double a, double b) = 0;
|
|
24
|
+
virtual void connectToDevice(jsi::Runtime &rt, jsi::String deviceId) = 0;
|
|
25
|
+
virtual void disconnectFromDevice(jsi::Runtime &rt, jsi::String deviceId) = 0;
|
|
26
|
+
virtual void fetchHrData(jsi::Runtime &rt, jsi::String deviceId) = 0;
|
|
27
|
+
virtual void scanDevices(jsi::Runtime &rt) = 0;
|
|
28
|
+
virtual void disposeHrStream(jsi::Runtime &rt) = 0;
|
|
29
|
+
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
template <typename T>
|
|
33
|
+
class JSI_EXPORT NativePolarBridgeCxxSpec : public TurboModule {
|
|
34
|
+
public:
|
|
35
|
+
jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override {
|
|
36
|
+
return delegate_.create(rt, propName);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime& runtime) override {
|
|
40
|
+
return delegate_.getPropertyNames(runtime);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
static constexpr std::string_view kModuleName = "PolarBridge";
|
|
44
|
+
|
|
45
|
+
protected:
|
|
46
|
+
NativePolarBridgeCxxSpec(std::shared_ptr<CallInvoker> jsInvoker)
|
|
47
|
+
: TurboModule(std::string{NativePolarBridgeCxxSpec::kModuleName}, jsInvoker),
|
|
48
|
+
delegate_(reinterpret_cast<T*>(this), jsInvoker) {}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
private:
|
|
52
|
+
class Delegate : public NativePolarBridgeCxxSpecJSI {
|
|
53
|
+
public:
|
|
54
|
+
Delegate(T *instance, std::shared_ptr<CallInvoker> jsInvoker) :
|
|
55
|
+
NativePolarBridgeCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {
|
|
56
|
+
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
double multiply(jsi::Runtime &rt, double a, double b) override {
|
|
60
|
+
static_assert(
|
|
61
|
+
bridging::getParameterCount(&T::multiply) == 3,
|
|
62
|
+
"Expected multiply(...) to have 3 parameters");
|
|
63
|
+
|
|
64
|
+
return bridging::callFromJs<double>(
|
|
65
|
+
rt, &T::multiply, jsInvoker_, instance_, std::move(a), std::move(b));
|
|
66
|
+
}
|
|
67
|
+
void connectToDevice(jsi::Runtime &rt, jsi::String deviceId) override {
|
|
68
|
+
static_assert(
|
|
69
|
+
bridging::getParameterCount(&T::connectToDevice) == 2,
|
|
70
|
+
"Expected connectToDevice(...) to have 2 parameters");
|
|
71
|
+
|
|
72
|
+
return bridging::callFromJs<void>(
|
|
73
|
+
rt, &T::connectToDevice, jsInvoker_, instance_, std::move(deviceId));
|
|
74
|
+
}
|
|
75
|
+
void disconnectFromDevice(jsi::Runtime &rt, jsi::String deviceId) override {
|
|
76
|
+
static_assert(
|
|
77
|
+
bridging::getParameterCount(&T::disconnectFromDevice) == 2,
|
|
78
|
+
"Expected disconnectFromDevice(...) to have 2 parameters");
|
|
79
|
+
|
|
80
|
+
return bridging::callFromJs<void>(
|
|
81
|
+
rt, &T::disconnectFromDevice, jsInvoker_, instance_, std::move(deviceId));
|
|
82
|
+
}
|
|
83
|
+
void fetchHrData(jsi::Runtime &rt, jsi::String deviceId) override {
|
|
84
|
+
static_assert(
|
|
85
|
+
bridging::getParameterCount(&T::fetchHrData) == 2,
|
|
86
|
+
"Expected fetchHrData(...) to have 2 parameters");
|
|
87
|
+
|
|
88
|
+
return bridging::callFromJs<void>(
|
|
89
|
+
rt, &T::fetchHrData, jsInvoker_, instance_, std::move(deviceId));
|
|
90
|
+
}
|
|
91
|
+
void scanDevices(jsi::Runtime &rt) override {
|
|
92
|
+
static_assert(
|
|
93
|
+
bridging::getParameterCount(&T::scanDevices) == 1,
|
|
94
|
+
"Expected scanDevices(...) to have 1 parameters");
|
|
95
|
+
|
|
96
|
+
return bridging::callFromJs<void>(
|
|
97
|
+
rt, &T::scanDevices, jsInvoker_, instance_);
|
|
98
|
+
}
|
|
99
|
+
void disposeHrStream(jsi::Runtime &rt) override {
|
|
100
|
+
static_assert(
|
|
101
|
+
bridging::getParameterCount(&T::disposeHrStream) == 1,
|
|
102
|
+
"Expected disposeHrStream(...) to have 1 parameters");
|
|
103
|
+
|
|
104
|
+
return bridging::callFromJs<void>(
|
|
105
|
+
rt, &T::disposeHrStream, jsInvoker_, instance_);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private:
|
|
109
|
+
friend class NativePolarBridgeCxxSpec;
|
|
110
|
+
T *instance_;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
Delegate delegate_;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
import { TurboModuleRegistry } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface Spec extends TurboModule {
|
|
5
|
+
multiply(a: number, b: number): number;
|
|
6
|
+
connectToDevice(deviceId: string): void;
|
|
7
|
+
disconnectFromDevice(deviceId: string): void;
|
|
8
|
+
fetchHrData(deviceId: string): void;
|
|
9
|
+
scanDevices(): void;
|
|
10
|
+
disposeHrStream(): void;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default TurboModuleRegistry.getEnforcing<Spec>('PolarBridge');
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import PolarBridge from './NativePolarBridge';
|
|
4
|
+
export function multiply(a, b) {
|
|
5
|
+
return PolarBridge.multiply(a, b);
|
|
6
|
+
}
|
|
7
|
+
export function connectToDevice(deviceId) {
|
|
8
|
+
return PolarBridge.connectToDevice(deviceId);
|
|
9
|
+
}
|
|
10
|
+
export function disconnectFromDevice(deviceId) {
|
|
11
|
+
return PolarBridge.disconnectFromDevice(deviceId);
|
|
12
|
+
}
|
|
13
|
+
export function scanDevices() {
|
|
14
|
+
return PolarBridge.scanDevices();
|
|
15
|
+
}
|
|
16
|
+
export function fetchHrData(deviceId) {
|
|
17
|
+
return PolarBridge.fetchHrData(deviceId);
|
|
18
|
+
}
|
|
19
|
+
export function disposeHrStream() {
|
|
20
|
+
return PolarBridge.disposeHrStream();
|
|
21
|
+
}
|
|
22
|
+
export const emittedEventId = Object.freeze({
|
|
23
|
+
SCAN_DEVICE_FOUND: 'onDeviceFound',
|
|
24
|
+
SCAN_DEVICE_ERROR: 'onScanError',
|
|
25
|
+
SCAN_DEVICE_COMPLETE: 'onScanComplete',
|
|
26
|
+
POLAR_HR_DATA: 'PolarHrData',
|
|
27
|
+
POLAR_HR_ERROR: 'PolarHrError',
|
|
28
|
+
POLAR_HR_COMPLETE: 'PolarHrComplete'
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["PolarBridge","multiply","a","b","connectToDevice","deviceId","disconnectFromDevice","scanDevices","fetchHrData","disposeHrStream","emittedEventId","Object","freeze","SCAN_DEVICE_FOUND","SCAN_DEVICE_ERROR","SCAN_DEVICE_COMPLETE","POLAR_HR_DATA","POLAR_HR_ERROR","POLAR_HR_COMPLETE"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,WAAW,MAAM,qBAAqB;AAE7C,OAAO,SAASC,QAAQA,CAACC,CAAS,EAAEC,CAAS,EAAU;EACrD,OAAOH,WAAW,CAACC,QAAQ,CAACC,CAAC,EAAEC,CAAC,CAAC;AACnC;AAEA,OAAO,SAASC,eAAeA,CAACC,QAAgB,EAAE;EAChD,OAAOL,WAAW,CAACI,eAAe,CAACC,QAAQ,CAAC;AAC9C;AAEA,OAAO,SAASC,oBAAoBA,CAACD,QAAgB,EAAE;EACrD,OAAOL,WAAW,CAACM,oBAAoB,CAACD,QAAQ,CAAC;AACnD;AAEA,OAAO,SAASE,WAAWA,CAAA,EAAE;EAC3B,OAAOP,WAAW,CAACO,WAAW,CAAC,CAAC;AAClC;AAEA,OAAO,SAASC,WAAWA,CAACH,QAAgB,EAAE;EAC5C,OAAOL,WAAW,CAACQ,WAAW,CAACH,QAAQ,CAAC;AAC1C;AAEA,OAAO,SAASI,eAAeA,CAAA,EAAE;EAC/B,OAAOT,WAAW,CAACS,eAAe,CAAC,CAAC;AACtC;AAEA,OAAO,MAAMC,cAAc,GAAGC,MAAM,CAACC,MAAM,CAAC;EAC1CC,iBAAiB,EAAE,eAAe;EAClCC,iBAAiB,EAAE,aAAa;EAChCC,oBAAoB,EAAE,gBAAgB;EACtCC,aAAa,EAAE,aAAa;EAC5BC,cAAc,EAAE,cAAc;EAC9BC,iBAAiB,EAAE;AACrB,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"babel.config.d.ts","sourceRoot":"","sources":["../../babel.config.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eslint.config.d.mts","sourceRoot":"","sources":["../../eslint.config.mjs"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-native.config.d.ts","sourceRoot":"","sources":["../../react-native.config.js"],"names":[],"mappings":"wBACU,OAAO,mCAAmC,EAAE,oBAAoB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
multiply(a: number, b: number): number;
|
|
4
|
+
connectToDevice(deviceId: string): void;
|
|
5
|
+
disconnectFromDevice(deviceId: string): void;
|
|
6
|
+
fetchHrData(deviceId: string): void;
|
|
7
|
+
scanDevices(): void;
|
|
8
|
+
disposeHrStream(): void;
|
|
9
|
+
}
|
|
10
|
+
declare const _default: Spec;
|
|
11
|
+
export default _default;
|
|
12
|
+
//# sourceMappingURL=NativePolarBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativePolarBridge.d.ts","sourceRoot":"","sources":["../../../src/NativePolarBridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,WAAW,IAAI,IAAI,CAAC;IACpB,eAAe,IAAI,IAAI,CAAC;CACzB;;AAED,wBAAqE"}
|