diff --git a/app/src/main/java/ru/ua1zbe/svxremote/MainActivity.kt b/app/src/main/java/ru/ua1zbe/svxremote/MainActivity.kt index fd07915..552a0d9 100644 --- a/app/src/main/java/ru/ua1zbe/svxremote/MainActivity.kt +++ b/app/src/main/java/ru/ua1zbe/svxremote/MainActivity.kt @@ -96,20 +96,18 @@ class MainActivity : Activity(), SvxService.Listener { // ---------- APRS метеостанции (экспериментально) ---------- private var aprsMeteo: AprsMeteo? = null private var lastMeteo: String? = null - private var lastAprsCall = "" private var lastAprsCoords = "" private fun startAprsMeteo() { aprsMeteo?.stop() aprsMeteo = null - val call = Prefs.aprsCallsign(this).trim() - if (call.isEmpty()) return val coords = Prefs.aprsCoords(this) .split(',') .mapNotNull { it.trim().toDoubleOrNull() } .take(2) .let { if (it.size == 2) it[0] to it[1] else null } - aprsMeteo = AprsMeteo(call, coords) { wx -> + if (coords == null) return + aprsMeteo = AprsMeteo(coords) { wx -> lastMeteo = wx lblSubtitle.text = wx }.also { it.start() } @@ -224,7 +222,6 @@ class MainActivity : Activity(), SvxService.Listener { refreshUi() startAprsMeteo() - lastAprsCall = Prefs.aprsCallsign(this).trim() lastAprsCoords = Prefs.aprsCoords(this).trim() } @@ -249,10 +246,8 @@ class MainActivity : Activity(), SvxService.Listener { } } refreshUi() - val aprsCall = Prefs.aprsCallsign(this).trim() val aprsCoords = Prefs.aprsCoords(this).trim() - if (aprsCall != lastAprsCall || aprsCoords != lastAprsCoords) { - lastAprsCall = aprsCall + if (aprsCoords != lastAprsCoords) { lastAprsCoords = aprsCoords startAprsMeteo() } diff --git a/app/src/main/java/ru/ua1zbe/svxremote/SettingsActivity.kt b/app/src/main/java/ru/ua1zbe/svxremote/SettingsActivity.kt index 985f3be..4300420 100644 --- a/app/src/main/java/ru/ua1zbe/svxremote/SettingsActivity.kt +++ b/app/src/main/java/ru/ua1zbe/svxremote/SettingsActivity.kt @@ -23,7 +23,6 @@ class SettingsActivity : Activity() { private lateinit var inputAuthKey: EditText private lateinit var inputTg: EditText private lateinit var inputGroups: EditText - private lateinit var inputAprsCallsign: EditText private lateinit var inputAprsCoords: EditText private var currentProfile = 0 @@ -38,11 +37,9 @@ class SettingsActivity : Activity() { inputAuthKey = findViewById(R.id.input_auth_key) inputTg = findViewById(R.id.input_tg) inputGroups = findViewById(R.id.input_groups) - inputAprsCallsign = findViewById(R.id.input_aprs_callsign) inputAprsCoords = findViewById(R.id.input_aprs_coords) val chkNodeToasts = findViewById(R.id.chk_node_toasts) chkNodeToasts.isChecked = Prefs.nodeToastsEnabled(this) - inputAprsCallsign.setText(Prefs.aprsCallsign(this)) inputAprsCoords.setText(Prefs.aprsCoords(this)) val profileNames = (1..Prefs.PROFILE_COUNT) @@ -94,7 +91,6 @@ class SettingsActivity : Activity() { Prefs.saveProfile(this, currentProfile, profile) Prefs.setActiveProfile(this, currentProfile) Prefs.setNodeToastsEnabled(this, chkNodeToasts.isChecked) - Prefs.setAprsCallsign(this, inputAprsCallsign.text.toString()) Prefs.setAprsCoords(this, inputAprsCoords.text.toString()) toast(getString(R.string.saved)) finish() diff --git a/app/src/main/java/ru/ua1zbe/svxremote/aprs/AprsMeteo.kt b/app/src/main/java/ru/ua1zbe/svxremote/aprs/AprsMeteo.kt index 17a51d7..4c48027 100644 --- a/app/src/main/java/ru/ua1zbe/svxremote/aprs/AprsMeteo.kt +++ b/app/src/main/java/ru/ua1zbe/svxremote/aprs/AprsMeteo.kt @@ -11,11 +11,10 @@ import java.net.Socket /** * Экспериментально: приём метеостанций с APRS-IS (aprs2.net) в радиусе 250 км - * от позывного (фильтр b/) или от координат (фильтр r/). Весь код — в этом - * файле, удаляется вместе с вызовом в MainActivity и полями в настройках. + * от координат (фильтр r/). Весь код — в этом файле, удаляется вместе с + * вызовом в MainActivity и полями в настройках. */ class AprsMeteo( - private val callsign: String, private val coords: Pair?, private val onWeather: (String) -> Unit ) { @@ -59,11 +58,12 @@ class AprsMeteo( val filter = if (coords != null) { "r/${coords.first}/${coords.second}/250" } else { - "b/$callsign/250" + // Координаты не заданы — функция отключена (MainActivity не запускает) + "b/$APRS_CALL/250" } // ВАЖНО: без "vers" — сервер пользователя (T2SPB/T2APATITY) // не принимает фильтр и молчит; с "vers" — фильтр игнорируется - val login = "user $callsign pass ${passcode(callsign)} " + + val login = "user $APRS_CALL pass ${passcode(APRS_CALL)} " + "filter $filter\r\n" sock.getOutputStream().write(login.toByteArray()) sock.getOutputStream().flush() @@ -148,8 +148,9 @@ class AprsMeteo( } companion object { - // Сначала сервер пользователя; если он не отдаёт трафик (аплинк - // молчит), переходим на публичный aprs2.net + // Позывной для подключения к APRS-IS (SVX). Сначала сервер пользователя; + // если он не отдаёт трафик (аплинк молчит), переходим на публичный aprs2.net + private const val APRS_CALL = "SVX" private val APRS_HOSTS = listOf("rotate.radiorubka.org", "rotate.aprs2.net") private const val APRS_PORT = 14580 } diff --git a/app/src/main/java/ru/ua1zbe/svxremote/prefs/Prefs.kt b/app/src/main/java/ru/ua1zbe/svxremote/prefs/Prefs.kt index 74f47ff..62e71ab 100644 --- a/app/src/main/java/ru/ua1zbe/svxremote/prefs/Prefs.kt +++ b/app/src/main/java/ru/ua1zbe/svxremote/prefs/Prefs.kt @@ -129,15 +129,7 @@ object Prefs { // ---------- APRS метеостанции (экспериментально) ---------- - /** Позывной для APRS (пусто = функция выключена). */ - fun aprsCallsign(context: Context): String = - sp(context).getString("aprs_callsign", "") ?: "" - - fun setAprsCallsign(context: Context, callsign: String) { - sp(context).edit().putString("aprs_callsign", callsign.trim()).apply() - } - - /** Координаты "lat,lon" (пусто = фильтр b/ по позывному). */ + /** Координаты "lat,lon" (пусто = функция выключена). */ fun aprsCoords(context: Context): String = sp(context).getString("aprs_coords", "") ?: "" diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index b102eb1..66ee99f 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -182,26 +182,6 @@ android:textSize="13sp" android:layout_marginBottom="12dp" /> - - - - Всплывающее уведомление о подключении/отключении узлов Метеостанции (APRS) Экспериментально: принимает метеостанции в радиусе 250 км. Последняя станция показывается вместо строки сервера на главном экране. - APRS позывной - например UA1ZBE-1 Координаты (широта, долгота) — необязательно например 60.00, 30.00 Подключился: %1$s%2$s