Fix group monitoring: per-group 15s idle timeout, drop priority lock
This commit is contained in:
@@ -77,9 +77,13 @@ class MainActivity : Activity(), SvxService.Listener {
|
||||
private var connected = false
|
||||
private var monitoring = false
|
||||
private var connectedSettings: ConnectionSettings? = null
|
||||
private var priorityActive = false
|
||||
private var settings: ConnectionSettings = ConnectionSettings("", 5300, "", "", 11)
|
||||
|
||||
// Динамический мониторинг: если на группе нет голоса 15 секунд,
|
||||
// возвращаемся к мониторингу всех групп (базовая группа).
|
||||
private val MONITOR_IDLE_MS = 15_000L
|
||||
private var monitorIdleTask: Runnable? = null
|
||||
|
||||
private var svc: SvxService? = null
|
||||
private val svcConn = object : ServiceConnection {
|
||||
override fun onServiceConnected(name: ComponentName, binder: IBinder) {
|
||||
@@ -259,7 +263,6 @@ class MainActivity : Activity(), SvxService.Listener {
|
||||
if (prev != settings && connectedSettings != null) {
|
||||
if (settings.host.isBlank() || settings.callsign.isBlank()) {
|
||||
monitoring = false
|
||||
priorityActive = false
|
||||
updateMonitorButton()
|
||||
updatePttEnabled()
|
||||
svc?.disconnect()
|
||||
@@ -397,20 +400,13 @@ class MainActivity : Activity(), SvxService.Listener {
|
||||
while (talkLog.size > TALK_LOG_MAX) {
|
||||
talkLog.removeFirst()
|
||||
}
|
||||
val priority = monitoring && settings.groups.firstOrNull() == tg
|
||||
if (priority) {
|
||||
priorityActive = true
|
||||
}
|
||||
if (priority || !priorityActive) {
|
||||
// Мониторинг: переключаемся на группу, где началась передача,
|
||||
// и даём ей 15 секунд; после тишины вернёмся ко всем группам.
|
||||
if (monitoring) {
|
||||
svc?.selectGroup(tg)
|
||||
lblTalkerTitle.text = when {
|
||||
priority -> getString(R.string.talker_mon_priority, callsign, tg)
|
||||
monitoring -> getString(R.string.talker_mon, callsign, tg)
|
||||
else -> getString(R.string.talker_now, callsign)
|
||||
}
|
||||
lblTalkerTitle.setTextColor(
|
||||
if (priority) getColor(R.color.danger) else getColor(R.color.text_secondary)
|
||||
)
|
||||
resetMonitorIdle()
|
||||
lblTalkerTitle.text = getString(R.string.talker_mon, callsign, tg)
|
||||
lblTalkerTitle.setTextColor(getColor(R.color.text_secondary))
|
||||
lblTalker.text = callsign
|
||||
}
|
||||
}
|
||||
@@ -418,11 +414,6 @@ class MainActivity : Activity(), SvxService.Listener {
|
||||
|
||||
override fun onTalkerStop(tg: Long, callsign: String) {
|
||||
// последний говоривший остаётся на экране
|
||||
mainHandler.post {
|
||||
if (monitoring && settings.groups.firstOrNull() == tg) {
|
||||
priorityActive = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onNodeJoined(callsign: String, tg: Long?) {
|
||||
@@ -484,10 +475,26 @@ class MainActivity : Activity(), SvxService.Listener {
|
||||
micMeter.setLevel(level)
|
||||
} else { // SRC_SPEAKER
|
||||
rxMeter.setLevel(level)
|
||||
// Голос на текущей группе — откладываем возврат ко всем группам
|
||||
if (monitoring && connected && level > 0.03f) {
|
||||
resetMonitorIdle()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Сбросить таймер молчания: группа жива — продолжаем её слушать. */
|
||||
private fun resetMonitorIdle() {
|
||||
monitorIdleTask?.let { mainHandler.removeCallbacks(it) }
|
||||
val task = Runnable {
|
||||
if (monitoring && connected) {
|
||||
svc?.selectGroup(settings.talkGroup)
|
||||
}
|
||||
}
|
||||
monitorIdleTask = task
|
||||
mainHandler.postDelayed(task, MONITOR_IDLE_MS)
|
||||
}
|
||||
|
||||
override fun onError(detail: String) {
|
||||
mainHandler.post {
|
||||
toast(detail)
|
||||
@@ -537,7 +544,6 @@ class MainActivity : Activity(), SvxService.Listener {
|
||||
showToast(R.string.monitor_off)
|
||||
}
|
||||
monitoring = enabling
|
||||
priorityActive = false
|
||||
updateMonitorButton()
|
||||
updatePttEnabled()
|
||||
if (connected) {
|
||||
@@ -578,7 +584,6 @@ class MainActivity : Activity(), SvxService.Listener {
|
||||
Prefs.setActiveProfile(this, which)
|
||||
settings = Prefs.load(this)
|
||||
monitoring = false
|
||||
priorityActive = false
|
||||
updateMonitorButton()
|
||||
updatePttEnabled()
|
||||
refreshUi()
|
||||
@@ -615,6 +620,8 @@ class MainActivity : Activity(), SvxService.Listener {
|
||||
svc?.selectGroup(tg)
|
||||
if (!monitoring) {
|
||||
svc?.setMonitorTgs(listOf(tg))
|
||||
} else {
|
||||
resetMonitorIdle()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -410,7 +410,10 @@ class ReflectorClient(
|
||||
sendTcp(socket, MsgBuilder.selectTg(s.talkGroup))
|
||||
sendTcp(socket, MsgBuilder.tgMonitor(listOf(s.talkGroup)))
|
||||
} else {
|
||||
sendTcp(socket, MsgBuilder.selectTg(monitor.first()))
|
||||
// Мониторинг: сидим на базовой группе и слушаем
|
||||
// уведомления обо всех группах (аудио идёт только
|
||||
// с выбранной, поэтому переключение — в MainActivity).
|
||||
sendTcp(socket, MsgBuilder.selectTg(s.talkGroup))
|
||||
sendTcp(socket, MsgBuilder.tgMonitor(monitor))
|
||||
}
|
||||
openUdp(s)
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
<string name="btn_monitor_on">Мониторинг групп включен (нажмите, чтобы выключить)</string>
|
||||
<string name="status_monitoring">Мониторинг: %1$s</string>
|
||||
<string name="talker_mon">Говорит: %1$s · TG%2$d</string>
|
||||
<string name="talker_mon_priority">ПРИОРИТЕТ: %1$s · TG%2$d</string>
|
||||
<string name="status_big_disconnected">DISCONNECTED</string>
|
||||
<string name="status_big_connected">CONNECTED</string>
|
||||
<string name="status_big_talking">ПЕРЕДАЧА</string>
|
||||
|
||||
Reference in New Issue
Block a user