1 /** 2 * Copyright 2019 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "sensors/buildjson.hpp" 18 19 #include "conf.hpp" 20 #include "sensors/sensor.hpp" 21 22 #include <cstdio> 23 #include <nlohmann/json.hpp> 24 25 using json = nlohmann::json; 26 27 namespace conf 28 { 29 void from_json(const json& j, conf::SensorConfig& s) 30 { 31 j.at("type").get_to(s.type); 32 j.at("readPath").get_to(s.readPath); 33 34 /* The writePath field is optional in a configuration */ 35 auto writePath = j.find("writePath"); 36 if (writePath == j.end()) 37 { 38 s.writePath = ""; 39 } 40 else 41 { 42 j.at("writePath").get_to(s.writePath); 43 } 44 45 /* Default to not ignore dbus MinValue/MaxValue - only used by passive 46 * sensors. 47 */ 48 s.ignoreDbusMinMax = false; 49 s.min = 0; 50 s.max = 0; 51 52 auto ignore = j.find("ignoreDbusMinMax"); 53 if (ignore != j.end()) 54 { 55 j.at("ignoreDbusMinMax").get_to(s.ignoreDbusMinMax); 56 } 57 58 /* The min field is optional in a configuration. */ 59 auto min = j.find("min"); 60 if (min != j.end()) 61 { 62 if (s.type == "fan") 63 { 64 j.at("min").get_to(s.min); 65 } 66 else 67 { 68 std::fprintf(stderr, "Non-fan types ignore min value specified\n"); 69 } 70 } 71 72 /* The max field is optional in a configuration. */ 73 auto max = j.find("max"); 74 if (max != j.end()) 75 { 76 if (s.type == "fan") 77 { 78 j.at("max").get_to(s.max); 79 } 80 else 81 { 82 std::fprintf(stderr, "Non-fan types ignore max value specified\n"); 83 } 84 } 85 86 /* The timeout field is optional in a configuration. */ 87 auto timeout = j.find("timeout"); 88 if (timeout == j.end()) 89 { 90 s.timeout = Sensor::getDefaultTimeout(s.type); 91 } 92 else 93 { 94 j.at("timeout").get_to(s.timeout); 95 } 96 } 97 } // namespace conf 98 99 std::map<std::string, struct conf::SensorConfig> 100 buildSensorsFromJson(const json& data) 101 { 102 std::map<std::string, struct conf::SensorConfig> config; 103 auto sensors = data["sensors"]; 104 105 /* TODO: If no sensors, this is invalid, and we should except here or during 106 * parsing. 107 */ 108 for (const auto& sensor : sensors) 109 { 110 config[sensor["name"]] = sensor.get<struct conf::SensorConfig>(); 111 } 112 113 return config; 114 } 115