diff --git a/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/BaseDataType.kt b/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/BaseDataType.kt index 9f595cb..d0d101e 100644 --- a/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/BaseDataType.kt +++ b/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/BaseDataType.kt @@ -3,8 +3,9 @@ package de.timklge.karooheadwind.datatypes import android.content.Context import android.util.Log import de.timklge.karooheadwind.KarooHeadwindExtension -import de.timklge.karooheadwind.weatherprovider.WeatherData import de.timklge.karooheadwind.streamCurrentWeatherData +import de.timklge.karooheadwind.throttle +import de.timklge.karooheadwind.weatherprovider.WeatherData import io.hammerhead.karooext.KarooSystemService import io.hammerhead.karooext.extension.DataTypeImpl import io.hammerhead.karooext.internal.Emitter @@ -28,8 +29,11 @@ abstract class BaseDataType( val job = CoroutineScope(Dispatchers.IO).launch { val currentWeatherData = applicationContext.streamCurrentWeatherData(karooSystemService) + val refreshRate = karooSystemService.getRefreshRateInMilliseconds(applicationContext) + currentWeatherData .filterNotNull() + .throttle(refreshRate) .collect { data -> val value = getValue(data) Log.d(KarooHeadwindExtension.TAG, "$dataTypeId: $value") diff --git a/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/HeadwindSpeedDataType.kt b/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/HeadwindSpeedDataType.kt index 5ebc4ee..03abc3e 100644 --- a/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/HeadwindSpeedDataType.kt +++ b/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/HeadwindSpeedDataType.kt @@ -7,6 +7,7 @@ import de.timklge.karooheadwind.weatherprovider.WeatherData import de.timklge.karooheadwind.getRelativeHeadingFlow import de.timklge.karooheadwind.streamCurrentWeatherData import de.timklge.karooheadwind.streamSettings +import de.timklge.karooheadwind.throttle import io.hammerhead.karooext.KarooSystemService import io.hammerhead.karooext.extension.DataTypeImpl import io.hammerhead.karooext.internal.Emitter @@ -27,11 +28,14 @@ class HeadwindSpeedDataType( override fun startStream(emitter: Emitter) { val job = CoroutineScope(Dispatchers.IO).launch { + val refreshRate = karooSystem.getRefreshRateInMilliseconds(context) + karooSystem.getRelativeHeadingFlow(context) .combine(context.streamCurrentWeatherData(karooSystem)) { value, data -> value to data } .combine(context.streamSettings(karooSystem)) { (value, data), settings -> StreamData(value, data, settings) } + .throttle(refreshRate) .collect { streamData -> val windSpeed = streamData.weatherData?.windSpeed ?: 0.0 val windDirection = (streamData.headingResponse as? HeadingResponse.Value)?.diff ?: 0.0 diff --git a/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/RelativeGradeDataType.kt b/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/RelativeGradeDataType.kt index 2a623fc..9dffc65 100644 --- a/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/RelativeGradeDataType.kt +++ b/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/RelativeGradeDataType.kt @@ -10,6 +10,7 @@ import de.timklge.karooheadwind.streamCurrentWeatherData import de.timklge.karooheadwind.streamDataFlow import de.timklge.karooheadwind.streamSettings import de.timklge.karooheadwind.streamUserProfile +import de.timklge.karooheadwind.throttle import io.hammerhead.karooext.KarooSystemService import io.hammerhead.karooext.extension.DataTypeImpl import io.hammerhead.karooext.internal.Emitter @@ -113,7 +114,7 @@ class RelativeGradeDataType(private val karooSystemService: KarooSystemService, return relativeGrade } - fun streamRelativeGrade(karooSystemService: KarooSystemService, context: Context): Flow { + suspend fun streamRelativeGrade(karooSystemService: KarooSystemService, context: Context): Flow { val relativeWindDirectionFlow = karooSystemService.getRelativeHeadingFlow(context).filterIsInstance().map { it.diff + 180 } val speedFlow = karooSystemService.streamDataFlow(DataType.Type.SPEED).filterIsInstance().map { it.dataPoint.singleValue ?: 0.0 } val actualGradeFlow = karooSystemService.streamDataFlow(DataType.Type.ELEVATION_GRADE).filterIsInstance().map { it.dataPoint.singleValue }.filterNotNull().map { it / 100.0 } // Convert to decimal grade @@ -126,6 +127,8 @@ class RelativeGradeDataType(private val karooSystemService: KarooSystemService, } + DEFAULT_BIKE_WEIGHT } + val refreshRate = karooSystemService.getRefreshRateInMilliseconds(context) + val windSpeedFlow = combine(context.streamSettings(karooSystemService), karooSystemService.streamUserProfile(), context.streamCurrentWeatherData(karooSystemService).filterNotNull()) { settings, profile, weatherData -> val isOpenMeteo = settings.weatherProvider == WeatherDataProvider.OPEN_METEO val profileIsImperial = profile.preferredUnit.distance == UserProfile.PreferredUnit.UnitType.IMPERIAL @@ -161,7 +164,7 @@ class RelativeGradeDataType(private val karooSystemService: KarooSystemService, return combine(relativeWindDirectionFlow, speedFlow, windSpeedFlow, actualGradeFlow, totalMassFlow) { windDirection, speed, windSpeed, actualGrade, totalMass -> StreamValues(windDirection, speed, windSpeed, actualGrade, totalMass) - }.distinctUntilChanged().map { (windDirection, speed, windSpeed, actualGrade, totalMass) -> + }.distinctUntilChanged().throttle(refreshRate).map { (windDirection, speed, windSpeed, actualGrade, totalMass) -> val relativeGrade = estimateRelativeGrade(actualGrade, speed, windSpeed, windDirection, totalMass) Log.d(KarooHeadwindExtension.TAG, "Relative grade: $relativeGrade - Wind Direction: $windDirection - Speed: $speed - Wind Speed: $windSpeed - Actual Grade: $actualGrade - Total Mass: $totalMass") diff --git a/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/WeatherDataType.kt b/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/WeatherDataType.kt index acb7d40..2f8e826 100644 --- a/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/WeatherDataType.kt +++ b/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/WeatherDataType.kt @@ -17,12 +17,13 @@ import de.timklge.karooheadwind.HeadwindSettings import de.timklge.karooheadwind.KarooHeadwindExtension import de.timklge.karooheadwind.MainActivity import de.timklge.karooheadwind.TemperatureUnit -import de.timklge.karooheadwind.weatherprovider.WeatherData -import de.timklge.karooheadwind.weatherprovider.WeatherInterpretation import de.timklge.karooheadwind.getHeadingFlow import de.timklge.karooheadwind.streamCurrentWeatherData import de.timklge.karooheadwind.streamSettings import de.timklge.karooheadwind.streamUserProfile +import de.timklge.karooheadwind.throttle +import de.timklge.karooheadwind.weatherprovider.WeatherData +import de.timklge.karooheadwind.weatherprovider.WeatherInterpretation import io.hammerhead.karooext.KarooSystemService import io.hammerhead.karooext.extension.DataTypeImpl import io.hammerhead.karooext.internal.Emitter @@ -62,11 +63,10 @@ class WeatherDataType( val job = CoroutineScope(Dispatchers.IO).launch { val currentWeatherData = applicationContext.streamCurrentWeatherData(karooSystem) - currentWeatherData - .collect { data -> - Log.d(KarooHeadwindExtension.TAG, "Wind code: ${data?.weatherCode}") - emitter.onNext(StreamState.Streaming(DataPoint(dataTypeId, mapOf(DataType.Field.SINGLE to (data?.weatherCode?.toDouble() ?: 0.0))))) - } + currentWeatherData.collect { data -> + Log.d(KarooHeadwindExtension.TAG, "Wind code: ${data?.weatherCode}") + emitter.onNext(StreamState.Streaming(DataPoint(dataTypeId, mapOf(DataType.Field.SINGLE to (data?.weatherCode?.toDouble() ?: 0.0))))) + } } emitter.setCancellable { job.cancel() @@ -110,7 +110,9 @@ class WeatherDataType( val viewJob = CoroutineScope(Dispatchers.IO).launch { emitter.onNext(ShowCustomStreamState("", null)) - dataFlow.collect { (data, settings, userProfile, headingResponse) -> + val refreshRate = karooSystem.getRefreshRateInMilliseconds(context) + + dataFlow.throttle(refreshRate).collect { (data, settings, userProfile, headingResponse) -> Log.d(KarooHeadwindExtension.TAG, "Updating weather view") if (data == null){ diff --git a/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/WindDirectionDataType.kt b/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/WindDirectionDataType.kt index 980efa8..b2a302c 100644 --- a/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/WindDirectionDataType.kt +++ b/app/src/main/kotlin/de/timklge/karooheadwind/datatypes/WindDirectionDataType.kt @@ -19,6 +19,7 @@ import androidx.glance.text.TextStyle import de.timklge.karooheadwind.KarooHeadwindExtension import de.timklge.karooheadwind.weatherprovider.WeatherData import de.timklge.karooheadwind.streamDataFlow +import de.timklge.karooheadwind.throttle import io.hammerhead.karooext.KarooSystemService import io.hammerhead.karooext.internal.ViewEmitter import io.hammerhead.karooext.models.ShowCustomStreamState @@ -78,27 +79,28 @@ class WindDirectionDataType(val karooSystem: KarooSystemService, context: Contex .mapNotNull { (it as? StreamState.Streaming)?.dataPoint?.singleValue ?: 0.0 } } - flow - .collect { windBearing -> - val windCardinalDirectionIndex = ((windBearing % 360) / 22.5).roundToInt() % 16 + val refreshRate = karooSystem.getRefreshRateInMilliseconds(context) - val text = windDirections[windCardinalDirectionIndex] - Log.d( KarooHeadwindExtension.TAG,"Updating wind direction view") - val result = glance.compose(context, DpSize.Unspecified) { - Box(modifier = GlanceModifier.fillMaxSize(), - contentAlignment = Alignment( - vertical = Alignment.Vertical.Top, - horizontal = when(config.alignment){ - ViewConfig.Alignment.LEFT -> Alignment.Horizontal.Start - ViewConfig.Alignment.CENTER -> Alignment.Horizontal.CenterHorizontally - ViewConfig.Alignment.RIGHT -> Alignment.Horizontal.End - }, - )) { - Text(text, style = TextStyle(color = ColorProvider(Color.Black, Color.White), fontFamily = FontFamily.Monospace, fontSize = TextUnit( - config.textSize.toFloat(), TextUnitType.Sp))) - } + flow.throttle(refreshRate).collect { windBearing -> + val windCardinalDirectionIndex = ((windBearing % 360) / 22.5).roundToInt() % 16 + + val text = windDirections[windCardinalDirectionIndex] + Log.d( KarooHeadwindExtension.TAG,"Updating wind direction view") + val result = glance.compose(context, DpSize.Unspecified) { + Box(modifier = GlanceModifier.fillMaxSize(), + contentAlignment = Alignment( + vertical = Alignment.Vertical.Top, + horizontal = when(config.alignment){ + ViewConfig.Alignment.LEFT -> Alignment.Horizontal.Start + ViewConfig.Alignment.CENTER -> Alignment.Horizontal.CenterHorizontally + ViewConfig.Alignment.RIGHT -> Alignment.Horizontal.End + }, + )) { + Text(text, style = TextStyle(color = ColorProvider(Color.Black, Color.White), fontFamily = FontFamily.Monospace, fontSize = TextUnit( + config.textSize.toFloat(), TextUnitType.Sp))) } - emitter.updateView(result.remoteViews) + } + emitter.updateView(result.remoteViews) } }