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