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 <nlohmann/json.hpp> 23 24 #include <cstdio> 25 26 using json = nlohmann::json; 27 28 namespace conf 29 { 30 void from_json(const json& j, conf::SensorConfig& s) 31 { 32 j.at("type").get_to(s.type); 33 j.at("readPath").get_to(s.readPath); 34 35 /* The writePath field is optional in a configuration */ 36 auto writePath = j.find("writePath"); 37 if (writePath == j.end()) 38 { 39 s.writePath = ""; 40 } 41 else 42 { 43 j.at("writePath").get_to(s.writePath); 44 } 45 46 /* Default to not ignore dbus MinValue/MaxValue - only used by passive 47 * sensors. 48 */ 49 s.ignoreDbusMinMax = false; 50 s.min = 0; 51 s.max = 0; 52 53 auto ignore = j.find("ignoreDbusMinMax"); 54 if (ignore != j.end()) 55 { 56 j.at("ignoreDbusMinMax").get_to(s.ignoreDbusMinMax); 57 } 58 59 /* The min field is optional in a configuration. */ 60 auto min = j.find("min"); 61 if (min != j.end()) 62 { 63 if (s.type == "fan") 64 { 65 j.at("min").get_to(s.min); 66 } 67 else 68 { 69 std::fprintf(stderr, "Non-fan types ignore min value specified\n"); 70 } 71 } 72 73 /* The max field is optional in a configuration. */ 74 auto max = j.find("max"); 75 if (max != j.end()) 76 { 77 if (s.type == "fan") 78 { 79 j.at("max").get_to(s.max); 80 } 81 else 82 { 83 std::fprintf(stderr, "Non-fan types ignore max value specified\n"); 84 } 85 } 86 87 /* The timeout field is optional in a configuration. */ 88 auto timeout = j.find("timeout"); 89 if (timeout == j.end()) 90 { 91 s.timeout = Sensor::getDefaultTimeout(s.type); 92 } 93 else 94 { 95 j.at("timeout").get_to(s.timeout); 96 } 97 } 98 } // namespace conf 99 100 std::map<std::string, struct conf::SensorConfig> 101 buildSensorsFromJson(const json& data) 102 { 103 std::map<std::string, struct conf::SensorConfig> config; 104 auto sensors = data["sensors"]; 105 106 /* TODO: If no sensors, this is invalid, and we should except here or during 107 * parsing. 108 */ 109 for (const auto& sensor : sensors) 110 { 111 config[sensor["name"]] = sensor.get<struct conf::SensorConfig>(); 112 } 113 114 return config; 115 } 116