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