Added rotator control function to PolarViewModel.kt

This commit is contained in:
Arty Bishop committed 2021-04-14 18:32:57 +01:00
1 parent 703dc17794
commit a205ebfa2b
2 files changed
+43 -9

No files matched your search

@@ -22,13 +22,13 @@ import com.rtbishop.look4sat.data.model.SatPass
import com.rtbishop.look4sat.data.model.SatTrans import com.rtbishop.look4sat.data.model.SatTrans
import com.rtbishop.look4sat.data.repository.PassesRepo import com.rtbishop.look4sat.data.repository.PassesRepo
import com.rtbishop.look4sat.data.repository.SatelliteRepo import com.rtbishop.look4sat.data.repository.SatelliteRepo
import com.rtbishop.look4sat.di.IoDispatcher
import com.rtbishop.look4sat.utility.PrefsManager import com.rtbishop.look4sat.utility.PrefsManager
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.*
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.isActive import timber.log.Timber
import kotlinx.coroutines.launch import java.net.Socket
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
@@ -37,7 +37,8 @@ class PolarViewModel @Inject constructor(
private val orientation: Orientation, private val orientation: Orientation,
private val prefsManager: PrefsManager, private val prefsManager: PrefsManager,
private val passesRepo: PassesRepo, private val passesRepo: PassesRepo,
private val satelliteRepo: SatelliteRepo private val satelliteRepo: SatelliteRepo,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher
) : ViewModel(), Orientation.OrientationListener { ) : ViewModel(), Orientation.OrientationListener {
private val magDeclination = prefsManager.getMagDeclination() private val magDeclination = prefsManager.getMagDeclination()
@@ -51,6 +52,7 @@ class PolarViewModel @Inject constructor(
val pass = passes.find { it.catNum == catNum && it.aosDate.time == aosTime } val pass = passes.find { it.catNum == catNum && it.aosDate.time == aosTime }
pass?.let { satPass -> pass?.let { satPass ->
processTransmitters(satPass) processTransmitters(satPass)
initRotatorControl(satPass)
emit(satPass) emit(satPass)
} }
} }
@@ -68,6 +70,27 @@ class PolarViewModel @Inject constructor(
_azimuth.value = azimuth + magDeclination _azimuth.value = azimuth + magDeclination
} }
private fun initRotatorControl(satPass: SatPass) {
viewModelScope.launch {
val rotatorPrefs = prefsManager.getRotatorServer()
if (rotatorPrefs != null) {
runCatching {
withContext(ioDispatcher) {
val client = Socket(rotatorPrefs.first, rotatorPrefs.second)
val writer = client.getOutputStream()
while (isActive) {
val satPos = satPass.predictor.getSatPos(Date())
val message = "\\set_pos ${satPos.azimuth} ${satPos.elevation}"
writer?.write(message.toByteArray())
delay(1000)
}
writer.close()
}
}.onFailure { Timber.d(it) }
}
}
}
private fun processTransmitters(satPass: SatPass) { private fun processTransmitters(satPass: SatPass) {
viewModelScope.launch { viewModelScope.launch {
satelliteRepo.getSatTransmitters(satPass.catNum).collect { transList -> satelliteRepo.getSatTransmitters(satPass.catNum).collect { transList ->
@@ -47,6 +47,9 @@ class PrefsManager @Inject constructor(val preferences: SharedPreferences, moshi
const val keyPositionGPS = "setPositionGPS" const val keyPositionGPS = "setPositionGPS"
const val keyPositionQTH = "setPositionQTH" const val keyPositionQTH = "setPositionQTH"
const val keyIsFirstLaunch = "shouldShowSplash" const val keyIsFirstLaunch = "shouldShowSplash"
const val keyRotator = "isRotatorEnabled"
const val keyRotatorAddress = "rotatorAddress"
const val keyRotatorPort = "rotatorPort"
} }
fun getHoursAhead(): Int { fun getHoursAhead(): Int {
@@ -59,10 +62,10 @@ class PrefsManager @Inject constructor(val preferences: SharedPreferences, moshi
fun getStationPosition(): GroundStationPosition { fun getStationPosition(): GroundStationPosition {
val defaultGSP = "0.0" val defaultGSP = "0.0"
val lat = preferences.getString(keyLatitude, defaultGSP)!!.toDouble() val latitude = preferences.getString(keyLatitude, null) ?: defaultGSP
val lon = preferences.getString(keyLongitude, defaultGSP)!!.toDouble() val longitude = preferences.getString(keyLongitude, null) ?: defaultGSP
val alt = preferences.getString(keyAltitude, defaultGSP)!!.toDouble() val altitude = preferences.getString(keyAltitude, null) ?: defaultGSP
return GroundStationPosition(lat, lon, alt) return GroundStationPosition(latitude.toDouble(), longitude.toDouble(), altitude.toDouble())
} }
fun setStationPosition(latitude: Double, longitude: Double, altitude: Double) { fun setStationPosition(latitude: Double, longitude: Double, altitude: Double) {
@@ -141,4 +144,12 @@ class PrefsManager @Inject constructor(val preferences: SharedPreferences, moshi
} }
return emptyList() return emptyList()
} }
fun getRotatorServer(): Pair<String, Int>? {
return if (preferences.getBoolean(keyRotator, false)) {
val address = preferences.getString(keyRotatorAddress, null) ?: "127.0.0.1"
val port = preferences.getString(keyRotatorPort, null) ?: "4096"
Pair(address, port.toInt())
} else null
}
} }