#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> mapping; // 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()["HwmonSensor"]]; mapping.push_back(make_shared(pwmControl, rpmSensor)); } } catch (const std::exception &e) { std::cout << "Deserialization error! Message: " << e.what() << std::endl; } return mapping; } void Serializer::WriteJson(json o) { json obj; if (fs::exists(fs::path(SERIALIZATION_DIR) / FANS_JSON_FILENAME)) { auto 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); } void Serializer::SerializeTempSensors(vector> sensors) { json obj; for (auto s : sensors) { obj["tempSensors"].push_back(s->toJson()); } WriteJson(obj); } vector> DeserializeTempSensors(vector> availableSensors) { return vector>(); }