mirror of
https://github.com/atsunatsu/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
Added OMM class for future celestrak compatibility, fixes to PolarView
This commit is contained in:
1 parent
9ffb793dfd
commit
3c29dafd51
4 files changed
+62
-38
No files matched your search
@@ -0,0 +1,16 @@
|
|||||||
|
package com.rtbishop.look4sat.framework.model
|
||||||
|
|
||||||
|
import com.squareup.moshi.Json
|
||||||
|
|
||||||
|
data class OMM(
|
||||||
|
@field:Json(name = "OBJECT_NAME") val name: String,
|
||||||
|
@field:Json(name = "EPOCH") val epochString: String,
|
||||||
|
@field:Json(name = "MEAN_MOTION") val meanmo: Double,
|
||||||
|
@field:Json(name = "ECCENTRICITY") val eccn: Double,
|
||||||
|
@field:Json(name = "INCLINATION") val incl: Double,
|
||||||
|
@field:Json(name = "RA_OF_ASC_NODE") val raan: Double,
|
||||||
|
@field:Json(name = "ARG_OF_PERICENTER") val argper: Double,
|
||||||
|
@field:Json(name = "MEAN_ANOMALY") val meanan: Double,
|
||||||
|
@field:Json(name = "NORAD_CAT_ID") val catnum: Int,
|
||||||
|
@field:Json(name = "BSTAR") val bstar: Double,
|
||||||
|
)
|
||||||
@@ -73,8 +73,8 @@ class PolarFragment : Fragment(R.layout.fragment_polar) {
|
|||||||
binding.frame.addView(polarView)
|
binding.frame.addView(polarView)
|
||||||
observeTransmitters(pass, transAdapter, binding)
|
observeTransmitters(pass, transAdapter, binding)
|
||||||
}
|
}
|
||||||
viewModel.azimuth.observe(viewLifecycleOwner, { trueNorthAzimuth ->
|
viewModel.orientation.observe(viewLifecycleOwner, { orientation ->
|
||||||
polarView?.rotation = -trueNorthAzimuth
|
polarView?.setOrientation(orientation.first, orientation.second, orientation.third)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +93,6 @@ class PolarFragment : Fragment(R.layout.fragment_polar) {
|
|||||||
binding.noTransMsg.visibility = View.VISIBLE
|
binding.noTransMsg.visibility = View.VISIBLE
|
||||||
}
|
}
|
||||||
setPassText(satPass, binding)
|
setPassText(satPass, binding)
|
||||||
polarView?.invalidate()
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,8 +38,11 @@ class PolarView(context: Context) : View(context) {
|
|||||||
private val scale = resources.displayMetrics.density
|
private val scale = resources.displayMetrics.density
|
||||||
private val radius = polarWidth * 0.48f
|
private val radius = polarWidth * 0.48f
|
||||||
private val txtSize = scale * 16f
|
private val txtSize = scale * 16f
|
||||||
private val path: Path = Path()
|
private val satTrack: Path = Path()
|
||||||
private val piDiv2 = Math.PI / 2.0
|
private val piDiv2 = Math.PI / 2.0
|
||||||
|
private var azimuth: Float = 0f
|
||||||
|
private var pitch: Float = 0f
|
||||||
|
private var roll: Float = 0f
|
||||||
|
|
||||||
private val radarPaint = Paint().apply {
|
private val radarPaint = Paint().apply {
|
||||||
isAntiAlias = true
|
isAntiAlias = true
|
||||||
@@ -66,55 +69,62 @@ class PolarView(context: Context) : View(context) {
|
|||||||
|
|
||||||
fun setPass(satPass: SatPass) {
|
fun setPass(satPass: SatPass) {
|
||||||
this.satPass = satPass
|
this.satPass = satPass
|
||||||
|
createPassTrajectory(satPass)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setOrientation(azimuth: Float, pitch: Float, roll: Float) {
|
||||||
|
this.azimuth = azimuth
|
||||||
|
this.pitch = pitch
|
||||||
|
this.roll = roll
|
||||||
|
this.rotation = -azimuth
|
||||||
|
invalidate()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDraw(canvas: Canvas) {
|
override fun onDraw(canvas: Canvas) {
|
||||||
canvas.translate(polarCenter, polarCenter)
|
canvas.translate(polarCenter, polarCenter)
|
||||||
drawRadarView(canvas)
|
drawRadarView(canvas)
|
||||||
drawRadarText(canvas)
|
drawRadarText(canvas)
|
||||||
if (!satPass.isDeepSpace) drawPassTrajectory(canvas, satPass)
|
if (!satPass.isDeepSpace) canvas.drawPath(satTrack, trackPaint)
|
||||||
drawSatellite(canvas, satPass)
|
drawSatellite(canvas, satPass)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun drawRadarView(cvs: Canvas) {
|
private fun createPassTrajectory(satPass: SatPass) {
|
||||||
cvs.drawLine(-radius, 0f, radius, 0f, radarPaint)
|
|
||||||
cvs.drawLine(0f, -radius, 0f, radius, radarPaint)
|
|
||||||
cvs.drawCircle(0f, 0f, radius, radarPaint)
|
|
||||||
cvs.drawCircle(0f, 0f, (radius / 3) * 2, radarPaint)
|
|
||||||
cvs.drawCircle(0f, 0f, radius / 3, radarPaint)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun drawRadarText(cvs: Canvas) {
|
|
||||||
cvs.drawText("N", scale, -radius + txtSize - scale * 2, txtPaint)
|
|
||||||
cvs.drawText("30°", scale, -((radius / 3) * 2) - scale * 2, txtPaint)
|
|
||||||
cvs.drawText("60°", scale, -(radius / 3) - scale * 2, txtPaint)
|
|
||||||
cvs.drawText("90°", scale, -scale * 2, txtPaint)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun drawPassTrajectory(cvs: Canvas, satPass: SatPass) {
|
|
||||||
val startTime = satPass.aosDate
|
val startTime = satPass.aosDate
|
||||||
val endTime = satPass.losDate
|
val endTime = satPass.losDate
|
||||||
while (startTime.before(endTime)) {
|
while (startTime.before(endTime)) {
|
||||||
val satPos = satPass.predictor.getSatPos(startTime)
|
val satPos = satPass.predictor.getSatPos(startTime)
|
||||||
val x = sph2CartX(satPos.azimuth, satPos.elevation, radius.toDouble())
|
val passX = sph2CartX(satPos.azimuth, satPos.elevation, radius.toDouble())
|
||||||
val y = sph2CartY(satPos.azimuth, satPos.elevation, radius.toDouble())
|
val passY = sph2CartY(satPos.azimuth, satPos.elevation, radius.toDouble())
|
||||||
if (startTime.compareTo(satPass.aosDate) == 0) {
|
if (startTime.compareTo(satPass.aosDate) == 0) {
|
||||||
path.moveTo(x, -y)
|
satTrack.moveTo(passX, -passY)
|
||||||
} else {
|
} else {
|
||||||
path.lineTo(x, -y)
|
satTrack.lineTo(passX, -passY)
|
||||||
}
|
}
|
||||||
startTime.time += 15000
|
startTime.time += 15000
|
||||||
}
|
}
|
||||||
cvs.drawPath(path, trackPaint)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun drawSatellite(cvs: Canvas, satPass: SatPass) {
|
private fun drawRadarView(canvas: Canvas) {
|
||||||
val date = Date(System.currentTimeMillis())
|
canvas.drawLine(-radius, 0f, radius, 0f, radarPaint)
|
||||||
val satPos = satPass.predictor.getSatPos(date)
|
canvas.drawLine(0f, -radius, 0f, radius, radarPaint)
|
||||||
|
canvas.drawCircle(0f, 0f, radius, radarPaint)
|
||||||
|
canvas.drawCircle(0f, 0f, (radius / 3) * 2, radarPaint)
|
||||||
|
canvas.drawCircle(0f, 0f, radius / 3, radarPaint)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun drawRadarText(canvas: Canvas) {
|
||||||
|
canvas.drawText("N", scale, -radius + txtSize - scale * 2, txtPaint)
|
||||||
|
canvas.drawText("30°", scale, -((radius / 3) * 2) - scale * 2, txtPaint)
|
||||||
|
canvas.drawText("60°", scale, -(radius / 3) - scale * 2, txtPaint)
|
||||||
|
canvas.drawText("90°", scale, -scale * 2, txtPaint)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun drawSatellite(canvas: Canvas, satPass: SatPass) {
|
||||||
|
val satPos = satPass.predictor.getSatPos(Date())
|
||||||
if (satPos.elevation > 0) {
|
if (satPos.elevation > 0) {
|
||||||
val x = sph2CartX(satPos.azimuth, satPos.elevation, radius.toDouble())
|
val satX = sph2CartX(satPos.azimuth, satPos.elevation, radius.toDouble())
|
||||||
val y = sph2CartY(satPos.azimuth, satPos.elevation, radius.toDouble())
|
val satY = sph2CartY(satPos.azimuth, satPos.elevation, radius.toDouble())
|
||||||
cvs.drawCircle(x, -y, txtSize / 2.4f, satPaint)
|
canvas.drawCircle(satX, -satY, txtSize / 2.4f, satPaint)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,12 +18,12 @@
|
|||||||
package com.rtbishop.look4sat.presentation.polarScreen
|
package com.rtbishop.look4sat.presentation.polarScreen
|
||||||
|
|
||||||
import androidx.lifecycle.*
|
import androidx.lifecycle.*
|
||||||
import com.rtbishop.look4sat.utility.PassesRepo
|
|
||||||
import com.rtbishop.look4sat.di.IoDispatcher
|
import com.rtbishop.look4sat.di.IoDispatcher
|
||||||
import com.rtbishop.look4sat.domain.model.SatTrans
|
import com.rtbishop.look4sat.domain.model.SatTrans
|
||||||
import com.rtbishop.look4sat.interactors.GetTransmittersForSat
|
|
||||||
import com.rtbishop.look4sat.domain.predict4kotlin.SatPass
|
import com.rtbishop.look4sat.domain.predict4kotlin.SatPass
|
||||||
|
import com.rtbishop.look4sat.interactors.GetTransmittersForSat
|
||||||
import com.rtbishop.look4sat.utility.OrientationProvider
|
import com.rtbishop.look4sat.utility.OrientationProvider
|
||||||
|
import com.rtbishop.look4sat.utility.PassesRepo
|
||||||
import com.rtbishop.look4sat.utility.PrefsManager
|
import com.rtbishop.look4sat.utility.PrefsManager
|
||||||
import com.rtbishop.look4sat.utility.round
|
import com.rtbishop.look4sat.utility.round
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
@@ -43,11 +43,10 @@ class PolarViewModel @Inject constructor(
|
|||||||
@IoDispatcher private val ioDispatcher: CoroutineDispatcher
|
@IoDispatcher private val ioDispatcher: CoroutineDispatcher
|
||||||
) : ViewModel(), OrientationProvider.OrientationListener {
|
) : ViewModel(), OrientationProvider.OrientationListener {
|
||||||
|
|
||||||
private val magDeclination = prefsManager.getMagDeclination()
|
|
||||||
private val _transmitters = MutableLiveData<List<SatTrans>>()
|
private val _transmitters = MutableLiveData<List<SatTrans>>()
|
||||||
private val _azimuth = MutableLiveData<Float>()
|
private val _orientation = MutableLiveData<Triple<Float, Float, Float>>()
|
||||||
val transmitters: LiveData<List<SatTrans>> = _transmitters
|
val transmitters: LiveData<List<SatTrans>> = _transmitters
|
||||||
val azimuth: LiveData<Float> = _azimuth
|
val orientation: LiveData<Triple<Float, Float, Float>> = _orientation
|
||||||
|
|
||||||
fun getPass(catNum: Int, aosTime: Long) = liveData {
|
fun getPass(catNum: Int, aosTime: Long) = liveData {
|
||||||
passesRepo.passes.collect { passes ->
|
passesRepo.passes.collect { passes ->
|
||||||
@@ -69,7 +68,7 @@ class PolarViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onOrientationChanged(azimuth: Float, pitch: Float, roll: Float) {
|
override fun onOrientationChanged(azimuth: Float, pitch: Float, roll: Float) {
|
||||||
_azimuth.value = azimuth + magDeclination
|
_orientation.value = Triple(azimuth + prefsManager.getMagDeclination(), pitch, roll)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initRotatorControl(satPass: SatPass) {
|
private fun initRotatorControl(satPass: SatPass) {
|
||||||
|
|||||||
Reference in new issue
Block a user