1 #pragma once
2 
3 #include "common/types.hpp"
4 #include "common/utils.hpp"
5 
6 #include <nlohmann/json.hpp>
7 
8 #include <filesystem>
9 #include <map>
10 #include <string>
11 #include <tuple>
12 #include <vector>
13 
14 namespace pldm::responder::events
15 {
16 
17 /** @struct StateSensorEntry
18  *
19  *  StateSensorEntry is a key to uniquely identify a state sensor, so that a
20  *  D-Bus action can be defined for PlatformEventMessage command with
21  *  sensorEvent type. This struct is used as a key in a std::map so implemented
22  *  operator== and operator<.
23  */
24 struct StateSensorEntry
25 {
26     pdr::ContainerID containerId;
27     pdr::EntityType entityType;
28     pdr::EntityInstance entityInstance;
29     pdr::SensorOffset sensorOffset;
30     pdr::StateSetId stateSetid;
31     bool skipContainerId;
32 
33     bool operator==(const StateSensorEntry& e) const
34     {
35         if (!skipContainerId)
36         {
37             return ((containerId == e.containerId) &&
38                     (entityType == e.entityType) &&
39                     (entityInstance == e.entityInstance) &&
40                     (sensorOffset == e.sensorOffset) &&
41                     (stateSetid == e.stateSetid));
42         }
43         else
44         {
45             return ((entityType == e.entityType) &&
46                     (entityInstance == e.entityInstance) &&
47                     (sensorOffset == e.sensorOffset) &&
48                     (stateSetid == e.stateSetid));
49         }
50     }
51 
52     bool operator<(const StateSensorEntry& e) const
53     {
54         if (!skipContainerId)
55         {
56             return std::tie(entityType, entityInstance, containerId,
57                             sensorOffset, stateSetid) <
58                    std::tie(e.entityType, e.entityInstance, e.containerId,
59                             e.sensorOffset, e.stateSetid);
60         }
61         else
62         {
63             return std::tie(entityType, entityInstance, sensorOffset,
64                             stateSetid) <
65                    std::tie(e.entityType, e.entityInstance, e.sensorOffset,
66                             e.stateSetid);
67         }
68     }
69 };
70 
71 using StateToDBusValue = std::map<pdr::EventState, pldm::utils::PropertyValue>;
72 using EventDBusInfo = std::tuple<pldm::utils::DBusMapping, StateToDBusValue>;
73 using EventMap = std::map<StateSensorEntry, EventDBusInfo>;
74 using Json = nlohmann::json;
75 
76 /** @class StateSensorHandler
77  *
78  *  @brief Parses the event state sensor configuration JSON file and build
79  *         the lookup data structure, which can map the event state for a
80  *         sensor in the PlatformEventMessage command to a D-Bus property and
81  *         the property value.
82  */
83 class StateSensorHandler
84 {
85   public:
86     StateSensorHandler() = delete;
87 
88     /** @brief Parse the event state sensor configuration JSON file and build
89      *         the lookup data structure.
90      *
91      *  @param[in] dirPath - directory path which has the config JSONs
92      */
93     explicit StateSensorHandler(const std::string& dirPath);
94     virtual ~StateSensorHandler() = default;
95     StateSensorHandler(const StateSensorHandler&) = default;
96     StateSensorHandler& operator=(const StateSensorHandler&) = default;
97     StateSensorHandler(StateSensorHandler&&) = default;
98     StateSensorHandler& operator=(StateSensorHandler&&) = default;
99 
100     /** @brief If the StateSensorEntry and EventState is valid, the D-Bus
101      *         property corresponding to the StateSensorEntry is set based on
102      *         the EventState
103      *
104      *  @param[in] entry - state sensor entry
105      *  @param[in] state - event state
106      *
107      *  @return PLDM completion code
108      */
109     int eventAction(const StateSensorEntry& entry, pdr::EventState state);
110 
111     /** @brief Helper API to get D-Bus information for a StateSensorEntry
112      *
113      *  @param[in] entry - state sensor entry
114      *
115      *  @return D-Bus information corresponding to the SensorEntry
116      */
117     const EventDBusInfo& getEventInfo(const StateSensorEntry& entry) const
118     {
119         return eventMap.at(entry);
120     }
121 
122   private:
123     EventMap eventMap; //!< a map of StateSensorEntry to D-Bus information
124 
125     /** @brief Create a map of EventState to D-Bus property values from
126      *         the information provided in the event state configuration
127      *         JSON
128      *
129      *  @param[in] eventStates - a JSON array of event states
130      *  @param[in] propertyValues - a JSON array of D-Bus property values
131      *  @param[in] type - the type of D-Bus property
132      *
133      *  @return a map of EventState to D-Bus property values
134      */
135     StateToDBusValue mapStateToDBusVal(const Json& eventStates,
136                                        const Json& propertyValues,
137                                        std::string_view type);
138 };
139 
140 } // namespace pldm::responder::events
141