mirror of
https://github.com/aljazceru/Android-nRF-Toolbox.git
synced 2026-01-07 16:54:27 +01:00
committed by
GitHub
parent
18ad3d97bb
commit
1004a561fd
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user