Extracted rotation data reporting to a separate class
This commit is contained in:
1 parent
f3d64d23b2
commit
8c7e2c9bb0
4 files changed
+71
-38
No files matched your search
@@ -0,0 +1,34 @@
|
||||
package com.rtbishop.look4sat.framework
|
||||
|
||||
import com.rtbishop.look4sat.data.DataReporter
|
||||
import kotlinx.coroutines.CoroutineDispatcher
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.io.BufferedWriter
|
||||
import java.net.Socket
|
||||
|
||||
class NetDataReporter(private val reporterDispatcher: CoroutineDispatcher) : DataReporter {
|
||||
|
||||
private var rotatorSocket: Socket? = null
|
||||
private var rotatorWriter: BufferedWriter? = null
|
||||
|
||||
override suspend fun setRotatorSocket(server: String, port: Int) {
|
||||
withContext(reporterDispatcher) {
|
||||
runCatching {
|
||||
rotatorSocket = Socket(server, port)
|
||||
rotatorWriter = rotatorSocket?.getOutputStream()?.bufferedWriter()
|
||||
}.onFailure { println(it.localizedMessage) }
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun reportRotation(azim: Double, elev: Double) {
|
||||
withContext(reporterDispatcher) {
|
||||
runCatching {
|
||||
rotatorWriter?.let { writer ->
|
||||
writer.write("\\set_pos $azim $elev")
|
||||
writer.newLine()
|
||||
writer.flush()
|
||||
}
|
||||
}.onFailure { println(it.localizedMessage) }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,11 +21,9 @@ import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.location.LocationManager
|
||||
import androidx.room.Room
|
||||
import com.rtbishop.look4sat.data.LocalDataSource
|
||||
import com.rtbishop.look4sat.data.PreferencesSource
|
||||
import com.rtbishop.look4sat.data.RemoteDataSource
|
||||
import com.rtbishop.look4sat.data.SatelliteRepo
|
||||
import com.rtbishop.look4sat.data.*
|
||||
import com.rtbishop.look4sat.domain.Predictor
|
||||
import com.rtbishop.look4sat.framework.NetDataReporter
|
||||
import com.rtbishop.look4sat.framework.PreferencesProvider
|
||||
import com.rtbishop.look4sat.framework.api.RemoteSource
|
||||
import com.rtbishop.look4sat.framework.api.SatelliteService
|
||||
@@ -46,6 +44,7 @@ import javax.inject.Singleton
|
||||
object SatelliteDataModule {
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideMoshi(): Moshi {
|
||||
return Moshi.Builder().build()
|
||||
}
|
||||
@@ -83,11 +82,13 @@ object SatelliteDataModule {
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideSatelliteDao(db: SatelliteDb): SatelliteDao {
|
||||
return db.satelliteDao()
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideSatelliteDb(@ApplicationContext context: Context, moshi: Moshi): SatelliteDb {
|
||||
Converters.initialize(moshi)
|
||||
return Room.databaseBuilder(context, SatelliteDb::class.java, "SatelliteDb")
|
||||
@@ -95,15 +96,23 @@ object SatelliteDataModule {
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideRemoteDataSource(satelliteService: SatelliteService): RemoteDataSource {
|
||||
return RemoteSource(satelliteService)
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideSatelliteService(): SatelliteService {
|
||||
return Retrofit.Builder()
|
||||
.baseUrl("https://db.satnogs.org/api/")
|
||||
.addConverterFactory(MoshiConverterFactory.create())
|
||||
.build().create(SatelliteService::class.java)
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideDataReporter(@IoDispatcher dispatcher: CoroutineDispatcher): DataReporter {
|
||||
return NetDataReporter(dispatcher)
|
||||
}
|
||||
}
|
||||
+16
-34
@@ -18,6 +18,7 @@
|
||||
package com.rtbishop.look4sat.presentation.radarScreen
|
||||
|
||||
import androidx.lifecycle.*
|
||||
import com.rtbishop.look4sat.data.DataReporter
|
||||
import com.rtbishop.look4sat.data.PreferencesSource
|
||||
import com.rtbishop.look4sat.data.SatelliteRepo
|
||||
import com.rtbishop.look4sat.domain.Predictor
|
||||
@@ -25,13 +26,12 @@ import com.rtbishop.look4sat.domain.SatPass
|
||||
import com.rtbishop.look4sat.domain.SatPos
|
||||
import com.rtbishop.look4sat.domain.Transmitter
|
||||
import com.rtbishop.look4sat.framework.OrientationProvider
|
||||
import com.rtbishop.look4sat.injection.IoDispatcher
|
||||
import com.rtbishop.look4sat.utility.round
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.collect
|
||||
import timber.log.Timber
|
||||
import java.net.Socket
|
||||
import kotlinx.coroutines.isActive
|
||||
import kotlinx.coroutines.launch
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
|
||||
@@ -41,7 +41,7 @@ class RadarViewModel @Inject constructor(
|
||||
private val preferences: PreferencesSource,
|
||||
private val predictor: Predictor,
|
||||
private val satelliteRepo: SatelliteRepo,
|
||||
@IoDispatcher private val ioDispatcher: CoroutineDispatcher
|
||||
private val dataReporter: DataReporter
|
||||
) : ViewModel(), OrientationProvider.OrientationListener {
|
||||
|
||||
private val stationPos = preferences.loadStationPosition()
|
||||
@@ -59,7 +59,6 @@ class RadarViewModel @Inject constructor(
|
||||
emit(satPass)
|
||||
sendPassData(satPass)
|
||||
processTransmitters(satPass)
|
||||
initRotatorControl(satPass)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -78,44 +77,27 @@ class RadarViewModel @Inject constructor(
|
||||
|
||||
private fun sendPassData(satPass: SatPass) {
|
||||
viewModelScope.launch {
|
||||
var track: List<SatPos> = emptyList()
|
||||
var satTrack: List<SatPos> = emptyList()
|
||||
val rotatorPrefs = preferences.getRotatorServer()
|
||||
if (rotatorPrefs != null) {
|
||||
dataReporter.setRotatorSocket(rotatorPrefs.first, rotatorPrefs.second)
|
||||
}
|
||||
if (!satPass.isDeepSpace) {
|
||||
val startDate = Date(satPass.aosTime)
|
||||
val endDate = Date(satPass.losTime)
|
||||
track = predictor.getSatTrack(satPass.satellite, stationPos, startDate, endDate)
|
||||
satTrack = predictor.getSatTrack(satPass.satellite, stationPos, startDate, endDate)
|
||||
}
|
||||
while (isActive) {
|
||||
val pos = predictor.getSatPos(satPass.satellite, stationPos, Date())
|
||||
_passData.postValue(RadarData(pos, track))
|
||||
val satPos = predictor.getSatPos(satPass.satellite, stationPos, Date())
|
||||
val azimuth = Math.toDegrees(satPos.azimuth).round(1)
|
||||
val elevation = Math.toDegrees(satPos.elevation).round(1)
|
||||
dataReporter.reportRotation(azimuth, elevation)
|
||||
_passData.postValue(RadarData(satPos, satTrack))
|
||||
delay(1000)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun initRotatorControl(satPass: SatPass) {
|
||||
viewModelScope.launch {
|
||||
val rotatorPrefs = preferences.getRotatorServer()
|
||||
if (rotatorPrefs != null) {
|
||||
runCatching {
|
||||
withContext(ioDispatcher) {
|
||||
val socket = Socket(rotatorPrefs.first, rotatorPrefs.second)
|
||||
val writer = socket.getOutputStream().bufferedWriter()
|
||||
while (isActive) {
|
||||
val satPos = predictor.getSatPos(satPass.satellite, stationPos, Date())
|
||||
val azimuth = Math.toDegrees(satPos.azimuth).round(1)
|
||||
val elevation = Math.toDegrees(satPos.elevation).round(1)
|
||||
writer.write("\\set_pos $azimuth $elevation")
|
||||
writer.newLine()
|
||||
writer.flush()
|
||||
delay(1000)
|
||||
}
|
||||
writer.close()
|
||||
}
|
||||
}.onFailure { Timber.d(it) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun processTransmitters(satPass: SatPass) {
|
||||
viewModelScope.launch {
|
||||
satelliteRepo.getSatTransmitters(satPass.catNum).collect { transList ->
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.rtbishop.look4sat.data
|
||||
|
||||
interface DataReporter {
|
||||
|
||||
suspend fun setRotatorSocket(server: String, port: Int)
|
||||
|
||||
suspend fun reportRotation(azim: Double, elev: Double)
|
||||
}
|
||||
Reference in new issue
Block a user