rtu: add read status register and event support
Add support to read the status registers and generate the appropriate
events.
Tested:
Unit Test -
```
> meson test -t 10 -C builddir/ --print-errorlogs --wrapper="valgrind --error-exitcode=1" test_events
ninja: Entering directory `/host/repos/Modbus/phosphor-modbus/builddir'
ninja: no work to do.
1/1 test_events OK 9.69s
Ok: 1
Fail: 0
```
Tested on Qemu -
```
Apr 03 15:41:52 ventura phosphor-modbus-rtu[1654]: OPENBMC_MESSAGE_ID={"xyz.openbmc_project.Sensor.SensorFailure":{"SENSOR_NAME":"/xyz/openbmc_project/sensors/RPU_Coolant_Outlet_Thermometer_Status","_SOURCE":{"COLUMN":73,"FILE":"../git/common/ev
ents.cpp","FUNCTION":"sdbusplus::async::task<> phosphor::modbus::events::Events::generateSensorFailureEvent(sdbusplus::message::object_path, bool)","LINE":95,"PID":1654}}}
...
Apr 03 15:41:52 ventura phosphor-modbus-rtu[1654]: OPENBMC_MESSAGE_ID={"xyz.openbmc_project.Sensor.Threshold.ReadingCritical":{"READING_VALUE":1670.6000000000001,"SENSOR_NAME":"/xyz/openbmc_project/sensors/RPU_Coolant_Outlet_Temp_C","UNITS":"xyz
.openbmc_project.Sensor.Value.Unit.DegreesC","_SOURCE":{"COLUMN":67,"FILE":"../git/common/events.cpp","FUNCTION":"sdbusplus::async::task<> phosphor::modbus::events::Events::generateSensorReadingEvent(sdbusplus::message::object_path, phosphor::modbus::events::EventLevel, double, sdbusplus::common::xyz::openbmc_project::sensor::Value::Unit, bool)","LINE":48,"PID":1654}}}
```
Change-Id: Icd78f22cf07798d06916cc077ec3f8bfac9ee8d3
Signed-off-by: Jagpal Singh Gill <paligill@gmail.com>
diff --git a/common/events.hpp b/common/events.hpp
new file mode 100644
index 0000000..8a13f82
--- /dev/null
+++ b/common/events.hpp
@@ -0,0 +1,64 @@
+#pragma once
+
+#include <sdbusplus/async.hpp>
+#include <xyz/openbmc_project/Sensor/Value/client.hpp>
+
+namespace phosphor::modbus::events
+{
+
+using SensorValueIntf =
+ sdbusplus::client::xyz::openbmc_project::sensor::Value<>;
+
+enum class EventLevel
+{
+ critical,
+ warning
+};
+
+class Events
+{
+ public:
+ Events() = delete;
+
+ explicit Events(sdbusplus::async::context& ctx) : ctx(ctx) {}
+
+ auto generateSensorReadingEvent(sdbusplus::message::object_path objectPath,
+ EventLevel level, double value,
+ SensorValueIntf::Unit unit, bool asserted)
+ -> sdbusplus::async::task<>;
+
+ auto generateSensorFailureEvent(sdbusplus::message::object_path objectPath,
+ bool asserted) -> sdbusplus::async::task<>;
+
+ auto generateControllerFailureEvent(
+ sdbusplus::message::object_path objectPath, std::string additionalInfo,
+ bool asserted) -> sdbusplus::async::task<>;
+
+ auto generatePowerFaultEvent(sdbusplus::message::object_path objectPath,
+ std::string additionalInfo, bool asserted)
+ -> sdbusplus::async::task<>;
+
+ auto generateFilterFailureEvent(sdbusplus::message::object_path objectPath,
+ bool asserted) -> sdbusplus::async::task<>;
+
+ auto generatePumpFailureEvent(sdbusplus::message::object_path objectPath,
+ bool asserted) -> sdbusplus::async::task<>;
+
+ auto generateFanFailureEvent(sdbusplus::message::object_path objectPath,
+ bool asserted) -> sdbusplus::async::task<>;
+
+ auto generateLeakDetectedEvent(sdbusplus::message::object_path objectPath,
+ EventLevel level, bool asserted)
+ -> sdbusplus::async::task<>;
+
+ // Button Pressed
+
+ private:
+ /** @brief Map type for event name to log event object path */
+ using event_map_t = std::map<std::string, sdbusplus::message::object_path>;
+
+ sdbusplus::async::context& ctx;
+ event_map_t pendingEvents;
+};
+
+} // namespace phosphor::modbus::events