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