From 8d22a23fe1c679aea058151f6fdc6bc2c2844a42 Mon Sep 17 00:00:00 2001 From: andrekir Date: Thu, 12 Oct 2023 22:52:54 -0300 Subject: [PATCH] feat: warn user when duty cycle limit reached closes #540 --- .../main/java/com/geeksville/mesh/MainActivity.kt | 1 + .../main/java/com/geeksville/mesh/model/UIState.kt | 6 ++++++ .../mesh/repository/radio/RadioInterfaceService.kt | 12 ++++++++++++ .../java/com/geeksville/mesh/service/MeshService.kt | 10 +++++++--- app/src/main/res/values/strings.xml | 1 + 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt index 8bfb13b52..45792d499 100644 --- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt +++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt @@ -334,6 +334,7 @@ class MainActivity : AppCompatActivity(), Logging { // val messageStr = getText(messageText) val builder = MaterialAlertDialogBuilder(this) + .setCancelable(false) .setTitle(titleText) .setMessage(messageText) .setPositiveButton(R.string.okay) { _, _ -> diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt index 43ccb9557..15ade7f89 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -34,6 +34,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.launchIn @@ -143,6 +144,11 @@ class UIViewModel @Inject constructor( private val requestIds = MutableStateFlow>(hashMapOf()) init { + radioInterfaceService.errorMessage.filterNotNull().onEach { + _snackbarText.value = it + radioInterfaceService.clearErrorMessage() + }.launchIn(viewModelScope) + radioConfigRepository.nodeInfoFlow().onEach(nodeDB::setNodes) .launchIn(viewModelScope) diff --git a/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt b/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt index 94b95b1da..e2d0919dc 100644 --- a/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt +++ b/app/src/main/java/com/geeksville/mesh/repository/radio/RadioInterfaceService.kt @@ -55,6 +55,18 @@ class RadioInterfaceService @Inject constructor( private val _receivedData = MutableSharedFlow() val receivedData: SharedFlow = _receivedData + private val _errorMessage = MutableStateFlow(null) + val errorMessage: SharedFlow = _errorMessage + + fun setErrorMessage(text: String) { + errormsg(text) + _errorMessage.value = text + } + + fun clearErrorMessage() { + _errorMessage.value = null + } + private val logSends = false private val logReceives = false private lateinit var sentPacketsLog: BinaryLogFile // inited in onCreate 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 55987aeeb..9883e647c 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -664,12 +664,16 @@ class MeshService : Service(), Logging { handleReceivedTelemetry(packet.from, u, dataPacket.time) } - // Handle new style routing info Portnums.PortNum.ROUTING_APP_VALUE -> { - shouldBroadcast = - true // We always send acks to other apps, because they might care about the messages they sent + // We always send ACKs to other apps, because they might care about the messages they sent + shouldBroadcast = true val u = MeshProtos.Routing.parseFrom(data.payload) val isAck = u.errorReasonValue == MeshProtos.Routing.Error.NONE_VALUE + + if (u.errorReason == MeshProtos.Routing.Error.DUTY_CYCLE_LIMIT) { + radioInterfaceService.setErrorMessage(getString(R.string.error_duty_cycle)) + } + handleAckNak(isAck, fromId, data.requestId) queueResponse.remove(data.requestId)?.complete(true) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2a86e4708..5cb7f18a3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -181,4 +181,5 @@ Delete waypoint? New waypoint Received waypoint: %s + Duty Cycle limit reached. Cannot send messages right now, please try again later.