1 #pragma once 2 3 #include "dbus/util.hpp" 4 #include "interfaces.hpp" 5 6 #include <chrono> 7 #include <cmath> 8 #include <iostream> 9 #include <map> 10 #include <memory> 11 #include <mutex> 12 #include <sdbusplus/bus.hpp> 13 #include <sdbusplus/message.hpp> 14 #include <sdbusplus/server.hpp> 15 #include <set> 16 #include <string> 17 #include <tuple> 18 #include <vector> 19 20 int DbusHandleSignal(sd_bus_message* msg, void* data, sd_bus_error* err); 21 22 /* 23 * This ReadInterface will passively listen for Value updates from whomever 24 * owns the associated dbus object. 25 * 26 * This requires another modification in phosphor-dbus-interfaces that will 27 * signal a value update every time it's read instead of only when it changes 28 * to help us: 29 * - ensure we're still receiving data (since we don't control the reader) 30 * - simplify stale data detection 31 * - simplify error detection 32 */ 33 class DbusPassive : public ReadInterface 34 { 35 public: 36 static std::unique_ptr<ReadInterface> 37 CreateDbusPassive(sdbusplus::bus::bus& bus, const std::string& type, 38 const std::string& id, DbusHelperInterface* helper); 39 40 DbusPassive(sdbusplus::bus::bus& bus, const std::string& type, 41 const std::string& id, DbusHelperInterface* helper); 42 43 ReadReturn read(void) override; 44 45 void setValue(double value); 46 int64_t getScale(void); 47 std::string getId(void); 48 49 private: 50 sdbusplus::bus::bus& _bus; 51 sdbusplus::server::match::match _signal; 52 int64_t _scale; 53 std::string _id; // for debug identification 54 DbusHelperInterface* _helper; 55 56 std::mutex _lock; 57 double _value = 0; 58 /* The last time the value was refreshed, not necessarily changed. */ 59 std::chrono::high_resolution_clock::time_point _updated; 60 }; 61 62 int HandleSensorValue(sdbusplus::message::message& msg, DbusPassive* owner); 63