mirror of
https://github.com/rt-bishop/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
Fixes and refactoring for LocationSource
This commit is contained in:
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
|
||||
|
||||
Reference in new issue
Block a user