Migration to latest BLEK (#132)

* Migration to latest BLEK

* Clean up
This commit is contained in:
Aleksander Nowakowski
2023-12-21 22:55:47 +01:00
committed by GitHub
parent 18ad3d97bb
commit 1004a561fd
28 changed files with 163 additions and 183 deletions

View File

@@ -45,27 +45,26 @@ dependencies {
implementation(project(":lib_ui"))
implementation(project(":lib_utils"))
implementation(libs.nordic.theme)
implementation(libs.nordic.navigation)
implementation(libs.nordic.uilogger)
implementation(libs.nordic.blek.client)
implementation(libs.nordic.blek.profile)
implementation(libs.nordic.blek.server)
implementation(libs.nordic.blek.advertiser)
implementation(libs.nordic.blek.uiscanner)
implementation(libs.chart)
implementation(libs.nordic.ble.common)
implementation(libs.nordic.ble.ktx)
implementation(libs.nordic.theme)
implementation(libs.nordic.blek.uiscanner)
implementation(libs.nordic.navigation)
implementation(libs.nordic.uilogger)
implementation(libs.androidx.hilt.navigation.compose)
implementation(libs.androidx.compose.material.iconsExtended)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.lifecycle.service)
implementation(libs.androidx.hilt.navigation.compose)
testImplementation(libs.hilt.android.testing)
kaptTest(libs.hilt.compiler)
testImplementation(libs.androidx.test.rules)

View File

@@ -44,12 +44,12 @@ class GlsServer @Inject constructor(
private val logger: BleLogger = DefaultConsoleLogger(context)
) {
lateinit var server: ServerBleGatt
private lateinit var server: ServerBleGatt
lateinit var glsCharacteristic: ServerBleGattCharacteristic
lateinit var glsContextCharacteristic: ServerBleGattCharacteristic
lateinit var racpCharacteristic: ServerBleGattCharacteristic
lateinit var batteryLevelCharacteristic: ServerBleGattCharacteristic
private lateinit var glsCharacteristic: ServerBleGattCharacteristic
private lateinit var glsContextCharacteristic: ServerBleGattCharacteristic
private lateinit var racpCharacteristic: ServerBleGattCharacteristic
private lateinit var batteryLevelCharacteristic: ServerBleGattCharacteristic
private var lastRequest = DataByteArray()
@@ -144,7 +144,7 @@ class GlsServer @Inject constructor(
OLDEST_RECORD
)
val racp = DataByteArray.from(0x06, 0x00, 0x01, 0x01)
private val SUCCESS = DataByteArray.from(0x06, 0x00, 0x01, 0x01)
fun start(
context: Context,
@@ -193,7 +193,8 @@ class GlsServer @Inject constructor(
context = context,
config = arrayOf(serviceConfig, batteryService),
mock = device,
logger = { priority, log -> println(log) }
scope = scope,
logger = { _, log -> println(log) }
)
val advertiser = BleAdvertiser.create(context)
@@ -223,12 +224,11 @@ class GlsServer @Inject constructor(
BATTERY_LEVEL_CHARACTERISTIC_UUID
)!!
startGlsService(connection)
// startBatteryService(connection)
startGlsService()
// startBatteryService()
}
private fun startGlsService(connection: ServerBluetoothGattConnection) {
private fun startGlsService() {
racpCharacteristic.value
.onEach { lastRequest = it }
.launchIn(scope)
@@ -238,42 +238,38 @@ class GlsServer @Inject constructor(
sendResponse(lastRequest)
}
private fun sendResponse(request: DataByteArray) {
if (request == RecordAccessControlPointInputParser.reportNumberOfAllStoredRecords()) {
sendAll(glsCharacteristic)
racpCharacteristic.setValue(racp)
} else if (request == RecordAccessControlPointInputParser.reportLastStoredRecord()) {
sendLast(glsCharacteristic)
racpCharacteristic.setValue(racp)
} else if (request == RecordAccessControlPointInputParser.reportFirstStoredRecord()) {
sendFirst(glsCharacteristic)
racpCharacteristic.setValue(racp)
private fun sendResponse(request: DataByteArray) = scope.launch {
when (request) {
RecordAccessControlPointInputParser.reportNumberOfAllStoredRecords() -> {
records.forEach {
send(glsCharacteristic, it)
delay(100)
}
racpCharacteristic.setValueAndNotifyClient(SUCCESS)
}
RecordAccessControlPointInputParser.reportLastStoredRecord() -> {
send(glsCharacteristic, records.last())
send(racpCharacteristic, SUCCESS)
}
RecordAccessControlPointInputParser.reportFirstStoredRecord() -> {
send(glsCharacteristic, records.first())
send(racpCharacteristic, SUCCESS)
}
}
}
private fun sendFirst(characteristics: ServerBleGattCharacteristic) {
characteristics.setValue(records.first())
private suspend fun send(characteristics: ServerBleGattCharacteristic, data: DataByteArray) {
characteristics.setValueAndNotifyClient(data)
}
private fun sendLast(characteristics: ServerBleGattCharacteristic) {
characteristics.setValue(records.last())
}
private fun sendAll(characteristics: ServerBleGattCharacteristic) = scope.launch {
records.forEach {
characteristics.setValue(it)
delay(100)
}
}
private fun startBatteryService(connection: ServerBluetoothGattConnection) {
private fun startBatteryService() {
scope.launch {
repeat(100) {
batteryLevelCharacteristic.setValue(DataByteArray.from(0x61))
send(batteryLevelCharacteristic, DataByteArray.from(0x61))
delay(STANDARD_DELAY)
batteryLevelCharacteristic.setValue(DataByteArray.from(0x60))
send(batteryLevelCharacteristic, DataByteArray.from(0x60))
delay(STANDARD_DELAY)
batteryLevelCharacteristic.setValue(DataByteArray.from(0x5F))
send(batteryLevelCharacteristic, DataByteArray.from(0x5F))
delay(STANDARD_DELAY)
}
}

View File

@@ -40,7 +40,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Divider
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -71,7 +71,7 @@ internal fun GLSDetailsContentView(record: GLSRecord, context: GLSMeasurementCon
)
}
Divider(
HorizontalDivider(
color = MaterialTheme.colorScheme.secondary,
thickness = 1.dp,
modifier = Modifier.padding(vertical = 16.dp)
@@ -112,7 +112,7 @@ internal fun GLSDetailsContentView(record: GLSRecord, context: GLSMeasurementCon
}
record.status?.let {
Divider(
HorizontalDivider(
color = MaterialTheme.colorScheme.secondary,
thickness = 1.dp,
modifier = Modifier.padding(vertical = 16.dp)
@@ -178,7 +178,7 @@ internal fun GLSDetailsContentView(record: GLSRecord, context: GLSMeasurementCon
}
context?.let {
Divider(
HorizontalDivider(
color = MaterialTheme.colorScheme.secondary,
thickness = 1.dp,
modifier = Modifier.padding(vertical = 16.dp)

View File

@@ -32,9 +32,10 @@
package no.nordicsemi.android.gls.main.viewmodel
import android.annotation.SuppressLint
import android.app.Application
import android.content.Context
import android.os.ParcelUuid
import androidx.lifecycle.ViewModel
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
@@ -61,12 +62,12 @@ import no.nordicsemi.android.gls.main.view.OnGLSRecordClick
import no.nordicsemi.android.gls.main.view.OnWorkingModeSelected
import no.nordicsemi.android.gls.main.view.OpenLoggerEvent
import no.nordicsemi.android.kotlin.ble.client.main.callback.ClientBleGatt
import no.nordicsemi.android.kotlin.ble.client.main.errors.GattOperationException
import no.nordicsemi.android.kotlin.ble.client.main.service.ClientBleGattCharacteristic
import no.nordicsemi.android.kotlin.ble.client.main.service.ClientBleGattServices
import no.nordicsemi.android.kotlin.ble.core.ServerDevice
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionState
import no.nordicsemi.android.kotlin.ble.core.data.GattConnectionStateWithStatus
import no.nordicsemi.android.kotlin.ble.core.errors.GattOperationException
import no.nordicsemi.android.kotlin.ble.profile.battery.BatteryLevelParser
import no.nordicsemi.android.kotlin.ble.profile.gls.GlucoseMeasurementContextParser
import no.nordicsemi.android.kotlin.ble.profile.gls.GlucoseMeasurementParser
@@ -99,13 +100,12 @@ val BATTERY_LEVEL_CHARACTERISTIC_UUID = UUID.fromString("00002A19-0000-1000-8000
@SuppressLint("MissingPermission")
@HiltViewModel
internal class GLSViewModel @Inject constructor(
@ApplicationContext
private val context: Context,
@ApplicationContext context: Context,
private val navigationManager: Navigator,
private val analytics: AppAnalytics,
private val stringConst: StringConst,
private val loggerFactory: NordicLoggerFactory
) : ViewModel() {
) : AndroidViewModel(context as Application) {
private var client: ClientBleGatt? = null
private lateinit var logger: BleLoggerAndLauncher
@@ -168,9 +168,9 @@ internal class GLSViewModel @Inject constructor(
private fun startGattClient(device: ServerDevice) = viewModelScope.launch {
_state.value = _state.value.copy(deviceName = device.name)
logger = loggerFactory.createNordicLogger(context, stringConst.APP_NAME, "GLS", device.address)
logger = loggerFactory.createNordicLogger(getApplication(), stringConst.APP_NAME, "GLS", device.address)
val client = ClientBleGatt.connect(context, device, logger = logger)
val client = ClientBleGatt.connect(getApplication(), device, viewModelScope, logger = logger)
this@GLSViewModel.client = client
client.waitForBonding()