regulators: Create Chassis class
Create C++ class that implements the 'chassis' element from the JSON
config file. See chassis.md for more information.
Signed-off-by: Shawn McCarney <shawnmm@us.ibm.com>
Change-Id: I00544ad00fb810bc5d25896c83f2d7dd1221937d
diff --git a/phosphor-regulators/src/chassis.hpp b/phosphor-regulators/src/chassis.hpp
new file mode 100644
index 0000000..d9eec81
--- /dev/null
+++ b/phosphor-regulators/src/chassis.hpp
@@ -0,0 +1,117 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include "device.hpp"
+
+#include <memory>
+#include <stdexcept>
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace phosphor::power::regulators
+{
+
+/**
+ * @class Chassis
+ *
+ * A chassis within the system.
+ *
+ * Chassis are large enclosures that can be independently powered off and on by
+ * the BMC. Small and mid-sized systems may contain a single chassis. In a
+ * large rack-mounted system, each drawer may correspond to a chassis.
+ *
+ * A C++ Chassis object only needs to be created if the physical chassis
+ * contains regulators that need to be configured or monitored.
+ */
+class Chassis
+{
+ public:
+ // Specify which compiler-generated methods we want
+ Chassis() = delete;
+ Chassis(const Chassis&) = delete;
+ Chassis(Chassis&&) = delete;
+ Chassis& operator=(const Chassis&) = delete;
+ Chassis& operator=(Chassis&&) = delete;
+ ~Chassis() = default;
+
+ /**
+ * Constructor.
+ *
+ * Throws an exception if any of the input parameters are invalid.
+ *
+ * @param number Chassis number within the system. Chassis numbers start at
+ * 1 because chassis 0 represents the entire system.
+ * @param devices Devices within this chassis, if any. The vector should
+ * contain regulator devices and any related devices required
+ * to perform regulator operations.
+ */
+ explicit Chassis(unsigned int number,
+ std::vector<std::unique_ptr<Device>> devices =
+ std::vector<std::unique_ptr<Device>>{}) :
+ number{number},
+ devices{std::move(devices)}
+ {
+ if (number < 1)
+ {
+ throw std::invalid_argument{"Invalid chassis number: " +
+ std::to_string(number)};
+ }
+ }
+
+ /**
+ * Returns the devices within this chassis, if any.
+ *
+ * The vector contains regulator devices and any related devices
+ * required to perform regulator operations.
+ *
+ * @return devices in chassis
+ */
+ const std::vector<std::unique_ptr<Device>>& getDevices() const
+ {
+ return devices;
+ }
+
+ /**
+ * Returns the chassis number within the system.
+ *
+ * @return chassis number
+ */
+ unsigned int getNumber() const
+ {
+ return number;
+ }
+
+ private:
+ /**
+ * Chassis number within the system.
+ *
+ * Chassis numbers start at 1 because chassis 0 represents the entire
+ * system.
+ */
+ const unsigned int number{};
+
+ /**
+ * Devices within this chassis, if any.
+ *
+ * The vector contains regulator devices and any related devices
+ * required to perform regulator operations.
+ */
+ std::vector<std::unique_ptr<Device>> devices{};
+};
+
+} // namespace phosphor::power::regulators