diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 770fc5f..0ee8171 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -71,9 +71,9 @@ tasks.register("generateManifest") { "latestVersionCode" to android.defaultConfig.versionCode, "developer" to "timklge", "description" to "Shows in-ride alerts after a given time interval, distance or HR / power / speed / cadence out of range", - "releaseNotes" to "* Add additional trigger types for ambient and CORE temperature, gradient and tire pressure\n" + - "* Add additional beep patterns for Karoo 3\n" + - "* Add touchable back button", + "releaseNotes" to "* Use imperial units for temperature and tire pressure if selected\n" + + "* Add additional trigger types for ambient and CORE temperature, gradient and tire pressure\n" + + "* Add additional beep patterns for Karoo 3" ) val gson = groovy.json.JsonBuilder(manifest).toPrettyString() diff --git a/app/src/main/kotlin/de/timklge/karooreminder/KarooReminderExtension.kt b/app/src/main/kotlin/de/timklge/karooreminder/KarooReminderExtension.kt index 877339f..d0d3471 100644 --- a/app/src/main/kotlin/de/timklge/karooreminder/KarooReminderExtension.kt +++ b/app/src/main/kotlin/de/timklge/karooreminder/KarooReminderExtension.kt @@ -79,8 +79,8 @@ enum class ReminderTrigger(val id: String, val label: String) { POWER_LIMIT_MAXIMUM_EXCEEDED, POWER_LIMIT_MINIMUM_EXCEEDED -> "W" SPEED_LIMIT_MAXIMUM_EXCEEDED, SPEED_LIMIT_MINIMUM_EXCEEDED -> if(imperial) "mph" else "km/h" CADENCE_LIMIT_MAXIMUM_EXCEEDED, CADENCE_LIMIT_MINIMUM_EXCEEDED -> "rpm" - CORE_TEMPERATURE_LIMIT_MAXIMUM_EXCEEDED, CORE_TEMPERATURE_LIMIT_MINIMUM_EXCEEDED, AMBIENT_TEMPERATURE_LIMIT_MINIMUM_EXCEEDED, AMBIENT_TEMPERATURE_LIMIT_MAXIMUM_EXCEEDED -> "°C" - FRONT_TIRE_PRESSURE_LIMIT_MAXIMUM_EXCEEDED, FRONT_TIRE_PRESSURE_LIMIT_MINIMUM_EXCEEDED, REAR_TIRE_PRESSURE_LIMIT_MAXIMUM_EXCEEDED, REAR_TIRE_PRESSURE_LIMIT_MINIMUM_EXCEEDED -> "bar" + CORE_TEMPERATURE_LIMIT_MAXIMUM_EXCEEDED, CORE_TEMPERATURE_LIMIT_MINIMUM_EXCEEDED, AMBIENT_TEMPERATURE_LIMIT_MINIMUM_EXCEEDED, AMBIENT_TEMPERATURE_LIMIT_MAXIMUM_EXCEEDED -> if(imperial) "°F" else "°C" + FRONT_TIRE_PRESSURE_LIMIT_MAXIMUM_EXCEEDED, FRONT_TIRE_PRESSURE_LIMIT_MINIMUM_EXCEEDED, REAR_TIRE_PRESSURE_LIMIT_MAXIMUM_EXCEEDED, REAR_TIRE_PRESSURE_LIMIT_MINIMUM_EXCEEDED -> if(imperial) "psi" else "bar" ENERGY_OUTPUT -> "kJ" GRADIENT_LIMIT_MAXIMUM_EXCEEDED, GRADIENT_LIMIT_MINIMUM_EXCEEDED -> "%" } @@ -277,7 +277,7 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", BuildConfig.VERS } } - data class StreamData(val value: Double, val reminders: MutableList? = null, val imperial: Boolean = false) + data class StreamData(val value: Double, val reminders: MutableList? = null, val distanceImperial: Boolean = false, val temperatureImperial: Boolean = false) private fun startRangeExceededJob(triggerType: ReminderTrigger): Job { return CoroutineScope(Dispatchers.IO).launch { @@ -327,7 +327,10 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", BuildConfig.VERS } .filter { it != 0.0 } .combine(preferences) { value, reminders -> StreamData(value, reminders) } - .combine(karooSystem.streamUserProfile()) { streamData, profile -> streamData.copy(imperial = profile.preferredUnit.distance == UserProfile.PreferredUnit.UnitType.IMPERIAL) } + .combine(karooSystem.streamUserProfile()) { streamData, profile -> streamData.copy( + distanceImperial = profile.preferredUnit.distance == UserProfile.PreferredUnit.UnitType.IMPERIAL, + temperatureImperial = profile.preferredUnit.temperature == UserProfile.PreferredUnit.UnitType.IMPERIAL + ) } .let { @Suppress("KotlinConstantConditions") when (triggerType){ @@ -346,19 +349,19 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", BuildConfig.VERS ReminderTrigger.ELAPSED_TIME, ReminderTrigger.DISTANCE, ReminderTrigger.ENERGY_OUTPUT -> error("Unsupported trigger type: $triggerType") } } - .map { (value, reminders, imperial) -> + .map { (actualValue, reminders, distanceImperial, temperatureImperial) -> val triggered = reminders?.filter { reminder -> - val reminderValue = when(triggerType) { + val triggerThreshold = when(triggerType) { ReminderTrigger.SPEED_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.SPEED_LIMIT_MAXIMUM_EXCEEDED -> { - if (imperial) reminder.interval?.times(0.44704) else reminder.interval?.times(0.277778) + if (distanceImperial) reminder.interval?.times(0.44704) else reminder.interval?.times(0.277778) } ReminderTrigger.CORE_TEMPERATURE_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.CORE_TEMPERATURE_LIMIT_MAXIMUM_EXCEEDED, ReminderTrigger.AMBIENT_TEMPERATURE_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.AMBIENT_TEMPERATURE_LIMIT_MAXIMUM_EXCEEDED -> { - reminder.intervalFloat + if (temperatureImperial) (reminder.intervalFloat?.minus(32))?.div(1.8) else reminder.intervalFloat } ReminderTrigger.FRONT_TIRE_PRESSURE_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.FRONT_TIRE_PRESSURE_LIMIT_MAXIMUM_EXCEEDED, ReminderTrigger.REAR_TIRE_PRESSURE_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.REAR_TIRE_PRESSURE_LIMIT_MAXIMUM_EXCEEDED -> { - reminder.intervalFloat?.times(1000.0) // bar to mbar + if(distanceImperial) reminder.intervalFloat?.times(68.9476) /* psi to mbar */ else reminder.intervalFloat?.times(1000.0) /* bar to mbar */ } ReminderTrigger.ELAPSED_TIME, ReminderTrigger.DISTANCE, @@ -374,18 +377,24 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", BuildConfig.VERS ReminderTrigger.CADENCE_LIMIT_MAXIMUM_EXCEEDED, ReminderTrigger.SPEED_LIMIT_MAXIMUM_EXCEEDED, ReminderTrigger.CORE_TEMPERATURE_LIMIT_MAXIMUM_EXCEEDED, ReminderTrigger.FRONT_TIRE_PRESSURE_LIMIT_MAXIMUM_EXCEEDED, ReminderTrigger.REAR_TIRE_PRESSURE_LIMIT_MAXIMUM_EXCEEDED, ReminderTrigger.AMBIENT_TEMPERATURE_LIMIT_MAXIMUM_EXCEEDED, - ReminderTrigger.GRADIENT_LIMIT_MAXIMUM_EXCEEDED -> reminderValue != null && value > reminderValue + ReminderTrigger.GRADIENT_LIMIT_MAXIMUM_EXCEEDED -> triggerThreshold != null && actualValue > triggerThreshold ReminderTrigger.HR_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.POWER_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.CADENCE_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.SPEED_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.CORE_TEMPERATURE_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.FRONT_TIRE_PRESSURE_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.REAR_TIRE_PRESSURE_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.AMBIENT_TEMPERATURE_LIMIT_MINIMUM_EXCEEDED, - ReminderTrigger.GRADIENT_LIMIT_MINIMUM_EXCEEDED -> reminderValue != null && value < reminderValue + ReminderTrigger.GRADIENT_LIMIT_MINIMUM_EXCEEDED -> triggerThreshold != null && actualValue < triggerThreshold ReminderTrigger.ELAPSED_TIME, ReminderTrigger.DISTANCE, ReminderTrigger.ENERGY_OUTPUT -> error("Unsupported trigger type: $triggerType") } - reminder.isActive && reminder.trigger == triggerType && triggerIsMet + val result = reminder.isActive && reminder.trigger == triggerType && triggerIsMet + /* if (result){ + Log.i(TAG, "Triggered range reminder: ${reminder.name} (${triggerType}): actual value $actualValue, threshold $triggerThreshold") + } else if(reminder.trigger == triggerType && reminder.isActive) { + Log.i(TAG, "Not triggered range reminder: ${reminder.name} (${triggerType}): actual value $actualValue, threshold $triggerThreshold") + } */ + result } triggered @@ -394,9 +403,8 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", BuildConfig.VERS .filter { it.isNotEmpty() } .throttle(1_000 * 60) // At most once every minute .collectLatest { reminders -> - Log.i(TAG, "Triggered range reminder: ${reminders.size} reminders") - reminders.forEach { reminder -> + Log.d(TAG, "Dispatching reminder: ${reminder.name}") reminderChannel.send( DisplayedReminder( reminder.tone, triggerType, InRideAlert( diff --git a/app/src/main/kotlin/de/timklge/karooreminder/screens/DetailScreen.kt b/app/src/main/kotlin/de/timklge/karooreminder/screens/DetailScreen.kt index b482667..3cc8a67 100644 --- a/app/src/main/kotlin/de/timklge/karooreminder/screens/DetailScreen.kt +++ b/app/src/main/kotlin/de/timklge/karooreminder/screens/DetailScreen.kt @@ -36,6 +36,7 @@ import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -75,6 +76,11 @@ fun DetailScreen(isCreating: Boolean, reminder: Reminder, onSubmit: (updatedRemi LaunchedEffect(Unit) { karooSystem.connect{} } + DisposableEffect(Unit) { + onDispose { + karooSystem.disconnect() + } + } var title by remember { mutableStateOf(reminder.name) } var text by remember { mutableStateOf(reminder.text) } var selectedColor by remember { mutableStateOf(reminder.displayForegroundColor) } diff --git a/app/src/main/kotlin/de/timklge/karooreminder/screens/MainScreen.kt b/app/src/main/kotlin/de/timklge/karooreminder/screens/MainScreen.kt index 84ab6a2..db5ebfb 100644 --- a/app/src/main/kotlin/de/timklge/karooreminder/screens/MainScreen.kt +++ b/app/src/main/kotlin/de/timklge/karooreminder/screens/MainScreen.kt @@ -33,6 +33,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateListOf @@ -169,6 +170,18 @@ fun MainScreen(reminders: MutableList, onNavigateToReminder: (r: Remin showWarnings = true } + LaunchedEffect(Unit) { + karooSystem.connect { connected -> + karooConnected = connected + } + } + + DisposableEffect(Unit) { + onDispose { + karooSystem.disconnect() + } + } + Scaffold( topBar = { TopAppBar(title = {Text("Reminder")}) }, content = { @@ -209,12 +222,6 @@ fun MainScreen(reminders: MutableList, onNavigateToReminder: (r: Remin } } - LaunchedEffect(Unit) { - karooSystem.connect { connected -> - karooConnected = connected - } - } - if (showWarnings){ if (reminders.isEmpty()) Text(modifier = Modifier.padding(5.dp), text = "No reminders added.")