Support imperial units for temperature, tire pressures (#40)
* WIP add core temp, tire pressure trigger types * Add gradient, core temperature, tire pressure, ambient temperature trigger types * Update screenshots * Update changelog * Support imperial units for temperature, tire pressures * Fix karoo system connection is not closed by activity
This commit is contained in:
parent
349cabca05
commit
a085d97ead
@ -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()
|
||||
|
||||
@ -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<Reminder>? = null, val imperial: Boolean = false)
|
||||
data class StreamData(val value: Double, val reminders: MutableList<Reminder>? = 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(
|
||||
|
||||
@ -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) }
|
||||
|
||||
@ -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<Reminder>, 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<Reminder>, 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.")
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user