Browse Source

improvements to the fans

Malte Veerman 10 years ago
parent
commit
e635609af4

+ 13 - 12
kcm/src/fancontrolkcm.cpp

@@ -32,13 +32,12 @@ K_PLUGIN_FACTORY_WITH_JSON(FancontrolKCMFactory, "kcm_fancontrol.json", register
 
 FancontrolKCM::FancontrolKCM(QObject *parent, const QVariantList& args)
     : ConfigModule(parent, args),
-    m_base(new GUIBase(this))
+    m_base(new GUIBase(this)),
+    m_manualControl(false)
 {
-    if (m_base->hasSystemdCommunicator())
-        m_manualControl = m_base->systemdCommunicator()->serviceEnabled();
-    else
+    if (!m_base->hasSystemdCommunicator())
         qFatal("Fancontrol-gui-lib was compiled without systemd support!");
-    
+             
     KAboutData *about = new KAboutData("kcm_fancontrol",
                                        i18n("Fancontrol-KCM"),
                                        "0.1",
@@ -61,21 +60,23 @@ FancontrolKCM::FancontrolKCM(QObject *parent, const QVariantList& args)
 
 void FancontrolKCM::save()
 {
-    bool needsSave = false;
-    needsSave = m_base->loader()->save() ? needsSave : true;
+    bool save = false;
+    save = m_base->loader()->save() ? save : true;
     
     if (m_base->systemdCommunicator()->serviceActive() && m_manualControl)
-        needsSave = m_base->systemdCommunicator()->restartService() ? needsSave : true;
+        save = m_base->systemdCommunicator()->restartService() ? save : true;
     else 
-        needsSave = m_base->systemdCommunicator()->setServiceActive(m_manualControl) ? needsSave : true;
+        save = m_base->systemdCommunicator()->setServiceActive(m_manualControl) ? save : true;
 
-    needsSave = m_base->systemdCommunicator()->setServiceEnabled(m_manualControl) ? needsSave : true;
-    setNeedsSave(needsSave);
+    save = m_base->systemdCommunicator()->setServiceEnabled(m_manualControl) ? save : true;
+    setNeedsSave(save);
 }
 
 void FancontrolKCM::load()
 {
-    setNeedsSave(!m_base->loader()->load(QUrl::fromLocalFile("/etc/fancontrol")));
+    setManualControl(m_base->systemdCommunicator()->serviceEnabled());
+    m_base->loader()->load(QUrl::fromLocalFile("/etc/fancontrol"));
+    setNeedsSave(false);
 }
 
 void FancontrolKCM::defaults() 

+ 12 - 0
lib/src/loader.cpp

@@ -66,11 +66,13 @@ void Loader::parseHwmons()
         Hwmon *hwmon = new Hwmon(QFile::symLinkTarget(hwmonDir.absoluteFilePath(hwmonPath)), this);
         connect(hwmon, SIGNAL(configUpdateNeeded()), this, SLOT(createConfigFile()));
         connect(hwmon, SIGNAL(pwmFansChanged()), this, SLOT(emitAllPwmFansChanged()));
+        connect(hwmon, SIGNAL(tempsChanged()), this, SLOT(emitAllTempsChanged()));
         connect(this, SIGNAL(sensorsUpdateNeeded()), hwmon, SLOT(updateSensors()));
         m_hwmons << hwmon;
     }
     emit hwmonsChanged();
     emit allPwmFansChanged();
+    emit allTempsChanged();
 }
 
 bool Loader::load(const QUrl &url)
@@ -538,6 +540,16 @@ QList< QObject* > Loader::allPwmFans() const
     return list;
 }
 
+QList< QObject* > Loader::allTemps() const
+{
+    QList<QObject *> list;
+    foreach (const Hwmon *hwmon, m_hwmons)
+    {
+        list += hwmon->temps();
+    }
+    return list;
+}
+
 int Loader::getHwmonNumber(const QString &str)
 {
     if (str.isEmpty())

+ 4 - 0
lib/src/loader.h

@@ -36,6 +36,7 @@ class FANCONTROL_GUI_LIB_EXPORT Loader : public QObject
     Q_PROPERTY(QString configFile READ configFile NOTIFY configFileChanged)
     Q_PROPERTY(QList<QObject *> hwmons READ hwmons NOTIFY hwmonsChanged)
     Q_PROPERTY(QList<QObject *> allPwmFans READ allPwmFans NOTIFY allPwmFansChanged)
+    Q_PROPERTY(QList<QObject *> allTemps READ allTemps NOTIFY allTempsChanged)
     Q_PROPERTY(int interval READ interval WRITE setInterval NOTIFY intervalChanged)
     Q_PROPERTY(QString error READ error NOTIFY errorChanged)
     
@@ -52,6 +53,7 @@ public:
     QString configFile() const { return m_configFile; }
     QList<QObject *> hwmons() const;
     QList<QObject *> allPwmFans() const;
+    QList<QObject *> allTemps() const;
     int interval() const { return m_interval; }
     void setInterval(int interval, bool writeNewConfig = true);
     Hwmon * hwmon(int i) { return m_hwmons.value(i, Q_NULLPTR); }
@@ -70,6 +72,7 @@ protected slots:
 
     void createConfigFile();
     void emitAllPwmFansChanged() { emit allPwmFansChanged(); }
+    void emitAllTempsChanged() { emit allTempsChanged(); }
 
 
 protected:
@@ -94,6 +97,7 @@ signals:
     void errorChanged();
     void sensorsUpdateNeeded();
     void allPwmFansChanged();
+    void allTempsChanged();
 };
 
 #endif // LOADER_H

+ 35 - 14
lib/src/sensors.cpp

@@ -25,14 +25,18 @@
 #include <KSharedConfig>
 #include <KF5/KAuth/KAuthExecuteJob>
 
-Sensor::Sensor(Hwmon *parent, uint index) : QObject(parent),
+#define MAX_ERRORS_FOR_RPM_ZERO 10
+
+Sensor::Sensor(Hwmon *parent, uint index, const QString &path) : QObject(parent),
     m_parent(parent),
-    m_index(index)
+    m_index(index),
+    m_path(path)
 {
 }
 
 
-Fan::Fan(Hwmon *parent, uint index) : Sensor(parent, index)
+Fan::Fan(Hwmon *parent, uint index) : 
+    Sensor(parent, index, QString(parent->name() + QString("/fan") + QString::number(index)))
 {
     if (QDir(parent->path()).isReadable())
     {
@@ -90,6 +94,7 @@ PwmFan::PwmFan(Hwmon *parent, uint index) : Fan(parent, index),
     m_maxPwm(255),
     m_minStart(255),
     m_minStop(255),
+    m_zeroRpm(0),
     m_testStatus(notTesting)
 {
     m_testTimer.setSingleShot(true);
@@ -213,7 +218,7 @@ void PwmFan::test()
     m_testStatus = findingStop1;
     setPwmMode(1);
     setPwm(255);
-    m_testTimer.setInterval(2000);
+    m_testTimer.setInterval(500);
     m_testTimer.start();
     qDebug() << "Start testing...";
 }
@@ -234,12 +239,18 @@ void PwmFan::continueTest()
     {
     case findingStop1:
         if (m_rpm > 0)
-            setPwm(qMin(m_pwm * 0.9, m_pwm - 5.0));
+            setPwm(qMin(m_pwm * 0.95, m_pwm - 5.0));
         else
         {
-            m_testStatus = findingStart;
-            m_testTimer.setInterval(500);
-            qDebug() << "Start finding start value...";
+            if (m_zeroRpm < MAX_ERRORS_FOR_RPM_ZERO)
+                m_zeroRpm++;
+            else
+            {
+                m_testStatus = findingStart;
+                m_zeroRpm = 0;
+                m_testTimer.setInterval(250);
+                qDebug() << "Start finding start value...";
+            }
         }
         m_testTimer.start();
         break;
@@ -265,11 +276,20 @@ void PwmFan::continueTest()
         }
         else
         {
-            m_testStatus = notTesting;
-            m_testing = false;
-            emit testingChanged();
-            setMinStop(m_pwm + 5);
-            qDebug() << "Finished testing!";
+            if (m_zeroRpm < MAX_ERRORS_FOR_RPM_ZERO)
+            {
+                m_zeroRpm++;
+                m_testTimer.start();
+            }
+            else
+            {
+                m_testStatus = notTesting;
+                m_zeroRpm = 0;
+                m_testing = false;
+                emit testingChanged();
+                setMinStop(m_pwm + 5);
+                qDebug() << "Finished testing!";
+            }
         }
         break;
 
@@ -313,7 +333,8 @@ void PwmFan::setActive(bool a)
 }
 
 
-Temp::Temp(Hwmon *parent, uint index) : Sensor(parent, index)
+Temp::Temp(Hwmon *parent, uint index) : 
+    Sensor(parent, index, QString(parent->name() + QString("/temp") + QString::number(index)))
 {
     if (QDir(parent->path()).isReadable())
     {

+ 5 - 1
lib/src/sensors.h

@@ -34,14 +34,16 @@ class Sensor : public QObject
     Q_OBJECT
     Q_PROPERTY(uint index READ index CONSTANT)
     Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
+    Q_PROPERTY(QString path READ path CONSTANT)
     Q_PROPERTY(Hwmon * parent READ parent CONSTANT)
 
 public:
 
-    explicit Sensor(Hwmon *parent, uint index);
+    explicit Sensor(Hwmon *parent, uint index, const QString &path = QString());
 
     virtual QString name() const = 0;
     virtual void setName(const QString &name) = 0;
+    QString path() const { return m_path; }
     Hwmon * parent() const { return m_parent; }
     uint index() const { return m_index; }
 
@@ -60,6 +62,7 @@ protected:
 
     Hwmon *const m_parent;
     const uint m_index;
+    const QString m_path;
 };
 
 
@@ -218,6 +221,7 @@ protected:
     int m_minStart;
     int m_minStop;
     int m_pwmMode;
+    int m_zeroRpm;
 
     enum
     {

+ 16 - 0
package/contents/scripts/arrayfunctions.js

@@ -25,6 +25,14 @@ function names(array) {
     return names;
 }
 
+function namesWithPaths(array) {
+    var namesWithPaths = [];
+    for (var i=0; i<array.length; i++) {
+        namesWithPaths[i] = array[i].name + "  (" + array[i].path + ")";
+    }
+    return namesWithPaths;
+}
+
 function labels(array) {
     var labels = [];
     for (var i=0; i<array.length; i++) {
@@ -33,6 +41,14 @@ function labels(array) {
     return labels;
 }
 
+function labelsWithPaths(array) {
+    var labelsWithPaths = [];
+    for (var i=0; i<array.length; i++) {
+        labelsWithPaths[i] = array[i].label + "  (" + array[i].path + ")";
+    }
+    return labelsWithPaths;
+}
+
 function maxProperty(array, prop) {
     var max = 0;
     for (var i=0; i<array.length; i++) {

+ 1 - 1
package/contents/ui/KCM.qml

@@ -47,7 +47,7 @@ ColumnLayout {
         }
         ComboBox {
             id: fanCombobox
-            model: ArrayFunctions.names(kcm.base.loader.allPwmFans)
+            model: ArrayFunctions.namesWithPaths(kcm.base.loader.allPwmFans)
             Layout.fillWidth: true
             Layout.maximumWidth: root.width - fanLabel.width - parent.spacing
         }

+ 12 - 29
package/contents/ui/PwmFan.qml

@@ -51,18 +51,18 @@ Rectangle {
             hasTempCheckBox.checked = Qt.binding(function() { return fan.hasTemp; })
             fanOffCheckBox.checked = Qt.binding(function() { return (fan.minPwm == 0); })
             minStartInput.text = Qt.binding(function() { return fan.minStart; })
-            if (fan.hasTemp) {
-                hwmonBox.currentIndex = fan.temp.parent.index;
-                tempBox.currentIndex = fan.temp.index - 1;
+            if (fan.hasTemp && loader) {
+                tempBox.currentIndex = loader.allTemps.indexOf(fan.temp);
             }
         }
         canvas.requestPaint();
     }
     
     onFanChanged: update()
-    onUnitChanged: canvas.requestPaint()
-    onMinTempChanged: canvas.requestPaint()
-    onMaxTempChanged: canvas.requestPaint()
+    onLoaderChanged: update()
+    onUnitChanged: if (fan) canvas.requestPaint()
+    onMinTempChanged: if (fan) canvas.requestPaint()
+    onMaxTempChanged: if (fan) canvas.requestPaint()
     
     Connections {
         target: loader
@@ -122,6 +122,8 @@ Rectangle {
             onTextChanged: fan.name = text;
             horizontalAlignment: TextEdit.AlignLeft
             wrapMode: TextEdit.Wrap
+            font.bold: true
+            font.pointSize: 14
             selectByMouse: true
             Layout.fillWidth: true
 
@@ -347,33 +349,14 @@ Rectangle {
                 onCheckedChanged: fan.hasTemp = checked
             }
             RowLayout {                  
-                ComboBox {
-                    property QtObject hwmon: loader.hwmons[currentIndex]
-
-                    id: hwmonBox
-                    Layout.fillWidth: true
-                    model: ArrayFunctions.names(loader.hwmons)
-                    enabled: hasTempCheckBox.checked
-                }
-                Label {
-                    text: "/"
-                    anchors.verticalCenter: parent.verticalCenter
-                    verticalAlignment: Text.AlignVCenter
-                    enabled: hasTempCheckBox.checked
-                    renderType: Text.NativeRendering
-                }
                 ComboBox {
                     id: tempBox
                     Layout.fillWidth: true
-                    model: ArrayFunctions.names(hwmonBox.hwmon.temps)
+                    model: ArrayFunctions.namesWithPaths(loader.allTemps)
                     enabled: hasTempCheckBox.checked
                     onCurrentIndexChanged: { 
-                        if (hasTempCheckBox.checked && hwmonBox.hwmon)
-                            fan.temp = hwmonBox.hwmon.temps[currentIndex];
-                    }
-                    onModelChanged: {
-                        if (hasTempCheckBox.checked && hwmonBox.hwmon)
-                            fan.temp = hwmonBox.hwmon.temps[currentIndex];
+                        if (hasTempCheckBox.checked)
+                            fan.temp = loader.allTemps[currentIndex];
                     }
                 }
             }
@@ -426,7 +409,7 @@ Rectangle {
                 anchors.right: parent.right
                 onClicked: {
                     if (fan.testing) {
-                        fan.abortTesting();
+                        fan.abortTest();
                         systemdCom.serviceActive = true;
                     } else {
                         reactivateAfterTesting = systemdCom.serviceActive;