IPMI: Virtual sensor support in host ipmid

Resolves openbmc/openbmc#1608

Change-Id: Id76446061fd0fa6dc3dead702538e424293af7ce
Signed-off-by: Dhruvaraj Subhashchandran <dhruvaraj@in.ibm.com>
diff --git a/sensordatahandler.hpp b/sensordatahandler.hpp
new file mode 100644
index 0000000..fa74235
--- /dev/null
+++ b/sensordatahandler.hpp
@@ -0,0 +1,150 @@
+#include "types.hpp"
+#include "host-ipmid/ipmid-api.h"
+
+namespace ipmi
+{
+namespace sensor
+{
+
+using Assertion = uint16_t;
+using Deassertion = uint16_t;
+using AssertionSet = std::pair<Assertion, Deassertion>;
+
+using Service = std::string;
+using Path = std::string;
+using Interface = std::string;
+
+using ServicePath = std::pair<Path, Service>;
+
+using Interfaces = std::vector<Interface>;
+
+using MapperResponseType = std::map<Path, std::map<Service, Interfaces>>;
+
+/** @brief get the D-Bus service and service path
+ *  @param[in] bus - The Dbus bus object
+ *  @param[in] interface - interface to the service
+ *  @param[in] path - interested path in the list of objects
+ *  @return pair of service path and service
+ */
+ServicePath getServiceAndPath(sdbusplus::bus::bus& bus,
+                              const std::string& interface,
+                              const std::string& path = std::string());
+
+/** @brief Make assertion set from input data
+ *  @param[in] cmdData - Input sensor data
+ *  @return pair of assertion and deassertion set
+ */
+AssertionSet getAssertionSet(const SetSensorReadingReq& cmdData);
+
+/** @brief send the message to DBus
+ *  @param[in] msg - message to send
+ *  @return failure status in IPMI error code
+ */
+ipmi_ret_t updateToDbus(const IpmiUpdateData& msg);
+
+namespace set
+{
+
+/** @brief Make a DBus message for a Dbus call
+ *  @param[in] updateInterface - Interface name
+ *  @param[in] sensorPath - Path of the sensor
+ *  @param[in] command - command to be executed
+ *  @param[in] sensorInterface - DBus interface of sensor
+ *  @return a dbus message
+ */
+IpmiUpdateData makeDbusMsg(const std::string& updateInterface,
+                           const std::string& sensorPath,
+                           const std::string& command,
+                           const std::string& sensorInterface);
+
+/** @brief Create a message for IPMI assertion
+ *  @param[in] msg - Message to add the values
+ *  @param[in] interface - sensor interface
+ *  @param[in] sensorPath - Path of the sensor
+ *  @param[in] cmdData - input sensor data
+ *  @return a IPMI error code
+ */
+ipmi_ret_t appendAssertion(IpmiUpdateData& msg,
+                           const DbusInterfaceMap& interfaceMap,
+                           const std::string& sensorPath,
+                           const SetSensorReadingReq& cmdData);
+
+/** @brief Create a message for discrete signal
+ *  @param[in] msg - Message to add the values
+ *  @param[in] interface - sensor interface
+ *  @param[in] data - input discrete sensor data
+ *  @return a IPMI error code
+ */
+ipmi_ret_t appendDiscreteSignalData(IpmiUpdateData& msg,
+                                    const DbusInterfaceMap& interfaceMap,
+                                    uint8_t data);
+
+/** @brief Create a message for reading data
+ *  @param[in] msg - Message to add the values
+ *  @param[in] interface - sensor interface
+ *  @param[in] data - input sensor data
+ *  @return a IPMI error code
+ */
+ipmi_ret_t appendReadingData(IpmiUpdateData& msg,
+                             const DbusInterfaceMap& interfaceMap,
+                             const Value& data);
+
+}//namespace set
+
+namespace notify
+{
+
+/** @brief Make a DBus message for a Dbus call
+ *  @param[in] updateInterface - Interface name
+ *  @param[in] sensorPath - Path of the sensor
+ *  @param[in] command - command to be executed
+ *  @param[in] sensorInterface - DBus interface of sensor
+ *  @return a dbus message
+ */
+IpmiUpdateData makeDbusMsg(const std::string& updateInterface,
+                           const std::string& sensorPath,
+                           const std::string& command,
+                           const std::string& sensorInterface);
+
+/** @brief Create a message for IPMI discrete signal
+ *  @param[in] msg - Message to add the values
+ *  @param[in] interfaceMap - sensor interface
+ *  @param[in] sensorPath - Path of the sensor
+ *  @param[in] cmdData - input sensor data
+ *  @return a IPMI error code
+ */
+inline ipmi_ret_t appendDiscreteSignalData(IpmiUpdateData& msg,
+        const DbusInterfaceMap& interfaceMap,
+        uint8_t data)
+{
+    return IPMI_CC_OK;
+}
+
+/** @brief Create a message for reading data
+ *  @param[in] msg - Message to add the values
+ *  @param[in] interfaceMap - sensor interface
+ *  @param[in] data - input sensor data
+ *  @return a IPMI error code
+ */
+inline ipmi_ret_t appendReadingData(IpmiUpdateData& msg,
+                                    const DbusInterfaceMap& interfaceMap,
+                                    const Value &data)
+{
+    return IPMI_CC_OK;
+}
+
+/** @brief Create a message for IPMI asserting
+ *  @param[in] msg - Message to add the values
+ *  @param[in] interfaceMap - sensor interface
+ *  @param[in] sensorPath - Path of the sensor
+ *  @param[in] cmdData - input sensor data
+ *  @return a IPMI error code
+ */
+ipmi_ret_t appendAssertion(IpmiUpdateData& msg,
+                           const DbusInterfaceMap& interfaceMap,
+                           const std::string& sensorPath,
+                           const SetSensorReadingReq& cmdData);
+
+}//namespace notify
+}//namespace sensor
+}//namespace ipmi