ilabs-flir 2.3.8 → 2.3.10

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.
@@ -1,375 +1,391 @@
1
- package flir.android
2
-
3
- import android.util.Log
4
- import com.facebook.react.bridge.Promise
5
- import com.facebook.react.bridge.ReactApplicationContext
6
- import com.facebook.react.bridge.ReactContextBaseJavaModule
7
- import com.facebook.react.bridge.ReactMethod
8
- import com.facebook.react.modules.core.DeviceEventManagerModule
9
-
10
- class FlirModule(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
11
-
12
- companion object {
13
- private const val TAG = "FlirModule"
14
- }
15
-
16
- override fun getName(): String = "FlirModule"
17
-
18
- // Required for RN event emitter support
19
- private var listenerCount = 0
20
-
21
- @ReactMethod
22
- fun addListener(eventName: String) {
23
- listenerCount++
24
- Log.d(TAG, "addListener: $eventName (count: $listenerCount)")
25
- }
26
-
27
- @ReactMethod
28
- fun removeListeners(count: Int) {
29
- listenerCount -= count
30
- if (listenerCount < 0) listenerCount = 0
31
- Log.d(TAG, "removeListeners: $count (remaining: $listenerCount)")
32
- }
33
-
34
- // Simple placeholder conversion: converts an ARGB color to a pseudo-temperature value.
35
- // Replace with SDK call when integrating thermalsdk APIs.
36
- @ReactMethod
37
- fun getTemperatureFromColor(color: Int, promise: Promise?) {
38
- try {
39
- val r = (color shr 16) and 0xFF
40
- val g = (color shr 8) and 0xFF
41
- val b = color and 0xFF
42
- // Luminance-like value scaled to a plausible temperature range (0°C - 400°C)
43
- val lum = 0.2126 * r + 0.7152 * g + 0.0722 * b
44
- val temp = 0.0 + (lum / 255.0) * 400.0
45
- promise?.resolve(temp)
46
- } catch (e: Exception) {
47
- promise?.reject("ERR_FLIR_CONVERT", e)
48
- }
49
- }
50
-
51
- @ReactMethod
52
- fun getLatestFramePath(promise: Promise?) {
53
- try {
54
- val path = FlirFrameCache.latestFramePath
55
- if (path != null) promise?.resolve(path) else promise?.resolve(null)
56
- } catch (e: Exception) {
57
- promise?.reject("ERR_FLIR_PATH", e)
58
- }
59
- }
60
-
61
- @ReactMethod
62
- fun getTemperatureAt(x: Int, y: Int, promise: Promise?) {
63
- try {
64
- val temp = FlirManager.getTemperatureAt(x, y)
65
- if (temp != null) promise?.resolve(temp) else promise?.reject("ERR_NO_DATA", "No temperature data available")
66
- } catch (e: Exception) {
67
- promise?.reject("ERR_FLIR_SAMPLE", e)
68
- }
69
- }
70
-
71
- @ReactMethod
72
- fun getTemperatureAtNormalized(nx: Double, ny: Double, promise: Promise?) {
73
- try {
74
- val temp = FlirManager.getTemperatureAtNormalized(nx, ny)
75
- if (temp != null) promise?.resolve(temp) else promise?.resolve(null)
76
- } catch (e: Exception) {
77
- promise?.reject("ERR_FLIR_TEMP_NORM", e)
78
- }
79
- }
80
-
81
- @ReactMethod
82
- fun isEmulator(promise: Promise?) {
83
- try {
84
- promise?.resolve(FlirManager.isEmulator())
85
- } catch (e: Exception) {
86
- promise?.reject("ERR_FLIR_EMULATOR_CHECK", e)
87
- }
88
- }
89
-
90
- @ReactMethod
91
- fun isDeviceConnected(promise: Promise?) {
92
- try {
93
- promise?.resolve(FlirManager.isDeviceConnected())
94
- } catch (e: Exception) {
95
- promise?.reject("ERR_FLIR_DEVICE_CHECK", e)
96
- }
97
- }
98
-
99
- @ReactMethod
100
- fun getConnectedDeviceInfo(promise: Promise?) {
101
- try {
102
- promise?.resolve(FlirManager.getConnectedDeviceInfo())
103
- } catch (e: Exception) {
104
- promise?.reject("ERR_FLIR_DEVICE_INFO", e)
105
- }
106
- }
107
-
108
- @ReactMethod
109
- fun isSDKDownloaded(promise: Promise?) {
110
- try {
111
- val available = FlirSDKLoader.isSDKAvailable(reactContext)
112
- promise?.resolve(available)
113
- } catch (e: Exception) {
114
- promise?.reject("ERR_FLIR_SDK_CHECK", e)
115
- }
116
- }
117
-
118
- @ReactMethod
119
- fun getSDKStatus(promise: Promise?) {
120
- try {
121
- val available = FlirSDKLoader.isSDKAvailable(reactContext)
122
- val arch = FlirSDKLoader.getDeviceArch()
123
- val dexPath = FlirSDKLoader.getDexPath(reactContext)
124
- val nativeLibDir = FlirSDKLoader.getNativeLibDir(reactContext)
125
-
126
- val result = com.facebook.react.bridge.Arguments.createMap()
127
- result.putBoolean("available", available)
128
- result.putString("arch", arch)
129
- result.putString("dexPath", dexPath?.absolutePath ?: "not present (bundled SDK missing)")
130
- result.putString("nativeLibPath", nativeLibDir?.absolutePath ?: "not present (bundled SDK missing)")
131
- result.putBoolean("dexExists", dexPath?.exists() == true)
132
- result.putBoolean("nativeLibsExist", nativeLibDir?.exists() == true)
133
-
134
- promise?.resolve(result)
135
- } catch (e: Exception) {
136
- promise?.reject("ERR_FLIR_SDK_STATUS", e)
137
- }
138
- }
139
-
140
- @ReactMethod
141
- fun getAvailablePalettes(promise: Promise?) {
142
- try {
143
- val palettes = FlirManager.getAvailablePalettes()
144
- val result = com.facebook.react.bridge.Arguments.createArray()
145
- palettes.forEach { result.pushString(it) }
146
- promise?.resolve(result)
147
- } catch (e: Throwable) {
148
- promise?.reject("ERR_FLIR_PALETTES", e)
149
- }
150
- }
151
-
152
- @ReactMethod
153
- fun getPalettesWithIcons(promise: Promise?) {
154
- try {
155
- val palettes = FlirManager.getPalettesWithIcons(reactContext)
156
- val result = com.facebook.react.bridge.Arguments.createArray()
157
-
158
- palettes.forEach { p ->
159
- val map = com.facebook.react.bridge.Arguments.createMap()
160
- map.putString("name", p["name"])
161
- map.putString("uri", p["uri"])
162
- result.pushMap(map)
163
- }
164
- promise?.resolve(result)
165
- } catch (e: Throwable) {
166
- promise?.reject("ERR_FLIR_PALETTE_ICONS", e)
167
- }
168
- }
169
-
170
- @ReactMethod
171
- fun getDiscoveredDevices(promise: Promise?) {
172
- try {
173
- val devices = FlirManager.getDiscoveredDevices()
174
- val result = com.facebook.react.bridge.Arguments.createArray()
175
-
176
- devices.forEach { identity ->
177
- val deviceMap = com.facebook.react.bridge.Arguments.createMap()
178
- deviceMap.putString("id", identity.deviceId)
179
- deviceMap.putString("name", identity.deviceId)
180
- deviceMap.putString("communicationType", identity.communicationInterface.name)
181
- deviceMap.putBoolean("isEmulator", identity.communicationInterface.name == "EMULATOR")
182
- result.pushMap(deviceMap)
183
- }
184
-
185
- promise?.resolve(result)
186
- } catch (e: Exception) {
187
- promise?.reject("ERR_FLIR_DEVICES", e)
188
- }
189
- }
190
-
191
- @ReactMethod
192
- fun setPreferSdkRotation(prefer: Boolean, promise: Promise?) {
193
- try {
194
- FlirManager.setPreferSdkRotation(prefer)
195
- promise?.resolve(true)
196
- } catch (e: Exception) {
197
- promise?.reject("ERR_FLIR_SET_ROTATION_PREF", e)
198
- }
199
- }
200
-
201
- @ReactMethod
202
- fun isPreferSdkRotation(promise: Promise?) {
203
- try {
204
- val v = FlirManager.isPreferSdkRotation()
205
- promise?.resolve(v)
206
- } catch (e: Exception) {
207
- promise?.reject("ERR_FLIR_GET_ROTATION_PREF", e)
208
- }
209
- }
210
-
211
- @ReactMethod
212
- fun getBatteryLevel(promise: Promise?) {
213
- try {
214
- val level = FlirManager.getBatteryLevel()
215
- promise?.resolve(level)
216
- } catch (e: Exception) {
217
- promise?.reject("ERR_FLIR_GET_BATTERY", e)
218
- }
219
- }
220
-
221
- @ReactMethod
222
- fun isBatteryCharging(promise: Promise?) {
223
- try {
224
- val v = FlirManager.isBatteryCharging()
225
- promise?.resolve(v)
226
- } catch (e: Exception) {
227
- promise?.reject("ERR_FLIR_CHARGING", e)
228
- }
229
- }
230
-
231
- @ReactMethod
232
- fun startEmulator(emulatorType: String?, promise: Promise?) {
233
- try {
234
- // Ensure SDK is initialized with context before starting discovery
235
- FlirManager.init(reactContext)
236
- // With simplified API, just start discovery - emulators are discovered like any device
237
- FlirManager.startDiscovery(true)
238
- promise?.resolve(true)
239
- } catch (e: Exception) {
240
- promise?.reject("ERR_FLIR_EMULATOR", e)
241
- }
242
- }
243
-
244
- @ReactMethod
245
- fun connectToDevice(deviceId: String?, promise: Promise?) {
246
- try {
247
- // Ensure SDK is initialized with context before connecting
248
- FlirManager.init(reactContext)
249
- if (deviceId != null) {
250
- FlirManager.connectToDevice(deviceId)
251
- }
252
- promise?.resolve(true)
253
- } catch (e: Exception) {
254
- promise?.reject("ERR_FLIR_CONNECT", e)
255
- }
256
- }
257
-
258
- @ReactMethod
259
- fun startDiscovery(promise: Promise?) {
260
- try {
261
- // Ensure SDK is initialized with context before starting discovery
262
- FlirManager.init(reactContext)
263
- FlirManager.startDiscovery(true)
264
- promise?.resolve(true)
265
- } catch (e: Exception) {
266
- promise?.reject("ERR_FLIR_DISCOVERY", e)
267
- }
268
- }
269
-
270
- @ReactMethod
271
- fun stopDiscovery(promise: Promise?) {
272
- try {
273
- FlirManager.stopDiscovery()
274
- promise?.resolve(true)
275
- } catch (e: Exception) {
276
- promise?.reject("ERR_FLIR_STOP_DISCOVERY", e)
277
- }
278
- }
279
-
280
- @ReactMethod
281
- fun stopFlir(promise: Promise?) {
282
- try {
283
- FlirManager.stop()
284
- promise?.resolve(true)
285
- } catch (e: Exception) {
286
- promise?.reject("ERR_FLIR_STOP", e)
287
- }
288
- }
289
-
290
- @ReactMethod
291
- fun setSaveRadiometric(enabled: Boolean, promise: Promise?) {
292
- try {
293
- val varClass = Class.forName("ilabs.libs.io.data.Var")
294
- val field = varClass.getField("saveRadiometric")
295
- field.set(null, enabled)
296
- Log.d(TAG, "Updated Var.saveRadiometric to $enabled via reflection")
297
- promise?.resolve(true)
298
- } catch (e: Exception) {
299
- Log.w(TAG, "Could not update Var.saveRadiometric via reflection: ${e.message}")
300
- promise?.reject("ERR_FLIR_SAVE_RADIOMETRIC", e)
301
- }
302
- }
303
-
304
- @ReactMethod
305
- fun updateAcol(value: Float, promise: Promise?) {
306
- try {
307
- FlirManager.updateAcol(value)
308
- promise?.resolve(true)
309
- } catch (e: Throwable) {
310
- promise?.reject("ERR_FLIR_ACOL", e)
311
- }
312
- }
313
-
314
- @ReactMethod
315
- fun setPalette(name: String?, promise: Promise?) {
316
- try {
317
- if (name != null) {
318
- FlirManager.setPalette(name)
319
- }
320
- promise?.resolve(true)
321
- } catch (e: Throwable) {
322
- promise?.reject("ERR_FLIR_PALETTE", e)
323
- }
324
- }
325
-
326
- @ReactMethod
327
- fun initializeSDK(promise: Promise?) {
328
- try {
329
- FlirManager.init(reactContext)
330
-
331
- val result = com.facebook.react.bridge.Arguments.createMap()
332
- result.putBoolean("initialized", true)
333
- result.putString("message", "SDK initialized successfully")
334
- promise?.resolve(result)
335
- } catch (e: Exception) {
336
- val result = com.facebook.react.bridge.Arguments.createMap()
337
- result.putBoolean("initialized", false)
338
- result.putString("error", e.message ?: "Unknown error")
339
- result.putString("errorType", e.javaClass.simpleName)
340
- promise?.resolve(result)
341
- }
342
- }
343
-
344
- @ReactMethod
345
- fun getDebugInfo(promise: Promise?) {
346
- try {
347
- val result = com.facebook.react.bridge.Arguments.createMap()
348
-
349
- // SDK availability
350
- result.putBoolean("sdkAvailable", FlirSDKLoader.isSDKAvailable(reactContext))
351
- result.putString("arch", FlirSDKLoader.getDeviceArch())
352
-
353
- // Check if FLIR SDK classes are loadable
354
- val classesLoaded = try {
355
- Class.forName("com.flir.thermalsdk.androidsdk.ThermalSdkAndroid")
356
- Class.forName("com.flir.thermalsdk.live.discovery.DiscoveryFactory")
357
- true
358
- } catch (e: ClassNotFoundException) {
359
- false
360
- }
361
- result.putBoolean("sdkClassesLoaded", classesLoaded)
362
-
363
- // Discovery state
364
- val devices = FlirManager.getDiscoveredDevices()
365
- result.putInt("discoveredDeviceCount", devices.size)
366
- result.putBoolean("isConnected", FlirManager.isConnected())
367
- result.putBoolean("isStreaming", FlirManager.isStreaming())
368
- result.putString("connectedDevice", FlirManager.getConnectedDeviceInfo())
369
-
370
- promise?.resolve(result)
371
- } catch (e: Exception) {
372
- promise?.reject("ERR_DEBUG_INFO", e)
373
- }
374
- }
375
- }
1
+ package flir.android
2
+
3
+ import android.util.Log
4
+ import com.facebook.react.bridge.Promise
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.bridge.ReactContextBaseJavaModule
7
+ import com.facebook.react.bridge.ReactMethod
8
+ import com.facebook.react.modules.core.DeviceEventManagerModule
9
+
10
+ class FlirModule(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
11
+
12
+ companion object {
13
+ private const val TAG = "FlirModule"
14
+ }
15
+
16
+ override fun getName(): String = "FlirModule"
17
+
18
+ // Required for RN event emitter support
19
+ private var listenerCount = 0
20
+
21
+ @ReactMethod
22
+ fun addListener(eventName: String) {
23
+ listenerCount++
24
+ Log.d(TAG, "addListener: $eventName (count: $listenerCount)")
25
+ }
26
+
27
+ @ReactMethod
28
+ fun removeListeners(count: Int) {
29
+ listenerCount -= count
30
+ if (listenerCount < 0) listenerCount = 0
31
+ Log.d(TAG, "removeListeners: $count (remaining: $listenerCount)")
32
+ }
33
+
34
+ // Simple placeholder conversion: converts an ARGB color to a pseudo-temperature value.
35
+ // Replace with SDK call when integrating thermalsdk APIs.
36
+ @ReactMethod
37
+ fun getTemperatureFromColor(color: Int, promise: com.facebook.react.bridge.Promise?) {
38
+ try {
39
+ val r = (color shr 16) and 0xFF
40
+ val g = (color shr 8) and 0xFF
41
+ val b = color and 0xFF
42
+ // Luminance-like value scaled to a plausible temperature range (0°C - 400°C)
43
+ val lum = 0.2126 * r + 0.7152 * g + 0.0722 * b
44
+ val temp = 0.0 + (lum / 255.0) * 400.0
45
+ promise?.resolve(temp)
46
+ } catch (e: Exception) {
47
+ promise?.reject("ERR_FLIR_CONVERT", e)
48
+ }
49
+ }
50
+
51
+ @ReactMethod
52
+ fun getLatestFramePath(promise: Promise?) {
53
+ try {
54
+ val path = FlirFrameCache.latestFramePath
55
+ if (path != null) promise?.resolve(path) else promise?.resolve(null)
56
+ } catch (e: Exception) {
57
+ promise?.reject("ERR_FLIR_PATH", e)
58
+ }
59
+ }
60
+
61
+ @ReactMethod
62
+ fun getTemperatureAt(x: Int, y: Int, promise: Promise?) {
63
+ try {
64
+ val temp = FlirManager.getTemperatureAt(x, y)
65
+ if (temp != null) promise?.resolve(temp) else promise?.reject("ERR_NO_DATA", "No temperature data available")
66
+ } catch (e: Exception) {
67
+ promise?.reject("ERR_FLIR_SAMPLE", e)
68
+ }
69
+ }
70
+
71
+ @ReactMethod
72
+ fun getTemperatureAtNormalized(nx: Double, ny: Double, promise: Promise?) {
73
+ try {
74
+ val temp = FlirManager.getTemperatureAtNormalized(nx, ny)
75
+ if (temp != null) promise?.resolve(temp) else promise?.resolve(null)
76
+ } catch (e: Exception) {
77
+ promise?.reject("ERR_FLIR_TEMP_NORM", e)
78
+ }
79
+ }
80
+
81
+ @ReactMethod
82
+ fun isEmulator(promise: Promise?) {
83
+ try {
84
+ promise?.resolve(FlirManager.isEmulator())
85
+ } catch (e: Exception) {
86
+ promise?.reject("ERR_FLIR_EMULATOR_CHECK", e)
87
+ }
88
+ }
89
+
90
+ @ReactMethod
91
+ fun isDeviceConnected(promise: Promise?) {
92
+ try {
93
+ promise?.resolve(FlirManager.isDeviceConnected())
94
+ } catch (e: Exception) {
95
+ promise?.reject("ERR_FLIR_DEVICE_CHECK", e)
96
+ }
97
+ }
98
+
99
+ @ReactMethod
100
+ fun getConnectedDeviceInfo(promise: Promise?) {
101
+ try {
102
+ promise?.resolve(FlirManager.getConnectedDeviceInfo())
103
+ } catch (e: Exception) {
104
+ promise?.reject("ERR_FLIR_DEVICE_INFO", e)
105
+ }
106
+ }
107
+
108
+ @ReactMethod
109
+ fun isSDKDownloaded(promise: Promise?) {
110
+ try {
111
+ val available = FlirSDKLoader.isSDKAvailable(reactContext)
112
+ promise?.resolve(available)
113
+ } catch (e: Exception) {
114
+ promise?.reject("ERR_FLIR_SDK_CHECK", e)
115
+ }
116
+ }
117
+
118
+ @ReactMethod
119
+ fun getSDKStatus(promise: Promise?) {
120
+ try {
121
+ val available = FlirSDKLoader.isSDKAvailable(reactContext)
122
+ val arch = FlirSDKLoader.getDeviceArch()
123
+ val dexPath = FlirSDKLoader.getDexPath(reactContext)
124
+ val nativeLibDir = FlirSDKLoader.getNativeLibDir(reactContext)
125
+
126
+ val result = com.facebook.react.bridge.Arguments.createMap()
127
+ result.putBoolean("available", available)
128
+ result.putString("arch", arch)
129
+ result.putString("dexPath", dexPath?.absolutePath ?: "not present (bundled SDK missing)")
130
+ result.putString("nativeLibPath", nativeLibDir?.absolutePath ?: "not present (bundled SDK missing)")
131
+ result.putBoolean("dexExists", dexPath?.exists() == true)
132
+ result.putBoolean("nativeLibsExist", nativeLibDir?.exists() == true)
133
+
134
+ promise?.resolve(result)
135
+ } catch (e: Exception) {
136
+ promise?.reject("ERR_FLIR_SDK_STATUS", e)
137
+ }
138
+ }
139
+
140
+ @ReactMethod
141
+ fun getAvailablePalettes(promise: Promise?) {
142
+ try {
143
+ val palettes = FlirManager.getAvailablePalettes()
144
+ val result = com.facebook.react.bridge.Arguments.createArray()
145
+ palettes.forEach { result.pushString(it) }
146
+ promise?.resolve(result)
147
+ } catch (e: Throwable) {
148
+ promise?.reject("ERR_FLIR_PALETTES", e)
149
+ }
150
+ }
151
+
152
+ @ReactMethod
153
+ fun getPalettesWithIcons(promise: Promise?) {
154
+ try {
155
+ val palettes = FlirManager.getPalettesWithIcons(reactContext)
156
+ val result = com.facebook.react.bridge.Arguments.createArray()
157
+
158
+ palettes.forEach { p ->
159
+ val map = com.facebook.react.bridge.Arguments.createMap()
160
+ map.putString("name", p["name"])
161
+ map.putString("uri", p["uri"])
162
+ result.pushMap(map)
163
+ }
164
+ promise?.resolve(result)
165
+ } catch (e: Throwable) {
166
+ promise?.reject("ERR_FLIR_PALETTE_ICONS", e)
167
+ }
168
+ }
169
+
170
+ @ReactMethod
171
+ fun getDiscoveredDevices(promise: Promise?) {
172
+ try {
173
+ val devices = FlirManager.getDiscoveredDevices()
174
+ val result = com.facebook.react.bridge.Arguments.createArray()
175
+
176
+ devices.forEach { identity ->
177
+ val deviceMap = com.facebook.react.bridge.Arguments.createMap()
178
+ deviceMap.putString("id", identity.deviceId)
179
+ deviceMap.putString("name", identity.deviceId)
180
+ deviceMap.putString("communicationType", identity.communicationInterface.name)
181
+ deviceMap.putBoolean("isEmulator", identity.communicationInterface.name == "EMULATOR")
182
+ result.pushMap(deviceMap)
183
+ }
184
+
185
+ promise?.resolve(result)
186
+ } catch (e: Exception) {
187
+ promise?.reject("ERR_FLIR_DEVICES", e)
188
+ }
189
+ }
190
+
191
+ @ReactMethod
192
+ fun setPreferSdkRotation(prefer: Boolean, promise: Promise?) {
193
+ try {
194
+ FlirManager.setPreferSdkRotation(prefer)
195
+ promise?.resolve(true)
196
+ } catch (e: Exception) {
197
+ promise?.reject("ERR_FLIR_SET_ROTATION_PREF", e)
198
+ }
199
+ }
200
+
201
+ @ReactMethod
202
+ fun isPreferSdkRotation(promise: Promise?) {
203
+ try {
204
+ val v = FlirManager.isPreferSdkRotation()
205
+ promise?.resolve(v)
206
+ } catch (e: Exception) {
207
+ promise?.reject("ERR_FLIR_GET_ROTATION_PREF", e)
208
+ }
209
+ }
210
+
211
+ @ReactMethod
212
+ fun getBatteryLevel(promise: Promise?) {
213
+ try {
214
+ val level = FlirManager.getBatteryLevel()
215
+ promise?.resolve(level)
216
+ } catch (e: Exception) {
217
+ promise?.reject("ERR_FLIR_GET_BATTERY", e)
218
+ }
219
+ }
220
+
221
+ @ReactMethod
222
+ fun isBatteryCharging(promise: Promise?) {
223
+ try {
224
+ val v = FlirManager.isBatteryCharging()
225
+ promise?.resolve(v)
226
+ } catch (e: Exception) {
227
+ promise?.reject("ERR_FLIR_CHARGING", e)
228
+ }
229
+ }
230
+
231
+ @ReactMethod
232
+ fun startEmulator(emulatorType: String?, promise: Promise?) {
233
+ try {
234
+ // Ensure SDK is initialized with context before starting discovery
235
+ FlirManager.init(reactContext)
236
+ // With simplified API, just start discovery - emulators are discovered like any device
237
+ FlirManager.startDiscovery(true)
238
+ promise?.resolve(true)
239
+ } catch (e: Exception) {
240
+ promise?.reject("ERR_FLIR_EMULATOR", e)
241
+ }
242
+ }
243
+
244
+ @ReactMethod
245
+ fun connectToDevice(deviceId: String?, promise: Promise?) {
246
+ try {
247
+ // Ensure SDK is initialized with context before connecting
248
+ FlirManager.init(reactContext)
249
+ if (deviceId != null) {
250
+ FlirManager.connectToDevice(deviceId)
251
+ }
252
+ promise?.resolve(true)
253
+ } catch (e: Exception) {
254
+ promise?.reject("ERR_FLIR_CONNECT", e)
255
+ }
256
+ }
257
+
258
+ @ReactMethod
259
+ fun startDiscovery(promise: Promise?) {
260
+ try {
261
+ // Ensure SDK is initialized with context before starting discovery
262
+ FlirManager.init(reactContext)
263
+ FlirManager.startDiscovery(true)
264
+ promise?.resolve(true)
265
+ } catch (e: Exception) {
266
+ promise?.reject("ERR_FLIR_DISCOVERY", e)
267
+ }
268
+ }
269
+
270
+ @ReactMethod
271
+ fun stopDiscovery(promise: Promise?) {
272
+ try {
273
+ FlirManager.stopDiscovery()
274
+ promise?.resolve(true)
275
+ } catch (e: Exception) {
276
+ promise?.reject("ERR_FLIR_STOP_DISCOVERY", e)
277
+ }
278
+ }
279
+
280
+ @ReactMethod
281
+ fun stopFlir(promise: Promise?) {
282
+ try {
283
+ FlirManager.stop()
284
+ promise?.resolve(true)
285
+ } catch (e: Exception) {
286
+ promise?.reject("ERR_FLIR_STOP", e)
287
+ }
288
+ }
289
+
290
+ @ReactMethod
291
+ fun captureRadiometricSnapshot(path: String, promise: Promise?) {
292
+ try {
293
+ FlirManager.captureRadiometricSnapshot(path, object : FlirSdkManager.SnapshotCallback {
294
+ override fun onSnapshotSaved(savedPath: String) {
295
+ promise?.resolve(savedPath)
296
+ }
297
+ override fun onSnapshotError(message: String) {
298
+ promise?.reject("ERR_RADIOMETRIC_SAVE", message)
299
+ }
300
+ })
301
+ } catch (e: Exception) {
302
+ promise?.reject("ERR_RADIOMETRIC_TRIGGER", e.message)
303
+ }
304
+ }
305
+
306
+ @ReactMethod
307
+ fun setSaveRadiometric(enabled: Boolean, promise: Promise?) {
308
+ try {
309
+ val varClass = Class.forName("ilabs.libs.io.data.Var")
310
+ val field = varClass.getField("saveRadiometric")
311
+ field.set(null, enabled)
312
+ Log.d(TAG, "Updated Var.saveRadiometric to $enabled via reflection")
313
+ promise?.resolve(true)
314
+ } catch (e: Exception) {
315
+ Log.w(TAG, "Could not update Var.saveRadiometric via reflection: ${e.message}")
316
+ promise?.reject("ERR_FLIR_SAVE_RADIOMETRIC", e)
317
+ }
318
+ }
319
+
320
+ @ReactMethod
321
+ fun updateAcol(value: Float, promise: Promise?) {
322
+ try {
323
+ FlirManager.updateAcol(value)
324
+ promise?.resolve(true)
325
+ } catch (e: Throwable) {
326
+ promise?.reject("ERR_FLIR_ACOL", e)
327
+ }
328
+ }
329
+
330
+ @ReactMethod
331
+ fun setPalette(name: String?, promise: Promise?) {
332
+ try {
333
+ if (name != null) {
334
+ FlirManager.setPalette(name)
335
+ }
336
+ promise?.resolve(true)
337
+ } catch (e: Throwable) {
338
+ promise?.reject("ERR_FLIR_PALETTE", e)
339
+ }
340
+ }
341
+
342
+ @ReactMethod
343
+ fun initializeSDK(promise: Promise?) {
344
+ try {
345
+ FlirManager.init(reactContext)
346
+
347
+ val result = com.facebook.react.bridge.Arguments.createMap()
348
+ result.putBoolean("initialized", true)
349
+ result.putString("message", "SDK initialized successfully")
350
+ promise?.resolve(result)
351
+ } catch (e: Exception) {
352
+ val result = com.facebook.react.bridge.Arguments.createMap()
353
+ result.putBoolean("initialized", false)
354
+ result.putString("error", e.message ?: "Unknown error")
355
+ result.putString("errorType", e.javaClass.simpleName)
356
+ promise?.resolve(result)
357
+ }
358
+ }
359
+
360
+ @ReactMethod
361
+ fun getDebugInfo(promise: com.facebook.react.bridge.Promise?) {
362
+ try {
363
+ val result = com.facebook.react.bridge.Arguments.createMap()
364
+
365
+ // SDK availability
366
+ result.putBoolean("sdkAvailable", FlirSDKLoader.isSDKAvailable(reactContext))
367
+ result.putString("arch", FlirSDKLoader.getDeviceArch())
368
+
369
+ // Check if FLIR SDK classes are loadable
370
+ val classesLoaded = try {
371
+ Class.forName("com.flir.thermalsdk.androidsdk.ThermalSdkAndroid")
372
+ Class.forName("com.flir.thermalsdk.live.discovery.DiscoveryFactory")
373
+ true
374
+ } catch (e: ClassNotFoundException) {
375
+ false
376
+ }
377
+ result.putBoolean("sdkClassesLoaded", classesLoaded)
378
+
379
+ // Discovery state
380
+ val devices = FlirManager.getDiscoveredDevices()
381
+ result.putInt("discoveredDeviceCount", devices.size)
382
+ result.putBoolean("isConnected", FlirManager.isConnected())
383
+ result.putBoolean("isStreaming", FlirManager.isStreaming())
384
+ result.putString("connectedDevice", FlirManager.getConnectedDeviceInfo())
385
+
386
+ promise?.resolve(result)
387
+ } catch (e: Exception) {
388
+ promise?.reject("ERR_DEBUG_INFO", e)
389
+ }
390
+ }
391
+ }