diff --git a/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt b/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt index 9775bb0db..7f0f54d9f 100644 --- a/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt +++ b/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt @@ -34,6 +34,10 @@ class PacketRepository @Inject constructor(private val packetDaoLazy: dagger.Laz packetDao.updateMessageStatus(d, m) } + suspend fun updateMessageId(d: DataPacket, id: Int) = withContext(Dispatchers.IO) { + packetDao.updateMessageId(d, id) + } + suspend fun getDataPacketById(requestId: Int) = withContext(Dispatchers.IO) { packetDao.getDataPacketById(requestId) } diff --git a/app/src/main/java/com/geeksville/mesh/database/dao/PacketDao.kt b/app/src/main/java/com/geeksville/mesh/database/dao/PacketDao.kt index 9c166c024..979b699ea 100644 --- a/app/src/main/java/com/geeksville/mesh/database/dao/PacketDao.kt +++ b/app/src/main/java/com/geeksville/mesh/database/dao/PacketDao.kt @@ -48,6 +48,12 @@ interface PacketDao { findDataPacket(data)?.let { update(it.copy(data = new)) } } + @Transaction + fun updateMessageId(data: DataPacket, id: Int) { + val new = data.copy(id = id) + findDataPacket(data)?.let { update(it.copy(data = new)) } + } + @Query("Select data from packet order by received_time asc") fun getDataPackets(): List 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 e82f78083..d327586eb 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -850,6 +850,13 @@ class MeshService : Service(), Logging { private fun processQueuedPackets() = serviceScope.handledLaunch { packetRepository.get().getQueuedPackets()?.forEach { p -> + // check for duplicate packet IDs before sending (so ACK/NAK updates can work) + if (getDataPacketById(p.id)?.time != p.time) { + val newId = generatePacketId() + debug("Replaced duplicate packet ID in queue: ${p.id}, with: $newId") + packetRepository.get().updateMessageId(p, newId) + p.id = newId + } try { sendNow(p) } catch (ex: Exception) {