@startuml package sensor { interface Sensor { + {abstract} int Value() } class LMSensor { - string Label + int Value() } class GPUSensor { + int Value() } class LMSensorsFacade { + List RPMSensors() + List TemperatureSensors() } class GPUSensorsFacade { + List TemperatureSensors() } class SensorManager { - LMSensorsFacade - GPUSensorsFacade + List RPMSensors() + List TemperatureSensors() } } package fan { class HWMONFan { - string Label - Sensor RPMSensor - PWMControl PWMControl + int RPM() + void PWMPercent(int value) } class FanGenerator { + FanList FindFans(List, List) } struct FanStep { int Temp int Percent } class FanCurve { - List Steps - List TempSensor - List Fan + DoFanControl() } class FanController { - List + void StartFanControlLoop() } } package pwm { class PWMControl { + void PWMPercent(int value) + int PWM() } class PWMControlFacade { + List PWMControls() } } class ConfigManager { } HWMONFan -- Sensor HWMONFan -- PWMControl HWMONFan -- FanCurve PWMControlFacade -- PWMControl Sensor <|-- LMSensor Sensor <|-- GPUSensor SensorManager - Sensor LMSensor -- LMSensorsFacade GPUSensor -- GPUSensorsFacade LMSensorsFacade -- SensorManager GPUSensorsFacade -- SensorManager FanGenerator -- HWMONFan FanGenerator -- SensorManager : uses > FanGenerator -- PWMControlFacade : uses > Sensor - FanCurve FanCurve -- FanStep FanCurve -- FanController @enduml