1 #pragma once
2 
3 #include <xyz/openbmc_project/Association/Definitions/server.hpp>
4 #include <xyz/openbmc_project/Sensor/Value/server.hpp>
5 #include <xyz/openbmc_project/State/Decorator/OperationalStatus/server.hpp>
6 
7 namespace open_power
8 {
9 namespace occ
10 {
11 namespace dbus
12 {
13 
14 using ObjectPath = std::string;
15 
16 using SensorIntf = sdbusplus::server::object_t<
17     sdbusplus::xyz::openbmc_project::Sensor::server::Value>;
18 using OperationalStatusIntf =
19     sdbusplus::server::object_t<sdbusplus::xyz::openbmc_project::State::
20                                     Decorator::server::OperationalStatus>;
21 
22 // Note: Not using object<> so the PropertiesVariant ctor is available.
23 using AssociationIntf =
24     sdbusplus::xyz::openbmc_project::Association::server::Definitions;
25 
26 /** @class OccDBusSensors
27  *  @brief This is a custom D-Bus object, used to add D-Bus interface and update
28  *         the corresponding properties value.
29  */
30 class OccDBusSensors
31 {
32   private:
OccDBusSensors()33     OccDBusSensors() {}
34 
35   public:
36     OccDBusSensors(const OccDBusSensors&) = delete;
37     OccDBusSensors(OccDBusSensors&&) = delete;
38     OccDBusSensors& operator=(const OccDBusSensors&) = delete;
39     OccDBusSensors& operator=(OccDBusSensors&&) = delete;
40     ~OccDBusSensors() = default;
41 
getOccDBus()42     static OccDBusSensors& getOccDBus()
43     {
44         static OccDBusSensors customDBus;
45         return customDBus;
46     }
47 
48   public:
49     /** @brief Set the max value of the Sensor
50      *
51      *  @param[in] path  - The object path
52      *  @param[in] value - The value of the MaxValue property
53      *
54      *  @return true or false
55      */
56     bool setMaxValue(const std::string& path, double value);
57 
58     /** @brief Get the max value of the Sensor
59      *
60      *  @param[in] path  - The object path
61      *
62      *  @return bool     - The value of the MaxValue property
63      */
64     double getMaxValue(const std::string& path) const;
65 
66     /** @brief Set the min value of the Sensor
67      *
68      *  @param[in] path  - The object path
69      *  @param[in] value - The value of the MinValue property
70      *
71      *  @return true or false
72      */
73     bool setMinValue(const std::string& path, double value);
74 
75     /** @brief Get the min value of the Sensor
76      *
77      *  @param[in] path  - The object path
78      *
79      *  @return bool     - The value of the MinValue property
80      */
81     double getMinValue(const std::string& path) const;
82 
83     /** @brief Set the value of the Sensor
84      *
85      *  @param[in] path  - The object path
86      *  @param[in] value - The value of the Value property
87      *
88      *  @return true or false
89      */
90     bool setValue(const std::string& path, double value);
91 
92     /** @brief Get the value of the Sensor
93      *
94      *  @param[in] path  - The object path
95      *
96      *  @return bool     - The value of the Value property
97      */
98     double getValue(const std::string& path) const;
99 
100     /** @brief Set the unit of the Sensor
101      *
102      *  @param[in] path  - The object path
103      *  @param[in] value - The value of the Unit property
104      *
105      *  @return true or false
106      */
107     bool setUnit(const std::string& path, const std::string& value);
108 
109     /** @brief Get the unit of the Sensor
110      *
111      *  @param[in] path       - The object path
112      *
113      *  @return std::string   - The value of the Unit property
114      */
115     std::string getUnit(const std::string& path) const;
116 
117     /** @brief Set the Functional property
118      *
119      *  @param[in] path   - The object path
120      *  @param[in] value  - PLDM operational fault status
121      *
122      *  @return true or false
123      */
124     bool setOperationalStatus(const std::string& path, bool value);
125 
126     /** @brief Get the Functional property
127      *
128      *  @param[in] path   - The object path
129      *
130      *  @return status    - PLDM operational fault status
131      */
132     bool getOperationalStatus(const std::string& path) const;
133 
134     /** @brief Returns the Chassis inventory path
135      *
136      * @return path       - The chassis D-Bus path
137      */
138     std::string getChassisPath();
139 
140     /** @brief Set the association to the chassis
141      *
142      *  @param[in] path   - The object path
143      */
144     void setChassisAssociation(const std::string& path);
145 
146     /** @brief Set the value of the DVFS temp sensor
147      *
148      *  @param[in] path  - The object path
149      *  @param[in] value - The value of the Value property
150      */
151     void setDvfsTemp(const std::string& path, double value);
152 
153     /** @brief Says if the DVFS temp sensor is already present
154      *
155      *  @param[in] value - The value of the Value property
156      *  @return bool - If the sensor is already present
157      */
158     bool hasDvfsTemp(const std::string& path) const;
159 
160   private:
161     std::map<ObjectPath, std::unique_ptr<SensorIntf>> sensors;
162 
163     std::map<ObjectPath, std::unique_ptr<OperationalStatusIntf>>
164         operationalStatus;
165 
166     std::map<ObjectPath, std::unique_ptr<AssociationIntf>> chassisAssociations;
167 
168     std::string chassisPath;
169 
170     /** @brief Map of DVFS (Dynamic Voltage and Frequency Slewing) temps
171      *
172      * These do not have associations and do not get set to NaN when the OCC
173      * isn't active.
174      */
175     std::map<std::string, std::unique_ptr<SensorIntf>> dvfsTemps;
176 };
177 
178 } // namespace dbus
179 } // namespace occ
180 } // namespace open_power
181