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