From 05b88e617c35753612adc959c990521edd16bc25 Mon Sep 17 00:00:00 2001 From: andrekir Date: Sun, 18 Feb 2024 07:37:18 -0300 Subject: [PATCH] feat: add basic `StoreAndForward` handling --- .../geeksville/mesh/service/MeshService.kt | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) 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 49fc22073..2b3dec165 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -678,6 +678,12 @@ class MeshService : Service(), Logging { shouldBroadcast = false } + Portnums.PortNum.STORE_FORWARD_APP_VALUE -> { + val u = StoreAndForwardProtos.StoreAndForward.parseFrom(data.payload) + handleReceivedStoreAndForward(dataPacket, u) + shouldBroadcast = false + } + Portnums.PortNum.RANGE_TEST_APP_VALUE -> { if (!moduleConfig.rangeTest.enabled) return val u = dataPacket.copy(dataType = Portnums.PortNum.TEXT_MESSAGE_APP_VALUE) @@ -791,6 +797,46 @@ class MeshService : Service(), Logging { } } + private fun handleReceivedStoreAndForward( + dataPacket: DataPacket, + s: StoreAndForwardProtos.StoreAndForward, + ) { + debug("StoreAndForward: ${s.variantCase} ${s.rr} from ${dataPacket.from}") + when (s.variantCase) { + StoreAndForwardProtos.StoreAndForward.VariantCase.STATS -> { + val u = dataPacket.copy( + bytes = s.stats.toString().encodeToByteArray(), + dataType = Portnums.PortNum.TEXT_MESSAGE_APP_VALUE + ) + rememberDataPacket(u) + } + + StoreAndForwardProtos.StoreAndForward.VariantCase.HISTORY -> { + val text = """ + Total messages: ${s.history.historyMessages} + History window: ${s.history.window / 60000} min + Last request: ${s.history.lastRequest} + """.trimIndent() + val u = dataPacket.copy( + bytes = text.encodeToByteArray(), + dataType = Portnums.PortNum.TEXT_MESSAGE_APP_VALUE + ) + rememberDataPacket(u) + } + + StoreAndForwardProtos.StoreAndForward.VariantCase.TEXT -> { + if (s.rr == StoreAndForwardProtos.StoreAndForward.RequestResponse.ROUTER_TEXT_BROADCAST) { + dataPacket.to = DataPacket.ID_BROADCAST + } + val u = dataPacket.copy(dataType = Portnums.PortNum.TEXT_MESSAGE_APP_VALUE) + rememberDataPacket(u) + updateMessageNotification(u) + } + + else -> {} + } + } + /// Update our model and resend as needed for a MeshPacket we just received from the radio private fun handleReceivedMeshPacket(packet: MeshPacket) { if (haveNodeDB) {