| /** |
| * 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 "action_environment.hpp" |
| #include "i2c_action.hpp" |
| #include "i2c_interface.hpp" |
| #include "pmbus_utils.hpp" |
| |
| #include <cstdint> |
| #include <optional> |
| #include <string> |
| |
| namespace phosphor::power::regulators |
| { |
| |
| /** |
| * @class PMBusReadSensorAction |
| * |
| * Reads one sensor for a PMBus regulator rail. Communicates with the device |
| * directly using the I2C interface. |
| * |
| * Implements the pmbus_read_sensor action in the JSON config file. |
| * |
| * Currently supports the linear_11 and linear_16 sensor data formats. |
| * |
| * The linear_16 data format requires an exponent value. The exponent value |
| * can be specified in the constructor. Otherwise the exponent value will be |
| * obtained from the PMBus VOUT_MODE command. Note that some PMBus devices do |
| * not support the VOUT_MODE command. The exponent value for a device is often |
| * found in the device documentation (data sheet). |
| */ |
| class PMBusReadSensorAction : public I2CAction |
| { |
| public: |
| // Specify which compiler-generated methods we want |
| PMBusReadSensorAction() = delete; |
| PMBusReadSensorAction(const PMBusReadSensorAction&) = delete; |
| PMBusReadSensorAction(PMBusReadSensorAction&&) = delete; |
| PMBusReadSensorAction& operator=(const PMBusReadSensorAction&) = delete; |
| PMBusReadSensorAction& operator=(PMBusReadSensorAction&&) = delete; |
| virtual ~PMBusReadSensorAction() = default; |
| |
| /** |
| * Constructor. |
| * |
| * @param type Sensor value type. |
| * @param command PMBus command code. |
| * @param format Data format of the sensor value returned by the device. |
| * @param exponent Exponent value for linear_16 data format. |
| * Can be positive or negative. If not specified, the |
| * exponent value will be read from VOUT_MODE. |
| * Should not be specified if the data format is linear_11. |
| */ |
| explicit PMBusReadSensorAction(pmbus_utils::SensorValueType type, |
| uint8_t command, |
| pmbus_utils::SensorDataFormat format, |
| std::optional<int8_t> exponent) : |
| type{type}, |
| command{command}, format{format}, exponent{exponent} |
| { |
| } |
| |
| /** |
| * Executes this action. |
| * |
| * Reads one sensor using the I2C interface. |
| * |
| * The sensor value type is specified in the constructor. |
| * |
| * The PMBus command code is specified in the constructor. |
| * It is the register to read on the device. |
| * |
| * The sensor data format is specified in the constructor. Currently |
| * the linear_11 and linear_16 formats are supported. |
| * |
| * The linear_16 data format requires an exponent value. |
| * If an exponent value was specified in the constructor, that |
| * value will be used. Otherwise the exponent value will be obtained from |
| * the VOUT_MODE command. |
| * |
| * The device is obtained from the ActionEnvironment. |
| * |
| * Throws an exception if an error occurs. |
| * |
| * @param environment Action execution environment. |
| * @return true |
| */ |
| virtual bool execute(ActionEnvironment& environment) override; |
| |
| /** |
| * Returns the PMBus command code. |
| * |
| * @return command |
| */ |
| uint8_t getCommand() const |
| { |
| return command; |
| } |
| |
| /** |
| * Returns the optional exponent value for linear_16 data format. |
| * |
| * @return optional exponent value |
| */ |
| std::optional<int8_t> getExponent() const |
| { |
| return exponent; |
| } |
| |
| /** |
| * Returns the data format of the sensor value returned by the device. |
| * |
| * @return data format |
| */ |
| pmbus_utils::SensorDataFormat getFormat() const |
| { |
| return format; |
| } |
| |
| /** |
| * Returns the sensor value type. |
| * |
| * @return sensor value type. |
| */ |
| pmbus_utils::SensorValueType getType() const |
| { |
| return type; |
| } |
| |
| /** |
| * Returns a string description of this action. |
| * |
| * @return description of action |
| */ |
| virtual std::string toString() const override; |
| |
| private: |
| /** |
| * Gets the exponent value to use to convert a linear_16 format value to a |
| * decimal volts value. |
| * |
| * If an exponent value is defined for this action, that value is returned. |
| * Otherwise VOUT_MODE is read from the current device to obtain the |
| * exponent value. |
| * |
| * Throws an exception if an error occurs. |
| * |
| * @param interface I2C interface to the current device |
| * @return exponent value |
| */ |
| int8_t getExponentValue(i2c::I2CInterface& interface); |
| |
| /** |
| * Sensor value type. |
| */ |
| const pmbus_utils::SensorValueType type{}; |
| |
| /** |
| * PMBus command code. |
| */ |
| const uint8_t command{}; |
| |
| /** |
| * Data format of the sensor value returned by the device. |
| */ |
| const pmbus_utils::SensorDataFormat format{}; |
| |
| /** |
| * Optional exponent value for linear_16 data format. |
| */ |
| const std::optional<int8_t> exponent{}; |
| }; |
| |
| } // namespace phosphor::power::regulators |