blob: 36e0ac143babc2944d821d5534e495875881d444 [file] [log] [blame]
#pragma once
#include <chrono>
#include <cmath>
#include <iostream>
#include <map>
#include <mutex>
#include <set>
#include <string>
#include <tuple>
#include <vector>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/message.hpp>
#include <sdbusplus/server.hpp>
#include "interfaces.hpp"
#include "dbus/util.hpp"
int DbusHandleSignal(sd_bus_message* msg, void* data, sd_bus_error* err);
/*
* This ReadInterface will passively listen for Value updates from whomever
* owns the associated dbus object.
*
* This requires another modification in phosphor-dbus-interfaces that will
* signal a value update every time it's read instead of only when it changes
* to help us:
* - ensure we're still receiving data (since we don't control the reader)
* - simplify stale data detection
* - simplify error detection
*/
class DbusPassive : public ReadInterface
{
public:
DbusPassive(sdbusplus::bus::bus& bus,
const std::string& type,
const std::string& id);
ReadReturn read(void) override;
void setValue(double value);
int64_t getScale(void);
std::string getId(void);
private:
sdbusplus::bus::bus& _bus;
sdbusplus::server::match::match _signal;
int64_t _scale;
std::string _id; // for debug identification
std::mutex _lock;
double _value = 0;
/* The last time the value was refreshed, not necessarily changed. */
std::chrono::high_resolution_clock::time_point _updated;
};