blob: f97c71c4a42be7085999c4d16e4cc2eb54d43a6a [file] [log] [blame]
James Feist6714a252018-09-10 15:26:18 -07001#pragma once
2
Ed Tanous8a57ec02020-10-09 12:46:52 -07003#include <Thresholds.hpp>
4#include <Utils.hpp>
James Feist8086aba2020-08-25 16:00:59 -07005#include <boost/asio/streambuf.hpp>
James Feist58295ad2019-05-30 15:01:41 -07006#include <boost/container/flat_map.hpp>
James Feist38fb5982020-05-28 10:09:54 -07007#include <gpiod.hpp>
8#include <sdbusplus/asio/object_server.hpp>
Ed Tanous8a57ec02020-10-09 12:46:52 -07009#include <sensor.hpp>
James Feist38fb5982020-05-28 10:09:54 -070010
James Feist58295ad2019-05-30 15:01:41 -070011#include <filesystem>
12#include <fstream>
Patrick Venturefd6ba732019-10-31 14:27:39 -070013#include <memory>
Patrick Venturefd6ba732019-10-31 14:27:39 -070014#include <stdexcept>
15#include <string>
16#include <variant>
17#include <vector>
James Feist6714a252018-09-10 15:26:18 -070018
Arun P. Mohanan04d05062021-10-29 20:30:26 +053019class CPUSensor : public Sensor, public std::enable_shared_from_this<CPUSensor>
James Feist6714a252018-09-10 15:26:18 -070020{
Jae Hyun Yoo8d9886d2018-10-22 15:24:29 -070021 public:
James Feistd8705872019-02-08 13:26:09 -080022 CPUSensor(const std::string& path, const std::string& objectType,
23 sdbusplus::asio::object_server& objectServer,
24 std::shared_ptr<sdbusplus::asio::connection>& conn,
Jae Hyun Yoo73ca5512019-02-28 21:20:17 -080025 boost::asio::io_service& io, const std::string& sensorName,
James Feistd8705872019-02-08 13:26:09 -080026 std::vector<thresholds::Threshold>&& thresholds,
Vijay Khemka86dea2b2019-06-06 11:14:37 -070027 const std::string& configuration, int cpuId, bool show,
28 double dtsOffset);
Ed Tanous8a57ec02020-10-09 12:46:52 -070029 ~CPUSensor() override;
Jae Hyun Yoo9ced0a32018-10-25 10:42:39 -070030 static constexpr unsigned int sensorScaleFactor = 1000;
31 static constexpr unsigned int sensorPollMs = 1000;
Jae Hyun Yoo73ca5512019-02-28 21:20:17 -080032 static constexpr size_t warnAfterErrorCount = 10;
Jae Hyun Yoo73ca5512019-02-28 21:20:17 -080033 static constexpr const char* labelTcontrol = "Tcontrol";
Arun P. Mohanan04d05062021-10-29 20:30:26 +053034 void setupRead(void);
Jae Hyun Yoo8d9886d2018-10-22 15:24:29 -070035
James Feist6714a252018-09-10 15:26:18 -070036 private:
James Feistd8705872019-02-08 13:26:09 -080037 sdbusplus::asio::object_server& objServer;
Ed Tanous77518b22021-11-05 13:02:23 -070038 boost::asio::streambuf readBuf;
Jae Hyun Yoo9ced0a32018-10-25 10:42:39 -070039 boost::asio::posix::stream_descriptor inputDev;
40 boost::asio::deadline_timer waitTimer;
Jae Hyun Yoo73ca5512019-02-28 21:20:17 -080041 std::string nameTcontrol;
James Feist930fcde2019-05-28 12:58:43 -070042 std::string path;
Jae Hyun Yoo73ca5512019-02-28 21:20:17 -080043 double privTcontrol;
Vijay Khemka86dea2b2019-06-06 11:14:37 -070044 double dtsOffset;
Jae Hyun Yoo73ca5512019-02-28 21:20:17 -080045 bool show;
James Feistc22b8422020-07-07 14:40:39 -070046 size_t pollTime;
James Feist838529b2020-09-02 16:57:05 -070047 bool loggedInterfaceDown = false;
Ed Tanousb429f312022-06-27 16:09:53 -070048 uint8_t minMaxReadCounter{0};
Ed Tanous2049bd22022-07-09 07:20:26 -070049 int fd{};
James Feistd8705872019-02-08 13:26:09 -080050 void handleResponse(const boost::system::error_code& err);
James Feistce3fca42018-11-21 12:58:24 -080051 void checkThresholds(void) override;
Zbigniew Kurzynski8d8d8d72020-05-29 19:21:24 +020052 void updateMinMaxValues(void);
Arun Lal K M84545712021-12-31 13:29:56 +000053 void restartRead(void);
James Feist6714a252018-09-10 15:26:18 -070054};
Jae Hyun Yoo73ca5512019-02-28 21:20:17 -080055
Arun P. Mohanan04d05062021-10-29 20:30:26 +053056extern boost::container::flat_map<std::string, std::shared_ptr<CPUSensor>>
Jae Hyun Yoo73ca5512019-02-28 21:20:17 -080057 gCpuSensors;
James Feist58295ad2019-05-30 15:01:41 -070058
59// this is added to cpusensor.hpp to avoid having every sensor have to link
60// against libgpiod, if another sensor needs it we may move it to utils
Zev Weissafd15042022-07-18 12:28:40 -070061inline bool cpuIsPresent(const SensorBaseConfigMap& gpioConfig)
James Feist58295ad2019-05-30 15:01:41 -070062{
Jae Hyun Yooffa07e22019-07-17 10:47:18 -070063 static boost::container::flat_map<std::string, bool> cpuPresence;
James Feist58295ad2019-05-30 15:01:41 -070064
Jae Hyun Yooffa07e22019-07-17 10:47:18 -070065 auto findName = gpioConfig.find("Name");
66 if (findName == gpioConfig.end())
67 {
68 return false;
69 }
70 std::string gpioName =
71 std::visit(VariantToStringVisitor(), findName->second);
72
73 auto findIndex = cpuPresence.find(gpioName);
James Feist58295ad2019-05-30 15:01:41 -070074 if (findIndex != cpuPresence.end())
75 {
76 return findIndex->second;
77 }
78
Jae Hyun Yooffa07e22019-07-17 10:47:18 -070079 bool activeHigh = true;
80 auto findPolarity = gpioConfig.find("Polarity");
81 if (findPolarity != gpioConfig.end())
James Feist58295ad2019-05-30 15:01:41 -070082 {
Jae Hyun Yooffa07e22019-07-17 10:47:18 -070083 if (std::string("Low") ==
84 std::visit(VariantToStringVisitor(), findPolarity->second))
James Feist58295ad2019-05-30 15:01:41 -070085 {
Jae Hyun Yooffa07e22019-07-17 10:47:18 -070086 activeHigh = false;
James Feist58295ad2019-05-30 15:01:41 -070087 }
88 }
89
Jae Hyun Yooffa07e22019-07-17 10:47:18 -070090 auto line = gpiod::find_line(gpioName);
James Feist58295ad2019-05-30 15:01:41 -070091 if (!line)
92 {
Jae Hyun Yooffa07e22019-07-17 10:47:18 -070093 std::cerr << "Error requesting gpio: " << gpioName << "\n";
94 return false;
James Feist58295ad2019-05-30 15:01:41 -070095 }
96
Ed Tanous74cffa82022-01-25 13:00:28 -080097 bool resp = false;
James Feist58295ad2019-05-30 15:01:41 -070098 try
99 {
Jae Hyun Yooffa07e22019-07-17 10:47:18 -0700100 line.request({"cpusensor", gpiod::line_request::DIRECTION_INPUT,
101 activeHigh ? 0 : gpiod::line_request::FLAG_ACTIVE_LOW});
Ed Tanous2049bd22022-07-09 07:20:26 -0700102 resp = (line.get_value() != 0);
James Feist58295ad2019-05-30 15:01:41 -0700103 }
Patrick Williams26601e82021-10-06 12:43:25 -0500104 catch (const std::system_error&)
James Feist58295ad2019-05-30 15:01:41 -0700105 {
Jae Hyun Yooffa07e22019-07-17 10:47:18 -0700106 std::cerr << "Error reading gpio: " << gpioName << "\n";
107 return false;
James Feist58295ad2019-05-30 15:01:41 -0700108 }
109
Jae Hyun Yooffa07e22019-07-17 10:47:18 -0700110 cpuPresence[gpioName] = resp;
111
James Feist58295ad2019-05-30 15:01:41 -0700112 return resp;
Vijay Khemka86dea2b2019-06-06 11:14:37 -0700113}