diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index b4cc83f..f3cb0ce 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -18,6 +18,7 @@ add_executable(app src/pwm/PWMControlFacade.cxx src/fan/HwmonFan.cxx src/fan/FanCurve.cxx + src/fan/FanLabeler.cxx src/FanGenerator.cxx src/Serializer.cxx src/sensor/SensorManager.cxx diff --git a/app/include/fan/Fan.h b/app/include/fan/Fan.h index eb31e36..9b81fc1 100644 --- a/app/include/fan/Fan.h +++ b/app/include/fan/Fan.h @@ -9,6 +9,10 @@ public: virtual void PWM(int percent) = 0; virtual int RPM() = 0; + virtual void Label(std::string label) = 0; + virtual void MinPWM(int value) = 0; + virtual void StartPWM(int value) = 0; + virtual void FindMinPWM() = 0; virtual void FindStartPWM() = 0; }; diff --git a/app/include/fan/FanLabeler.h b/app/include/fan/FanLabeler.h new file mode 100644 index 0000000..8cb2da7 --- /dev/null +++ b/app/include/fan/FanLabeler.h @@ -0,0 +1,14 @@ +#ifndef FANLABELER_H_ +#define FANLABELER_H_ + +#include +#include + +#include + +class FanLabeler { +public: + void RunFanLabelInteraction(std::vector> fans); +}; + +#endif // FANLABELER_H_ diff --git a/app/include/fan/HwmonFan.h b/app/include/fan/HwmonFan.h index 4ec54c7..6e54900 100644 --- a/app/include/fan/HwmonFan.h +++ b/app/include/fan/HwmonFan.h @@ -11,12 +11,15 @@ class HwmonFan : public Fan { public: HwmonFan(std::shared_ptr pwmControl, - std::shared_ptr rpmSensor, std::string label = "", - int minPWM = 0, int startPWM = 0); + std::shared_ptr rpmSensor); void PWM(int percent) override; int RPM() override; + void Label(std::string label) override; + void MinPWM(int value) override; + void StartPWM(int value) override; + void FindMinPWM() override; void FindStartPWM() override; diff --git a/app/src/Controller.hxx b/app/src/Controller.hxx new file mode 100644 index 0000000..25e6a8d --- /dev/null +++ b/app/src/Controller.hxx @@ -0,0 +1,8 @@ +#ifndef CONTROLLER_H_ +#define CONTROLLER_H_ + +class Controller { +public: +}; + +#endif // CONTROLLER_H_ diff --git a/app/src/Serializer.cxx b/app/src/Serializer.cxx index a3e48b2..59c2a02 100644 --- a/app/src/Serializer.cxx +++ b/app/src/Serializer.cxx @@ -46,6 +46,9 @@ Serializer::DeserializeFans(vector> availableSensors) { auto pwmControl = make_shared(el.value()["PWMControl"]); auto rpmSensor = sensorMap[el.value()["LMSensor"]]; + int minPWM = el.value()["MinPWM"]; + string label = el.value()["Label"]; + mapping.push_back(make_shared(pwmControl, rpmSensor)); } } catch (const std::exception &e) { @@ -58,7 +61,7 @@ void Serializer::WriteJson(json o) { json obj; if (fs::exists(fs::path(SERIALIZATION_DIR) / FANS_JSON_FILENAME)) { - auto obj = ReadJson(); + obj = ReadJson(); } for (auto &[key, value] : o.items()) { diff --git a/app/src/fan/FanLabeler.cxx b/app/src/fan/FanLabeler.cxx new file mode 100644 index 0000000..a1678d5 --- /dev/null +++ b/app/src/fan/FanLabeler.cxx @@ -0,0 +1,41 @@ +#include +#include + +#include + +using namespace std; + +void FanLabeler::RunFanLabelInteraction( + std::vector> fans) { + cout << "Setting all fans to their minimum value" << endl; + + for (auto f : fans) { + f->PWM(0); + } + + cout << endl; + + for (auto f : fans) { + cout << "Setting fan to max power" << endl; + + f->PWM(100); + + cout << "Look inside your PC and check which fan is\n" + "spinning fastest and enter a name for it.\n" + "Just press enter to skip." + << endl; + + std::string name; + getline(cin, name); + + if (!name.empty()) { + cout << "Setting " << name << " as label for this fan." << endl; + f->Label(name); + } + + cout << "Resetting fan to lowest value\n\n" << endl; + f->PWM(0); + } + + cout << "Done!\n" << endl; +} diff --git a/app/src/fan/HwmonFan.cxx b/app/src/fan/HwmonFan.cxx index 3f6a33c..66ea001 100644 --- a/app/src/fan/HwmonFan.cxx +++ b/app/src/fan/HwmonFan.cxx @@ -12,19 +12,31 @@ using namespace std; 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) { + std::shared_ptr rpmSensor) + : mPWMControl(pwmControl), mRpmSensor(rpmSensor) { + cout << "Enabling manual control" << endl; mPWMControl->EnableManualControl(); } -void HwmonFan::PWM(int percent) { mPWMControl->pwm(percent); } +void HwmonFan::PWM(int percent) { + if (percent < mMinPWM) { + mPWMControl->pwm(mMinPWM); + } else { + mPWMControl->pwm(percent); + } +} int HwmonFan::RPM() { return mRpmSensor->value(); } +void HwmonFan::Label(std::string label) { mLabel = label; } + +void HwmonFan::MinPWM(int value) { mMinPWM = value; } + +void HwmonFan::StartPWM(int value) { mStartPWM = value; } + void HwmonFan::FindMinPWM() { int minPWM = 0; + mMinPWM = 0; for (int curPWM = 100; curPWM > 0; curPWM -= 5) { PWM(curPWM); @@ -52,7 +64,7 @@ json HwmonFan::toJson() const { json obj; obj = {mPWMControl->toJson(), mRpmSensor->toJson(), - {"label", mLabel}, + {"Label", mLabel}, {"MinPWM", mMinPWM}}; return obj; } diff --git a/app/src/main.cxx b/app/src/main.cxx index 30b6fda..4524279 100644 --- a/app/src/main.cxx +++ b/app/src/main.cxx @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -26,7 +27,14 @@ int main() { // s.SerializeFans(fans); fans = s.DeserializeFans(pwmSensors); - auto curves = s.DeserializeFanCurves(tempSensors, fans); + std::for_each(std::execution::par, std::begin(fans), std::end(fans), + [](auto &&f) { f->FindMinPWM(); }); + + // auto curves = s.DeserializeFanCurves(tempSensors, fans); + FanLabeler labeler; + labeler.RunFanLabelInteraction(fans); + + s.SerializeFans(fans); return 0; }