1*e73bd0a1SAndrew Jeffery #pragma once 2*e73bd0a1SAndrew Jeffery 3*e73bd0a1SAndrew Jeffery #include "PwmSensor.hpp" 4*e73bd0a1SAndrew Jeffery #include "Thresholds.hpp" 5*e73bd0a1SAndrew Jeffery #include "sensor.hpp" 6*e73bd0a1SAndrew Jeffery 7*e73bd0a1SAndrew Jeffery #include <boost/asio/random_access_file.hpp> 8*e73bd0a1SAndrew Jeffery #include <sdbusplus/asio/object_server.hpp> 9*e73bd0a1SAndrew Jeffery 10*e73bd0a1SAndrew Jeffery #include <array> 11*e73bd0a1SAndrew Jeffery #include <memory> 12*e73bd0a1SAndrew Jeffery #include <string> 13*e73bd0a1SAndrew Jeffery #include <utility> 14*e73bd0a1SAndrew Jeffery 15*e73bd0a1SAndrew Jeffery class PSUSensor : public Sensor, public std::enable_shared_from_this<PSUSensor> 16*e73bd0a1SAndrew Jeffery { 17*e73bd0a1SAndrew Jeffery public: 18*e73bd0a1SAndrew Jeffery PSUSensor(const std::string& path, const std::string& objectType, 19*e73bd0a1SAndrew Jeffery sdbusplus::asio::object_server& objectServer, 20*e73bd0a1SAndrew Jeffery std::shared_ptr<sdbusplus::asio::connection>& conn, 21*e73bd0a1SAndrew Jeffery boost::asio::io_service& io, const std::string& sensorName, 22*e73bd0a1SAndrew Jeffery std::vector<thresholds::Threshold>&& thresholds, 23*e73bd0a1SAndrew Jeffery const std::string& sensorConfiguration, 24*e73bd0a1SAndrew Jeffery const PowerState& powerState, const std::string& sensorUnits, 25*e73bd0a1SAndrew Jeffery unsigned int factor, double max, double min, double offset, 26*e73bd0a1SAndrew Jeffery const std::string& label, size_t tSize, double pollRate); 27*e73bd0a1SAndrew Jeffery ~PSUSensor() override; 28*e73bd0a1SAndrew Jeffery void setupRead(void); 29*e73bd0a1SAndrew Jeffery 30*e73bd0a1SAndrew Jeffery private: 31*e73bd0a1SAndrew Jeffery // Note, this buffer is a shared_ptr because during a read, its lifetime 32*e73bd0a1SAndrew Jeffery // might have to outlive the PSUSensor class if the object gets destroyed 33*e73bd0a1SAndrew Jeffery // while in the middle of a read operation 34*e73bd0a1SAndrew Jeffery std::shared_ptr<std::array<char, 128>> buffer; 35*e73bd0a1SAndrew Jeffery sdbusplus::asio::object_server& objServer; 36*e73bd0a1SAndrew Jeffery boost::asio::random_access_file inputDev; 37*e73bd0a1SAndrew Jeffery boost::asio::steady_timer waitTimer; 38*e73bd0a1SAndrew Jeffery std::string path; 39*e73bd0a1SAndrew Jeffery unsigned int sensorFactor; 40*e73bd0a1SAndrew Jeffery double sensorOffset; 41*e73bd0a1SAndrew Jeffery thresholds::ThresholdTimer thresholdTimer; 42*e73bd0a1SAndrew Jeffery void restartRead(); 43*e73bd0a1SAndrew Jeffery void handleResponse(const boost::system::error_code& err, size_t bytesRead); 44*e73bd0a1SAndrew Jeffery void checkThresholds(void) override; 45*e73bd0a1SAndrew Jeffery unsigned int sensorPollMs = defaultSensorPollMs; 46*e73bd0a1SAndrew Jeffery 47*e73bd0a1SAndrew Jeffery static constexpr size_t warnAfterErrorCount = 10; 48*e73bd0a1SAndrew Jeffery 49*e73bd0a1SAndrew Jeffery public: 50*e73bd0a1SAndrew Jeffery static constexpr double defaultSensorPoll = 1.0; 51*e73bd0a1SAndrew Jeffery static constexpr unsigned int defaultSensorPollMs = 52*e73bd0a1SAndrew Jeffery static_cast<unsigned int>(defaultSensorPoll * 1000); 53*e73bd0a1SAndrew Jeffery }; 54*e73bd0a1SAndrew Jeffery 55*e73bd0a1SAndrew Jeffery class PSUProperty 56*e73bd0a1SAndrew Jeffery { 57*e73bd0a1SAndrew Jeffery public: 58*e73bd0a1SAndrew Jeffery PSUProperty(std::string name, double max, double min, unsigned int factor, 59*e73bd0a1SAndrew Jeffery double offset) : 60*e73bd0a1SAndrew Jeffery labelTypeName(std::move(name)), 61*e73bd0a1SAndrew Jeffery maxReading(max), minReading(min), sensorScaleFactor(factor), 62*e73bd0a1SAndrew Jeffery sensorOffset(offset) 63*e73bd0a1SAndrew Jeffery {} 64*e73bd0a1SAndrew Jeffery ~PSUProperty() = default; 65*e73bd0a1SAndrew Jeffery 66*e73bd0a1SAndrew Jeffery std::string labelTypeName; 67*e73bd0a1SAndrew Jeffery double maxReading; 68*e73bd0a1SAndrew Jeffery double minReading; 69*e73bd0a1SAndrew Jeffery unsigned int sensorScaleFactor; 70*e73bd0a1SAndrew Jeffery double sensorOffset; 71*e73bd0a1SAndrew Jeffery }; 72