1 #pragma once 2 3 #include "Thresholds.hpp" 4 #include "sensor.hpp" 5 6 #include <sdbusplus/asio/object_server.hpp> 7 8 #include <chrono> 9 #include <string> 10 #include <vector> 11 12 class ExternalSensor : 13 public Sensor, 14 public std::enable_shared_from_this<ExternalSensor> 15 { 16 public: 17 ExternalSensor(const std::string& objectType, 18 sdbusplus::asio::object_server& objectServer, 19 std::shared_ptr<sdbusplus::asio::connection>& conn, 20 const std::string& sensorName, 21 const std::string& sensorUnits, 22 std::vector<thresholds::Threshold>&& thresholdsIn, 23 const std::string& sensorConfiguration, double maxReading, 24 double minReading, double timeoutSecs, 25 const PowerState& powerState); 26 ~ExternalSensor() override; 27 28 // Call this immediately after calling the constructor 29 void initWriteHook( 30 std::function<void(std::chrono::steady_clock::time_point now)>&& 31 writeHookIn); 32 33 // Returns true if sensor has external Value that is subject to timeout 34 bool isAliveAndPerishable() const; 35 36 // Returns true if AliveAndPerishable and timeout has not yet happened 37 bool 38 isAliveAndFresh(const std::chrono::steady_clock::time_point& now) const; 39 40 // Marks the time when Value successfully received from external source 41 void writeBegin(const std::chrono::steady_clock::time_point& now); 42 43 // Marks sensor as timed out, replacing Value with floating-point "NaN" 44 void writeInvalidate(); 45 46 // Returns amount of time elapsed since last writeBegin() happened 47 std::chrono::steady_clock::duration 48 ageElapsed(const std::chrono::steady_clock::time_point& now) const; 49 50 // Returns amount of time remaining until sensor timeout will happen 51 std::chrono::steady_clock::duration 52 ageRemaining(const std::chrono::steady_clock::time_point& now) const; 53 54 private: 55 sdbusplus::asio::object_server& objServer; 56 57 std::chrono::steady_clock::time_point writeLast; 58 std::chrono::steady_clock::duration writeTimeout; 59 bool writeAlive{false}; 60 bool writePerishable; 61 std::function<void(const std::chrono::steady_clock::time_point& now)> 62 writeHook; 63 64 void checkThresholds() override; 65 void externalSetTrigger(); 66 }; 67