ilabs-flir 1.0.2 → 1.0.3
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/Flir.podspec +31 -31
- package/README.md +1271 -1271
- package/android/Flir/build.gradle.kts +85 -80
- package/android/Flir/src/main/AndroidManifest.xml +31 -31
- package/android/Flir/src/main/java/com/flir/thermalsdk/ErrorCodeException.java +14 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/image/ImageBuffer.java +11 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/image/JavaImageBuffer.java +35 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/image/Palette.java +15 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/image/PaletteManager.java +16 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/image/Point.java +11 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/image/ThermalImage.java +23 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/image/ThermalValue.java +9 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/live/CameraType.java +8 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/live/CommunicationInterface.java +16 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/live/Identity.java +23 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/live/IpSettings.java +9 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/live/connectivity/ConnectionStatusListener.java +7 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/live/remote/OnReceived.java +5 -0
- package/android/Flir/src/main/java/com/flir/thermalsdk/live/remote/OnRemoteError.java +7 -0
- package/android/Flir/src/main/java/flir/android/CameraHandler.java +224 -194
- package/android/Flir/src/main/java/flir/android/FlirCommands.java +111 -0
- package/android/Flir/src/main/java/flir/android/FlirConnectionManager.java +354 -0
- package/android/Flir/src/main/java/flir/android/FlirController.kt +11 -11
- package/android/Flir/src/main/java/flir/android/FlirDiscoveryManager.java +236 -0
- package/android/Flir/src/main/java/flir/android/FlirDownloadManager.kt +75 -75
- package/android/Flir/src/main/java/flir/android/FlirDownloadPackage.kt +16 -16
- package/android/Flir/src/main/java/flir/android/FlirFrameCache.kt +6 -6
- package/android/Flir/src/main/java/flir/android/FlirManager.kt +254 -248
- package/android/Flir/src/main/java/flir/android/FlirModule.kt +74 -74
- package/android/Flir/src/main/java/flir/android/FlirPackage.kt +19 -19
- package/android/Flir/src/main/java/flir/android/FlirSDKLoader.kt +195 -195
- package/android/Flir/src/main/java/flir/android/FlirSdkManager.java +890 -0
- package/android/Flir/src/main/java/flir/android/FlirStatus.kt +12 -12
- package/android/Flir/src/main/java/flir/android/FlirView.kt +48 -48
- package/android/Flir/src/main/java/flir/android/FlirViewManager.kt +13 -13
- package/android/Flir/src/main/java/flir/android/FrameDataHolder.java +14 -14
- package/app.plugin.js +264 -264
- package/expo-module.config.json +5 -5
- package/ios/Flir/Framework/ThermalSDK/FLIRBattery.h +76 -76
- package/ios/Flir/Framework/ThermalSDK/FLIRCalibration.h +108 -108
- package/ios/Flir/Framework/ThermalSDK/FLIRCamera.h +156 -156
- package/ios/Flir/Framework/ThermalSDK/FLIRCameraDeviceInfo.h +53 -53
- package/ios/Flir/Framework/ThermalSDK/FLIRCameraEvent.h +132 -132
- package/ios/Flir/Framework/ThermalSDK/FLIRCameraImport.h +204 -204
- package/ios/Flir/Framework/ThermalSDK/FLIRColorDistributionSettings.h +204 -204
- package/ios/Flir/Framework/ThermalSDK/FLIRColorizer.h +82 -82
- package/ios/Flir/Framework/ThermalSDK/FLIRDiscoveredCamera.h +44 -44
- package/ios/Flir/Framework/ThermalSDK/FLIRDiscovery.h +132 -132
- package/ios/Flir/Framework/ThermalSDK/FLIRDisplaySettings.h +29 -29
- package/ios/Flir/Framework/ThermalSDK/FLIRFocus.h +70 -70
- package/ios/Flir/Framework/ThermalSDK/FLIRFusion.h +192 -192
- package/ios/Flir/Framework/ThermalSDK/FLIRFusionController.h +136 -136
- package/ios/Flir/Framework/ThermalSDK/FLIRFusionTransformation.h +35 -35
- package/ios/Flir/Framework/ThermalSDK/FLIRIdentity.h +264 -264
- package/ios/Flir/Framework/ThermalSDK/FLIRImageBase.h +196 -196
- package/ios/Flir/Framework/ThermalSDK/FLIRImageColorizer.h +26 -26
- package/ios/Flir/Framework/ThermalSDK/FLIRImageStatistics.h +61 -61
- package/ios/Flir/Framework/ThermalSDK/FLIRIsotherms.h +208 -208
- package/ios/Flir/Framework/ThermalSDK/FLIRMeasurementArea.h +38 -38
- package/ios/Flir/Framework/ThermalSDK/FLIRMeasurementCollection.h +147 -147
- package/ios/Flir/Framework/ThermalSDK/FLIRMeasurementDelta.h +62 -62
- package/ios/Flir/Framework/ThermalSDK/FLIRMeasurementDimensions.h +33 -33
- package/ios/Flir/Framework/ThermalSDK/FLIRMeasurementEllipse.h +49 -49
- package/ios/Flir/Framework/ThermalSDK/FLIRMeasurementLine.h +66 -66
- package/ios/Flir/Framework/ThermalSDK/FLIRMeasurementMarker.h +69 -69
- package/ios/Flir/Framework/ThermalSDK/FLIRMeasurementParameters.h +41 -41
- package/ios/Flir/Framework/ThermalSDK/FLIRMeasurementRectangle.h +36 -36
- package/ios/Flir/Framework/ThermalSDK/FLIRMeasurementReference.h +27 -27
- package/ios/Flir/Framework/ThermalSDK/FLIRMeasurementShape.h +46 -46
- package/ios/Flir/Framework/ThermalSDK/FLIRMeasurementSpot.h +33 -33
- package/ios/Flir/Framework/ThermalSDK/FLIRMeasurementsController.h +160 -160
- package/ios/Flir/Framework/ThermalSDK/FLIRMeterLinkSensorPoll.h +247 -247
- package/ios/Flir/Framework/ThermalSDK/FLIROverlayController.h +27 -27
- package/ios/Flir/Framework/ThermalSDK/FLIRPalette.h +60 -60
- package/ios/Flir/Framework/ThermalSDK/FLIRPaletteController.h +36 -36
- package/ios/Flir/Framework/ThermalSDK/FLIRPaletteManager.h +97 -97
- package/ios/Flir/Framework/ThermalSDK/FLIRQuantification.h +55 -55
- package/ios/Flir/Framework/ThermalSDK/FLIRRemoteControl.h +393 -393
- package/ios/Flir/Framework/ThermalSDK/FLIRRenderer.h +35 -35
- package/ios/Flir/Framework/ThermalSDK/FLIRRendererImpl.h +17 -17
- package/ios/Flir/Framework/ThermalSDK/FLIRScale.h +99 -99
- package/ios/Flir/Framework/ThermalSDK/FLIRScaleController.h +44 -44
- package/ios/Flir/Framework/ThermalSDK/FLIRStream.h +109 -109
- package/ios/Flir/Framework/ThermalSDK/FLIRStreamer.h +124 -124
- package/ios/Flir/Framework/ThermalSDK/FLIRSystem.h +40 -40
- package/ios/Flir/Framework/ThermalSDK/FLIRTemperatureRange.h +43 -43
- package/ios/Flir/Framework/ThermalSDK/FLIRThermalDelta.h +77 -77
- package/ios/Flir/Framework/ThermalSDK/FLIRThermalImage.h +331 -331
- package/ios/Flir/Framework/ThermalSDK/FLIRThermalImageFile.h +56 -56
- package/ios/Flir/Framework/ThermalSDK/FLIRThermalParameters.h +31 -31
- package/ios/Flir/Framework/ThermalSDK/FLIRThermalValue.h +92 -92
- package/ios/Flir/Framework/ThermalSDK/FLIRWirelessCameraDetails.h +88 -88
- package/ios/Flir/Framework/ThermalSDK/ThermalSDK.h +73 -73
- package/ios/Flir/SDKLoader/FlirSDKLoader.m +13 -13
- package/ios/Flir/SDKLoader/FlirSDKLoader.swift +175 -175
- package/ios/Flir/src/FlirEventEmitter.h +12 -12
- package/ios/Flir/src/FlirEventEmitter.m +33 -33
- package/ios/Flir/src/FlirModule.h +10 -10
- package/ios/Flir/src/FlirModule.m +381 -381
- package/ios/Flir/src/FlirPreviewView.h +13 -13
- package/ios/Flir/src/FlirPreviewView.m +24 -24
- package/ios/Flir/src/FlirState.h +20 -20
- package/ios/Flir/src/FlirState.m +79 -79
- package/ios/Flir/src/FlirViewManager.h +9 -9
- package/ios/Flir/src/FlirViewManager.m +16 -16
- package/package.json +60 -60
- package/react-native.config.js +14 -14
- package/scripts/copy_ios_libs.sh +32 -32
- package/scripts/create_stubs.py +174 -174
- package/scripts/download-sdk.js +62 -62
- package/scripts/prepare-binaries.sh +171 -171
- package/sdk-manifest.json +30 -30
- package/src/FlirDownload.ts +78 -78
- package/src/index.d.ts +17 -17
- package/src/index.js +7 -7
- package/src/index.ts +7 -7
|
@@ -1,248 +1,254 @@
|
|
|
1
|
-
package flir.android
|
|
2
|
-
|
|
3
|
-
import android.content.Context
|
|
4
|
-
import android.graphics.Bitmap
|
|
5
|
-
import android.
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import com.facebook.react.
|
|
9
|
-
import com.facebook.react.
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import java.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
private val
|
|
19
|
-
private
|
|
20
|
-
private
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
private var
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
private var
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
fun
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
fun getTemperatureAt(x: Int, y: Int): Double? {
|
|
167
|
-
return
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
val
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
1
|
+
package flir.android
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.graphics.Bitmap
|
|
5
|
+
import android.util.Log
|
|
6
|
+
import com.facebook.react.bridge.Arguments
|
|
7
|
+
import com.facebook.react.bridge.WritableMap
|
|
8
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
9
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
10
|
+
import java.io.File
|
|
11
|
+
import java.io.FileOutputStream
|
|
12
|
+
import java.util.concurrent.atomic.AtomicLong
|
|
13
|
+
|
|
14
|
+
object FlirManager {
|
|
15
|
+
private val TAG = "FlirManager"
|
|
16
|
+
private var sdkManager: FlirSdkManager? = null
|
|
17
|
+
private val lastEmitMs = AtomicLong(0)
|
|
18
|
+
private val minEmitIntervalMs = 333L // ~3 fps
|
|
19
|
+
private var discoveryStarted = false
|
|
20
|
+
private var reactContext: ThemedReactContext? = null
|
|
21
|
+
|
|
22
|
+
// Emulator and device state tracking
|
|
23
|
+
private var isEmulatorMode = false
|
|
24
|
+
private var isPhysicalDeviceConnected = false
|
|
25
|
+
private var connectedDeviceName: String? = null
|
|
26
|
+
|
|
27
|
+
// GL texture callback support for native filters
|
|
28
|
+
interface TextureUpdateCallback {
|
|
29
|
+
fun onTextureUpdate(bitmap: Bitmap, textureUnit: Int)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface TemperatureCallback {
|
|
33
|
+
fun onTemperatureData(temperature: Double, x: Int, y: Int)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
private var textureCallback: TextureUpdateCallback? = null
|
|
37
|
+
private var temperatureCallback: TemperatureCallback? = null
|
|
38
|
+
private var latestBitmap: Bitmap? = null
|
|
39
|
+
|
|
40
|
+
fun setTextureCallback(callback: TextureUpdateCallback?) {
|
|
41
|
+
textureCallback = callback
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
fun setTemperatureCallback(callback: TemperatureCallback?) {
|
|
45
|
+
temperatureCallback = callback
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
fun getLatestBitmap(): Bitmap? = latestBitmap
|
|
49
|
+
|
|
50
|
+
fun getTemperatureAtPoint(x: Int, y: Int): Double? {
|
|
51
|
+
return try {
|
|
52
|
+
sdkManager?.getTemperatureAtPoint(x, y)?.takeIf { !it.isNaN() }
|
|
53
|
+
} catch (t: Throwable) {
|
|
54
|
+
null
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Check if currently running in emulator mode (no physical FLIR device)
|
|
60
|
+
*/
|
|
61
|
+
fun isEmulator(): Boolean = isEmulatorMode
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Check if a physical FLIR device is connected
|
|
65
|
+
*/
|
|
66
|
+
fun isDeviceConnected(): Boolean = isPhysicalDeviceConnected
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Get information about the connected device
|
|
70
|
+
*/
|
|
71
|
+
fun getConnectedDeviceInfo(): String {
|
|
72
|
+
return when {
|
|
73
|
+
connectedDeviceName == null -> "Not connected"
|
|
74
|
+
isEmulatorMode -> "Emulator ($connectedDeviceName)"
|
|
75
|
+
else -> "Physical device ($connectedDeviceName)"
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
fun init(context: Context) {
|
|
80
|
+
try {
|
|
81
|
+
// Initialize SDK manager with listener
|
|
82
|
+
sdkManager = FlirSdkManager(object : FlirSdkManager.Listener {
|
|
83
|
+
override fun onFrame(bitmap: Bitmap) {
|
|
84
|
+
latestBitmap = bitmap
|
|
85
|
+
textureCallback?.onTextureUpdate(bitmap, 0)
|
|
86
|
+
emitFrameToReactNative(bitmap)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
override fun onTemperature(temp: Double, x: Int, y: Int) {
|
|
90
|
+
temperatureCallback?.onTemperatureData(temp, x, y)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
override fun onDeviceFound(name: String) {
|
|
94
|
+
connectedDeviceName = name
|
|
95
|
+
isPhysicalDeviceConnected = true
|
|
96
|
+
emitDeviceState("connected", true)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
override fun onEmulatorEnabled() {
|
|
100
|
+
isEmulatorMode = true
|
|
101
|
+
emitDeviceState("emulator", false)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
override fun onStreamKindChanged(kind: String) {
|
|
105
|
+
Log.d(TAG, "Stream kind changed: $kind")
|
|
106
|
+
}
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
// Try to initialize SDK via reflection
|
|
110
|
+
try {
|
|
111
|
+
val cls = Class.forName("com.flir.thermalsdk.live.ThermalSdkAndroid")
|
|
112
|
+
val method = cls.getMethod("init", Context::class.java)
|
|
113
|
+
method.invoke(null, context.applicationContext)
|
|
114
|
+
Log.i(TAG, "FLIR SDK initialized via reflection")
|
|
115
|
+
} catch (e: ClassNotFoundException) {
|
|
116
|
+
Log.w(TAG, "FLIR SDK not found on classpath, will attempt DexClassLoader")
|
|
117
|
+
} catch (e: Throwable) {
|
|
118
|
+
Log.w(TAG, "FLIR SDK init failed: ${e.message}")
|
|
119
|
+
}
|
|
120
|
+
} catch (t: Throwable) {
|
|
121
|
+
Log.e(TAG, "FlirManager init failed", t)
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
fun startDiscoveryAndConnect(context: ThemedReactContext) {
|
|
126
|
+
if (discoveryStarted) return
|
|
127
|
+
discoveryStarted = true
|
|
128
|
+
reactContext = context
|
|
129
|
+
|
|
130
|
+
emitDeviceState("discovering", false)
|
|
131
|
+
|
|
132
|
+
try {
|
|
133
|
+
val started = sdkManager?.startSdkEmulator() ?: false
|
|
134
|
+
if (!started) {
|
|
135
|
+
Log.w(TAG, "Failed to start SDK emulator")
|
|
136
|
+
emitDeviceState("error", false)
|
|
137
|
+
}
|
|
138
|
+
} catch (t: Throwable) {
|
|
139
|
+
Log.e(TAG, "startDiscoveryAndConnect failed", t)
|
|
140
|
+
emitDeviceState("error", false)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
fun stop() {
|
|
145
|
+
discoveryStarted = false
|
|
146
|
+
isPhysicalDeviceConnected = false
|
|
147
|
+
isEmulatorMode = false
|
|
148
|
+
connectedDeviceName = null
|
|
149
|
+
latestBitmap = null
|
|
150
|
+
// Note: FlirSdkManager doesn't have a stop method, but we reset our state
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
fun getLatestFramePath(): String? {
|
|
154
|
+
val bitmap = latestBitmap ?: return null
|
|
155
|
+
return try {
|
|
156
|
+
val file = File.createTempFile("flir_frame_", ".jpg")
|
|
157
|
+
FileOutputStream(file).use { out ->
|
|
158
|
+
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out)
|
|
159
|
+
}
|
|
160
|
+
file.absolutePath
|
|
161
|
+
} catch (t: Throwable) {
|
|
162
|
+
null
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
fun getTemperatureAt(x: Int, y: Int): Double? {
|
|
167
|
+
return getTemperatureAtPoint(x, y)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
private fun emitFrameToReactNative(bitmap: Bitmap) {
|
|
171
|
+
val now = System.currentTimeMillis()
|
|
172
|
+
if (now - lastEmitMs.get() < minEmitIntervalMs) return
|
|
173
|
+
lastEmitMs.set(now)
|
|
174
|
+
|
|
175
|
+
val ctx = reactContext ?: return
|
|
176
|
+
try {
|
|
177
|
+
val params = Arguments.createMap()
|
|
178
|
+
params.putInt("width", bitmap.width)
|
|
179
|
+
params.putInt("height", bitmap.height)
|
|
180
|
+
params.putDouble("timestamp", now.toDouble())
|
|
181
|
+
|
|
182
|
+
ctx.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
183
|
+
.emit("FlirFrameReceived", params)
|
|
184
|
+
} catch (e: Exception) {
|
|
185
|
+
// Silently ignore
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
private fun emitDeviceState(state: String, isPhysical: Boolean) {
|
|
190
|
+
val ctx = reactContext ?: return
|
|
191
|
+
try {
|
|
192
|
+
val params = Arguments.createMap()
|
|
193
|
+
params.putString("state", state)
|
|
194
|
+
params.putBoolean("isPhysical", isPhysical)
|
|
195
|
+
params.putBoolean("isEmulator", isEmulatorMode)
|
|
196
|
+
params.putBoolean("isConnected", isPhysicalDeviceConnected)
|
|
197
|
+
|
|
198
|
+
connectedDeviceName?.let {
|
|
199
|
+
params.putString("deviceName", it)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
ctx.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
203
|
+
.emit("FlirDeviceConnected", params)
|
|
204
|
+
} catch (e: Exception) {}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Compatibility for Java / FlirHelper
|
|
208
|
+
@JvmStatic
|
|
209
|
+
fun getInstance(): FlirManager = this
|
|
210
|
+
|
|
211
|
+
interface DiscoveryCallback {
|
|
212
|
+
fun onDeviceFound(deviceName: String)
|
|
213
|
+
fun onDiscoveryTimeout()
|
|
214
|
+
fun onEmulatorEnabled()
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
private var discoveryCallback: DiscoveryCallback? = null
|
|
218
|
+
|
|
219
|
+
fun setDiscoveryCallback(callback: DiscoveryCallback?) {
|
|
220
|
+
discoveryCallback = callback
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
fun setPalette(name: String) {
|
|
224
|
+
sdkManager?.setPalette(name)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
fun setEmulatorMode(enabled: Boolean) {
|
|
228
|
+
isEmulatorMode = enabled
|
|
229
|
+
if (enabled) {
|
|
230
|
+
discoveryCallback?.onEmulatorEnabled()
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
fun updateAcol(value: Float) {
|
|
235
|
+
// No-op for now - palette changes handled by setPalette
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
fun startDiscovery(retry: Boolean) {
|
|
239
|
+
if (reactContext != null) {
|
|
240
|
+
startDiscoveryAndConnect(reactContext!!)
|
|
241
|
+
} else {
|
|
242
|
+
// Fallback: try to start without React context
|
|
243
|
+
try {
|
|
244
|
+
sdkManager?.startSdkEmulator()
|
|
245
|
+
} catch (t: Throwable) {
|
|
246
|
+
Log.e(TAG, "startDiscovery failed", t)
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
fun enableEmulatorMode() {
|
|
252
|
+
setEmulatorMode(true)
|
|
253
|
+
}
|
|
254
|
+
}
|