Now showing satellite current azimuth, elevation, altitude and range in RadarFragment

This commit is contained in:
Arty Bishop committed 2019-12-05 22:28:15 +00:00
1 parent 4e4256bc3f
commit a32171c96f
6 files changed
+67 -63

No files matched your search

@@ -18,7 +18,6 @@ import com.rtbishop.lookingsat.MainViewModel
import com.rtbishop.lookingsat.R import com.rtbishop.lookingsat.R
import com.rtbishop.lookingsat.repo.SatPass import com.rtbishop.lookingsat.repo.SatPass
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.text.SimpleDateFormat
import java.util.* import java.util.*
import java.util.concurrent.Executors import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@@ -27,7 +26,7 @@ import kotlin.math.sin
class RadarFragment : Fragment() { class RadarFragment : Fragment() {
private val delay = 5000L private val delay = 2000L
private val service = Executors.newSingleThreadScheduledExecutor() private val service = Executors.newSingleThreadScheduledExecutor()
private lateinit var viewModel: MainViewModel private lateinit var viewModel: MainViewModel
@@ -36,11 +35,12 @@ class RadarFragment : Fragment() {
private lateinit var radarSkyFrame: FrameLayout private lateinit var radarSkyFrame: FrameLayout
private lateinit var transRecycler: RecyclerView private lateinit var transRecycler: RecyclerView
private lateinit var transAdapter: TransAdapter private lateinit var transAdapter: TransAdapter
private lateinit var radarSatName: TextView private lateinit var radarAzimuth: TextView
private lateinit var radarMaxEl: TextView private lateinit var radarElevation: TextView
private lateinit var radarAos: TextView private lateinit var radarRange: TextView
private lateinit var radarLos: TextView private lateinit var radarAltitude: TextView
private lateinit var transNoFound: TextView private lateinit var transNoFound: TextView
private lateinit var mainActivity: MainActivity
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -58,22 +58,28 @@ class RadarFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
satPass = arguments?.get("satPass") as SatPass satPass = arguments?.get("satPass") as SatPass
mainActivity = activity as MainActivity
mainActivity.supportActionBar?.title = satPass.tle.name
radarSkyFrame = view.findViewById(R.id.radar_sky_frame) radarSkyFrame = view.findViewById(R.id.radar_sky_frame)
transRecycler = view.findViewById(R.id.radar_recycler) transRecycler = view.findViewById(R.id.radar_recycler)
radarSatName = view.findViewById(R.id.radar_sat_name) radarAzimuth = view.findViewById(R.id.radar_azimuth)
radarMaxEl = view.findViewById(R.id.radar_maxEl) radarElevation = view.findViewById(R.id.radar_elevation)
radarAos = view.findViewById(R.id.radar_aos) radarRange = view.findViewById(R.id.radar_range)
radarLos = view.findViewById(R.id.radar_los) radarAltitude = view.findViewById(R.id.radar_altitude)
transNoFound = view.findViewById(R.id.radar_trans_no_found) transNoFound = view.findViewById(R.id.radar_no_trans)
radarView = RadarView(mainActivity)
radarSkyFrame.addView(radarView)
service.scheduleAtFixedRate({ radarView.invalidate() }, 0, delay, TimeUnit.MILLISECONDS)
setupRadarView()
setupTransRecycler() setupTransRecycler()
} }
private fun setupTransRecycler() { private fun setupTransRecycler() {
transAdapter = TransAdapter() transAdapter = TransAdapter()
transRecycler.apply { transRecycler.apply {
layoutManager = LinearLayoutManager(activity as MainActivity) layoutManager = LinearLayoutManager(mainActivity)
adapter = transAdapter adapter = transAdapter
} }
lifecycleScope.launch { lifecycleScope.launch {
@@ -88,22 +94,6 @@ class RadarFragment : Fragment() {
} }
} }
private fun setupRadarView() {
radarView = RadarView(activity as MainActivity)
radarSkyFrame.addView(radarView)
val aosTime =
SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(satPass.pass.startTime)
val losTime =
SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(satPass.pass.endTime)
radarSatName.text = satPass.tle.name
radarMaxEl.text = String.format("MaxEl: %.1f°", satPass.pass.maxEl)
radarAos.text = String.format("AOS - %s", aosTime)
radarLos.text = String.format("LOS - %s", losTime)
service.scheduleAtFixedRate({ radarView.invalidate() }, delay, delay, TimeUnit.MILLISECONDS)
}
inner class RadarView(context: Context) : View(context) { inner class RadarView(context: Context) : View(context) {
private val radarSize = resources.displayMetrics.widthPixels private val radarSize = resources.displayMetrics.widthPixels
@@ -153,6 +143,7 @@ class RadarFragment : Fragment() {
override fun onDraw(canvas: Canvas) { override fun onDraw(canvas: Canvas) {
bmp.eraseColor(Color.TRANSPARENT) bmp.eraseColor(Color.TRANSPARENT)
setPassText()
drawRadarView() drawRadarView()
drawRadarText() drawRadarText()
drawPassTrajectory() drawPassTrajectory()
@@ -160,6 +151,14 @@ class RadarFragment : Fragment() {
canvas.drawBitmap(bmp, left.toFloat(), top.toFloat(), null) canvas.drawBitmap(bmp, left.toFloat(), top.toFloat(), null)
} }
private fun setPassText() {
satPos = satPass.predictor.getSatPos(Date())
radarAzimuth.text = String.format("Azimuth: %.1f°", rad2Deg(satPos.azimuth))
radarElevation.text = String.format("Elevation: %.1f°", rad2Deg(satPos.elevation))
radarRange.text = String.format("Range: %.0f km", satPos.range)
radarAltitude.text = String.format("Altitude: %.0f km", satPos.altitude)
}
private fun drawRadarView() { private fun drawRadarView() {
cvs.drawLine(center - radius, center, center + radius, center, radarPaint) cvs.drawLine(center - radius, center, center + radius, center, radarPaint)
cvs.drawLine(center, center - radius, center, center + radius, radarPaint) cvs.drawLine(center, center - radius, center, center + radius, radarPaint)
@@ -213,5 +212,9 @@ class RadarFragment : Fragment() {
val radius = r * (piDiv2 - elevation) / piDiv2 val radius = r * (piDiv2 - elevation) / piDiv2
return (radius * sin(piDiv2 - azimuth)).toFloat() return (radius * sin(piDiv2 - azimuth)).toFloat()
} }
private fun rad2Deg(value: Double): Double {
return value * 180 / Math.PI
}
} }
} }
+2 -1
View File
@@ -13,7 +13,8 @@
<androidx.appcompat.widget.Toolbar <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"> android:layout_height="?attr/actionBarSize"
app:titleTextColor="@color/themeAccent">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/toolbar_layout_timer" android:id="@+id/toolbar_layout_timer"
+23 -30
View File
@@ -16,33 +16,34 @@
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/radar_sat_name" android:id="@+id/radar_azimuth"
style="@style/RadarText"
android:text="@string/card_sat_name"
app:layout_constraintStart_toStartOf="@+id/radar_aos"
app:layout_constraintTop_toTopOf="@+id/radar_maxEl" />
<TextView
android:id="@+id/radar_maxEl"
style="@style/RadarText"
android:layout_marginEnd="4dp"
android:text="@string/card_max_el"
app:layout_constraintEnd_toEndOf="@+id/radar_sky_frame"
app:layout_constraintTop_toTopOf="@+id/radar_sky_frame" />
<TextView
android:id="@+id/radar_aos"
style="@style/RadarText" style="@style/RadarText"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:text="@string/card_pass_aos_time" android:text="@string/radar_azimuth"
app:layout_constraintBottom_toBottomOf="@+id/radar_sky_frame" app:layout_constraintBottom_toBottomOf="@+id/radar_sky_frame"
app:layout_constraintStart_toStartOf="@+id/radar_sky_frame" /> app:layout_constraintStart_toStartOf="@+id/radar_sky_frame" />
<TextView <TextView
android:id="@+id/radar_los" android:id="@+id/radar_elevation"
style="@style/RadarText" style="@style/RadarText"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
android:text="@string/card_pass_los_time" android:text="@string/radar_elevation"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/radar_sky_frame" />
<TextView
android:id="@+id/radar_altitude"
style="@style/RadarText"
android:layout_marginStart="4dp"
android:text="@string/radar_altitude"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/radar_sky_frame" />
<TextView
android:id="@+id/radar_range"
style="@style/RadarText"
android:layout_marginEnd="4dp"
android:text="@string/radar_range"
app:layout_constraintBottom_toBottomOf="@+id/radar_sky_frame" app:layout_constraintBottom_toBottomOf="@+id/radar_sky_frame"
app:layout_constraintEnd_toEndOf="@+id/radar_sky_frame" /> app:layout_constraintEnd_toEndOf="@+id/radar_sky_frame" />
@@ -53,24 +54,16 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/radar_trans_header" />
<TextView
android:id="@+id/radar_trans_header"
style="@style/RadarText"
android:text="@string/trans_header"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/radar_sky_frame" /> app:layout_constraintTop_toBottomOf="@+id/radar_sky_frame" />
<TextView <TextView
android:id="@+id/radar_trans_no_found" android:id="@+id/radar_no_trans"
style="@style/RadarText" style="@style/RadarText"
android:layout_marginTop="8dp"
android:text="@string/no_trans" android:text="@string/no_trans"
android:visibility="invisible" android:visibility="invisible"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/radar_trans_header" /> app:layout_constraintTop_toBottomOf="@+id/radar_sky_frame" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
+5
View File
@@ -27,6 +27,11 @@
<string name="card_pass_aos_time">AOS - 13:14:15</string> <string name="card_pass_aos_time">AOS - 13:14:15</string>
<string name="card_pass_los_time">LOS - 16:17:18</string> <string name="card_pass_los_time">LOS - 16:17:18</string>
<string name="radar_azimuth">Azimuth: 180.00°</string>
<string name="radar_elevation">Elevation: 75.50°</string>
<string name="radar_altitude">Altitude: 850 km</string>
<string name="radar_range">Range: 12000 km</string>
<string name="btn_ok">OK</string> <string name="btn_ok">OK</string>
<string name="btn_cancel">Cancel</string> <string name="btn_cancel">Cancel</string>
<string name="btn_clear">Clear All</string> <string name="btn_clear">Clear All</string>
+4 -2
View File
@@ -88,13 +88,15 @@
<style name="RadarText"> <style name="RadarText">
<item name="android:layout_width">wrap_content</item> <item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item> <item name="android:layout_height">wrap_content</item>
<item name="android:textSize">14sp</item> <item name="android:textColor">@color/lightOnDark</item>
<item name="android:textSize">15sp</item>
</style> </style>
<style name="CardTransText"> <style name="CardTransText">
<item name="android:layout_width">wrap_content</item> <item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item> <item name="android:layout_height">wrap_content</item>
<item name="android:textSize">16sp</item> <item name="android:textColor">@color/lightOnDark</item>
<item name="android:textSize">15sp</item>
</style> </style>
</resources> </resources>
+1 -1
View File
@@ -8,7 +8,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.5.2' classpath 'com.android.tools.build:gradle:3.5.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
} }
} }