xref: /openbmc/dbus-sensors/src/external/ExternalSensor.hpp (revision 556e04b8f374a9eb8cf32bf0e36ac46c14873eba)
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