Fixes and refactoring for LocationSource

This commit is contained in:
Arty Bishop committed 2025-12-27 15:01:33 +00:00
1 parent 12fabc8f23
commit 542cfcfd50
19 files changed
+125 -95

No files matched your search

@@ -17,16 +17,16 @@
*/
package com.rtbishop.look4sat.domain
import com.rtbishop.look4sat.model.StationPos
import com.rtbishop.look4sat.model.GeoPos
import kotlinx.coroutines.flow.StateFlow
interface ILocationSource {
val stationPosition: StateFlow<StationPos>
val stationPosition: StateFlow<GeoPos>
fun setGpsPosition(): Boolean
fun setGeoPosition(latitude: Double, longitude: Double): Boolean
fun setGeoPosition(latitude: Double, longitude: Double, altitude: Double = 0.0): Boolean
fun setQthPosition(locator: String): Boolean
}
@@ -17,7 +17,7 @@
*/
package com.rtbishop.look4sat.domain
import com.rtbishop.look4sat.model.StationPos
import com.rtbishop.look4sat.model.GeoPos
interface ISettingsSource {
@@ -51,9 +51,9 @@ interface ISettingsSource {
"Amsat" to "https://amsat.org/tle/current/nasabare.txt"
)
fun loadStationPosition(): StationPos
fun loadStationPosition(): GeoPos
fun saveStationPosition(stationPos: StationPos)
fun saveStationPosition(stationPos: GeoPos)
fun getHoursAhead(): Int
@@ -60,7 +60,7 @@ abstract class Satellite(val data: OrbitalData) {
val apogee = sma * (1.0 + data.eccn) - EARTH_RADIUS
var lin = data.incl
if (lin >= 90.0) lin = 180.0 - lin
acos(EARTH_RADIUS / (apogee + EARTH_RADIUS)) + lin * DEG2RAD > abs(pos.lat * DEG2RAD)
acos(EARTH_RADIUS / (apogee + EARTH_RADIUS)) + lin * DEG2RAD > abs(pos.latitude * DEG2RAD)
}
}
@@ -146,8 +146,8 @@ abstract class Satellite(val data: OrbitalData) {
velocityVector.z - obsVel.z
)
magnitude(range)
val sinLat = sin(DEG2RAD * gsPos.lat)
val cosLat = cos(DEG2RAD * gsPos.lat)
val sinLat = sin(DEG2RAD * gsPos.latitude)
val cosLat = cos(DEG2RAD * gsPos.latitude)
val sinTheta = sin(gsPosTheta)
val cosTheta = cos(gsPosTheta)
val topS = sinLat * cosTheta * range.x + sinLat * sinTheta * range.y - cosLat * range.z
@@ -173,13 +173,13 @@ abstract class Satellite(val data: OrbitalData) {
obsVel: Vector4
) {
val mFactor = 7.292115E-5
gsPosTheta = mod2PI(thetaGJD(time) + DEG2RAD * gsPos.lon)
val c = invert(sqrt(1.0 + FLAT_FACT * (FLAT_FACT - 2) * sqr(sin(DEG2RAD * gsPos.lat))))
gsPosTheta = mod2PI(thetaGJD(time) + DEG2RAD * gsPos.longitude)
val c = invert(sqrt(1.0 + FLAT_FACT * (FLAT_FACT - 2) * sqr(sin(DEG2RAD * gsPos.latitude))))
val sq = sqr(1.0 - FLAT_FACT) * c
val achcp = (EARTH_RADIUS * c + gsPos.alt / 1000.0) * cos(DEG2RAD * gsPos.lat)
val achcp = (EARTH_RADIUS * c + gsPos.altitude / 1000.0) * cos(DEG2RAD * gsPos.latitude)
obsPos.setXYZ(
achcp * cos(gsPosTheta), achcp * sin(gsPosTheta),
(EARTH_RADIUS * sq + gsPos.alt / 1000.0) * sin(DEG2RAD * gsPos.lat)
(EARTH_RADIUS * sq + gsPos.altitude / 1000.0) * sin(DEG2RAD * gsPos.latitude)
)
obsVel.setXYZ(-mFactor * obsPos.y, mFactor * obsPos.x, 0.0)
magnitude(obsPos)
@@ -17,4 +17,10 @@
*/
package com.rtbishop.look4sat.model
data class GeoPos(val lat: Double, val lon: Double, val alt: Double = 0.0, val name: String? = null)
data class GeoPos(
val latitude: Double,
val longitude: Double,
val altitude: Double = 0.0,
val qthLocator: String = "null",
val timestamp: Long = 0L
)
@@ -1,7 +0,0 @@
package com.rtbishop.look4sat.model
data class StationPos(
val latitude: Double, val longitude: Double, val qthLocator: String, val timestamp: Long
) {
fun toGeoPos(): GeoPos = GeoPos(latitude, longitude)
}
@@ -25,11 +25,11 @@ class QthConverterTest {
@Test
fun `Given valid QTH returns correct POS`() {
var result = QthConverter.qthToPosition("io91VL39FX")
assert(result?.lat == 51.4792 && result.lon == -0.2083)
assert(result?.latitude == 51.4792 && result.longitude == -0.2083)
result = QthConverter.qthToPosition("JN58TD")
assert(result?.lat == 48.1458 && result.lon == 11.6250)
assert(result?.latitude == 48.1458 && result.longitude == 11.6250)
result = QthConverter.qthToPosition("gf15vc")
assert(result?.lat == -34.8958 && result.lon == -56.2083)
assert(result?.latitude == -34.8958 && result.longitude == -56.2083)
}
@Test