diff --git a/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt b/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt index bb39b1ef6..d163ae593 100644 --- a/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt +++ b/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt @@ -90,13 +90,6 @@ constructor( private val _currentDeviceAddressFlow = MutableStateFlow(radioPrefs.devAddr) val currentDeviceAddressFlow: StateFlow = _currentDeviceAddressFlow.asStateFlow() - private val _isRssiPollingEnabled = MutableStateFlow(false) - val isRssiPollingEnabled: StateFlow = _isRssiPollingEnabled.asStateFlow() - - fun setRssiPolling(enabled: Boolean) { - _isRssiPollingEnabled.value = enabled - } - private val logSends = false private val logReceives = false private lateinit var sentPacketsLog: BinaryLogFile diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsScreen.kt index 14eee02f0..bab494f18 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsScreen.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsScreen.kt @@ -42,7 +42,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState @@ -56,6 +55,7 @@ import androidx.compose.ui.unit.sp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.model.BTScanModel +import com.geeksville.mesh.model.DeviceListEntry import com.geeksville.mesh.ui.connections.components.BLEDevices import com.geeksville.mesh.ui.connections.components.ConnectionsSegmentedBar import com.geeksville.mesh.ui.connections.components.CurrentlyConnectedInfo @@ -126,11 +126,6 @@ fun ConnectionsScreen( val recentTcpDevices by scanModel.recentTcpDevicesForUi.collectAsStateWithLifecycle() val usbDevices by scanModel.usbDevicesForUi.collectAsStateWithLifecycle() - DisposableEffect(Unit) { - connectionsViewModel.onStart() - onDispose { connectionsViewModel.onStop() } - } - /* Animate waiting for the configurations */ var isWaiting by remember { mutableStateOf(false) } if (isWaiting) { @@ -209,6 +204,9 @@ fun ConnectionsScreen( TitledCard(title = stringResource(Res.string.connected_device)) { CurrentlyConnectedInfo( node = node, + bleDevice = + bleDevices.firstOrNull { it.fullAddress == selectedDevice } + as DeviceListEntry.Ble?, onNavigateToNodeDetails = onNavigateToNodeDetails, onClickDisconnect = { scanModel.disconnect() }, ) diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsViewModel.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsViewModel.kt index d899de13a..f8f661891 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsViewModel.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsViewModel.kt @@ -19,7 +19,6 @@ package com.geeksville.mesh.ui.connections import androidx.lifecycle.ViewModel import com.geeksville.mesh.repository.bluetooth.BluetoothRepository -import com.geeksville.mesh.repository.radio.RadioInterfaceService import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -40,18 +39,10 @@ class ConnectionsViewModel constructor( radioConfigRepository: RadioConfigRepository, serviceRepository: ServiceRepository, - private val radioInterfaceService: RadioInterfaceService, nodeRepository: NodeRepository, bluetoothRepository: BluetoothRepository, private val uiPrefs: UiPrefs, ) : ViewModel() { - fun onStart() { - radioInterfaceService.setRssiPolling(true) - } - - fun onStop() { - radioInterfaceService.setRssiPolling(false) - } val localConfig: StateFlow = radioConfigRepository.localConfigFlow.stateInWhileSubscribed(initialValue = LocalConfig.getDefaultInstance()) diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/CurrentlyConnectedInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/CurrentlyConnectedInfo.kt index 42fe80b89..626fafad2 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/CurrentlyConnectedInfo.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/CurrentlyConnectedInfo.kt @@ -28,6 +28,11 @@ import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -35,27 +40,40 @@ import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp +import com.geeksville.mesh.model.DeviceListEntry +import kotlinx.coroutines.delay import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node import org.meshtastic.core.strings.Res import org.meshtastic.core.strings.disconnect import org.meshtastic.core.strings.firmware_version import org.meshtastic.core.ui.component.MaterialBatteryInfo +import org.meshtastic.core.ui.component.MaterialBluetoothSignalInfo import org.meshtastic.core.ui.component.NodeChip import org.meshtastic.core.ui.theme.AppTheme import org.meshtastic.core.ui.theme.StatusColors.StatusRed import org.meshtastic.proto.MeshProtos import org.meshtastic.proto.PaxcountProtos import org.meshtastic.proto.TelemetryProtos +import kotlin.time.Duration.Companion.seconds -/** Converts Bluetooth RSSI to a 0-4 bar signal strength level. */ @Composable fun CurrentlyConnectedInfo( node: Node, onNavigateToNodeDetails: (Int) -> Unit, onClickDisconnect: () -> Unit, modifier: Modifier = Modifier, + bleDevice: DeviceListEntry.Ble? = null, ) { + var rssi by remember { mutableIntStateOf(0) } + LaunchedEffect(bleDevice) { + if (bleDevice != null) { + while (bleDevice.peripheral.isConnected) { + rssi = bleDevice.peripheral.readRssi() + delay(10.seconds) + } + } + } Column(modifier = modifier) { Row( modifier = Modifier.fillMaxWidth().padding(start = 16.dp, end = 16.dp, top = 8.dp), @@ -63,6 +81,9 @@ fun CurrentlyConnectedInfo( verticalAlignment = Alignment.CenterVertically, ) { MaterialBatteryInfo(level = node.batteryLevel, voltage = node.voltage) + if (bleDevice is DeviceListEntry.Ble) { + MaterialBluetoothSignalInfo(rssi) + } } Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp)) { Column(