[O] Optimize bluetooth handler initialization

This commit is contained in:
Azalea Gui
2023-01-23 16:32:31 -05:00
parent 92e57c5283
commit ed6c8403da
3 changed files with 31 additions and 41 deletions
@@ -10,6 +10,7 @@ import com.welie.blessed.BluetoothPeripheral
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.consumeAsFlow
import org.hydev.wearsync.bles.BluetoothHandler
import org.hydev.wearsync.bles.BluetoothHandler.Companion.ble
import org.hydev.wearsync.bles.ObservationUnit
import org.hydev.wearsync.databinding.ActivityScanBinding
import java.text.DateFormat
@@ -22,9 +23,6 @@ class ActivityScan : AppCompatActivity() {
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
private val dateFormat: DateFormat = SimpleDateFormat("dd-MM-yyyy HH:mm:ss", Locale.ENGLISH)
private val blueMan by lazy { blueMan() }
private lateinit var bluetoothHandler: BluetoothHandler
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityScanBinding.inflate(layoutInflater)
@@ -33,22 +31,17 @@ class ActivityScan : AppCompatActivity() {
initBluetoothHandler()
}
private val central get() = bluetoothHandler.central
@SuppressLint("MissingPermission")
private fun initBluetoothHandler() {
if (this::bluetoothHandler.isInitialized) return
bluetoothHandler = BluetoothHandler.ble(this)
println("OnCreate called, Initializing...")
// List bonded device addresses
val pairedDevices = blueMan.adapter.bondedDevices.toList()
val pairedDevices = blueMan().adapter.bondedDevices.toList()
val pairedAddresses = pairedDevices.map { it.address }.toSet()
// Scan devices
val scannedDevices = ArrayList<BluetoothPeripheral>()
central.scanForPeripherals({ peripheral, scanResult ->
ble.central.scanForPeripherals({ peripheral, scanResult ->
if (peripheral.name.isBlank() || scannedDevices.contains(peripheral)) return@scanForPeripherals
// Add to scanned devices
@@ -64,8 +57,8 @@ class ActivityScan : AppCompatActivity() {
// Click scanned device
binding.lvScanned.setOnItemClickListener { parent, view, position, id ->
central.stopScan()
bluetoothHandler.connectPeripheral(scannedDevices[position]) {
ble.central.stopScan()
ble.connectPeripheral(scannedDevices[position]) {
view.snack("✅ Connected.")
}
}
@@ -83,16 +76,16 @@ class ActivityScan : AppCompatActivity() {
view.snack("Connecting...")
// Scan for the device with the MAC address
bluetoothHandler.connectAddress(dev.address) {
ble.connectAddress(dev.address) {
view.snack("✅ Connected.")
}
}
collectHeartRate(bluetoothHandler)
collectPulseOxContinuous(bluetoothHandler)
collectPulseOxSpot(bluetoothHandler)
collectTemperature(bluetoothHandler)
collectWeight(bluetoothHandler)
collectHeartRate(ble)
collectPulseOxContinuous(ble)
collectPulseOxSpot(ble)
collectTemperature(ble)
collectWeight(ble)
}
private fun collectHeartRate(bluetoothHandler: BluetoothHandler) {
@@ -236,51 +236,50 @@ internal class BluetoothHandler private constructor(context: Context) {
companion object {
// UUIDs for the Blood Pressure service (BLP)
private val BLP_SERVICE_UUID: UUID = UUID.fromString("00001810-0000-1000-8000-00805f9b34fb")
private val BLP_MEASUREMENT_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A35-0000-1000-8000-00805f9b34fb")
val BLP_SERVICE_UUID: UUID = UUID.fromString("00001810-0000-1000-8000-00805f9b34fb")
val BLP_MEASUREMENT_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A35-0000-1000-8000-00805f9b34fb")
// UUIDs for the Health Thermometer service (HTS)
private val HTS_SERVICE_UUID = UUID.fromString("00001809-0000-1000-8000-00805f9b34fb")
private val HTS_MEASUREMENT_CHARACTERISTIC_UUID = UUID.fromString("00002A1C-0000-1000-8000-00805f9b34fb")
val HTS_SERVICE_UUID = UUID.fromString("00001809-0000-1000-8000-00805f9b34fb")
val HTS_MEASUREMENT_CHARACTERISTIC_UUID = UUID.fromString("00002A1C-0000-1000-8000-00805f9b34fb")
// UUIDs for the Heart Rate service (HRS)
private val HRS_SERVICE_UUID: UUID = UUID.fromString("0000180D-0000-1000-8000-00805f9b34fb")
private val HRS_MEASUREMENT_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A37-0000-1000-8000-00805f9b34fb")
val HRS_SERVICE_UUID: UUID = UUID.fromString("0000180D-0000-1000-8000-00805f9b34fb")
val HRS_MEASUREMENT_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A37-0000-1000-8000-00805f9b34fb")
// UUIDs for the Device Information service (DIS)
private val DIS_SERVICE_UUID: UUID = UUID.fromString("0000180A-0000-1000-8000-00805f9b34fb")
private val MANUFACTURER_NAME_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A29-0000-1000-8000-00805f9b34fb")
private val MODEL_NUMBER_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A24-0000-1000-8000-00805f9b34fb")
val DIS_SERVICE_UUID: UUID = UUID.fromString("0000180A-0000-1000-8000-00805f9b34fb")
val MANUFACTURER_NAME_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A29-0000-1000-8000-00805f9b34fb")
val MODEL_NUMBER_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A24-0000-1000-8000-00805f9b34fb")
// UUIDs for the Current Time service (CTS)
private val CTS_SERVICE_UUID: UUID = UUID.fromString("00001805-0000-1000-8000-00805f9b34fb")
private val CURRENT_TIME_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A2B-0000-1000-8000-00805f9b34fb")
val CTS_SERVICE_UUID: UUID = UUID.fromString("00001805-0000-1000-8000-00805f9b34fb")
val CURRENT_TIME_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A2B-0000-1000-8000-00805f9b34fb")
// UUIDs for the Battery Service (BAS)
private val BTS_SERVICE_UUID: UUID = UUID.fromString("0000180F-0000-1000-8000-00805f9b34fb")
private val BATTERY_LEVEL_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A19-0000-1000-8000-00805f9b34fb")
val BTS_SERVICE_UUID: UUID = UUID.fromString("0000180F-0000-1000-8000-00805f9b34fb")
val BATTERY_LEVEL_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A19-0000-1000-8000-00805f9b34fb")
// UUIDs for the Pulse Oximeter Service (PLX)
val PLX_SERVICE_UUID: UUID = UUID.fromString("00001822-0000-1000-8000-00805f9b34fb")
private val PLX_SPOT_MEASUREMENT_CHAR_UUID: UUID = UUID.fromString("00002a5e-0000-1000-8000-00805f9b34fb")
private val PLX_CONTINUOUS_MEASUREMENT_CHAR_UUID: UUID = UUID.fromString("00002a5f-0000-1000-8000-00805f9b34fb")
val PLX_SPOT_MEASUREMENT_CHAR_UUID: UUID = UUID.fromString("00002a5e-0000-1000-8000-00805f9b34fb")
val PLX_CONTINUOUS_MEASUREMENT_CHAR_UUID: UUID = UUID.fromString("00002a5f-0000-1000-8000-00805f9b34fb")
// UUIDs for the Weight Scale Service (WSS)
val WSS_SERVICE_UUID: UUID = UUID.fromString("0000181D-0000-1000-8000-00805f9b34fb")
private val WSS_MEASUREMENT_CHAR_UUID: UUID = UUID.fromString("00002A9D-0000-1000-8000-00805f9b34fb")
val WSS_MEASUREMENT_CHAR_UUID: UUID = UUID.fromString("00002A9D-0000-1000-8000-00805f9b34fb")
val GLUCOSE_SERVICE_UUID: UUID = UUID.fromString("00001808-0000-1000-8000-00805f9b34fb")
val GLUCOSE_MEASUREMENT_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A18-0000-1000-8000-00805f9b34fb")
val GLUCOSE_RECORD_ACCESS_POINT_CHARACTERISTIC_UUID: UUID = UUID.fromString("00002A52-0000-1000-8000-00805f9b34fb")
// Contour Glucose Service
val CONTOUR_SERVICE_UUID: UUID = UUID.fromString("00000000-0002-11E2-9E96-0800200C9A66")
private val CONTOUR_CLOCK = UUID.fromString("00001026-0002-11E2-9E96-0800200C9A66")
private var instance: BluetoothHandler? = null
val CONTOUR_CLOCK = UUID.fromString("00001026-0002-11E2-9E96-0800200C9A66")
@Synchronized
fun ble(context: Context): BluetoothHandler {
private var instance: BluetoothHandler? = null
val Context.ble get(): BluetoothHandler {
if (instance == null) {
instance = BluetoothHandler(context.applicationContext)
instance = BluetoothHandler(this)
}
return instance!!
}
@@ -3,5 +3,3 @@ package org.hydev.wearsync.bles
import com.welie.blessed.ScanFailure
class ScanException(val fail: ScanFailure) : Exception()
{
}