mirror of
https://github.com/rt-bishop/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
v4.0.1 - Hotfix for RadarScreen track projection display
This commit is contained in:
1 parent
6aa455490b
commit
a6a59877a8
4 files changed
+109
-103
No files matched your search
@@ -17,6 +17,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v5
|
uses: actions/setup-java@v5
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ android {
|
|||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId = "com.rtbishop.look4sat"
|
applicationId = "com.rtbishop.look4sat"
|
||||||
minSdk = 24
|
minSdk = 24
|
||||||
versionCode = 400
|
versionCode = 401
|
||||||
versionName = "4.0.0"
|
versionName = "4.0.1"
|
||||||
}
|
}
|
||||||
buildFeatures {
|
buildFeatures {
|
||||||
compose = true
|
compose = true
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ import com.rtbishop.look4sat.domain.model.SatRadio
|
|||||||
import com.rtbishop.look4sat.domain.utility.toDegrees
|
import com.rtbishop.look4sat.domain.utility.toDegrees
|
||||||
import com.rtbishop.look4sat.presentation.MainTheme
|
import com.rtbishop.look4sat.presentation.MainTheme
|
||||||
import com.rtbishop.look4sat.presentation.Screen
|
import com.rtbishop.look4sat.presentation.Screen
|
||||||
|
import com.rtbishop.look4sat.presentation.common.EmptyListCard
|
||||||
import com.rtbishop.look4sat.presentation.common.IconCard
|
import com.rtbishop.look4sat.presentation.common.IconCard
|
||||||
import com.rtbishop.look4sat.presentation.common.NextPassRow
|
import com.rtbishop.look4sat.presentation.common.NextPassRow
|
||||||
import com.rtbishop.look4sat.presentation.common.TimerRow
|
import com.rtbishop.look4sat.presentation.common.TimerRow
|
||||||
@@ -115,49 +116,56 @@ private fun RadarScreen(uiState: RadarState, navigateUp: () -> Unit) {
|
|||||||
if(isVerticalLayout()) {
|
if(isVerticalLayout()) {
|
||||||
ElevatedCard(modifier = Modifier.weight(1f)) {
|
ElevatedCard(modifier = Modifier.weight(1f)) {
|
||||||
Box(contentAlignment = Alignment.Center) {
|
Box(contentAlignment = Alignment.Center) {
|
||||||
RadarViewCompose(
|
if (uiState.orbitalPos == null) {
|
||||||
item = uiState.orbitalPos,
|
ElevatedCard(modifier = Modifier.fillMaxSize()) {
|
||||||
items = uiState.satTrack,
|
EmptyListCard(message = "")
|
||||||
azimElev = uiState.orientationValues,
|
|
||||||
shouldShowSweep = uiState.shouldShowSweep,
|
|
||||||
shouldUseCompass = uiState.shouldUseCompass,
|
|
||||||
modifier = Modifier.align(Alignment.Center)
|
|
||||||
)
|
|
||||||
Column(
|
|
||||||
verticalArrangement = Arrangement.SpaceBetween,
|
|
||||||
modifier = Modifier
|
|
||||||
.fillMaxSize()
|
|
||||||
.padding(horizontal = 6.dp, vertical = 4.dp)
|
|
||||||
) {
|
|
||||||
Row(
|
|
||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
|
||||||
modifier = Modifier.fillMaxWidth()
|
|
||||||
) {
|
|
||||||
RadarTextTop(
|
|
||||||
uiState.orbitalPos?.azimuth ?: 0.0,
|
|
||||||
stringResource(R.string.radar_az_text),
|
|
||||||
true
|
|
||||||
)
|
|
||||||
RadarTextTop(
|
|
||||||
uiState.orbitalPos?.elevation ?: 0.0,
|
|
||||||
stringResource(R.string.radar_el_text),
|
|
||||||
false
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
Row(
|
}
|
||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
uiState.orbitalPos?.let { position ->
|
||||||
modifier = Modifier.fillMaxWidth()
|
RadarViewCompose(
|
||||||
|
item = position,
|
||||||
|
items = uiState.satTrack,
|
||||||
|
azimElev = uiState.orientationValues,
|
||||||
|
shouldShowSweep = uiState.shouldShowSweep,
|
||||||
|
shouldUseCompass = uiState.shouldUseCompass,
|
||||||
|
modifier = Modifier.align(Alignment.Center)
|
||||||
|
)
|
||||||
|
Column(
|
||||||
|
verticalArrangement = Arrangement.SpaceBetween,
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxSize()
|
||||||
|
.padding(horizontal = 6.dp, vertical = 4.dp)
|
||||||
) {
|
) {
|
||||||
RadarTextBottom(
|
Row(
|
||||||
uiState.orbitalPos?.altitude ?: 0.0,
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
stringResource(R.string.radar_alt_text),
|
modifier = Modifier.fillMaxWidth()
|
||||||
true
|
) {
|
||||||
)
|
RadarTextTop(
|
||||||
RadarTextBottom(
|
position.azimuth,
|
||||||
uiState.orbitalPos?.distance ?: 0.0,
|
stringResource(R.string.radar_az_text),
|
||||||
stringResource(R.string.radar_dist_text),
|
true
|
||||||
false
|
)
|
||||||
)
|
RadarTextTop(
|
||||||
|
position.elevation,
|
||||||
|
stringResource(R.string.radar_el_text),
|
||||||
|
false
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Row(
|
||||||
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
|
modifier = Modifier.fillMaxWidth()
|
||||||
|
) {
|
||||||
|
RadarTextBottom(
|
||||||
|
position.altitude,
|
||||||
|
stringResource(R.string.radar_alt_text),
|
||||||
|
true
|
||||||
|
)
|
||||||
|
RadarTextBottom(
|
||||||
|
position.distance,
|
||||||
|
stringResource(R.string.radar_dist_text),
|
||||||
|
false
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -192,49 +200,56 @@ private fun RadarScreen(uiState: RadarState, navigateUp: () -> Unit) {
|
|||||||
Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) {
|
Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) {
|
||||||
ElevatedCard(modifier = Modifier.weight(1f)) {
|
ElevatedCard(modifier = Modifier.weight(1f)) {
|
||||||
Box(contentAlignment = Alignment.Center) {
|
Box(contentAlignment = Alignment.Center) {
|
||||||
RadarViewCompose(
|
if (uiState.orbitalPos == null) {
|
||||||
item = uiState.orbitalPos,
|
ElevatedCard(modifier = Modifier.fillMaxSize()) {
|
||||||
items = uiState.satTrack,
|
EmptyListCard(message = "")
|
||||||
azimElev = uiState.orientationValues,
|
|
||||||
shouldShowSweep = uiState.shouldShowSweep,
|
|
||||||
shouldUseCompass = false,
|
|
||||||
modifier = Modifier.align(Alignment.Center)
|
|
||||||
)
|
|
||||||
Column(
|
|
||||||
verticalArrangement = Arrangement.SpaceBetween,
|
|
||||||
modifier = Modifier
|
|
||||||
.fillMaxSize()
|
|
||||||
.padding(horizontal = 6.dp, vertical = 4.dp)
|
|
||||||
) {
|
|
||||||
Row(
|
|
||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
|
||||||
modifier = Modifier.fillMaxWidth()
|
|
||||||
) {
|
|
||||||
RadarTextTop(
|
|
||||||
uiState.orbitalPos?.azimuth ?: 0.0,
|
|
||||||
stringResource(R.string.radar_az_text),
|
|
||||||
true
|
|
||||||
)
|
|
||||||
RadarTextTop(
|
|
||||||
uiState.orbitalPos?.elevation ?: 0.0,
|
|
||||||
stringResource(R.string.radar_el_text),
|
|
||||||
false
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
Row(
|
}
|
||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
uiState.orbitalPos?.let { position ->
|
||||||
modifier = Modifier.fillMaxWidth()
|
RadarViewCompose(
|
||||||
|
item = position,
|
||||||
|
items = uiState.satTrack,
|
||||||
|
azimElev = uiState.orientationValues,
|
||||||
|
shouldShowSweep = uiState.shouldShowSweep,
|
||||||
|
shouldUseCompass = false,
|
||||||
|
modifier = Modifier.align(Alignment.Center)
|
||||||
|
)
|
||||||
|
Column(
|
||||||
|
verticalArrangement = Arrangement.SpaceBetween,
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxSize()
|
||||||
|
.padding(horizontal = 6.dp, vertical = 4.dp)
|
||||||
) {
|
) {
|
||||||
RadarTextBottom(
|
Row(
|
||||||
uiState.orbitalPos?.altitude ?: 0.0,
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
stringResource(R.string.radar_alt_text),
|
modifier = Modifier.fillMaxWidth()
|
||||||
true
|
) {
|
||||||
)
|
RadarTextTop(
|
||||||
RadarTextBottom(
|
position.azimuth,
|
||||||
uiState.orbitalPos?.distance ?: 0.0,
|
stringResource(R.string.radar_az_text),
|
||||||
stringResource(R.string.radar_dist_text),
|
true
|
||||||
false
|
)
|
||||||
)
|
RadarTextTop(
|
||||||
|
position.elevation,
|
||||||
|
stringResource(R.string.radar_el_text),
|
||||||
|
false
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Row(
|
||||||
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
|
modifier = Modifier.fillMaxWidth()
|
||||||
|
) {
|
||||||
|
RadarTextBottom(
|
||||||
|
position.altitude,
|
||||||
|
stringResource(R.string.radar_alt_text),
|
||||||
|
true
|
||||||
|
)
|
||||||
|
RadarTextBottom(
|
||||||
|
position.distance,
|
||||||
|
stringResource(R.string.radar_dist_text),
|
||||||
|
false
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
*/
|
*/
|
||||||
package com.rtbishop.look4sat.presentation.radar
|
package com.rtbishop.look4sat.presentation.radar
|
||||||
|
|
||||||
import android.media.SoundPool
|
|
||||||
import androidx.compose.animation.core.animateFloat
|
import androidx.compose.animation.core.animateFloat
|
||||||
import androidx.compose.animation.core.infiniteRepeatable
|
import androidx.compose.animation.core.infiniteRepeatable
|
||||||
import androidx.compose.animation.core.rememberInfiniteTransition
|
import androidx.compose.animation.core.rememberInfiniteTransition
|
||||||
@@ -27,7 +26,6 @@ import androidx.compose.foundation.layout.aspectRatio
|
|||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.mutableFloatStateOf
|
import androidx.compose.runtime.mutableFloatStateOf
|
||||||
import androidx.compose.runtime.mutableIntStateOf
|
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
@@ -44,8 +42,6 @@ import androidx.compose.ui.graphics.drawscope.Fill
|
|||||||
import androidx.compose.ui.graphics.drawscope.Stroke
|
import androidx.compose.ui.graphics.drawscope.Stroke
|
||||||
import androidx.compose.ui.graphics.drawscope.rotate
|
import androidx.compose.ui.graphics.drawscope.rotate
|
||||||
import androidx.compose.ui.graphics.drawscope.translate
|
import androidx.compose.ui.graphics.drawscope.translate
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.platform.LocalView
|
|
||||||
import androidx.compose.ui.text.TextMeasurer
|
import androidx.compose.ui.text.TextMeasurer
|
||||||
import androidx.compose.ui.text.TextStyle
|
import androidx.compose.ui.text.TextStyle
|
||||||
import androidx.compose.ui.text.drawText
|
import androidx.compose.ui.text.drawText
|
||||||
@@ -59,15 +55,15 @@ import kotlin.math.sin
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun RadarViewCompose(
|
fun RadarViewCompose(
|
||||||
item: OrbitalPos?,
|
item: OrbitalPos,
|
||||||
items: List<OrbitalPos>,
|
items: List<OrbitalPos>,
|
||||||
azimElev: Pair<Float, Float>,
|
azimElev: Pair<Float, Float>,
|
||||||
shouldShowSweep: Boolean,
|
shouldShowSweep: Boolean,
|
||||||
shouldUseCompass: Boolean,
|
shouldUseCompass: Boolean,
|
||||||
modifier: Modifier = Modifier
|
modifier: Modifier = Modifier
|
||||||
) {
|
) {
|
||||||
val context = LocalContext.current
|
// val context = LocalContext.current
|
||||||
val view = LocalView.current
|
// val view = LocalView.current
|
||||||
val radarColor = MaterialTheme.colorScheme.secondary
|
val radarColor = MaterialTheme.colorScheme.secondary
|
||||||
val trackColor = MaterialTheme.colorScheme.primary
|
val trackColor = MaterialTheme.colorScheme.primary
|
||||||
val aimColor = MaterialTheme.colorScheme.error
|
val aimColor = MaterialTheme.colorScheme.error
|
||||||
@@ -75,15 +71,15 @@ fun RadarViewCompose(
|
|||||||
val animTransition = rememberInfiniteTransition(label = "animScale")
|
val animTransition = rememberInfiniteTransition(label = "animScale")
|
||||||
val animSpec = infiniteRepeatable<Float>(tween(1000))
|
val animSpec = infiniteRepeatable<Float>(tween(1000))
|
||||||
val animScale = animTransition.animateFloat(16f, 64f, animSpec, label = "animScale")
|
val animScale = animTransition.animateFloat(16f, 64f, animSpec, label = "animScale")
|
||||||
val aimThreshold = 0.05f
|
// val aimThreshold = 0.05f
|
||||||
val measurer = rememberTextMeasurer()
|
val measurer = rememberTextMeasurer()
|
||||||
val sweepDegrees = remember { mutableFloatStateOf(0f) }
|
val sweepDegrees = remember { mutableFloatStateOf(0f) }
|
||||||
val trackCreated = remember { mutableStateOf(false) }
|
val trackCreated = remember { mutableStateOf(false) }
|
||||||
val trackPath = remember { mutableStateOf(Path()) }
|
val trackPath = remember { mutableStateOf(Path()) }
|
||||||
val trackEffect = remember { mutableStateOf(PathEffect.cornerPathEffect(0f)) }
|
val trackEffect = remember { mutableStateOf(PathEffect.cornerPathEffect(0f)) }
|
||||||
val soundPool = remember { mutableStateOf<SoundPool?>(null) }
|
// val soundPool = remember { mutableStateOf<SoundPool?>(null) }
|
||||||
val beepSoundId = remember { mutableIntStateOf(0) }
|
// val beepSoundId = remember { mutableIntStateOf(0) }
|
||||||
val aimTargetDifference = remember { mutableFloatStateOf(0f) }
|
// val aimTargetDifference = remember { mutableFloatStateOf(0f) }
|
||||||
|
|
||||||
// LaunchedEffect(item.azimuth, item.elevation, azimElev.first, azimElev.second) {
|
// LaunchedEffect(item.azimuth, item.elevation, azimElev.first, azimElev.second) {
|
||||||
// val aimAzimuthRadians = azimElev.first.toDouble().toRadians()
|
// val aimAzimuthRadians = azimElev.first.toDouble().toRadians()
|
||||||
@@ -95,13 +91,10 @@ fun RadarViewCompose(
|
|||||||
// val satX = sph2CartX(item.azimuth, item.elevation, radius)
|
// val satX = sph2CartX(item.azimuth, item.elevation, radius)
|
||||||
// val satY = sph2CartY(item.azimuth, item.elevation, radius)
|
// val satY = sph2CartY(item.azimuth, item.elevation, radius)
|
||||||
// aimTargetDifference.floatValue = sqrt((satX - aimX).pow(2) + (satY - aimY).pow(2))
|
// aimTargetDifference.floatValue = sqrt((satX - aimX).pow(2) + (satY - aimY).pow(2))
|
||||||
//
|
|
||||||
//
|
|
||||||
// val minPlaybackRate = 0.5f
|
// val minPlaybackRate = 0.5f
|
||||||
// val maxPlaybackRate = 2.0f
|
// val maxPlaybackRate = 2.0f
|
||||||
// val playbackRate =
|
// val playbackRate =
|
||||||
// maxPlaybackRate - (aimTargetDifference.floatValue / (maxPlaybackRate - minPlaybackRate))
|
// maxPlaybackRate - (aimTargetDifference.floatValue / (maxPlaybackRate - minPlaybackRate))
|
||||||
//
|
|
||||||
// soundPool.value?.setRate(beepSoundId.intValue, playbackRate)
|
// soundPool.value?.setRate(beepSoundId.intValue, playbackRate)
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
@@ -127,20 +120,16 @@ fun RadarViewCompose(
|
|||||||
// .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
|
// .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
|
||||||
// .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
|
// .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
|
||||||
// .build()
|
// .build()
|
||||||
//
|
|
||||||
// soundPool.value = SoundPool.Builder()
|
// soundPool.value = SoundPool.Builder()
|
||||||
// .setMaxStreams(1)
|
// .setMaxStreams(1)
|
||||||
// .setAudioAttributes(audioAttributes)
|
// .setAudioAttributes(audioAttributes)
|
||||||
// .build()
|
// .build()
|
||||||
//
|
|
||||||
// beepSoundId.intValue = soundPool.value?.load(context, R.raw.beep, 1) ?: 0
|
// beepSoundId.intValue = soundPool.value?.load(context, R.raw.beep, 1) ?: 0
|
||||||
//
|
|
||||||
// soundPool.value?.setOnLoadCompleteListener { soundPool, _, status ->
|
// soundPool.value?.setOnLoadCompleteListener { soundPool, _, status ->
|
||||||
// if (status == 0) {
|
// if (status == 0) {
|
||||||
// soundPool.play(beepSoundId.intValue, 0.5f, 0.5f, 0, -1, 1f)
|
// soundPool.play(beepSoundId.intValue, 0.5f, 0.5f, 0, -1, 1f)
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
// onDispose {
|
// onDispose {
|
||||||
// soundPool.value?.release()
|
// soundPool.value?.release()
|
||||||
// }
|
// }
|
||||||
@@ -161,7 +150,7 @@ fun RadarViewCompose(
|
|||||||
drawInfo(radius, trackColor, measurer, 3)
|
drawInfo(radius, trackColor, measurer, 3)
|
||||||
translate(center.x, center.y) {
|
translate(center.x, center.y) {
|
||||||
drawTrack(trackPath.value, trackEffect.value, aimColor, trackColor)
|
drawTrack(trackPath.value, trackEffect.value, aimColor, trackColor)
|
||||||
if (item != null && item.elevation > 0) {
|
if (item.elevation > 0) {
|
||||||
drawPosition(item, radius, animScale.value, trackColor)
|
drawPosition(item, radius, animScale.value, trackColor)
|
||||||
}
|
}
|
||||||
if (shouldUseCompass) {
|
if (shouldUseCompass) {
|
||||||
|
|||||||
Reference in new issue
Block a user