From 221e774471dfe7831c5958c78f8e2a7bf8ac6e27 Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Sun, 1 Feb 2026 17:18:06 -0600 Subject: [PATCH] chore: fix regressions in the release (#4398) Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com> --- app/src/main/AndroidManifest.xml | 3 +-- .../repository/radio/NordicBleInterface.kt | 22 ++++++++++++++----- .../geeksville/mesh/service/MeshService.kt | 4 +--- build-logic/settings.gradle.kts | 14 ++++++++++-- .../feature/node/metrics/DeviceMetrics.kt | 11 +++++++--- .../feature/node/metrics/EnvironmentCharts.kt | 22 +++++++++++-------- .../feature/node/metrics/PowerMetrics.kt | 10 +++++---- .../feature/node/metrics/SignalMetrics.kt | 10 +++++++-- settings.gradle.kts | 7 +++++- 9 files changed, 71 insertions(+), 32 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ff2107c5a..e5d62f95e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -65,7 +65,6 @@ - @@ -125,7 +124,7 @@ diff --git a/app/src/main/java/com/geeksville/mesh/repository/radio/NordicBleInterface.kt b/app/src/main/java/com/geeksville/mesh/repository/radio/NordicBleInterface.kt index fd0be1261..f85df2fc0 100644 --- a/app/src/main/java/com/geeksville/mesh/repository/radio/NordicBleInterface.kt +++ b/app/src/main/java/com/geeksville/mesh/repository/radio/NordicBleInterface.kt @@ -113,13 +113,18 @@ constructor( private fun fromRadioPacketFlow(): Flow = channelFlow { while (isActive) { - // Use safe call and Elvis operator for cleaner loop termination if read fails or returns empty val packet = - fromRadioCharacteristic?.read()?.takeIf { it.isNotEmpty() } - ?: run { - Logger.d { "[$address] fromRadio queue drain complete (read empty/null)" } - break - } + try { + fromRadioCharacteristic?.read()?.takeIf { it.isNotEmpty() } + } catch (e: Exception) { + Logger.w(e) { "[$address] Error reading fromRadioCharacteristic (likely disconnected)" } + null + } + + if (packet == null) { + Logger.d { "[$address] fromRadio queue drain complete or error reading characteristic" } + break + } send(packet) } } @@ -221,6 +226,11 @@ constructor( .onEach { state -> Logger.i { "[$address] BLE connection state changed to $state" } if (state is ConnectionState.Disconnected) { + toRadioCharacteristic = null + fromNumCharacteristic = null + fromRadioCharacteristic = null + logRadioCharacteristic = null + val uptime = if (connectionStartTime > 0) { System.currentTimeMillis() - connectionStartTime diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt index c7761b229..76f4e371d 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -140,9 +140,7 @@ class MeshService : Service() { SERVICE_NOTIFY_ID, notification, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - var types = - ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE or - ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC + var types = ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE if (hasLocationPermission()) { types = types or ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION } diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts index e1846dc05..dff68e004 100644 --- a/build-logic/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -20,7 +20,12 @@ pluginManagement { gradlePluginPortal() google() mavenCentral() - maven { url = uri("https://jitpack.io") } + maven { + url = uri("https://jitpack.io") + content { + includeGroupByRegex("com\\.github\\..*") + } + } } } @@ -39,7 +44,12 @@ dependencyResolutionManagement { } } mavenCentral() - maven { url = uri("https://jitpack.io") } + maven { + url = uri("https://jitpack.io") + content { + includeGroupByRegex("com\\.github\\..*") + } + } } versionCatalogs { create("libs") { diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt index 4e7f83da8..641678821 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt @@ -236,11 +236,16 @@ private fun DeviceMetricsChart( /* Series for Left Axis (0-100%) */ lineSeries { series(x = telemetries.map { it.time }, y = telemetries.map { it.deviceMetrics.batteryLevel }) - series(x = telemetries.map { it.time }, y = telemetries.map { it.deviceMetrics.channelUtilization }) - series(x = telemetries.map { it.time }, y = telemetries.map { it.deviceMetrics.airUtilTx }) + val chUtilData = telemetries.filter { !it.deviceMetrics.channelUtilization.isNaN() } + series(x = chUtilData.map { it.time }, y = chUtilData.map { it.deviceMetrics.channelUtilization }) + val airUtilData = telemetries.filter { !it.deviceMetrics.airUtilTx.isNaN() } + series(x = airUtilData.map { it.time }, y = airUtilData.map { it.deviceMetrics.airUtilTx }) } /* Series for Right Axis (Voltage) */ - lineSeries { series(x = telemetries.map { it.time }, y = telemetries.map { it.deviceMetrics.voltage }) } + lineSeries { + val voltageData = telemetries.filter { !it.deviceMetrics.voltage.isNaN() } + series(x = voltageData.map { it.time }, y = voltageData.map { it.deviceMetrics.voltage }) + } } } diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt index 353ad4706..b2cf20c25 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt @@ -134,12 +134,14 @@ fun EnvironmentMetricsChart( /* Pressure on its own layer/axis */ if (shouldPlot[Environment.BAROMETRIC_PRESSURE.ordinal]) { lineSeries { + val pressureData = + telemetries.filter { + val v = Environment.BAROMETRIC_PRESSURE.getValue(it) + v != null && !v.isNaN() + } series( - x = - telemetries.mapNotNull { t -> - Environment.BAROMETRIC_PRESSURE.getValue(t)?.let { t.time } - }, - y = telemetries.mapNotNull { t -> Environment.BAROMETRIC_PRESSURE.getValue(t) }, + x = pressureData.map { it.time }, + y = pressureData.map { Environment.BAROMETRIC_PRESSURE.getValue(it)!! }, ) } } @@ -147,10 +149,12 @@ fun EnvironmentMetricsChart( Environment.entries.forEach { metric -> if (metric != Environment.BAROMETRIC_PRESSURE && shouldPlot[metric.ordinal]) { lineSeries { - series( - x = telemetries.mapNotNull { t -> metric.getValue(t)?.let { t.time } }, - y = telemetries.mapNotNull { t -> metric.getValue(t) }, - ) + val metricData = + telemetries.filter { + val v = metric.getValue(it) + v != null && !v.isNaN() + } + series(x = metricData.map { it.time }, y = metricData.map { metric.getValue(it)!! }) } } } diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt index e82df3f07..717a1dd5e 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt @@ -253,15 +253,17 @@ private fun PowerMetricsChart( LaunchedEffect(telemetries, selectedChannel) { modelProducer.runTransaction { lineSeries { + val currentData = telemetries.filter { !retrieveCurrent(selectedChannel, it).isNaN() } series( - x = telemetries.map { it.time }, - y = telemetries.map { retrieveCurrent(selectedChannel, it) }, + x = currentData.map { it.time }, + y = currentData.map { retrieveCurrent(selectedChannel, it) }, ) } lineSeries { + val voltageData = telemetries.filter { !retrieveVoltage(selectedChannel, it).isNaN() } series( - x = telemetries.map { it.time }, - y = telemetries.map { retrieveVoltage(selectedChannel, it) }, + x = voltageData.map { it.time }, + y = voltageData.map { retrieveVoltage(selectedChannel, it) }, ) } } diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt index 96ebd08fc..eb46e6b57 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt @@ -139,8 +139,14 @@ private fun SignalMetricsChart( LaunchedEffect(meshPackets) { modelProducer.runTransaction { /* Use separate lineSeries calls to associate them with different vertical axes */ - lineSeries { series(x = meshPackets.map { it.rxTime }, y = meshPackets.map { it.rxRssi }) } - lineSeries { series(x = meshPackets.map { it.rxTime }, y = meshPackets.map { it.rxSnr }) } + lineSeries { + val rssiData = meshPackets.filter { it.rxRssi != 0 && !it.rxRssi.toFloat().isNaN() } + series(x = rssiData.map { it.rxTime }, y = rssiData.map { it.rxRssi }) + } + lineSeries { + val snrData = meshPackets.filter { !it.rxSnr.isNaN() } + series(x = snrData.map { it.rxTime }, y = snrData.map { it.rxSnr }) + } } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 9edbadb3e..9a7d63cd8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -62,7 +62,12 @@ dependencyResolutionManagement { mavenLocal() google() mavenCentral() - maven { url = uri("https://jitpack.io") } + maven { + url = uri("https://jitpack.io") + content { + includeGroupByRegex("com\\.github\\..*") + } + } } }