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 "action_environment.hpp" 19 #include "i2c_action.hpp" 20 21 #include <cstdint> 22 #include <string> 23 24 namespace phosphor::power::regulators 25 { 26 27 /** 28 * @class I2CCompareByteAction 29 * 30 * Compares a device register to a byte value. Communicates with the device 31 * directly using the I2C interface. 32 * 33 * Implements the i2c_compare_byte action in the JSON config file. 34 */ 35 class I2CCompareByteAction : public I2CAction 36 { 37 public: 38 // Specify which compiler-generated methods we want 39 I2CCompareByteAction() = delete; 40 I2CCompareByteAction(const I2CCompareByteAction&) = delete; 41 I2CCompareByteAction(I2CCompareByteAction&&) = delete; 42 I2CCompareByteAction& operator=(const I2CCompareByteAction&) = delete; 43 I2CCompareByteAction& operator=(I2CCompareByteAction&&) = delete; 44 virtual ~I2CCompareByteAction() = default; 45 46 /** 47 * Constructor. 48 * 49 * @param reg Device register address. Note: named 'reg' because 'register' 50 * is a reserved keyword. 51 * @param value Expected byte value. 52 * @param mask Bit mask. Specifies which bits should be compared within the 53 * byte value. Only the bits with a value of 1 in the mask will 54 * be compared. If not specified, defaults to 0xFF which means 55 * that all bits will be compared. 56 */ 57 explicit I2CCompareByteAction(uint8_t reg, uint8_t value, 58 uint8_t mask = 0xFF) : 59 reg{reg}, 60 value{value}, mask{mask} 61 {} 62 63 /** 64 * Executes this action. 65 * 66 * Compares a device register to a byte value using the I2C interface. 67 * 68 * The device register, byte value, and mask (if any) were specified in the 69 * constructor. 70 * 71 * The device is obtained from the specified action environment. 72 * 73 * Throws an exception if an error occurs. 74 * 75 * @param environment action execution environment 76 * @return true if the register contained the expected value, otherwise 77 * returns false. 78 */ 79 virtual bool execute(ActionEnvironment& environment) override; 80 81 /** 82 * Returns the device register address. 83 * 84 * @return register address 85 */ 86 uint8_t getRegister() const 87 { 88 return reg; 89 } 90 91 /** 92 * Returns the expected byte value. 93 * 94 * @return expected value 95 */ 96 uint8_t getValue() const 97 { 98 return value; 99 } 100 101 /** 102 * Returns the bit mask. 103 * 104 * Specifies which bits should be compared within the byte value. Only the 105 * bits with a value of 1 in the mask will be compared. 106 * 107 * @return bit mask 108 */ 109 uint8_t getMask() const 110 { 111 return mask; 112 } 113 114 /** 115 * Returns a string description of this action. 116 * 117 * @return description of action 118 */ 119 virtual std::string toString() const override; 120 121 private: 122 /** 123 * Device register address. Note: named 'reg' because 'register' is a 124 * reserved keyword. 125 */ 126 const uint8_t reg{0x00}; 127 128 /** 129 * Expected byte value. 130 */ 131 const uint8_t value{0x00}; 132 133 /** 134 * Bit mask. Specifies which bits should be compared within the byte value. 135 * Only the bits with a value of 1 in the mask will be compared. 136 */ 137 const uint8_t mask{0xFF}; 138 }; 139 140 } // namespace phosphor::power::regulators 141