@startuml interface Sensor { + {abstract} int Value() } class LMSensor { - string Label + int Value() } class GPUSensor { + int Value() } class HWMONFan { - string Label - Sensor RPMSensor - PWMControl PWMControl + int RPM() + void PWMPercent(int value) } class PWMControl { + void PWMPercent(int value) + int PWM() } class PWMControlFacade { + List PWMControls() } class LMSensorsFacade { + List RPMSensors() + List TemperatureSensors() } class GPUSensorsFacade { + List TemperatureSensors() } class SensorManager { - LMSensorsFacade - GPUSensorsFacade + List RPMSensors() + List TemperatureSensors() } class FanGenerator { + FanList FindFans(List, List) } struct Coordinate { int X int Y } enum SensorAggregateFunction { MIN MAX AVG } class FanCurve { - List Steps - List TempSensor - SensorAggregateFunction Fun - HWMONFan Fan + int TargetPWMPercent() } class FanController { - List + void StartFanControlLoop() } HWMONFan -- Sensor HWMONFan -- PWMControl HWMONFan - FanCurve PWMControl -- PWMControlFacade Sensor <|-- LMSensor Sensor <|-- GPUSensor SensorManager - Sensor LMSensor -- LMSensorsFacade GPUSensor -- GPUSensorsFacade LMSensorsFacade -- SensorManager GPUSensorsFacade -- SensorManager FanGenerator - HWMONFan FanGenerator - SensorManager FanGenerator - PWMControl Sensor - FanCurve FanCurve -- Coordinate FanCurve -- SensorAggregateFunction FanController -- FanCurve @enduml