From 8a065c5b885f83acf90e5922158938886d8b394b Mon Sep 17 00:00:00 2001 From: Vadim Furman Date: Fri, 12 Feb 2021 19:07:14 -0800 Subject: [PATCH] Per-channel minimum broadcast period enforcement --- .../geeksville/mesh/model/ChannelOption.kt | 10 ++++----- .../geeksville/mesh/ui/SettingsFragment.kt | 21 +++++++++++++------ app/src/main/res/values/strings.xml | 1 + 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/model/ChannelOption.kt b/app/src/main/java/com/geeksville/mesh/model/ChannelOption.kt index 2ceae83ea..0f0e929e3 100644 --- a/app/src/main/java/com/geeksville/mesh/model/ChannelOption.kt +++ b/app/src/main/java/com/geeksville/mesh/model/ChannelOption.kt @@ -3,11 +3,11 @@ package com.geeksville.mesh.model import com.geeksville.mesh.MeshProtos import com.geeksville.mesh.R -enum class ChannelOption(val modemConfig: MeshProtos.ChannelSettings.ModemConfig, val configRes: Int) { - SHORT(MeshProtos.ChannelSettings.ModemConfig.Bw500Cr45Sf128, R.string.modem_config_short), - MEDIUM(MeshProtos.ChannelSettings.ModemConfig.Bw125Cr45Sf128, R.string.modem_config_medium), - LONG(MeshProtos.ChannelSettings.ModemConfig.Bw31_25Cr48Sf512, R.string.modem_config_long), - VERY_LONG(MeshProtos.ChannelSettings.ModemConfig.Bw125Cr48Sf4096, R.string.modem_config_very_long); +enum class ChannelOption(val modemConfig: MeshProtos.ChannelSettings.ModemConfig, val configRes: Int, val minBroadcastPeriodSecs: Int) { + SHORT(MeshProtos.ChannelSettings.ModemConfig.Bw500Cr45Sf128, R.string.modem_config_short, 3), + MEDIUM(MeshProtos.ChannelSettings.ModemConfig.Bw125Cr45Sf128, R.string.modem_config_medium, 12), + LONG(MeshProtos.ChannelSettings.ModemConfig.Bw31_25Cr48Sf512, R.string.modem_config_long, 240), + VERY_LONG(MeshProtos.ChannelSettings.ModemConfig.Bw125Cr48Sf4096, R.string.modem_config_very_long, 375); companion object { fun fromConfig(modemConfig: MeshProtos.ChannelSettings.ModemConfig?): ChannelOption? { diff --git a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt index a582d3c5c..5d9ed9610 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -30,11 +30,11 @@ import com.geeksville.android.Logging import com.geeksville.android.hideKeyboard import com.geeksville.android.isGooglePlayAvailable import com.geeksville.mesh.MainActivity -import com.geeksville.mesh.MeshProtos import com.geeksville.mesh.R import com.geeksville.mesh.android.bluetoothManager import com.geeksville.mesh.android.usbManager import com.geeksville.mesh.databinding.SettingsFragmentBinding +import com.geeksville.mesh.model.ChannelOption import com.geeksville.mesh.model.UIViewModel import com.geeksville.mesh.service.BluetoothInterface import com.geeksville.mesh.service.MeshService @@ -620,13 +620,22 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { } binding.positionBroadcastPeriodEditText.on(EditorInfo.IME_ACTION_DONE) { - val str = binding.positionBroadcastPeriodEditText.text.toString() - val n = str.toIntOrNull() - if (n != null && n <= MAX_INT_DEVICE && n >= 0) { - model.positionBroadcastSecs = n + val textEdit = binding.positionBroadcastPeriodEditText + val n = textEdit.text.toString().toIntOrNull() + val minBroadcastPeriodSecs = + ChannelOption.fromConfig(model.radioConfig.value?.channelSettings?.modemConfig)?.minBroadcastPeriodSecs + ?: 9000 + info("edit broadcast $n min $minBroadcastPeriodSecs") + if (n != null && n >= 0 && n >= minBroadcastPeriodSecs) { + model.positionBroadcastSecs = n } else { - binding.scanStatusText.text = "Bad value: $str" + // restore the value in the edit field + textEdit.setText(model.positionBroadcastSecs.toString()) + val errorText = if (n == null || n <= 0) "Bad value: ${textEdit.text.toString()}" else + getString(R.string.broadcast_period_too_small).format(minBroadcastPeriodSecs) + Toast.makeText(context, errorText, Toast.LENGTH_LONG).show() } + requireActivity().hideKeyboard() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index de41846ff..af0fa2bca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -86,4 +86,5 @@ Broadcast position period (in seconds), 0 - disable Device sleep period (in seconds) Notifications about messages + Minimum broadcast period for this channel is %d