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, 31*1f978631SEd 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; 38e73bd0a1SAndrew Jeffery void setupRead(void); 39e73bd0a1SAndrew Jeffery void activate(const std::string& newPath, 40e73bd0a1SAndrew Jeffery const std::shared_ptr<I2CDevice>& newI2CDevice); 41e73bd0a1SAndrew Jeffery void deactivate(void); 42e73bd0a1SAndrew Jeffery bool isActive(void); 43e73bd0a1SAndrew Jeffery 44e73bd0a1SAndrew 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(); 64e73bd0a1SAndrew Jeffery void checkThresholds(void) override; 65e73bd0a1SAndrew Jeffery }; 66