#include "fan/FanCurve.h" #include "sensor/Sensor.h" #include #include #include #include #include #include #include #include using namespace std; namespace fs = filesystem; Serializer::Serializer() { if (!fs::exists(SERIALIZATION_DIR)) { fs::create_directory(SERIALIZATION_DIR); } } void Serializer::SerializeFans(vector> fans) { json obj; for (auto f : fans) { obj["fans"].push_back(f->toJson()); } WriteJson(obj); } vector> Serializer::DeserializeFans(vector> availableSensors) { vector> fans; // Create a for the sensors first, then searching becomes cheaper map> sensorMap; for (auto s : availableSensors) { sensorMap[s->toString()] = s; } auto data = ReadJson(); try { for (auto &el : data["fans"].items()) { auto pwmControl = make_shared(el.value()["PWMControl"]); auto rpmSensor = sensorMap[el.value()["LMSensor"]]; int minPWM = el.value()["MinPWM"]; int startPWM = el.value()["StartPWM"]; string label = el.value()["Label"]; auto fan = make_shared(pwmControl, rpmSensor); fan->MinPWM(minPWM); fan->StartPWM(startPWM); fan->Label(label); fans.push_back(fan); } } catch (const std::exception &e) { std::cout << "Deserialization error! Message: " << e.what() << std::endl; } return fans; } void Serializer::WriteJson(json o) { json obj; if (fs::exists(fs::path(SERIALIZATION_DIR) / FANS_JSON_FILENAME)) { obj = ReadJson(); } for (auto &[key, value] : o.items()) { obj[key] = value; } ofstream ostrm(fs::path(SERIALIZATION_DIR) / FANS_JSON_FILENAME, ios::trunc); ostrm << obj.dump(2) << "\n"; } json Serializer::ReadJson() { ifstream istrm(fs::path(SERIALIZATION_DIR) / FANS_JSON_FILENAME); return json::parse(istrm); } vector> Serializer::DeserializeFanCurves( std::vector> availableSensors, std::vector> availableFans) { auto data = ReadJson(); map> sensorMap; for (auto s : availableSensors) { sensorMap[s->toString()] = s; } 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()) { steps.push_back(FanStep{step.value()[0], step.value()[1]}); } for (auto &sensor : el.value()["Sensors"].items()) { if (sensorMap.contains(sensor.value())) sensors.push_back(sensorMap[sensor.value()]); } for (auto &fan : el.value()["Fans"].items()) { if (fanMap.contains(fan.value())) fans.push_back(fanMap[fan.value()]); } curves.push_back(make_shared(steps, sensors, fans)); } return curves; }