Loading...
Searching...
No Matches
MeasurementManagerExample.kt
Go to the documentation of this file.
1import kotlinx.coroutines.delay
2import kotlinx.coroutines.runBlocking
3import kotlinx.coroutines.GlobalScope
4import kotlinx.coroutines.launch
5
6/**
7 * MeasurementManager usage example for Kotlin
8 * Demonstrates working with sensor and signal measurements, generators, and measurement management
9 */
10class MeasurementManagerExample {
11 private var sdk: NavigineSdk? = null
12 private var locationManager: LocationManager? = null
13 private var measurementManager: MeasurementManager? = null
14 private var measurementListener: MeasurementListener? = null
15
16 init {
17 initializeSdk()
18 setupMeasurementListener()
19 }
20
21 /**
22 * Initialize SDK and get managers
23 */
24 private fun initializeSdk() {
25 try {
26 // [kotlin_NavigineSdk_getInstance]
27 // Get SDK instance
28 sdk = NavigineSdk.getInstance()
29 // [kotlin_NavigineSdk_getInstance]
30
31 // [kotlin_NavigineSdk_setUserHash]
32 // Set user hash
33 sdk?.setUserHash("USER-HASH-HERE")
34 // [kotlin_NavigineSdk_setUserHash]
35
36 // [kotlin_NavigineSdk_setServer]
37 // Set server URL (optional)
38 sdk?.setServer("https://custom.navigine.com")
39 // [kotlin_NavigineSdk_setServer]
40
41 // [kotlin_NavigineSdk_getLocationManager]
42 // Get LocationManager for working with locations
43 locationManager = sdk?.getLocationManager()
44 // [kotlin_NavigineSdk_getLocationManager]
45
46 // [kotlin_NavigineSdk_getMeasurementManager]
47 // Get MeasurementManager for working with measurements
48 measurementManager = sdk?.getMeasurementManager(locationManager)
49 // [kotlin_NavigineSdk_getMeasurementManager]
50
51 // [kotlin_MeasurementManager_setPublishIntervalMs]
52 // Optional: interval between measurement batches sent to listeners (ms)
53 measurementManager?.setPublishIntervalMs(1000)
54 // [kotlin_MeasurementManager_setPublishIntervalMs]
55
56 if (locationManager != null && measurementManager != null) {
57 println("LocationManager and MeasurementManager successfully initialized")
58 }
59 } catch (e: Exception) {
60 System.err.println("Error initializing SDK: ${e.message}")
61 }
62 }
63
64 /**
65 * Setup measurement listener
66 */
67 private fun setupMeasurementListener() {
68 measurementListener = object : MeasurementListener() {
69 // [kotlin_MeasurementListener_onSensorMeasurementDetected]
70 override fun onSensorMeasurementDetected(sensors: Map<SensorType, SensorMeasurement>) {
71 println("Sensor measurements detected")
72 demonstrateSensorMeasurements(sensors)
73 }
74 // [kotlin_MeasurementListener_onSensorMeasurementDetected]
75
76 // [kotlin_MeasurementListener_onSignalMeasurementDetected]
77 override fun onSignalMeasurementDetected(signals: Map<String, SignalMeasurement>) {
78 println("Signal measurements detected")
79 demonstrateSignalMeasurements(signals)
80 }
81 // [kotlin_MeasurementListener_onSignalMeasurementDetected]
82 }
83 }
84
85 /**
86 * Demonstrate MeasurementManager methods
87 */
88 fun demonstrateMeasurementManagerMethods() {
89 val manager = measurementManager ?: run {
90 System.err.println("MeasurementManager not initialized")
91 return
92 }
93
94 val listener = measurementListener ?: return
95
96 // [kotlin_MeasurementManager_addMeasurementListener]
97 // Add measurement listener
98 manager.addMeasurementListener(listener)
99 println("Added measurement listener")
100 // [kotlin_MeasurementManager_addMeasurementListener]
101
102 // Demonstrate beacon generators
103 demonstrateBeaconGenerators()
104
105 // Demonstrate Eddystone generators
106 demonstrateEddystoneGenerators()
107
108 // Demonstrate Wi-Fi generators
109 demonstrateWifiGenerators()
110
111 // Demonstrate Wi-Fi RTT generators
112 demonstrateWifiRttGenerators()
113
114 // Demonstrate location generators
115 demonstrateLocationGenerators()
116
117 // Simulate some time passing for measurements
118 GlobalScope.launch {
119 delay(2000)
120
121 // [kotlin_MeasurementManager_removeMeasurementListener]
122 // Remove measurement listener
123 manager.removeMeasurementListener(listener)
124 println("Removed measurement listener")
125 // [kotlin_MeasurementManager_removeMeasurementListener]
126 }
127 }
128
129 /**
130 * Demonstrate beacon generators
131 */
132 private fun demonstrateBeaconGenerators() {
133 val manager = measurementManager ?: return
134
135 // [kotlin_MeasurementManager_addBeaconGenerator]
136 // Add beacon generator
137 val beaconId = manager.addBeaconGenerator(
138 "12345678-1234-1234-1234-123456789012", // UUID
139 100, // major
140 200, // minor
141 -60, // power (dBm)
142 5000, // timeout (ms)
143 -80, // rssiMin
144 -40 // rssiMax
145 )
146 println("Added beacon generator with ID: $beaconId")
147 // [kotlin_MeasurementManager_addBeaconGenerator]
148
149 // [kotlin_MeasurementManager_removeBleGenerator]
150 // Remove specific BLE generator
151 manager.removeBleGenerator(beaconId)
152 println("Removed BLE generator: $beaconId")
153 // [kotlin_MeasurementManager_removeBleGenerator]
154
155 // [kotlin_MeasurementManager_removeBleGenerators]
156 // Remove all BLE generators
157 manager.removeBleGenerators()
158 println("Removed all BLE generators")
159 // [kotlin_MeasurementManager_removeBleGenerators]
160 }
161
162 /**
163 * Demonstrate Eddystone generators
164 */
165 private fun demonstrateEddystoneGenerators() {
166 val manager = measurementManager ?: return
167
168 // [kotlin_MeasurementManager_addEddystoneGenerator]
169 // Add Eddystone generator
170 val eddystoneId = manager.addEddystoneGenerator(
171 "12345678901234567890", // namespaceId
172 "1234567890123456", // instanceId
173 -65, // power (dBm)
174 3000, // timeout (ms)
175 -85, // rssiMin
176 -45 // rssiMax
177 )
178 println("Added Eddystone generator with ID: $eddystoneId")
179 // [kotlin_MeasurementManager_addEddystoneGenerator]
180
181 // Remove Eddystone generator (uses same method as BLE)
182 manager.removeBleGenerator(eddystoneId)
183 println("Removed Eddystone generator: $eddystoneId")
184 }
185
186 /**
187 * Demonstrate Wi-Fi generators
188 */
189 private fun demonstrateWifiGenerators() {
190 val manager = measurementManager ?: return
191
192 // [kotlin_MeasurementManager_addWifiGenerator]
193 // Add Wi-Fi generator
194 val wifiId = manager.addWifiGenerator(
195 "AA:BB:CC:DD:EE:FF", // MAC address
196 4000, // timeout (ms)
197 -90, // rssiMin
198 -50 // rssiMax
199 )
200 println("Added Wi-Fi generator with ID: $wifiId")
201 // [kotlin_MeasurementManager_addWifiGenerator]
202
203 // [kotlin_MeasurementManager_removeWifiGenerator]
204 // Remove specific Wi-Fi generator
205 manager.removeWifiGenerator(wifiId)
206 println("Removed Wi-Fi generator: $wifiId")
207 // [kotlin_MeasurementManager_removeWifiGenerator]
208
209 // [kotlin_MeasurementManager_removeWifiGenerators]
210 // Remove all Wi-Fi generators
211 manager.removeWifiGenerators()
212 println("Removed all Wi-Fi generators")
213 // [kotlin_MeasurementManager_removeWifiGenerators]
214 }
215
216 /**
217 * Demonstrate Wi-Fi RTT generators
218 */
219 private fun demonstrateWifiRttGenerators() {
220 val manager = measurementManager ?: return
221
222 // [kotlin_MeasurementManager_addWifiRttGenerator]
223 // Add Wi-Fi RTT generator
224 val wifiRttId = manager.addWifiRttGenerator(
225 "11:22:33:44:55:66", // MAC address
226 6000, // timeout (ms)
227 1, // distMin (meters)
228 10, // distMax (meters)
229 0, // stdDevMin
230 2, // stdDevMax
231 -70, // rssiMin
232 -30 // rssiMax
233 )
234 println("Added Wi-Fi RTT generator with ID: $wifiRttId")
235 // [kotlin_MeasurementManager_addWifiRttGenerator]
236
237 // [kotlin_MeasurementManager_removeWifiRttGenerator]
238 // Remove specific Wi-Fi RTT generator
239 manager.removeWifiRttGenerator(wifiRttId)
240 println("Removed Wi-Fi RTT generator: $wifiRttId")
241 // [kotlin_MeasurementManager_removeWifiRttGenerator]
242
243 // [kotlin_MeasurementManager_removeWifiRttGenerators]
244 // Remove all Wi-Fi RTT generators
245 manager.removeWifiRttGenerators()
246 println("Removed all Wi-Fi RTT generators")
247 // [kotlin_MeasurementManager_removeWifiRttGenerators]
248 }
249
250 /**
251 * Demonstrate location generators
252 */
253 private fun demonstrateLocationGenerators() {
254 val manager = measurementManager ?: return
255
256 // [kotlin_MeasurementManager_addLocationGenerator]
257 // Add location generator
258 val locationId = manager.addLocationGenerator(
259 55.7558, // latMin
260 55.7559, // latMax
261 37.6176, // lonMin
262 37.6177, // lonMax
263 1.0, // accMin (meters)
264 5.0, // accMax (meters)
265 7000 // timeout (ms)
266 )
267 println("Added location generator with ID: $locationId")
268 // [kotlin_MeasurementManager_addLocationGenerator]
269
270 // [kotlin_MeasurementManager_removeLocationGenerator]
271 // Remove specific location generator
272 manager.removeLocationGenerator(locationId)
273 println("Removed location generator: $locationId")
274 // [kotlin_MeasurementManager_removeLocationGenerator]
275
276 // [kotlin_MeasurementManager_removeLocationGenerators]
277 // Remove all location generators
278 manager.removeLocationGenerators()
279 println("Removed all location generators")
280 // [kotlin_MeasurementManager_removeLocationGenerators]
281 }
282
283 /**
284 * Demonstrate sensor measurements
285 */
286 fun demonstrateSensorMeasurements(sensors: Map<SensorType, SensorMeasurement>) {
287 sensors.forEach { (sensorType, measurement) ->
288 // [kotlin_SensorMeasurement_getType]
289 // Get sensor type
290 val type = measurement.type
291 println("Sensor type: $type")
292 // [kotlin_SensorMeasurement_getType]
293
294 // [kotlin_SensorMeasurement_getValues]
295 // Get sensor values
296 val values = measurement.values
297 println("Sensor values - X: ${values.x}, Y: ${values.y}, Z: ${values.z}")
298 // [kotlin_SensorMeasurement_getValues]
299
300 // [kotlin_SensorMeasurement_getTime]
301 // Get measurement timestamp
302 val time = measurement.time
303 println("Measurement time: $time ms")
304 // [kotlin_SensorMeasurement_getTime]
305
306 // Demonstrate Vector3d properties
307 demonstrateVector3d(values)
308 }
309 }
310
311 /**
312 * Demonstrate signal measurements
313 */
314 fun demonstrateSignalMeasurements(signals: Map<String, SignalMeasurement>) {
315 signals.forEach { (signalId, measurement) ->
316 // [kotlin_SignalMeasurement_getType]
317 // Get signal type
318 val type = measurement.type
319 println("Signal type: $type")
320 // [kotlin_SignalMeasurement_getType]
321
322 // [kotlin_SignalMeasurement_getId]
323 // Get signal identifier
324 val id = measurement.id
325 println("Signal ID: $id")
326 // [kotlin_SignalMeasurement_getId]
327
328 // [kotlin_SignalMeasurement_getRssi]
329 // Get RSSI value
330 val rssi = measurement.rssi
331 println("Signal RSSI: $rssi dBm")
332 // [kotlin_SignalMeasurement_getRssi]
333
334 // [kotlin_SignalMeasurement_getDistance]
335 // Get estimated distance
336 val distance = measurement.distance
337 println("Signal distance: $distance meters")
338 // [kotlin_SignalMeasurement_getDistance]
339
340 // [kotlin_SignalMeasurement_getTime]
341 // Get measurement timestamp
342 val time = measurement.time
343 println("Signal measurement time: $time ms")
344 // [kotlin_SignalMeasurement_getTime]
345 }
346 }
347
348 /**
349 * Demonstrate Vector3d properties
350 */
351 private fun demonstrateVector3d(vector: Vector3d) {
352 // [kotlin_Vector3d_getX]
353 // Get X coordinate
354 val x = vector.x
355 println("Vector X: $x")
356 // [kotlin_Vector3d_getX]
357
358 // [kotlin_Vector3d_getY]
359 // Get Y coordinate
360 val y = vector.y
361 println("Vector Y: $y")
362 // [kotlin_Vector3d_getY]
363
364 // [kotlin_Vector3d_getZ]
365 // Get Z coordinate
366 val z = vector.z
367 println("Vector Z: $z")
368 // [kotlin_Vector3d_getZ]
369 }
370
371 /**
372 * Main demonstration method
373 */
374 suspend fun runExample() {
375 println("=== MeasurementManager Example ===")
376
377 demonstrateMeasurementManagerMethods()
378
379 // Wait a bit for measurements
380 delay(5000)
381
382 println("=== Example completed ===")
383 }
384}
385
386/**
387 * Function to run the example
388 */
389fun main() = runBlocking {
390 val example = MeasurementManagerExample()
391 example.runExample()
392}