diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 4f247a6..b4cc83f 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -17,6 +17,7 @@ add_executable(app src/pwm/PWMControl.cxx src/pwm/PWMControlFacade.cxx src/fan/HwmonFan.cxx + src/fan/FanCurve.cxx src/FanGenerator.cxx src/Serializer.cxx src/sensor/SensorManager.cxx diff --git a/app/include/Serializer.h b/app/include/Serializer.h index 2973086..e274015 100644 --- a/app/include/Serializer.h +++ b/app/include/Serializer.h @@ -1,12 +1,14 @@ #ifndef SERIALIZER_H_ #define SERIALIZER_H_ +#include "fan/HwmonFan.h" #include #include #include #include +#include #include #define SERIALIZATION_DIR "/etc/fantasize" @@ -20,10 +22,9 @@ public: void SerializeFans(std::vector> fans); std::vector> DeserializeFans(std::vector> availableSensors); - - void SerializeTempSensors(std::vector> senors); - std::vector> - DeserializeTempSensors(std::vector> availableSensors); + std::vector> + DeserializeFanCurves(std::vector> availableSensors, + std::vector> availableFans); private: void WriteJson(json o); diff --git a/app/include/fan/FanCurve.h b/app/include/fan/FanCurve.h index 142c83d..3cbc675 100644 --- a/app/include/fan/FanCurve.h +++ b/app/include/fan/FanCurve.h @@ -14,6 +14,10 @@ struct FanStep { class FanCurve { public: + FanCurve(std::vector steps, + std::vector> sensors, + std::vector> fans); + void DoFanControl(); private: @@ -21,7 +25,7 @@ private: std::vector mSteps; std::vector> mTempSensors; - std::vector> mFans; + std::vector> mFans; }; #endif // FANCURVE_H_ diff --git a/app/src/Serializer.cxx b/app/src/Serializer.cxx index fdd730b..a3e48b2 100644 --- a/app/src/Serializer.cxx +++ b/app/src/Serializer.cxx @@ -1,3 +1,5 @@ +#include "fan/FanCurve.h" +#include "sensor/Sensor.h" #include #include #include @@ -72,16 +74,42 @@ json Serializer::ReadJson() { return json::parse(istrm); } -void Serializer::SerializeTempSensors(vector> sensors) { - json obj; +vector> Serializer::DeserializeFanCurves( + std::vector> availableSensors, + std::vector> availableFans) { + auto data = ReadJson(); - for (auto s : sensors) { - obj["tempSensors"].push_back(s->toJson()); + map> sensorMap; + for (auto s : availableSensors) { + sensorMap[s->toString()] = s; } - WriteJson(obj); -} -vector> -DeserializeTempSensors(vector> availableSensors) { - return vector>(); + map> fanMap; + for (auto f : availableFans) { + fanMap[f->toString()] = f; + } + + vector> curves; + + for (auto &el : data["fancurves"].items()) { + vector steps; + vector> sensors; + vector> fans; + + for (auto &step : el.value()["FanSteps"].items()) { + FanStep fanStep{step.value()[0], step.value()[1]}; + } + + for (auto &sensor : el.value()["Sensors"].items()) { + sensors.push_back(sensorMap[sensor.value()]); + } + + for (auto &fan : el.value()["Fans"].items()) { + fans.push_back(fanMap[fan.value()]); + } + + curves.push_back(make_shared(steps, sensors, fans)); + } + + return curves; } diff --git a/app/src/fan/FanCurve.cxx b/app/src/fan/FanCurve.cxx index f4e94e7..c03bc7b 100644 --- a/app/src/fan/FanCurve.cxx +++ b/app/src/fan/FanCurve.cxx @@ -4,6 +4,11 @@ using namespace std; +FanCurve::FanCurve(std::vector steps, + std::vector> sensors, + std::vector> fans) + : mSteps(steps), mTempSensors(sensors), mFans(fans) {} + void FanCurve::DoFanControl() { int temp = AggregateTemperature(); @@ -30,7 +35,7 @@ void FanCurve::DoFanControl() { int targetFanSpeed = p0 + ((p1 - p0) / (t1 - t0)) * (temp - t0); for (auto f : mFans) { - f->pwm(targetFanSpeed); + f->PWM(targetFanSpeed); } } diff --git a/app/src/main.cxx b/app/src/main.cxx index 2008d40..30b6fda 100644 --- a/app/src/main.cxx +++ b/app/src/main.cxx @@ -12,6 +12,7 @@ int main() { SensorManager sensorManager; auto pwmSensors = sensorManager.RPMSensors(); + auto tempSensors = sensorManager.TemperatureSensors(); PWMControlFacade pwmControlFacade; auto controls = pwmControlFacade.PWMControls(); @@ -25,10 +26,7 @@ int main() { // s.SerializeFans(fans); fans = s.DeserializeFans(pwmSensors); - std::for_each(std::execution::par, std::begin(fans), std::end(fans), - [](auto &&f) { f->FindMinPWM(); }); - - s.SerializeFans(fans); + auto curves = s.DeserializeFanCurves(tempSensors, fans); return 0; }