1 /** 2 * Copyright © 2020 IBM Corporation 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 #pragma once 17 18 #include "chassis.hpp" 19 #include "id_map.hpp" 20 #include "rule.hpp" 21 #include "services.hpp" 22 23 #include <memory> 24 #include <utility> 25 #include <vector> 26 27 namespace phosphor::power::regulators 28 { 29 30 /** 31 * @class System 32 * 33 * The computer system being controlled and monitored by the BMC. 34 * 35 * The system contains one or more chassis. Chassis are large enclosures that 36 * can be independently powered off and on by the BMC. 37 */ 38 class System 39 { 40 public: 41 // Specify which compiler-generated methods we want 42 System() = delete; 43 System(const System&) = delete; 44 System(System&&) = delete; 45 System& operator=(const System&) = delete; 46 System& operator=(System&&) = delete; 47 ~System() = default; 48 49 /** 50 * Constructor. 51 * 52 * @param rules rules used to monitor and control regulators in the system 53 * @param chassis chassis in the system 54 */ 55 explicit System(std::vector<std::unique_ptr<Rule>> rules, 56 std::vector<std::unique_ptr<Chassis>> chassis) : 57 rules{std::move(rules)}, 58 chassis{std::move(chassis)} 59 { 60 buildIDMap(); 61 } 62 63 /** 64 * Close the regulator devices in the system. 65 * 66 * @param services system services like error logging and the journal 67 */ 68 void closeDevices(Services& services); 69 70 /** 71 * Configure the regulator devices in the system. 72 * 73 * This method should be called during the boot before regulators are 74 * enabled. 75 * 76 * @param services system services like error logging and the journal 77 */ 78 void configure(Services& services); 79 80 /** 81 * Returns the chassis in the system. 82 * 83 * @return chassis 84 */ 85 const std::vector<std::unique_ptr<Chassis>>& getChassis() const 86 { 87 return chassis; 88 } 89 90 /** 91 * Returns the IDMap for the system. 92 * 93 * The IDMap provides a mapping from string IDs to the associated Device, 94 * Rail, and Rule objects. 95 * 96 * @return IDMap 97 */ 98 const IDMap& getIDMap() const 99 { 100 return idMap; 101 } 102 103 /** 104 * Returns the rules used to monitor and control regulators in the system. 105 * 106 * @return rules 107 */ 108 const std::vector<std::unique_ptr<Rule>>& getRules() const 109 { 110 return rules; 111 } 112 113 /** 114 * Monitors the sensors for the voltage rails produced by this system, if 115 * any. 116 * 117 * This method should be called once per second. 118 * 119 * @param services system services like error logging and the journal 120 */ 121 void monitorSensors(Services& services); 122 123 private: 124 /** 125 * Builds the IDMap for the system. 126 * 127 * Adds the Device, Rail, and Rule objects in the system to the map. 128 */ 129 void buildIDMap(); 130 131 /** 132 * Rules used to monitor and control regulators in the system. 133 */ 134 std::vector<std::unique_ptr<Rule>> rules{}; 135 136 /** 137 * Chassis in the system. 138 */ 139 std::vector<std::unique_ptr<Chassis>> chassis{}; 140 141 /** 142 * Mapping from string IDs to the associated Device, Rail, and Rule objects. 143 */ 144 IDMap idMap{}; 145 }; 146 147 } // namespace phosphor::power::regulators 148