From ec553bf4294d87e5207e18c22a6fbcaf8b474519 Mon Sep 17 00:00:00 2001 From: Arty Bishop Date: Thu, 10 Mar 2022 10:42:20 +0000 Subject: [PATCH] Added more satellite parameters to the map screen --- .../presentation/mapScreen/MapData.kt | 3 + .../presentation/mapScreen/MapFragment.kt | 4 +- .../presentation/mapScreen/MapViewModel.kt | 28 +++- app/src/main/res/layout/fragment_map.xml | 120 ++++++++++-------- app/src/main/res/values-ru/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + .../look4sat/domain/ISatelliteManager.kt | 2 + .../domain/predict/SatelliteManager.kt | 11 +- 8 files changed, 112 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapData.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapData.kt index c8530e64..ba5d7e6c 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapData.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapData.kt @@ -24,6 +24,9 @@ data class MapData( val pass: Satellite, val catNum: Int, val name: String, + val aosTime: String, + val azimuth: Double, + val elevation: Double, val range: Double, val altitude: Double, val velocity: Double, diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt index 3368eb88..1b58e13c 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapFragment.kt @@ -198,7 +198,9 @@ class MapFragment : Fragment(R.layout.fragment_map) { private fun handleMapData(mapData: MapData) { binding.apply { - mapTitle.text = mapData.name + mapTimer.text = mapData.aosTime + mapAzimuth.text = String.format(getString(R.string.map_azimuth), mapData.azimuth) + mapElevation.text = String.format(getString(R.string.map_elevation), mapData.elevation) mapDataId.text = String.format(getString(R.string.map_sat_id), mapData.catNum) mapDataQth.text = String.format(getString(R.string.map_qth), mapData.qthLoc) mapDataAlt.text = String.format(getString(R.string.map_altitude), mapData.altitude) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt index d5e2e2af..ed1ac71a 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/mapScreen/MapViewModel.kt @@ -26,6 +26,7 @@ import com.rtbishop.look4sat.domain.predict.SatPos import com.rtbishop.look4sat.domain.predict.Satellite import com.rtbishop.look4sat.utility.QthConverter import com.rtbishop.look4sat.utility.toDegrees +import com.rtbishop.look4sat.utility.toTimerString import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.* import java.util.* @@ -41,9 +42,10 @@ class MapViewModel @Inject constructor( ) : ViewModel() { private val stationPosition = settings.loadStationPosition() + private var allPasses = satelliteManager.getPasses() private var allSatellites = listOf() private var dataUpdateJob: Job? = null - private var dataUpdateRate = 2000L + private var dataUpdateRate = 1000L private lateinit var selectedSatellite: Satellite val stationPos = liveData { @@ -84,7 +86,8 @@ class MapViewModel @Inject constructor( if (satellites.isNotEmpty()) { allSatellites = satellites if (catnum == -1) { - selectSatellite(satellites.first()) + allPasses.find { pass -> pass.progress < 100 && !pass.isDeepSpace } + ?.let { pass -> selectSatellite(pass.satellite) } } else { satellites.find { it.data.catnum == catnum }?.let { selectSatellite(it) } } @@ -156,8 +159,23 @@ class MapViewModel @Inject constructor( _footprint.postValue(satPos) } - private suspend fun getSatData(satellite: Satellite, pos: GeoPos, date: Date) { - val satPos = satelliteManager.getPosition(satellite, pos, date.time) + private suspend fun getSatData(sat: Satellite, pos: GeoPos, date: Date) { + var aosTime = 0L.toTimerString() + allPasses.find { pass -> pass.catNum == sat.data.catnum && pass.progress < 100 } + ?.let { satPass -> + if (!satPass.isDeepSpace) { + aosTime = if (date.time < satPass.aosTime) { + val millisBeforeStart = satPass.aosTime.minus(date.time) + millisBeforeStart.toTimerString() + } else { + val millisBeforeEnd = satPass.losTime.minus(date.time) + millisBeforeEnd.toTimerString() + } + } + } + val satPos = satelliteManager.getPosition(sat, pos, date.time) + val azimuth = satPos.azimuth.toDegrees() + val elevation = satPos.elevation.toDegrees() val osmLat = clipLat(satPos.latitude.toDegrees()) val osmLon = clipLon(satPos.longitude.toDegrees()) val osmPos = GeoPos(osmLat, osmLon) @@ -165,7 +183,7 @@ class MapViewModel @Inject constructor( val phase = satPos.phase.toDegrees() val visibility = satPos.eclipsed val satData = MapData( - satellite, satellite.data.catnum, satellite.data.name, satPos.distance, + sat, sat.data.catnum, sat.data.name, aosTime, azimuth, elevation, satPos.distance, satPos.altitude, satPos.getOrbitalVelocity(), qthLoc, osmPos, phase, visibility ) _mapData.postValue(satData) diff --git a/app/src/main/res/layout/fragment_map.xml b/app/src/main/res/layout/fragment_map.xml index 94fe51ef..c7426cf0 100644 --- a/app/src/main/res/layout/fragment_map.xml +++ b/app/src/main/res/layout/fragment_map.xml @@ -21,15 +21,8 @@ android:src="@drawable/ic_back" /> + android:id="@+id/map_timer" + style="@style/ToolbarTimer" /> @@ -66,7 +59,7 @@ android:includeFontPadding="false" android:maxLines="1" android:text="@string/map_copyright" - android:textColor="@color/textDisabled" + android:textColor="@color/textMain" android:textSize="@dimen/text_size_copyright" app:layout_constraintEnd_toEndOf="@+id/map_card" app:layout_constraintStart_toStartOf="@+id/map_card" @@ -88,6 +81,66 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + + + + + + + + + + + @@ -109,55 +163,17 @@ app:layout_constraintBaseline_toBaselineOf="@+id/map_data_visibility" app:layout_constraintEnd_toEndOf="parent" /> - - - - - - - - + app:layout_constraintStart_toStartOf="@+id/map_data_lat" + app:layout_constraintTop_toBottomOf="@+id/map_data_lat" /> + app:layout_constraintEnd_toEndOf="@+id/map_data_lon" /> diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e0ef083d..ad454ab1 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -101,6 +101,8 @@ Карта Мира %s Id:%d + Азимут: %.1f° + Элевация: %.1f° Широта: %.1f° Долгота: %.1f° QTH Локатор: %s diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fd99adce..f315d571 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -102,6 +102,8 @@ World Map %s Id:%d + Azimuth: %.1f° + Elevation: %.1f° Latitude: %.1f° Longitude: %.1f° QTH Locator: %s diff --git a/base/src/main/java/com/rtbishop/look4sat/domain/ISatelliteManager.kt b/base/src/main/java/com/rtbishop/look4sat/domain/ISatelliteManager.kt index acc8f6e1..25d2c75c 100644 --- a/base/src/main/java/com/rtbishop/look4sat/domain/ISatelliteManager.kt +++ b/base/src/main/java/com/rtbishop/look4sat/domain/ISatelliteManager.kt @@ -11,6 +11,8 @@ interface ISatelliteManager { val calculatedPasses: SharedFlow> + fun getPasses(): List + suspend fun getPosition(sat: Satellite, pos: GeoPos, time: Long): SatPos suspend fun getTrack(sat: Satellite, pos: GeoPos, start: Long, end: Long): List diff --git a/base/src/main/java/com/rtbishop/look4sat/domain/predict/SatelliteManager.kt b/base/src/main/java/com/rtbishop/look4sat/domain/predict/SatelliteManager.kt index 62db594f..fd85d583 100644 --- a/base/src/main/java/com/rtbishop/look4sat/domain/predict/SatelliteManager.kt +++ b/base/src/main/java/com/rtbishop/look4sat/domain/predict/SatelliteManager.kt @@ -27,9 +27,12 @@ import kotlinx.coroutines.withContext class SatelliteManager(private val defaultDispatcher: CoroutineDispatcher) : ISatelliteManager { + private var passes = listOf() private val _calculatedPasses = MutableSharedFlow>(replay = 1) override val calculatedPasses: SharedFlow> = _calculatedPasses + override fun getPasses(): List = passes + override suspend fun getPosition(sat: Satellite, pos: GeoPos, time: Long): SatPos { return withContext(defaultDispatcher) { sat.getPosition(pos, time) } } @@ -96,14 +99,18 @@ class SatelliteManager(private val defaultDispatcher: CoroutineDispatcher) : ISa minElevation: Double ) { if (satList.isEmpty()) { - _calculatedPasses.emit(emptyList()) + val newPasses = emptyList() + passes = newPasses + _calculatedPasses.emit(newPasses) } else { withContext(defaultDispatcher) { val allPasses = mutableListOf() satList.forEach { satellite -> allPasses.addAll(satellite.getPasses(pos, time, hoursAhead)) } - _calculatedPasses.emit(allPasses.filter(time, hoursAhead, minElevation)) + val newPasses = allPasses.filter(time, hoursAhead, minElevation) + passes = newPasses + _calculatedPasses.emit(newPasses) } } }