diff --git a/app/src/main/java/com/rtbishop/look4sat/framework/model/OMM.kt b/app/src/main/java/com/rtbishop/look4sat/framework/model/OMM.kt new file mode 100644 index 00000000..920fad29 --- /dev/null +++ b/app/src/main/java/com/rtbishop/look4sat/framework/model/OMM.kt @@ -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, +) diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarFragment.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarFragment.kt index abf5f2b7..e431b309 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarFragment.kt @@ -73,8 +73,8 @@ class PolarFragment : Fragment(R.layout.fragment_polar) { binding.frame.addView(polarView) observeTransmitters(pass, transAdapter, binding) } - viewModel.azimuth.observe(viewLifecycleOwner, { trueNorthAzimuth -> - polarView?.rotation = -trueNorthAzimuth + viewModel.orientation.observe(viewLifecycleOwner, { orientation -> + polarView?.setOrientation(orientation.first, orientation.second, orientation.third) }) } @@ -93,7 +93,6 @@ class PolarFragment : Fragment(R.layout.fragment_polar) { binding.noTransMsg.visibility = View.VISIBLE } setPassText(satPass, binding) - polarView?.invalidate() }) } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarView.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarView.kt index b8414be2..18f74658 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarView.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarView.kt @@ -31,15 +31,18 @@ import kotlin.math.cos import kotlin.math.sin class PolarView(context: Context) : View(context) { - + private lateinit var satPass: SatPass private val polarWidth = resources.displayMetrics.widthPixels private val polarCenter = polarWidth / 2f private val scale = resources.displayMetrics.density private val radius = polarWidth * 0.48f private val txtSize = scale * 16f - private val path: Path = Path() + private val satTrack: Path = Path() 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 { isAntiAlias = true @@ -63,58 +66,65 @@ class PolarView(context: Context) : View(context) { color = ContextCompat.getColor(context, R.color.themeLight) style = Paint.Style.FILL } - + fun setPass(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) { canvas.translate(polarCenter, polarCenter) drawRadarView(canvas) drawRadarText(canvas) - if (!satPass.isDeepSpace) drawPassTrajectory(canvas, satPass) + if (!satPass.isDeepSpace) canvas.drawPath(satTrack, trackPaint) drawSatellite(canvas, satPass) } - - private fun drawRadarView(cvs: Canvas) { - 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) { + private fun createPassTrajectory(satPass: SatPass) { val startTime = satPass.aosDate val endTime = satPass.losDate while (startTime.before(endTime)) { val satPos = satPass.predictor.getSatPos(startTime) - val x = sph2CartX(satPos.azimuth, satPos.elevation, radius.toDouble()) - val y = sph2CartY(satPos.azimuth, satPos.elevation, radius.toDouble()) + val passX = sph2CartX(satPos.azimuth, satPos.elevation, radius.toDouble()) + val passY = sph2CartY(satPos.azimuth, satPos.elevation, radius.toDouble()) if (startTime.compareTo(satPass.aosDate) == 0) { - path.moveTo(x, -y) + satTrack.moveTo(passX, -passY) } else { - path.lineTo(x, -y) + satTrack.lineTo(passX, -passY) } startTime.time += 15000 } - cvs.drawPath(path, trackPaint) } - private fun drawSatellite(cvs: Canvas, satPass: SatPass) { - val date = Date(System.currentTimeMillis()) - val satPos = satPass.predictor.getSatPos(date) + private fun drawRadarView(canvas: Canvas) { + canvas.drawLine(-radius, 0f, radius, 0f, radarPaint) + 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) { - val x = sph2CartX(satPos.azimuth, satPos.elevation, radius.toDouble()) - val y = sph2CartY(satPos.azimuth, satPos.elevation, radius.toDouble()) - cvs.drawCircle(x, -y, txtSize / 2.4f, satPaint) + val satX = sph2CartX(satPos.azimuth, satPos.elevation, radius.toDouble()) + val satY = sph2CartY(satPos.azimuth, satPos.elevation, radius.toDouble()) + canvas.drawCircle(satX, -satY, txtSize / 2.4f, satPaint) } } diff --git a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarViewModel.kt index 5854a257..20d9ca6d 100644 --- a/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/presentation/polarScreen/PolarViewModel.kt @@ -18,12 +18,12 @@ package com.rtbishop.look4sat.presentation.polarScreen import androidx.lifecycle.* -import com.rtbishop.look4sat.utility.PassesRepo import com.rtbishop.look4sat.di.IoDispatcher import com.rtbishop.look4sat.domain.model.SatTrans -import com.rtbishop.look4sat.interactors.GetTransmittersForSat import com.rtbishop.look4sat.domain.predict4kotlin.SatPass +import com.rtbishop.look4sat.interactors.GetTransmittersForSat import com.rtbishop.look4sat.utility.OrientationProvider +import com.rtbishop.look4sat.utility.PassesRepo import com.rtbishop.look4sat.utility.PrefsManager import com.rtbishop.look4sat.utility.round import dagger.hilt.android.lifecycle.HiltViewModel @@ -43,11 +43,10 @@ class PolarViewModel @Inject constructor( @IoDispatcher private val ioDispatcher: CoroutineDispatcher ) : ViewModel(), OrientationProvider.OrientationListener { - private val magDeclination = prefsManager.getMagDeclination() private val _transmitters = MutableLiveData>() - private val _azimuth = MutableLiveData() + private val _orientation = MutableLiveData>() val transmitters: LiveData> = _transmitters - val azimuth: LiveData = _azimuth + val orientation: LiveData> = _orientation fun getPass(catNum: Int, aosTime: Long) = liveData { passesRepo.passes.collect { passes -> @@ -69,7 +68,7 @@ class PolarViewModel @Inject constructor( } 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) {