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 
32     bool operator==(const StateSensorEntry& e) const
33     {
34         return (
35             (containerId == e.containerId) && (entityType == e.entityType) &&
36             (entityInstance == e.entityInstance) &&
37             (sensorOffset == e.sensorOffset) && (stateSetid == e.stateSetid));
38     }
39 
40     bool operator<(const StateSensorEntry& e) const
41     {
42         return (
43             (containerId < e.containerId) ||
44             ((containerId == e.containerId) && (entityType < e.entityType)) ||
45             ((containerId == e.containerId) && (entityType == e.entityType) &&
46              (entityInstance < e.entityInstance)) ||
47             ((containerId == e.containerId) && (entityType == e.entityType) &&
48              (entityInstance == e.entityInstance) &&
49              (sensorOffset < e.sensorOffset)) ||
50             ((containerId == e.containerId) && (entityType == e.entityType) &&
51              (entityInstance == e.entityInstance) &&
52              (sensorOffset == e.sensorOffset) && (stateSetid < e.stateSetid)));
53     }
54 };
55 
56 using StateToDBusValue = std::map<pdr::EventState, pldm::utils::PropertyValue>;
57 using EventDBusInfo = std::tuple<pldm::utils::DBusMapping, StateToDBusValue>;
58 using EventMap = std::map<StateSensorEntry, EventDBusInfo>;
59 using Json = nlohmann::json;
60 
61 /** @class StateSensorHandler
62  *
63  *  @brief Parses the event state sensor configuration JSON file and build
64  *         the lookup data structure, which can map the event state for a
65  *         sensor in the PlatformEventMessage command to a D-Bus property and
66  *         the property value.
67  */
68 class StateSensorHandler
69 {
70   public:
71     StateSensorHandler() = delete;
72 
73     /** @brief Parse the event state sensor configuration JSON file and build
74      *         the lookup data stucture.
75      *
76      *  @param[in] dirPath - directory path which has the config JSONs
77      */
78     explicit StateSensorHandler(const std::string& dirPath);
79     virtual ~StateSensorHandler() = default;
80     StateSensorHandler(const StateSensorHandler&) = default;
81     StateSensorHandler& operator=(const StateSensorHandler&) = default;
82     StateSensorHandler(StateSensorHandler&&) = default;
83     StateSensorHandler& operator=(StateSensorHandler&&) = default;
84 
85     /** @brief If the StateSensorEntry and EventState is valid, the D-Bus
86      *         property corresponding to the StateSensorEntry is set based on
87      *         the EventState
88      *
89      *  @param[in] entry - state sensor entry
90      *  @param[in] state - event state
91      *
92      *  @return PLDM completion code
93      */
94     int eventAction(const StateSensorEntry& entry, pdr::EventState state);
95 
96     /** @brief Helper API to get D-Bus information for a StateSensorEntry
97      *
98      *  @param[in] entry - state sensor entry
99      *
100      *  @return D-Bus information corresponding to the SensorEntry
101      */
102     const EventDBusInfo& getEventInfo(const StateSensorEntry& entry) const
103     {
104         return eventMap.at(entry);
105     }
106 
107   private:
108     EventMap eventMap; //!< a map of StateSensorEntry to D-Bus information
109 
110     /** @brief Create a map of EventState to D-Bus property values from
111      *         the information provided in the event state configuration
112      *         JSON
113      *
114      *  @param[in] eventStates - a JSON array of event states
115      *  @param[in] propertyValues - a JSON array of D-Bus property values
116      *  @param[in] type - the type of D-Bus property
117      *
118      *  @return a map of EventState to D-Bus property values
119      */
120     StateToDBusValue mapStateToDBusVal(const Json& eventStates,
121                                        const Json& propertyValues,
122                                        std::string_view type);
123 };
124 
125 } // namespace pldm::responder::events
126