Fix APRS meteo temp: t-field is whole degrees Fahrenheit (was dividing by 10); round to whole Celsius

This commit is contained in:
ua1zbe
2026-08-18 08:46:48 +03:00
parent 985cd9eb1a
commit 4102140fa0

View File

@@ -93,7 +93,7 @@ class AprsMeteo(
sawPacket = true sawPacket = true
if (BuildConfig.DEBUG) Log.d(tag, "pkt: " + line.substringBefore('>')) if (BuildConfig.DEBUG) Log.d(tag, "pkt: " + line.substringBefore('>'))
parse(line)?.let { wx -> parse(line)?.let { wx ->
Log.d(tag, "wx: $wx") Log.d(tag, "wx: $wx RAW=${line.length} $line")
main.post { onWeather(wx) } main.post { onWeather(wx) }
} }
} }
@@ -122,26 +122,19 @@ class AprsMeteo(
val temp = parseTemp(body) ?: return null val temp = parseTemp(body) ?: return null
// В APRS метео-часть температура в градусах Фаренгейта // В APRS метео-часть температура в градусах Фаренгейта
val c = (temp - 32.0) * 5.0 / 9.0 val c = (temp - 32.0) * 5.0 / 9.0
val t = if (c == c.toInt().toDouble()) c.toInt().toString() val t = Math.round(c).toString()
else (Math.round(c * 10.0) / 10.0).toString() return line.substringBefore('>') + " Температура: " + t + " °C"
return line.substringBefore('>') + " Температура " + t + "C"
} }
/** Температура из метео-части после символа '_': t062=62°F, t06=6°F, t-08=-8°F, T083=83°F. /** Температура из метео-части после символа '_': t057=57°F, t06=6°F, t-08=-8°F.
* В APRS метео-формате температура кодируется в градусах Фаренгейта. */ * В APRS метео-формате температура — целые градусы Фаренгейта. */
private fun parseTemp(body: String): Double? { private fun parseTemp(body: String): Double? {
val u = body.indexOf('_') val u = body.indexOf('_')
if (u < 0) return null if (u < 0) return null
val meta = body.substring(u + 1).substringBefore(' ') // до комментария val meta = body.substring(u + 1).substringBefore(' ') // до комментария
val m = Regex("[tT]([+-]?)(\\d{2,3})").find(meta) ?: return null val m = Regex("[tT]([+-]?)(\\d{2,3})").find(meta) ?: return null
val sign = if (m.groupValues[1] == "-") -1 else 1 val sign = if (m.groupValues[1] == "-") -1 else 1
val d = m.groupValues[2] return sign * m.groupValues[2].toInt().toDouble()
val v = if (d.length == 3) {
d.substring(0, 2).toInt() + d.substring(2).toInt() / 10.0
} else {
d.toInt().toDouble()
}
return sign * v
} }
/** APRS-IS passcode по позывному (алгоритм aprsc). */ /** APRS-IS passcode по позывному (алгоритм aprsc). */