feat(serial): send heartbeat to keep connection alive

closes #456
pull/1447/head
andrekir 2024-12-14 05:59:41 -03:00
rodzic 22fafe8033
commit 193ee727b5
1 zmienionych plików z 18 dodań i 1 usunięć

Wyświetl plik

@ -23,6 +23,7 @@ import androidx.core.content.edit
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.coroutineScope import androidx.lifecycle.coroutineScope
import com.geeksville.mesh.CoroutineDispatchers import com.geeksville.mesh.CoroutineDispatchers
import com.geeksville.mesh.MeshProtos
import com.geeksville.mesh.android.BinaryLogFile import com.geeksville.mesh.android.BinaryLogFile
import com.geeksville.mesh.android.BuildUtils import com.geeksville.mesh.android.BuildUtils
import com.geeksville.mesh.android.GeeksvilleApplication import com.geeksville.mesh.android.GeeksvilleApplication
@ -110,8 +111,20 @@ class RadioInterfaceService @Inject constructor(
}.launchIn(processLifecycle.coroutineScope) }.launchIn(processLifecycle.coroutineScope)
} }
companion object : Logging { companion object {
const val DEVADDR_KEY = "devAddr2" // the new name for devaddr const val DEVADDR_KEY = "devAddr2" // the new name for devaddr
private const val HEARTBEAT_INTERVAL_MILLIS = 5 * 60 * 1000L
}
private var lastHeartbeatMillis = 0L
private fun keepAlive(now: Long) {
if (now - lastHeartbeatMillis > HEARTBEAT_INTERVAL_MILLIS) {
info("Sending ToRadio heartbeat")
val heartbeat = MeshProtos.ToRadio.newBuilder()
.setHeartbeat(MeshProtos.Heartbeat.getDefaultInstance()).build()
handleSendToRadio(heartbeat.toByteArray())
lastHeartbeatMillis = now
}
} }
/** /**
@ -184,6 +197,10 @@ class RadioInterfaceService @Inject constructor(
receivedPacketsLog.flush() receivedPacketsLog.flush()
} }
if (radioIf is SerialInterface) {
keepAlive(System.currentTimeMillis())
}
// ignoreException { debug("FromRadio: ${MeshProtos.FromRadio.parseFrom(p)}") } // ignoreException { debug("FromRadio: ${MeshProtos.FromRadio.parseFrom(p)}") }
processLifecycle.coroutineScope.launch(dispatchers.io) { processLifecycle.coroutineScope.launch(dispatchers.io) {