diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index c314f47..4f247a6 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -22,7 +22,7 @@ add_executable(app src/sensor/SensorManager.cxx ) -set_property(TARGET app PROPERTY CXX_STANDARD 17) +set_property(TARGET app PROPERTY CXX_STANDARD 20) target_include_directories(app PUBLIC include /opt/cuda) -target_link_libraries(app PUBLIC sensors nvidia-ml nlohmann_json::nlohmann_json) +target_link_libraries(app PUBLIC sensors nvidia-ml nlohmann_json::nlohmann_json tbb) diff --git a/app/include/fan/Fan.h b/app/include/fan/Fan.h index 9a97865..eb31e36 100644 --- a/app/include/fan/Fan.h +++ b/app/include/fan/Fan.h @@ -6,8 +6,11 @@ class Fan : public Serializable, public Printable { public: - virtual void pwm(int percent) = 0; - virtual int rpm() = 0; + virtual void PWM(int percent) = 0; + virtual int RPM() = 0; + + virtual void FindMinPWM() = 0; + virtual void FindStartPWM() = 0; }; #endif // FAN_H_ diff --git a/app/include/fan/HwmonFan.h b/app/include/fan/HwmonFan.h index 49aede9..4ec54c7 100644 --- a/app/include/fan/HwmonFan.h +++ b/app/include/fan/HwmonFan.h @@ -11,10 +11,14 @@ class HwmonFan : public Fan { public: HwmonFan(std::shared_ptr pwmControl, - std::shared_ptr rpmSensor); + std::shared_ptr rpmSensor, std::string label = "", + int minPWM = 0, int startPWM = 0); - void pwm(int percent) override; - int rpm() override; + void PWM(int percent) override; + int RPM() override; + + void FindMinPWM() override; + void FindStartPWM() override; json toJson() const override; @@ -24,6 +28,9 @@ private: std::shared_ptr mPWMControl; std::shared_ptr mRpmSensor; std::string mLabel; + + int mMinPWM; + int mStartPWM; }; #endif // HWMONFAN_H_ diff --git a/app/src/FanGenerator.cxx b/app/src/FanGenerator.cxx index 06f5255..3593c4f 100644 --- a/app/src/FanGenerator.cxx +++ b/app/src/FanGenerator.cxx @@ -1,4 +1,3 @@ -#include "FanGenerator.h" #include #include #include diff --git a/app/src/fan/HwmonFan.cxx b/app/src/fan/HwmonFan.cxx index 9e1c7ae..3f6a33c 100644 --- a/app/src/fan/HwmonFan.cxx +++ b/app/src/fan/HwmonFan.cxx @@ -1,20 +1,59 @@ +#include +#include +#include +#include + #include "pwm/PWMControl.h" #include #include +#define TIMEOUT 5 + using namespace std; -HwmonFan::HwmonFan(shared_ptr pwmControl, - shared_ptr rpmSensor) - : mPWMControl(pwmControl), mRpmSensor(rpmSensor) {} +HwmonFan::HwmonFan(std::shared_ptr pwmControl, + std::shared_ptr rpmSensor, std::string label, + int minPWM, int startPWM) + : mPWMControl(pwmControl), mRpmSensor(rpmSensor), mLabel(label), + mMinPWM(minPWM), mStartPWM(startPWM) { + mPWMControl->EnableManualControl(); +} -void HwmonFan::pwm(int percent) { mPWMControl->pwm(percent); } +void HwmonFan::PWM(int percent) { mPWMControl->pwm(percent); } -int HwmonFan::rpm() { return mRpmSensor->value(); } +int HwmonFan::RPM() { return mRpmSensor->value(); } + +void HwmonFan::FindMinPWM() { + int minPWM = 0; + + for (int curPWM = 100; curPWM > 0; curPWM -= 5) { + PWM(curPWM); + this_thread::sleep_for(chrono::seconds(TIMEOUT)); + + int curRPM = RPM(); + + if (curRPM <= 0) { + minPWM = curPWM + 5; + break; + } + } + + if (minPWM == 0) { + cout << "Fan never stopped. "; + } + cout << "Setting minimal PWM: " << minPWM << endl; + + mMinPWM = minPWM; +} + +void HwmonFan::FindStartPWM() {} json HwmonFan::toJson() const { json obj; - obj = {mPWMControl->toJson(), mRpmSensor->toJson(), mLabel}; + obj = {mPWMControl->toJson(), + mRpmSensor->toJson(), + {"label", mLabel}, + {"MinPWM", mMinPWM}}; return obj; } diff --git a/app/src/main.cxx b/app/src/main.cxx index 7b7bd95..2008d40 100644 --- a/app/src/main.cxx +++ b/app/src/main.cxx @@ -1,8 +1,11 @@ +#include #include #include #include #include +#include +#include #include #include @@ -18,11 +21,14 @@ int main() { std::vector> fans; - fans = m.FindFans(pwmSensors, controls); + // fans = m.FindFans(pwmSensors, controls); + // s.SerializeFans(fans); + fans = s.DeserializeFans(pwmSensors); - for (auto f : fans) { - std::cout << f->toString() << std::endl; - } + std::for_each(std::execution::par, std::begin(fans), std::end(fans), + [](auto &&f) { f->FindMinPWM(); }); + + s.SerializeFans(fans); return 0; } diff --git a/app/src/sensor/LMSensor.cxx b/app/src/sensor/LMSensor.cxx index e273cb3..c336cf3 100644 --- a/app/src/sensor/LMSensor.cxx +++ b/app/src/sensor/LMSensor.cxx @@ -21,6 +21,6 @@ const string LMSensor::toString() const { } json LMSensor::toJson() const { - json obj = {"HwmonSensor", toString()}; + json obj = {"LMSensor", toString()}; return obj; }