From 22671a73db7c4fe8d257610ef468fbbd0fd890a4 Mon Sep 17 00:00:00 2001 From: andrekir Date: Wed, 12 Oct 2022 23:40:54 -0300 Subject: [PATCH] detect UUID to warn firmware is too old --- .../main/java/com/geeksville/mesh/MainActivity.kt | 4 ++++ .../mesh/repository/radio/BluetoothInterface.kt | 13 ++++++++++++- .../java/com/geeksville/mesh/service/MeshService.kt | 3 +++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt index 0ec7b571..8d728cd3 100644 --- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt +++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt @@ -40,6 +40,7 @@ import com.geeksville.mesh.model.BluetoothViewModel import com.geeksville.mesh.model.ChannelSet import com.geeksville.mesh.model.DeviceVersion import com.geeksville.mesh.model.UIViewModel +import com.geeksville.mesh.repository.radio.BluetoothInterface import com.geeksville.mesh.repository.radio.RadioInterfaceService import com.geeksville.mesh.repository.radio.SerialInterface import com.geeksville.mesh.service.* @@ -416,6 +417,7 @@ class MainActivity : BaseActivity(), Logging { /** Show an alert that may contain HTML */ private fun showAlert(titleText: Int, messageText: Int) { + // make links clickable per https://stackoverflow.com/a/62642807 // val messageStr = getText(messageText) @@ -476,6 +478,8 @@ class MainActivity : BaseActivity(), Logging { } } } + } else if (BluetoothInterface.invalidVersion) { + showAlert(R.string.firmware_too_old, R.string.firmware_old) } } catch (ex: RemoteException) { warn("Abandoning connect $ex, because we probably just lost device connection") diff --git a/app/src/main/java/com/geeksville/mesh/repository/radio/BluetoothInterface.kt b/app/src/main/java/com/geeksville/mesh/repository/radio/BluetoothInterface.kt index d77dab87..9d57100c 100644 --- a/app/src/main/java/com/geeksville/mesh/repository/radio/BluetoothInterface.kt +++ b/app/src/main/java/com/geeksville/mesh/repository/radio/BluetoothInterface.kt @@ -99,6 +99,10 @@ class BluetoothInterface( /// this service UUID is publically visible for scanning val BTM_SERVICE_UUID: UUID = UUID.fromString("6ba1b218-15a8-461f-9fa8-5dcae273eafd") + var invalidVersion = false + val EOL_FROMRADIO_CHARACTER: UUID = + UUID.fromString("8ba2bcc2-ee02-4a55-a531-c525c5e454d5") + val BTM_FROMRADIO_CHARACTER: UUID = UUID.fromString("2c55e69e-4993-11ed-b878-0242ac120002") val BTM_TORADIO_CHARACTER: UUID = @@ -149,6 +153,7 @@ class BluetoothInterface( ?: throw RadioNotConnectedException("BLE service not found") private lateinit var fromNum: BluetoothGattCharacteristic + private lateinit var fromRadio: BluetoothGattCharacteristic /** * With the new rev2 api, our first send is to start the configure readbacks. In that case, @@ -228,7 +233,6 @@ class BluetoothInterface( /// Attempt to read from the fromRadio mailbox, if data is found broadcast it to android apps private fun doReadFromRadio(firstRead: Boolean) { safe?.let { s -> - val fromRadio = getCharacteristic(BTM_FROMRADIO_CHARACTER) s.asyncReadCharacteristic(fromRadio) { try { val b = it.getOrThrow() @@ -357,6 +361,13 @@ class BluetoothInterface( fromNum = getCharacteristic(BTM_FROMNUM_CHARACTER) + // We changed UUIDs to be able to identify old firmware (<1.3.43) + fromRadio = if (bservice.characteristics.map { it.uuid } + .contains(EOL_FROMRADIO_CHARACTER)) { + invalidVersion = true + getCharacteristic(EOL_FROMRADIO_CHARACTER) + } else getCharacteristic(BTM_FROMRADIO_CHARACTER) + // We treat the first send by a client as special isFirstSend = true 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 dbb34d82..66de2ef5 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -1391,6 +1391,9 @@ class MeshService : Service(), Logging { configNonce += 1 newNodes.clear() newMyNodeInfo = null + + if (BluetoothInterface.invalidVersion) onHasSettings() // Device firmware is too old + debug("Starting config nonce=$configNonce") sendToRadio(ToRadio.newBuilder().apply {