Changes to location and settings handlers

This commit is contained in:
Arty Bishop committed 2022-02-19 12:13:02 +00:00
1 parent ffd1fc1551
commit 72f78e5c6b
7 files changed
+64 -36

No files matched your search

@@ -29,9 +29,13 @@ interface ISettingsHandler {
"https://amsat.org/tle/current/nasabare.txt"
)
fun loadStationLocator(): String
fun saveStationLocator(locator: String)
fun loadStationPosition(): GeoPos
fun saveStationPosition(latitude: Double, longitude: Double)
fun saveStationPosition(position: GeoPos)
fun getHoursAhead(): Int
@@ -8,6 +8,8 @@ interface ILocationHandler {
val stationPosition: SharedFlow<DataState<GeoPos>>
fun getStationLocator(): String
fun getStationPosition(): GeoPos
fun setStationPosition(latitude: Double, longitude: Double)
@@ -16,7 +18,7 @@ interface ILocationHandler {
fun setPositionFromNet()
fun setPositionFromQth(qthString: String)
fun setPositionFromQth(locator: String)
fun setPositionHandled()
}
@@ -22,17 +22,17 @@ import kotlin.math.round
object QthConverter {
fun qthToPosition(qthString: String): GeoPos? {
val trimmedQth = qthString.take(6)
if (!isValidQth(trimmedQth)) return null
fun qthToPosition(locator: String): GeoPos? {
val trimmedQth = locator.take(6)
if (!isValidLocator(trimmedQth)) return null
val lonFirst = (trimmedQth[0].uppercaseChar().code - 65) * 20
val latFirst = (trimmedQth[1].uppercaseChar().code - 65) * 10
val lonSecond = trimmedQth[2].toString().toInt() * 2
val latSecond = trimmedQth[3].toString().toInt()
val lonThird = (((trimmedQth[4].lowercaseChar().code - 97) / 12.0) + (1.0 / 24.0)) - 180
val latThird = (((trimmedQth[5].lowercaseChar().code - 97) / 24.0) + (1.0 / 48.0)) - 90
val longitude = (lonFirst + lonSecond + lonThird).roundToDecimals(4)
val latitude = (latFirst + latSecond + latThird).roundToDecimals(4)
val longitude = (lonFirst + lonSecond + lonThird).round(4)
val latitude = (latFirst + latSecond + latThird).round(4)
return GeoPos(latitude, longitude)
}
@@ -53,15 +53,14 @@ object QthConverter {
}
fun isValidPosition(lat: Double, lon: Double): Boolean {
return (lat > -90.0 && lat < 90.0) && (lon > -180.0 && lon < 360.0)
return (lat >= -90.0 && lat <= 90.0) && (lon >= -180.0 && lon <= 360.0)
}
private fun isValidQth(qthString: String): Boolean {
val qthPattern = "[a-xA-X][a-xA-X][0-9][0-9][a-xA-X][a-xA-X]".toRegex()
return qthString.matches(qthPattern)
fun isValidLocator(locator: String): Boolean {
return locator.matches("[a-xA-X][a-xA-X][0-9][0-9][a-xA-X][a-xA-X]".toRegex())
}
private fun Double.roundToDecimals(decimals: Int): Double {
fun Double.round(decimals: Int): Double {
var multiplier = 1.0
repeat(decimals) { multiplier *= 10 }
return round(this * multiplier) / multiplier