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