blob: 6ce02a29324f961857cc0873c4427dcc843d5f45 [file] [log] [blame]
Brad Bishope55ef3d2016-12-19 09:12:40 -05001#pragma once
2
Carol Wang9bbe6022019-08-01 17:31:30 +08003#include "average.hpp"
Patrick Venture043d3232018-08-31 10:10:53 -07004#include "hwmonio.hpp"
5#include "interface.hpp"
6#include "sensor.hpp"
7#include "sensorset.hpp"
8#include "sysfs.hpp"
Patrick Venture043d3232018-08-31 10:10:53 -07009#include "types.hpp"
10
Brad Bishop9c7b6e02016-12-19 12:43:36 -050011#include <sdbusplus/server.hpp>
William A. Kennington III0dd0c4d2018-10-18 19:20:01 -070012#include <sdeventplus/clock.hpp>
William A. Kennington III0fe4cb32018-10-18 19:19:58 -070013#include <sdeventplus/event.hpp>
William A. Kennington III0dd0c4d2018-10-18 19:20:01 -070014#include <sdeventplus/utility/timer.hpp>
Patrick Williamse8771fd2023-05-10 07:51:06 -050015
16#include <any>
17#include <future>
18#include <memory>
19#include <optional>
Patrick Venture043d3232018-08-31 10:10:53 -070020#include <string>
21#include <vector>
Brad Bishop075f7a22017-01-06 09:45:08 -050022
Patrick Ventureab10f162017-05-22 09:44:50 -070023static constexpr auto default_interval = 1000000;
24
Matthew Barth979c8062018-04-17 11:37:15 -050025static constexpr auto sensorID = 0;
26static constexpr auto sensorLabel = 1;
George Liuc9d61612022-10-12 14:31:39 +080027static constexpr auto sensorAccuracy = 2;
Lakshmi Yadlapati47fb49a2023-10-19 14:47:08 -050028static constexpr auto sensorPriority = 3;
29using SensorIdentifiers =
30 std::tuple<std::string, std::string, std::string, std::string>;
Matthew Barth979c8062018-04-17 11:37:15 -050031
Brad Bishopd499ca62016-12-19 09:24:50 -050032/** @class MainLoop
33 * @brief hwmon-readd main application loop.
34 */
35class MainLoop
36{
Patrick Venture043d3232018-08-31 10:10:53 -070037 public:
38 MainLoop() = delete;
39 MainLoop(const MainLoop&) = delete;
40 MainLoop& operator=(const MainLoop&) = delete;
William A. Kennington III0dd0c4d2018-10-18 19:20:01 -070041 MainLoop(MainLoop&&) = delete;
42 MainLoop& operator=(MainLoop&&) = delete;
Patrick Venture043d3232018-08-31 10:10:53 -070043 ~MainLoop() = default;
Brad Bishopd499ca62016-12-19 09:24:50 -050044
Patrick Venture043d3232018-08-31 10:10:53 -070045 /** @brief Constructor
46 *
47 * @param[in] bus - sdbusplus bus client connection.
48 * @param[in] param - the path parameter provided
49 * @param[in] path - hwmon sysfs instance to manage
50 * @param[in] devPath - physical device sysfs path.
51 * @param[in] prefix - DBus busname prefix.
52 * @param[in] root - DBus sensors namespace root.
Anton D. Kachalovd46d0812021-02-03 23:25:37 +010053 * @param[in] instanceId - override value to identify instance on d-bus.
Patrick Venture043d3232018-08-31 10:10:53 -070054 *
55 * Any DBus objects are created relative to the DBus
56 * sensors namespace root.
57 *
58 * At startup, the application will own a busname with
59 * the format <prefix>.hwmon<n>.
60 */
Patrick Williamsad6043f2022-07-22 19:26:56 -050061 MainLoop(sdbusplus::bus_t&& bus, const std::string& param,
Patrick Venture043d3232018-08-31 10:10:53 -070062 const std::string& path, const std::string& devPath,
Patrick Venture16805a62019-06-21 14:19:33 -070063 const char* prefix, const char* root,
Anton D. Kachalovd46d0812021-02-03 23:25:37 +010064 const std::string& instanceId,
Patrick Venture16805a62019-06-21 14:19:33 -070065 const hwmonio::HwmonIOInterface* ioIntf);
Brad Bishopd499ca62016-12-19 09:24:50 -050066
Patrick Venture043d3232018-08-31 10:10:53 -070067 /** @brief Setup polling timer in a sd event loop and attach to D-Bus
68 * event loop.
69 */
70 void run();
Brad Bishopd499ca62016-12-19 09:24:50 -050071
Patrick Venture043d3232018-08-31 10:10:53 -070072 /** @brief Stop polling timer event loop from another thread.
73 *
74 * Typically only used by testcases.
75 */
76 void shutdown() noexcept;
Brad Bishopd499ca62016-12-19 09:24:50 -050077
Patrick Venture0cd4f692019-06-21 13:39:40 -070078 /** @brief Remove sensors slated for removal.
79 */
80 void removeSensors();
81
82 /** @brief Attempt to add sensors back that had been removed.
83 */
84 void addDroppedSensors();
85
Patrick Venture043d3232018-08-31 10:10:53 -070086 private:
87 using mapped_type =
88 std::tuple<SensorSet::mapped_type, std::string, ObjectInfo>;
89 using SensorState = std::map<SensorSet::key_type, mapped_type>;
Brad Bishop3c344d32017-01-05 11:48:39 -050090
Patrick Venture043d3232018-08-31 10:10:53 -070091 /** @brief Read hwmon sysfs entries */
92 void read();
Deepak Kodihalli2a51a9c2018-03-07 02:39:40 -060093
Patrick Venture043d3232018-08-31 10:10:53 -070094 /** @brief Set up D-Bus object state */
95 void init();
Deepak Kodihalli2a51a9c2018-03-07 02:39:40 -060096
Patrick Venture043d3232018-08-31 10:10:53 -070097 /** @brief sdbusplus bus client connection. */
Patrick Williamsad6043f2022-07-22 19:26:56 -050098 sdbusplus::bus_t _bus;
Patrick Venture043d3232018-08-31 10:10:53 -070099 /** @brief sdbusplus freedesktop.ObjectManager storage. */
Patrick Williamsad6043f2022-07-22 19:26:56 -0500100 sdbusplus::server::manager_t _manager;
Patrick Venture043d3232018-08-31 10:10:53 -0700101 /** @brief the parameter path used. */
102 std::string _pathParam;
103 /** @brief hwmon sysfs class path. */
104 std::string _hwmonRoot;
105 /** @brief hwmon sysfs instance. */
106 std::string _instance;
107 /** @brief physical device sysfs path. */
108 std::string _devPath;
109 /** @brief DBus busname prefix. */
110 const char* _prefix;
111 /** @brief DBus sensors namespace root. */
112 const char* _root;
113 /** @brief DBus object state. */
Patrick Venture52b40612018-12-19 13:36:41 -0800114 SensorState _state;
Anton D. Kachalovd46d0812021-02-03 23:25:37 +0100115 /** @brief DBus instance id specified by command line. */
116 std::string _instanceId;
Patrick Venture043d3232018-08-31 10:10:53 -0700117 /** @brief Sleep interval in microseconds. */
118 uint64_t _interval = default_interval;
119 /** @brief Hwmon sysfs access. */
Patrick Venture16805a62019-06-21 14:19:33 -0700120 const hwmonio::HwmonIOInterface* _ioAccess;
William A. Kennington III0fe4cb32018-10-18 19:19:58 -0700121 /** @brief the Event Loop structure */
Patrick Venture52b40612018-12-19 13:36:41 -0800122 sdeventplus::Event _event;
William A. Kennington III0dd0c4d2018-10-18 19:20:01 -0700123 /** @brief Read Timer */
Patrick Venture52b40612018-12-19 13:36:41 -0800124 sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> _timer;
Patrick Venture043d3232018-08-31 10:10:53 -0700125 /** @brief Store the specifications of sensor objects */
126 std::map<SensorSet::key_type, std::unique_ptr<sensor::Sensor>>
Patrick Venture52b40612018-12-19 13:36:41 -0800127 _sensorObjects;
Brandon Kim6d50c3e2019-08-09 15:38:53 -0700128 /** @brief Store the async futures of timed out sensor objects */
129 sensor::TimedoutMap _timedoutMap;
Matthew Barth31d214c2018-03-26 09:54:27 -0500130
Patrick Venture043d3232018-08-31 10:10:53 -0700131 /**
132 * @brief Map of removed sensors
133 */
Patrick Venture52b40612018-12-19 13:36:41 -0800134 std::map<SensorSet::key_type, SensorSet::mapped_type> _rmSensors;
Matthew Barth31d214c2018-03-26 09:54:27 -0500135
Carol Wang9bbe6022019-08-01 17:31:30 +0800136 /** @brief Object of class Average, to handle with average related process
137 */
138 Average _average;
139
Patrick Venture043d3232018-08-31 10:10:53 -0700140 /**
141 * @brief Get the ID of the sensor
142 *
143 * @param[in] sensor - Sensor to get the ID of
144 */
145 std::string getID(SensorSet::container_t::const_reference sensor);
Matthew Barth979c8062018-04-17 11:37:15 -0500146
Patrick Venture043d3232018-08-31 10:10:53 -0700147 /**
148 * @brief Get the sensor identifiers
149 *
150 * @param[in] sensor - Sensor to get the identifiers of
151 */
152 SensorIdentifiers
153 getIdentifiers(SensorSet::container_t::const_reference sensor);
Matthew Barth979c8062018-04-17 11:37:15 -0500154
Patrick Venture043d3232018-08-31 10:10:53 -0700155 /**
156 * @brief Used to create and add sensor objects
157 *
158 * @param[in] sensor - Sensor to create/add object for
159 *
160 * @return - Optional
161 * Object state data on success, nothing on failure
162 */
William A. Kennington III4cbdfef2018-10-18 19:19:51 -0700163 std::optional<ObjectStateData>
Patrick Venture043d3232018-08-31 10:10:53 -0700164 getObject(SensorSet::container_t::const_reference sensor);
Brad Bishopd499ca62016-12-19 09:24:50 -0500165};
Patrick Venturefeb744a2019-06-26 19:07:48 -0700166
167/** @brief Given a value and map of interfaces, update values and check
168 * thresholds.
169 */
Matt Spinlerecac0ae2020-07-08 13:09:08 -0500170void updateSensorInterfaces(InterfaceMap& ifaces, SensorValueType value);