Merge pull request #30 from tekk/master

Added Doppler frequency shift calculations
This commit is contained in:
Arty Bishop authored and GitHub committed 2020-09-18 11:58:10 +01:00
commit c30407cf12
8 files changed
+137 -24

No files matched your search

@@ -27,10 +27,17 @@ import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.R import com.rtbishop.look4sat.R
import com.rtbishop.look4sat.data.Transmitter import com.rtbishop.look4sat.data.Transmitter
import com.rtbishop.look4sat.databinding.ItemTransmitterBinding import com.rtbishop.look4sat.databinding.ItemTransmitterBinding
import com.rtbishop.look4sat.utility.PassPredictor
import java.util.*
class TransmitterAdapter : RecyclerView.Adapter<TransmitterAdapter.TransmitterHolder>() { class TransmitterAdapter : RecyclerView.Adapter<TransmitterAdapter.TransmitterHolder>() {
private var transmittersList = emptyList<Transmitter>() private var transmittersList = emptyList<Transmitter>()
private lateinit var predictor: PassPredictor
fun setPredictor(predict: PassPredictor) {
predictor = predict
}
fun setList(list: List<Transmitter>) { fun setList(list: List<Transmitter>) {
transmittersList = list transmittersList = list
@@ -65,6 +72,11 @@ class TransmitterAdapter : RecyclerView.Adapter<TransmitterAdapter.TransmitterHo
context.getString(R.string.trans_down_low), context.getString(R.string.trans_down_low),
transmitter.downlinkLow / freqDivider transmitter.downlinkLow / freqDivider
) )
binding.transDownlinkDoppler.text = String
.format(
context.getString(R.string.trans_down_low_doppler),
predictor.getDownlinkFreq(transmitter.downlinkLow, Date()) / freqDivider
)
} else if (transmitter.downlinkLow != null && transmitter.downlinkHigh != null) { } else if (transmitter.downlinkLow != null && transmitter.downlinkHigh != null) {
binding.transDownlink.text = String binding.transDownlink.text = String
.format( .format(
@@ -72,8 +84,15 @@ class TransmitterAdapter : RecyclerView.Adapter<TransmitterAdapter.TransmitterHo
transmitter.downlinkLow / freqDivider, transmitter.downlinkLow / freqDivider,
transmitter.downlinkHigh / freqDivider transmitter.downlinkHigh / freqDivider
) )
binding.transDownlinkDoppler.text = String
.format(
context.getString(R.string.trans_down_lowHigh_doppler),
predictor.getDownlinkFreq(transmitter.downlinkLow, Date()) / freqDivider,
predictor.getDownlinkFreq(transmitter.downlinkHigh, Date()) / freqDivider
)
} else { } else {
binding.transDownlink.text = context.getString(R.string.no_downlink) binding.transDownlink.text = context.getString(R.string.no_downlink)
binding.transDownlinkDoppler.text = context.getString(R.string.no_downlink_doppler)
} }
if (transmitter.uplinkLow != null && transmitter.uplinkHigh == null) { if (transmitter.uplinkLow != null && transmitter.uplinkHigh == null) {
@@ -81,14 +100,24 @@ class TransmitterAdapter : RecyclerView.Adapter<TransmitterAdapter.TransmitterHo
context.getString(R.string.trans_up_low), context.getString(R.string.trans_up_low),
transmitter.uplinkLow / freqDivider transmitter.uplinkLow / freqDivider
) )
binding.transUplinkDoppler.text = String.format(
context.getString(R.string.trans_up_low_doppler),
predictor.getUplinkFreq(transmitter.uplinkLow, Date()) / freqDivider
)
} else if (transmitter.uplinkLow != null && transmitter.uplinkHigh != null) { } else if (transmitter.uplinkLow != null && transmitter.uplinkHigh != null) {
binding.transUplink.text = String.format( binding.transUplink.text = String.format(
context.getString(R.string.trans_up_lowHigh), context.getString(R.string.trans_up_lowHigh),
transmitter.uplinkLow / freqDivider, transmitter.uplinkLow / freqDivider,
transmitter.uplinkHigh / freqDivider transmitter.uplinkHigh / freqDivider
) )
binding.transUplinkDoppler.text = String.format(
context.getString(R.string.trans_up_lowHigh_doppler),
predictor.getUplinkFreq(transmitter.uplinkLow, Date()) / freqDivider,
predictor.getUplinkFreq(transmitter.uplinkHigh, Date()) / freqDivider
)
} else { } else {
binding.transUplink.text = context.getString(R.string.no_uplink) binding.transUplink.text = context.getString(R.string.no_uplink)
binding.transUplinkDoppler.text = context.getString(R.string.no_uplink_doppler)
} }
if (transmitter.mode != null) { if (transmitter.mode != null) {
@@ -142,6 +142,7 @@ class PolarViewFragment : Fragment(R.layout.fragment_polar_view), SensorEventLis
private fun observeTransmitters() { private fun observeTransmitters() {
viewModel.getTransmittersForSat(satPass.tle.catnum).observe(viewLifecycleOwner, Observer { viewModel.getTransmittersForSat(satPass.tle.catnum).observe(viewLifecycleOwner, Observer {
if (it.isNotEmpty()) { if (it.isNotEmpty()) {
transmitterAdapter.setPredictor(satPass.predictor)
transmitterAdapter.setList(it) transmitterAdapter.setList(it)
transmitterAdapter.notifyDataSetChanged() transmitterAdapter.notifyDataSetChanged()
binding.recPolar.visibility = View.VISIBLE binding.recPolar.visibility = View.VISIBLE
@@ -159,6 +160,7 @@ class PolarViewFragment : Fragment(R.layout.fragment_polar_view), SensorEventLis
while (true) { while (true) {
setPassText() setPassText()
polarView?.invalidate() polarView?.invalidate()
transmitterAdapter.notifyDataSetChanged()
delay(rate) delay(rate)
} }
} }
+7
View File
@@ -0,0 +1,7 @@
<vector android:height="24dp" android:viewportHeight="100"
android:viewportWidth="100" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFE082" android:pathData="M63.5,45.5c-2.485,0 -4.5,2.015 -4.5,4.5c0,2.485 2.015,4.5 4.5,4.5S68,52.485 68,50C68,47.515 65.985,45.5 63.5,45.5L63.5,45.5z"/>
<path android:fillColor="#FFE082" android:pathData="M54.5,23c14.888,0 27,12.112 27,27s-12.112,27 -27,27s-27,-12.112 -27,-27S39.612,23 54.5,23M54.5,18.5C37.103,18.5 23,32.603 23,50s14.103,31.5 31.5,31.5S86,67.397 86,50S71.897,18.5 54.5,18.5L54.5,18.5z"/>
<path android:fillColor="#FFE082" android:pathData="M50,9.5c22.332,0 40.5,18.168 40.5,40.5S72.332,90.5 50,90.5S9.5,72.332 9.5,50S27.668,9.5 50,9.5M50,5C25.147,5 5,25.147 5,50s20.147,45 45,45s45,-20.147 45,-45S74.853,5 50,5L50,5z"/>
<path android:fillColor="#FFE082" android:pathData="M59,36.5c7.444,0 13.5,6.056 13.5,13.5c0,7.444 -6.056,13.5 -13.5,13.5c-7.444,0 -13.5,-6.056 -13.5,-13.5C45.5,42.556 51.556,36.5 59,36.5M59,32c-9.941,0 -18,8.059 -18,18s8.059,18 18,18s18,-8.059 18,-18S68.941,32 59,32L59,32z"/>
</vector>
+85 -1
View File
@@ -57,6 +57,34 @@
app:layout_constraintStart_toEndOf="@+id/trans_img_uplink" app:layout_constraintStart_toEndOf="@+id/trans_img_uplink"
app:layout_constraintTop_toBottomOf="@+id/trans_downlink" /> app:layout_constraintTop_toBottomOf="@+id/trans_downlink" />
<View
android:id="@+id/separator"
android:layout_width="match_parent"
android:padding="15dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_height="1dp"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintTop_toBottomOf="@+id/trans_uplink"
android:background="#333"/>
<TextView
android:id="@+id/trans_downlink_doppler"
style="@style/CardTransText"
android:text="@string/trans_down_lowHigh_doppler"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/trans_img_downlink_doppler"
app:layout_constraintTop_toBottomOf="@+id/separator" />
<TextView
android:id="@+id/trans_uplink_doppler"
style="@style/CardTransText"
android:text="@string/trans_up_lowHigh_doppler"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/trans_img_uplink_doppler"
app:layout_constraintTop_toBottomOf="@+id/trans_downlink_doppler" />
<TextView <TextView
android:id="@+id/trans_mode" android:id="@+id/trans_mode"
style="@style/CardTransText" style="@style/CardTransText"
@@ -65,7 +93,7 @@
android:text="@string/trans_mode" android:text="@string/trans_mode"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/trans_uplink" /> app:layout_constraintTop_toBottomOf="@+id/trans_uplink_doppler" />
<TextView <TextView
android:id="@+id/trans_inverted" android:id="@+id/trans_inverted"
@@ -114,5 +142,61 @@
app:layout_constraintTop_toBottomOf="@+id/trans_downlink" app:layout_constraintTop_toBottomOf="@+id/trans_downlink"
app:srcCompat="@drawable/ic_arrow" /> app:srcCompat="@drawable/ic_arrow" />
<ImageView
android:id="@+id/trans_img_downlink_current"
android:layout_width="20dp"
android:layout_height="20dp"
android:contentDescription="@string/placeholder"
android:rotation="180"
app:layout_constraintBottom_toBottomOf="@+id/trans_downlink_doppler"
app:layout_constraintEnd_toStartOf="@+id/trans_img_downlink_doppler"
app:layout_constraintHorizontal_bias="1"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/trans_downlink_doppler"
app:srcCompat="@drawable/ic_arrow" />
<ImageView
android:id="@+id/trans_img_uplink_current"
android:layout_width="20dp"
android:layout_height="20dp"
android:contentDescription="@string/placeholder"
app:layout_constraintBottom_toBottomOf="@+id/trans_uplink_doppler"
app:layout_constraintEnd_toStartOf="@+id/trans_img_uplink_doppler"
app:layout_constraintHorizontal_bias="1"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/trans_downlink_doppler"
app:srcCompat="@drawable/ic_arrow" />
<ImageView
android:id="@+id/trans_img_downlink_doppler"
android:layout_width="20dp"
android:layout_height="20dp"
android:contentDescription="@string/placeholder"
android:rotation="180"
app:layout_constraintBottom_toBottomOf="@+id/trans_downlink_doppler"
app:layout_constraintEnd_toStartOf="@+id/trans_downlink_doppler"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/trans_downlink_doppler"
app:srcCompat="@drawable/ic_doppler" />
<ImageView
android:id="@+id/trans_img_uplink_doppler"
android:layout_width="20dp"
android:layout_height="20dp"
android:contentDescription="@string/placeholder"
app:layout_constraintBottom_toBottomOf="@+id/trans_uplink_doppler"
app:layout_constraintEnd_toStartOf="@+id/trans_uplink_doppler"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/trans_downlink_doppler"
app:srcCompat="@drawable/ic_doppler" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
+4
View File
@@ -92,6 +92,10 @@
<string name="trans_up_lowHigh">Восход.: %.4f - %.4f MHz</string> <string name="trans_up_lowHigh">Восход.: %.4f - %.4f MHz</string>
<string name="trans_down_low">Нисход.: %.4f MHz</string> <string name="trans_down_low">Нисход.: %.4f MHz</string>
<string name="trans_down_lowHigh">Нисход.: %.4f - %.4f MHz</string> <string name="trans_down_lowHigh">Нисход.: %.4f - %.4f MHz</string>
<string name="trans_up_low_doppler">Восход.: %.4f MHz</string>
<string name="trans_up_lowHigh_doppler">Восход.: %.4f - %.4f MHz</string>
<string name="trans_down_low_doppler">Нисход.: %.4f MHz</string>
<string name="trans_down_lowHigh_doppler">Нисход.: %.4f - %.4f MHz</string>
<string name="info_swipe_text">Проведите по экрану вниз, чтобы обновить список пролетов <string name="info_swipe_text">Проведите по экрану вниз, чтобы обновить список пролетов
для выбранных спутников</string> для выбранных спутников</string>
+6
View File
@@ -78,6 +78,8 @@
<string name="no_mode">Mode: null</string> <string name="no_mode">Mode: null</string>
<string name="no_uplink">Uplink: null</string> <string name="no_uplink">Uplink: null</string>
<string name="no_downlink">Downlink: null</string> <string name="no_downlink">Downlink: null</string>
<string name="no_uplink_doppler">Current uplink: null</string>
<string name="no_downlink_doppler">Current downlink: null</string>
<string name="no_trans">No transceivers found for this satellite</string> <string name="no_trans">No transceivers found for this satellite</string>
<string name="err_no_permissions">Missing permissions</string> <string name="err_no_permissions">Missing permissions</string>
@@ -108,6 +110,10 @@
<string name="trans_up_lowHigh">Uplink: %.4f - %.4f MHz</string> <string name="trans_up_lowHigh">Uplink: %.4f - %.4f MHz</string>
<string name="trans_down_low">Downlink: %.4f MHz</string> <string name="trans_down_low">Downlink: %.4f MHz</string>
<string name="trans_down_lowHigh">Downlink: %.4f - %.4f MHz</string> <string name="trans_down_lowHigh">Downlink: %.4f - %.4f MHz</string>
<string name="trans_up_low_doppler">Current uplink: %.4f MHz</string>
<string name="trans_up_lowHigh_doppler">Current uplink: %.4f - %.4f MHz</string>
<string name="trans_down_low_doppler">Current downlink: %.4f MHz</string>
<string name="trans_down_lowHigh_doppler">Current downlink: %.4f - %.4f MHz</string>
<string name="info_swipe_text"> <string name="info_swipe_text">
Swipe the screen to refresh the list of passes for selected satellites</string> Swipe the screen to refresh the list of passes for selected satellites</string>
+2 -1
View File
@@ -26,9 +26,10 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.6.3' classpath 'com.android.tools.build:gradle:4.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.2.2" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.2.2"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10"
} }
} }
+2 -22
View File
@@ -1,26 +1,6 @@
# #Thu Sep 17 13:43:53 CEST 2020
# Look4Sat. Amateur radio and weather satellite tracker and passes predictor for Android.
# Copyright (C) 2019, 2020 Arty Bishop (bishop.arty@gmail.com)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
#Mon Feb 24 22:26:03 GMT 2020
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
distributionSha256Sum=abc10bcedb58806e8654210f96031db541bcd2d6fc3161e81cb0572d6a15e821