diff --git a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/model/OverlaySettings.kt b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/model/OverlaySettings.kt index 47432fe..e25e49f 100644 --- a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/model/OverlaySettings.kt +++ b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/model/OverlaySettings.kt @@ -33,9 +33,11 @@ data class OverlaySettings( val frametime: Sensor.Frametime = Sensor.Frametime(), val cpuTemp: Sensor.CpuTemp = Sensor.CpuTemp(), val cpuUsage: Sensor.CpuUsage = Sensor.CpuUsage(), + val cpuConsumption: Sensor.CpuConsumption = Sensor.CpuConsumption(), val gpuTemp: Sensor.GpuTemp = Sensor.GpuTemp(), val gpuUsage: Sensor.GpuUsage = Sensor.GpuUsage(), val vramUsage: Sensor.VramUsage = Sensor.VramUsage(), + val gpuConsumption: Sensor.GpuConsumption = Sensor.GpuConsumption(), val totalVramUsed: Sensor.TotalVramUsed = Sensor.TotalVramUsed(), val ramUsage: Sensor.RamUsage = Sensor.RamUsage(), val upRate: Sensor.UpRate = Sensor.UpRate(), @@ -96,6 +98,13 @@ data class OverlaySettings( override val boundaries: Boundaries = Boundaries(), ) : GraphSensor() + @Serializable + @Immutable + data class CpuConsumption( + override val isEnabled: Boolean = true, + override val customReadingId: String = "", + ) : Sensor() + @Serializable @Immutable data class GpuTemp( @@ -127,6 +136,13 @@ data class OverlaySettings( override val customReadingId: String = "", ) : Sensor() + @Serializable + @Immutable + data class GpuConsumption( + override val isEnabled: Boolean = true, + override val customReadingId: String = "", + ) : Sensor() + @Serializable @Immutable data class RamUsage( diff --git a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/overlay/Overlay.kt b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/overlay/Overlay.kt index a98688b..dfa4162 100644 --- a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/overlay/Overlay.kt +++ b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/overlay/Overlay.kt @@ -24,7 +24,9 @@ fun Overlay( overlaySettings.sensors.cpuUsage, overlaySettings.sensors.gpuUsage, overlaySettings.sensors.vramUsage, - overlaySettings.sensors.ramUsage + overlaySettings.sensors.ramUsage, + overlaySettings.sensors.cpuConsumption, + overlaySettings.sensors.gpuConsumption ).all { !it.isEnabled } ) { return@AppTheme diff --git a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/overlay/sections/CpuSection.kt b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/overlay/sections/CpuSection.kt index 7bf5b73..247de51 100644 --- a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/overlay/sections/CpuSection.kt +++ b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/overlay/sections/CpuSection.kt @@ -1,10 +1,26 @@ package app.cleanmeter.target.desktop.ui.overlay.sections +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn +import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import app.cleanmeter.core.common.hardwaremonitor.FPS import app.cleanmeter.core.common.hardwaremonitor.HardwareMonitorData +import app.cleanmeter.core.common.hardwaremonitor.getReading import app.cleanmeter.target.desktop.model.OverlaySettings import app.cleanmeter.target.desktop.ui.components.CustomReadingProgress import app.cleanmeter.target.desktop.ui.components.Pill +import app.cleanmeter.target.desktop.ui.components.ProgressLabel +import app.cleanmeter.target.desktop.ui.components.ProgressUnit import java.util.* @Composable @@ -35,6 +51,15 @@ internal fun CpuSection(overlaySettings: OverlaySettings, data: HardwareMonitorD boundaries = overlaySettings.sensors.cpuUsage.boundaries, ) } + + if (overlaySettings.sensors.cpuConsumption.isValid()) { + val reading = data.getReading(overlaySettings.sensors.cpuConsumption.customReadingId) + val value = (reading?.Value ?: 1f).coerceAtLeast(1f).toInt() + Row(verticalAlignment = Alignment.Bottom, modifier = Modifier.widthIn(min = 35.dp).padding(bottom = 2.dp)) { + ProgressLabel("$value") + ProgressUnit("W") + } + } } } } diff --git a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/overlay/sections/GpuSection.kt b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/overlay/sections/GpuSection.kt index a3e6556..c45375a 100644 --- a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/overlay/sections/GpuSection.kt +++ b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/overlay/sections/GpuSection.kt @@ -1,12 +1,20 @@ package app.cleanmeter.target.desktop.ui.overlay.sections +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.widthIn import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp import app.cleanmeter.core.common.hardwaremonitor.HardwareMonitorData import app.cleanmeter.core.common.hardwaremonitor.getReading import app.cleanmeter.target.desktop.model.OverlaySettings import app.cleanmeter.target.desktop.ui.components.CustomReadingProgress import app.cleanmeter.target.desktop.ui.components.Pill import app.cleanmeter.target.desktop.ui.components.Progress +import app.cleanmeter.target.desktop.ui.components.ProgressLabel +import app.cleanmeter.target.desktop.ui.components.ProgressUnit import java.util.* private fun OverlaySettings.Sensors.isAllValid(): Boolean { @@ -54,6 +62,15 @@ internal fun GpuSection(overlaySettings: OverlaySettings, data: HardwareMonitorD boundaries = overlaySettings.sensors.vramUsage.boundaries, ) } + + if (overlaySettings.sensors.gpuConsumption.isValid()) { + val reading = data.getReading(overlaySettings.sensors.gpuConsumption.customReadingId) + val value = (reading?.Value ?: 1f).coerceAtLeast(1f).toInt() + Row(verticalAlignment = Alignment.Bottom, modifier = Modifier.widthIn(min = 35.dp).padding(bottom = 2.dp)) { + ProgressLabel("$value") + ProgressUnit("W") + } + } } } } \ No newline at end of file diff --git a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/CheckboxSectionOption.kt b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/CheckboxSectionOption.kt index 2fba66e..7eb6adc 100644 --- a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/CheckboxSectionOption.kt +++ b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/CheckboxSectionOption.kt @@ -13,7 +13,7 @@ data class CheckboxSectionOption( ) enum class SensorType { - Framerate, Frametime, CpuTemp, CpuUsage, GpuTemp, GpuUsage, VramUsage, TotalVramUsed, RamUsage, UpRate, DownRate, NetGraph + Framerate, Frametime, CpuTemp, CpuUsage, CpuConsumption, GpuTemp, GpuUsage, VramUsage, TotalVramUsed, GpuConsumption, RamUsage, UpRate, DownRate, NetGraph } enum class SectionType { diff --git a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/Settings.kt b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/Settings.kt index 53e6525..232672f 100644 --- a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/Settings.kt +++ b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/Settings.kt @@ -227,6 +227,8 @@ private fun TabContent( SensorType.UpRate -> settingsState.overlaySettings.sensors.upRate SensorType.DownRate -> settingsState.overlaySettings.sensors.downRate SensorType.NetGraph -> settingsState.overlaySettings.sensors.upRate // no sensor for netgraph + SensorType.CpuConsumption -> settingsState.overlaySettings.sensors.cpuConsumption + SensorType.GpuConsumption -> settingsState.overlaySettings.sensors.gpuConsumption } } ) diff --git a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/SettingsViewModel.kt b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/SettingsViewModel.kt index 67ea373..4e55e51 100644 --- a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/SettingsViewModel.kt +++ b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/SettingsViewModel.kt @@ -32,8 +32,10 @@ import java.io.PrintStream import java.util.Scanner sealed interface Log { - @JvmInline value class Info(val value: String) - @JvmInline value class Error(val value: String) + @JvmInline + value class Info(val value: String) + @JvmInline + value class Error(val value: String) } data class SettingsState( @@ -317,6 +319,8 @@ class SettingsViewModel : ViewModel() { SensorType.UpRate -> settingsState.overlaySettings SensorType.DownRate -> settingsState.overlaySettings SensorType.NetGraph -> settingsState.overlaySettings + SensorType.CpuConsumption -> settingsState.overlaySettings + SensorType.GpuConsumption -> settingsState.overlaySettings } OverlaySettingsRepository.setOverlaySettings(newSettings) @@ -477,6 +481,22 @@ class SettingsViewModel : ViewModel() { ) ) + SensorType.CpuConsumption -> overlaySettings?.copy( + sensors = overlaySettings.sensors.copy( + cpuConsumption = overlaySettings.sensors.cpuConsumption.copy( + customReadingId = sensorId, + ) + ) + ) + + SensorType.GpuConsumption -> overlaySettings?.copy( + sensors = overlaySettings.sensors.copy( + gpuConsumption = overlaySettings.sensors.gpuConsumption.copy( + customReadingId = sensorId, + ) + ) + ) + SensorType.Framerate -> overlaySettings SensorType.Frametime -> overlaySettings SensorType.RamUsage -> overlaySettings @@ -637,6 +657,22 @@ class SettingsViewModel : ViewModel() { SensorType.TotalVramUsed -> overlaySettings // cant disable total vram used SensorType.NetGraph -> overlaySettings?.copy(netGraph = option.isSelected) + + SensorType.CpuConsumption -> overlaySettings?.copy( + sensors = overlaySettings.sensors.copy( + cpuConsumption = overlaySettings.sensors.cpuConsumption.copy( + isEnabled = option.isSelected + ) + ) + ) + + SensorType.GpuConsumption -> overlaySettings?.copy( + sensors = overlaySettings.sensors.copy( + gpuConsumption = overlaySettings.sensors.gpuConsumption.copy( + isEnabled = option.isSelected + ) + ) + ) } OverlaySettingsRepository.setOverlaySettings(newSettings) diff --git a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/CpuStats.kt b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/CpuStats.kt index 592093f..a3a6d9c 100644 --- a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/CpuStats.kt +++ b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/CpuStats.kt @@ -29,7 +29,7 @@ internal fun CpuStats( ) { CustomBodyCheckboxSection( title = "CPU", - options = availableOptions.filterOptions(SensorType.CpuUsage, SensorType.CpuTemp), + options = availableOptions.filterOptions(SensorType.CpuUsage, SensorType.CpuTemp, SensorType.CpuConsumption), onSwitchToggle = { onSectionSwitchToggle(SectionType.Cpu, it) }, body = { options -> Column(modifier = Modifier, verticalArrangement = Arrangement.spacedBy(12.dp)) { diff --git a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/GpuStats.kt b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/GpuStats.kt index db5cf7a..46a0eb7 100644 --- a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/GpuStats.kt +++ b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/GpuStats.kt @@ -34,6 +34,7 @@ internal fun GpuStats( SensorType.GpuTemp, SensorType.VramUsage, SensorType.TotalVramUsed, + SensorType.GpuConsumption, ), onSwitchToggle = { onSectionSwitchToggle(SectionType.Gpu, it) }, body = { options -> diff --git a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/StatsUi.kt b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/StatsUi.kt index 911a546..42977c9 100644 --- a/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/StatsUi.kt +++ b/target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/tabs/stats/StatsUi.kt @@ -138,6 +138,14 @@ private fun checkboxSectionOptions(overlaySettings: OverlaySettings) = listOf( useCustomSensor = true, dataType = HardwareMonitorData.SensorType.Load, ), + CheckboxSectionOption( + isSelected = overlaySettings.sensors.cpuConsumption.isEnabled, + name = "CPU consumption", + type = SensorType.CpuConsumption, + optionReadingId = overlaySettings.sensors.cpuConsumption.customReadingId, + useCustomSensor = true, + dataType = HardwareMonitorData.SensorType.Power, + ), CheckboxSectionOption( isSelected = overlaySettings.sensors.gpuTemp.isEnabled, name = "GPU temperature", @@ -171,6 +179,14 @@ private fun checkboxSectionOptions(overlaySettings: OverlaySettings) = listOf( useCheckbox = false, dataType = HardwareMonitorData.SensorType.SmallData, ), + CheckboxSectionOption( + isSelected = overlaySettings.sensors.gpuConsumption.isEnabled, + name = "GPU consumption", + type = SensorType.GpuConsumption, + optionReadingId = overlaySettings.sensors.gpuConsumption.customReadingId, + useCustomSensor = true, + dataType = HardwareMonitorData.SensorType.Power, + ), CheckboxSectionOption( isSelected = overlaySettings.sensors.ramUsage.isEnabled, name = "RAM usage",