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