From eb80d419eb6bbbcaa56c49d934975334cc66d3f6 Mon Sep 17 00:00:00 2001 From: andrekir Date: Wed, 23 Oct 2024 18:05:26 -0300 Subject: [PATCH] refactor(logs): add optional `portNum` parameter to `getMeshPacketsFrom` --- .../mesh/database/MeshLogRepository.kt | 19 +++++++++++-------- .../mesh/database/dao/MeshLogDao.kt | 6 +++++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/database/MeshLogRepository.kt b/app/src/main/java/com/geeksville/mesh/database/MeshLogRepository.kt index b78ff9164..6c5fa3c70 100644 --- a/app/src/main/java/com/geeksville/mesh/database/MeshLogRepository.kt +++ b/app/src/main/java/com/geeksville/mesh/database/MeshLogRepository.kt @@ -30,9 +30,6 @@ class MeshLogRepository @Inject constructor(private val meshLogDaoLazy: dagger.L private fun parseTelemetryLog(log: MeshLog): Telemetry? = runCatching { Telemetry.parseFrom(log.fromRadio.packet.decoded.payload) }.getOrNull() - private fun parseMeshPacket(log: MeshLog): MeshPacket? = - runCatching { log.meshPacket }.getOrNull() - @OptIn(ExperimentalCoroutinesApi::class) fun getTelemetryFrom(nodeNum: Int): Flow> = meshLogDao.getLogsFrom(nodeNum, Portnums.PortNum.TELEMETRY_APP_VALUE, MAX_MESH_PACKETS) @@ -40,12 +37,18 @@ class MeshLogRepository @Inject constructor(private val meshLogDaoLazy: dagger.L .mapLatest { list -> list.mapNotNull(::parseTelemetryLog) } .flowOn(Dispatchers.IO) + /* + * Retrieves MeshPackets matching 'nodeNum' and 'portNum'. + * If 'portNum' is not specified, returns all MeshPackets. Otherwise, filters by 'portNum'. + */ @OptIn(ExperimentalCoroutinesApi::class) - fun getMeshPacketsFrom(nodeNum: Int): Flow> = - meshLogDao.getLogsFrom(nodeNum, Portnums.PortNum.TELEMETRY_APP_VALUE, MAX_MESH_PACKETS) - .distinctUntilChanged() - .mapLatest { list -> list.mapNotNull(::parseMeshPacket) } - .flowOn(Dispatchers.IO) + fun getMeshPacketsFrom( + nodeNum: Int, + portNum: Int = Portnums.PortNum.UNKNOWN_APP_VALUE, + ): Flow> = meshLogDao.getLogsFrom(nodeNum, portNum, MAX_MESH_PACKETS) + .distinctUntilChanged() + .mapLatest { list -> list.map { it.fromRadio.packet } } + .flowOn(Dispatchers.IO) suspend fun insert(log: MeshLog) = withContext(Dispatchers.IO) { meshLogDao.insert(log) diff --git a/app/src/main/java/com/geeksville/mesh/database/dao/MeshLogDao.kt b/app/src/main/java/com/geeksville/mesh/database/dao/MeshLogDao.kt index 2ad412e75..6a2f70dcb 100644 --- a/app/src/main/java/com/geeksville/mesh/database/dao/MeshLogDao.kt +++ b/app/src/main/java/com/geeksville/mesh/database/dao/MeshLogDao.kt @@ -15,10 +15,14 @@ interface MeshLogDao { @Query("SELECT * FROM log ORDER BY received_date ASC LIMIT 0,:maxItem") fun getAllLogsInReceiveOrder(maxItem: Int): Flow> + /* + * Retrieves MeshPackets matching 'from_num' (nodeNum) and 'port_num' (PortNum). + * If 'portNum' is 0, returns all MeshPackets. Otherwise, filters by 'port_num'. + */ @Query( """ SELECT * FROM log - WHERE from_num = :fromNum AND port_num = :portNum + WHERE from_num = :fromNum AND (:portNum = 0 AND port_num != 0 OR port_num = :portNum) ORDER BY received_date DESC LIMIT 0,:maxItem """ )