From da95b4f0c2307e4d2cd77ce9032744cca4c3059a Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Wed, 3 Mar 2021 07:30:05 +0800 Subject: [PATCH] basic settings and channel stuff works for android --- .../geeksville/mesh/service/MeshService.kt | 104 +++++++++--------- 1 file changed, 51 insertions(+), 53 deletions(-) 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 4271b6389..fa4008e0e 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -111,7 +111,10 @@ class MeshService : Service(), Logging { private val serviceJob = Job() private val serviceScope = CoroutineScope(Dispatchers.IO + serviceJob) private var connectionState = ConnectionState.DISCONNECTED + + /// A database of received packets - used only for debug log private var packetRepo: PacketRepository? = null + private var fusedLocationClient: FusedLocationProviderClient? = null // If we've ever read a valid region code from our device it will be here @@ -588,12 +591,14 @@ class MeshService : Service(), Logging { * Helper to make it easy to build a subpacket in the proper protobufs */ private fun MeshProtos.MeshPacket.Builder.buildAdminPacket( + wantResponse: Boolean = false, initFn: AdminProtos.AdminMessage.Builder.() -> Unit ): MeshPacket = buildMeshPacket( wantAck = true, priority = MeshPacket.Priority.RELIABLE ) { + this.wantResponse = wantResponse portnumValue = Portnums.PortNum.ADMIN_APP_VALUE payload = AdminProtos.AdminMessage.newBuilder().also { initFn(it) @@ -684,47 +689,42 @@ class MeshService : Service(), Logging { if (dataPacket != null) { - if (myInfo.myNodeNum == packet.from) { - // Handle position updates from the device - if (data.portnumValue == Portnums.PortNum.POSITION_APP_VALUE) { - handleReceivedPosition( - packet.from, - MeshProtos.Position.parseFrom(data.payload), - dataPacket.time - ) - } else - debug("Ignoring packet sent from our node, portnum=${data.portnumValue} ${bytes.size} bytes") - } else { - debug("Received data from $fromId, portnum=${data.portnumValue} ${bytes.size} bytes") + // We ignore most messages that we sent + val fromUs = myInfo.myNodeNum == packet.from - dataPacket.status = MessageStatus.RECEIVED - rememberDataPacket(dataPacket) + debug("Received data from $fromId, portnum=${data.portnum} ${bytes.size} bytes") - // if (p.hasUser()) handleReceivedUser(fromNum, p.user) + dataPacket.status = MessageStatus.RECEIVED + rememberDataPacket(dataPacket) - /// We tell other apps about most message types, but some may have sensitve data, so that is not shared' - var shouldBroadcast = true + // if (p.hasUser()) handleReceivedUser(fromNum, p.user) - when (data.portnumValue) { - Portnums.PortNum.TEXT_MESSAGE_APP_VALUE -> { + /// We tell other apps about most message types, but some may have sensitve data, so that is not shared' + var shouldBroadcast = !fromUs + + when (data.portnumValue) { + Portnums.PortNum.TEXT_MESSAGE_APP_VALUE -> + if (!fromUs) { debug("Received CLEAR_TEXT from $fromId") updateMessageNotification(dataPacket) } - // Handle new style position info - Portnums.PortNum.POSITION_APP_VALUE -> { - val u = MeshProtos.Position.parseFrom(data.payload) - handleReceivedPosition(packet.from, u, dataPacket.time) - } + // Handle new style position info + Portnums.PortNum.POSITION_APP_VALUE -> { + val u = MeshProtos.Position.parseFrom(data.payload) + handleReceivedPosition(packet.from, u, dataPacket.time) + } - // Handle new style user info - Portnums.PortNum.NODEINFO_APP_VALUE -> { + // Handle new style user info + Portnums.PortNum.NODEINFO_APP_VALUE -> + if (!fromUs) { val u = MeshProtos.User.parseFrom(data.payload) handleReceivedUser(packet.from, u) } - // Handle new style routing info - Portnums.PortNum.ROUTING_APP_VALUE -> { + // Handle new style routing info + Portnums.PortNum.ROUTING_APP_VALUE -> + if (!fromUs) { val u = MeshProtos.Routing.parseFrom(data.payload) if (u.errorReasonValue == MeshProtos.Routing.Error.NONE_VALUE) handleAckNak(true, data.requestId) @@ -732,31 +732,30 @@ class MeshService : Service(), Logging { handleAckNak(false, data.requestId) } - Portnums.PortNum.ADMIN_APP_VALUE -> { - val u = AdminProtos.AdminMessage.parseFrom(data.payload) - handleReceivedAdmin(packet.from, u) - shouldBroadcast = false - } - - else -> - debug("No custom processing needed for ${data.portnumValue}") + Portnums.PortNum.ADMIN_APP_VALUE -> { + val u = AdminProtos.AdminMessage.parseFrom(data.payload) + handleReceivedAdmin(packet.from, u) + shouldBroadcast = false } - // We always tell other apps when new data packets arrive - if (shouldBroadcast) - serviceBroadcasts.broadcastReceivedData(dataPacket) - - GeeksvilleApplication.analytics.track( - "num_data_receive", - DataPair(1) - ) - - GeeksvilleApplication.analytics.track( - "data_receive", - DataPair("num_bytes", bytes.size), - DataPair("type", data.portnumValue) - ) + else -> + debug("No custom processing needed for ${data.portnumValue}") } + + // We always tell other apps when new data packets arrive + if (shouldBroadcast) + serviceBroadcasts.broadcastReceivedData(dataPacket) + + GeeksvilleApplication.analytics.track( + "num_data_receive", + DataPair(1) + ) + + GeeksvilleApplication.analytics.track( + "data_receive", + DataPair("num_bytes", bytes.size), + DataPair("type", data.portnumValue) + ) } } } @@ -1361,20 +1360,19 @@ class MeshService : Service(), Logging { haveNodeDB = true // we now have nodes from real hardware requestRadioConfig() - requestChannel(0) } } else warn("Ignoring stale config complete") } private fun requestRadioConfig() { - sendToRadio(newMeshPacketTo(myNodeNum).buildAdminPacket { + sendToRadio(newMeshPacketTo(myNodeNum).buildAdminPacket(wantResponse = true) { getRadioRequest = true }) } private fun requestChannel(channelIndex: Int) { - sendToRadio(newMeshPacketTo(myNodeNum).buildAdminPacket { + sendToRadio(newMeshPacketTo(myNodeNum).buildAdminPacket(wantResponse = true) { getChannelRequest = channelIndex + 1 }) }