mirror of
https://github.com/atsunatsu/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
Now showing satellite current azimuth, elevation, altitude and range in RadarFragment
This commit is contained in:
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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"
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user