1e73bd0a1SAndrew Jeffery #pragma once
2e73bd0a1SAndrew Jeffery 
3e73bd0a1SAndrew Jeffery #include "DeviceMgmt.hpp"
4e73bd0a1SAndrew Jeffery #include "Thresholds.hpp"
5e73bd0a1SAndrew Jeffery #include "sensor.hpp"
6e73bd0a1SAndrew Jeffery 
7e73bd0a1SAndrew Jeffery #include <boost/asio/random_access_file.hpp>
8e73bd0a1SAndrew Jeffery #include <sdbusplus/asio/object_server.hpp>
9e73bd0a1SAndrew Jeffery 
10e73bd0a1SAndrew Jeffery #include <string>
11e73bd0a1SAndrew Jeffery #include <vector>
12e73bd0a1SAndrew Jeffery 
13e73bd0a1SAndrew Jeffery struct SensorParams
14e73bd0a1SAndrew Jeffery {
15e73bd0a1SAndrew Jeffery     double minValue;
16e73bd0a1SAndrew Jeffery     double maxValue;
17e73bd0a1SAndrew Jeffery     double offsetValue;
18e73bd0a1SAndrew Jeffery     double scaleValue;
19e73bd0a1SAndrew Jeffery     std::string units;
20e73bd0a1SAndrew Jeffery     std::string typeName;
21e73bd0a1SAndrew Jeffery };
22e73bd0a1SAndrew Jeffery 
23e73bd0a1SAndrew Jeffery class HwmonTempSensor :
24e73bd0a1SAndrew Jeffery     public Sensor,
25e73bd0a1SAndrew Jeffery     public std::enable_shared_from_this<HwmonTempSensor>
26e73bd0a1SAndrew Jeffery {
27e73bd0a1SAndrew Jeffery   public:
28e73bd0a1SAndrew Jeffery     HwmonTempSensor(const std::string& path, const std::string& objectType,
29e73bd0a1SAndrew Jeffery                     sdbusplus::asio::object_server& objectServer,
30e73bd0a1SAndrew Jeffery                     std::shared_ptr<sdbusplus::asio::connection>& conn,
311f978631SEd Tanous                     boost::asio::io_context& io, const std::string& sensorName,
32e73bd0a1SAndrew Jeffery                     std::vector<thresholds::Threshold>&& thresholds,
33e73bd0a1SAndrew Jeffery                     const struct SensorParams& thisSensorParameters,
34e73bd0a1SAndrew Jeffery                     float pollRate, const std::string& sensorConfiguration,
35e73bd0a1SAndrew Jeffery                     PowerState powerState,
36e73bd0a1SAndrew Jeffery                     const std::shared_ptr<I2CDevice>& i2cDevice);
37e73bd0a1SAndrew Jeffery     ~HwmonTempSensor() override;
38*201a1015SEd Tanous     void setupRead();
39e73bd0a1SAndrew Jeffery     void activate(const std::string& newPath,
40e73bd0a1SAndrew Jeffery                   const std::shared_ptr<I2CDevice>& newI2CDevice);
41*201a1015SEd Tanous     void deactivate();
42*201a1015SEd Tanous     bool isActive();
43e73bd0a1SAndrew Jeffery 
getI2CDevice() const44e73bd0a1SAndrew Jeffery     std::shared_ptr<I2CDevice> getI2CDevice() const
45e73bd0a1SAndrew Jeffery     {
46e73bd0a1SAndrew Jeffery         return i2cDevice;
47e73bd0a1SAndrew Jeffery     }
48e73bd0a1SAndrew Jeffery 
49e73bd0a1SAndrew Jeffery   private:
50e73bd0a1SAndrew Jeffery     // Ordering is important here; readBuf is first so that it's not destroyed
51e73bd0a1SAndrew Jeffery     // while async operations from other member fields might still be using it.
52e73bd0a1SAndrew Jeffery     std::array<char, 128> readBuf{};
53e73bd0a1SAndrew Jeffery     std::shared_ptr<I2CDevice> i2cDevice;
54e73bd0a1SAndrew Jeffery     sdbusplus::asio::object_server& objServer;
55e73bd0a1SAndrew Jeffery     boost::asio::random_access_file inputDev;
56e73bd0a1SAndrew Jeffery     boost::asio::steady_timer waitTimer;
57e73bd0a1SAndrew Jeffery     std::string path;
58e73bd0a1SAndrew Jeffery     double offsetValue;
59e73bd0a1SAndrew Jeffery     double scaleValue;
60e73bd0a1SAndrew Jeffery     unsigned int sensorPollMs;
61e73bd0a1SAndrew Jeffery 
62e73bd0a1SAndrew Jeffery     void handleResponse(const boost::system::error_code& err, size_t bytesRead);
63e73bd0a1SAndrew Jeffery     void restartRead();
64*201a1015SEd Tanous     void checkThresholds() override;
65e73bd0a1SAndrew Jeffery };
66