mirror of
https://github.com/atsunatsu/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
feat(passes/radar): port pass history + compass calibration, cumulative what's new
- Pass history (Iu-yang1 fork): PassesSettings.hoursBefore look-back window; second 'Time before' slider in the pass filter; completed passes stay listed (progress clamped to [0,1]) in the history window. - Compass calibration (Iu-yang1 fork): OtherSettings.compassOffsetDegrees, CompassAccuracy from the magnetic sensor, calibration dialog with figure-eight accuracy meter, corrected heading and manual offset field; RadarViewModel applies the offset. - What's New dialog now shows the cumulative 4.4.6->4.4.7 changelog and follows the system language (values/ + values-zh/). - pass_filter_history_hours localized in es/ru/si/tr/uk.
This commit is contained in:
1 parent
3591960d55
commit
bf492e3f8b
20 files changed
+363
-29
No files matched your search
@@ -76,9 +76,11 @@ class SatelliteRepo(
|
||||
.collect { selectedIds ->
|
||||
_satellites.update { localStorage.getEntriesWithIds(selectedIds) }
|
||||
val settings = settingsRepo.passesSettings.value
|
||||
val now = System.currentTimeMillis()
|
||||
// 历史过境: 回看窗口 hoursBefore 小时, 过境列表从更早时间开始计算.
|
||||
calculatePasses(
|
||||
time = System.currentTimeMillis(),
|
||||
hoursAhead = settings.hoursAhead,
|
||||
time = now - settings.hoursBefore * 60L * 60L * 1000L,
|
||||
hoursAhead = settings.hoursBefore + settings.hoursAhead,
|
||||
minElevation = settings.minElevation,
|
||||
aosStartMinute = settings.aosStartMinute,
|
||||
aosEndMinute = settings.aosEndMinute,
|
||||
|
||||
@@ -27,6 +27,7 @@ import android.view.Display
|
||||
import android.view.Surface
|
||||
import com.rtbishop.look4sat.core.domain.predict.GeoPos
|
||||
import com.rtbishop.look4sat.core.domain.predict.RAD2DEG
|
||||
import com.rtbishop.look4sat.core.domain.repository.CompassAccuracy
|
||||
import com.rtbishop.look4sat.core.domain.repository.ISensorsRepo
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
@@ -41,7 +42,12 @@ class SensorsRepo(
|
||||
) : ISensorsRepo, SensorEventListener {
|
||||
|
||||
private val _sensorData = MutableStateFlow(Pair(0f, 0f))
|
||||
private val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)
|
||||
private val rotationSensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR)
|
||||
private val magneticSensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
|
||||
private val _compassAccuracy = MutableStateFlow(
|
||||
if (rotationSensor == null || magneticSensor == null) CompassAccuracy.UNAVAILABLE
|
||||
else CompassAccuracy.UNRELIABLE
|
||||
)
|
||||
private val rotationMatrix = FloatArray(9)
|
||||
private val tempMatrix = FloatArray(9)
|
||||
private val orientationValues = FloatArray(3)
|
||||
@@ -50,6 +56,7 @@ class SensorsRepo(
|
||||
private var hasInitialReading = false
|
||||
|
||||
override val sensorData: StateFlow<Pair<Float, Float>> = _sensorData
|
||||
override val compassAccuracy: StateFlow<CompassAccuracy> = _compassAccuracy
|
||||
|
||||
override fun getMagDeclination(geoPos: GeoPos, time: Long): Float {
|
||||
return GeomagneticField(
|
||||
@@ -62,15 +69,41 @@ class SensorsRepo(
|
||||
|
||||
override fun enableSensor() {
|
||||
hasInitialReading = false
|
||||
sensor?.let { sensorManager.registerListener(this, it, SENSOR_RATE_US) }
|
||||
if (rotationSensor == null || magneticSensor == null) {
|
||||
_compassAccuracy.value = CompassAccuracy.UNAVAILABLE
|
||||
return
|
||||
}
|
||||
_compassAccuracy.value = CompassAccuracy.UNRELIABLE
|
||||
val rotationRegistered = sensorManager.registerListener(this, rotationSensor, SENSOR_RATE_US)
|
||||
val magneticRegistered = sensorManager.registerListener(this, magneticSensor, SENSOR_RATE_US)
|
||||
if (!rotationRegistered || !magneticRegistered) {
|
||||
sensorManager.unregisterListener(this)
|
||||
_compassAccuracy.value = CompassAccuracy.UNAVAILABLE
|
||||
}
|
||||
}
|
||||
|
||||
override fun disableSensor() = sensorManager.unregisterListener(this)
|
||||
|
||||
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) = Unit
|
||||
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
|
||||
if (sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
|
||||
updateAccuracy(accuracy)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onSensorChanged(event: SensorEvent) {
|
||||
if (event.sensor.type == Sensor.TYPE_ROTATION_VECTOR) handleSensorEvent(event)
|
||||
when (event.sensor.type) {
|
||||
Sensor.TYPE_ROTATION_VECTOR -> handleSensorEvent(event)
|
||||
Sensor.TYPE_MAGNETIC_FIELD -> updateAccuracy(event.accuracy)
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateAccuracy(accuracy: Int) {
|
||||
_compassAccuracy.value = when (accuracy) {
|
||||
SensorManager.SENSOR_STATUS_ACCURACY_HIGH -> CompassAccuracy.HIGH
|
||||
SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM -> CompassAccuracy.MEDIUM
|
||||
SensorManager.SENSOR_STATUS_ACCURACY_LOW -> CompassAccuracy.LOW
|
||||
else -> CompassAccuracy.UNRELIABLE
|
||||
}
|
||||
}
|
||||
|
||||
private fun getDisplayRotation(): Int {
|
||||
|
||||
@@ -58,6 +58,7 @@ class SettingsRepo(
|
||||
private val keyBluetoothFrequencyFormat = "bluetoothFrequencyFormat"
|
||||
private val keyFilterShowDeepSpace = "filterShowDeepSpace"
|
||||
private val keyFilterHoursAhead = "filterHoursAhead"
|
||||
private val keyFilterHoursBefore = "filterHoursBefore"
|
||||
private val keyFilterMinElevation = "filterMinElevation"
|
||||
private val keyFilterAosStartMinute = "filterAosStartMinute"
|
||||
private val keyFilterAosEndMinute = "filterAosEndMinute"
|
||||
@@ -79,6 +80,7 @@ class SettingsRepo(
|
||||
private val keyStateOfAutoUpdate = "stateOfAutoUpdate"
|
||||
private val keyStateOfAutoLotwSync = "stateOfAutoLotwSync"
|
||||
private val keyStateOfSensors = "stateOfSensors"
|
||||
private val keyCompassOffsetDegrees = "compassOffsetDegrees"
|
||||
private val keyStateOfSweep = "stateOfSweep"
|
||||
private val keyStateOfUtc = "stateOfUtc"
|
||||
private val keyStateOfLightTheme = "stateOfLightTheme"
|
||||
@@ -318,6 +320,7 @@ class SettingsRepo(
|
||||
override fun setPassesSettings(settings: PassesSettings) = preferences.edit {
|
||||
putBoolean(keyFilterShowDeepSpace, settings.showDeepSpace)
|
||||
putInt(keyFilterHoursAhead, settings.hoursAhead)
|
||||
putInt(keyFilterHoursBefore, settings.hoursBefore)
|
||||
putLong(keyFilterMinElevation, settings.minElevation.toRawBits())
|
||||
putInt(keyFilterAosStartMinute, settings.aosStartMinute)
|
||||
putInt(keyFilterAosEndMinute, settings.aosEndMinute)
|
||||
@@ -329,6 +332,7 @@ class SettingsRepo(
|
||||
private fun getPassesSettings(): PassesSettings {
|
||||
val showDeepSpace = preferences.getBoolean(keyFilterShowDeepSpace, true)
|
||||
val hoursAhead = preferences.getInt(keyFilterHoursAhead, 24)
|
||||
val hoursBefore = preferences.getInt(keyFilterHoursBefore, 0).coerceIn(0, 240)
|
||||
val minElevation = Double.fromBits(preferences.getLong(keyFilterMinElevation, 16.0.toRawBits()))
|
||||
val aosStartMinute = preferences.getInt(keyFilterAosStartMinute, 0).coerceIn(0, 23 * 60 + 59)
|
||||
val aosEndMinute = preferences.getInt(keyFilterAosEndMinute, 23 * 60 + 59).coerceIn(0, 23 * 60 + 59)
|
||||
@@ -342,7 +346,8 @@ class SettingsRepo(
|
||||
aosStartMinute,
|
||||
aosEndMinute,
|
||||
invertAosTimeWindow,
|
||||
selectedModes
|
||||
selectedModes,
|
||||
hoursBefore
|
||||
)
|
||||
}
|
||||
//endregion
|
||||
@@ -542,6 +547,7 @@ class SettingsRepo(
|
||||
putBoolean(keyStateOfAutoUpdate, new.stateOfAutoUpdate)
|
||||
putBoolean(keyStateOfAutoLotwSync, new.stateOfAutoLotwSync)
|
||||
putBoolean(keyStateOfSensors, new.stateOfSensors)
|
||||
putFloat(keyCompassOffsetDegrees, new.compassOffsetDegrees.coerceIn(-180f, 180f))
|
||||
putBoolean(keyStateOfSweep, new.stateOfSweep)
|
||||
putBoolean(keyStateOfUtc, new.stateOfUtc)
|
||||
putBoolean(keyStateOfLightTheme, new.stateOfLightTheme)
|
||||
@@ -562,6 +568,7 @@ class SettingsRepo(
|
||||
stateOfAutoUpdate = preferences.getBoolean(keyStateOfAutoUpdate, true),
|
||||
stateOfAutoLotwSync = preferences.getBoolean(keyStateOfAutoLotwSync, true),
|
||||
stateOfSensors = preferences.getBoolean(keyStateOfSensors, true),
|
||||
compassOffsetDegrees = preferences.getFloat(keyCompassOffsetDegrees, 0f).coerceIn(-180f, 180f),
|
||||
stateOfSweep = preferences.getBoolean(keyStateOfSweep, true),
|
||||
stateOfUtc = preferences.getBoolean(keyStateOfUtc, false),
|
||||
stateOfLightTheme = preferences.getBoolean(keyStateOfLightTheme, false),
|
||||
|
||||
Reference in new issue
Block a user