blob: c1b3fe33a94754448a4c7549abb5bb3ced24db60 [file] [log] [blame]
Brad Bishope55ef3d2016-12-19 09:12:40 -05001/**
2 * Copyright © 2016 IBM Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#include <iostream>
17#include <memory>
Brad Bishop9c7b6e02016-12-19 12:43:36 -050018#include <cstring>
19#include <cstdlib>
20#include <chrono>
Brad Bishope55ef3d2016-12-19 09:12:40 -050021#include "sensorset.hpp"
22#include "sensorcache.hpp"
23#include "hwmon.hpp"
24#include "sysfs.hpp"
Brad Bishopd499ca62016-12-19 09:24:50 -050025#include "mainloop.hpp"
Brad Bishope55ef3d2016-12-19 09:12:40 -050026
Brad Bishop9c7b6e02016-12-19 12:43:36 -050027using namespace std::literals::chrono_literals;
28
Brad Bishopb9e2b072016-12-19 13:47:10 -050029MainLoop::MainLoop(
Brad Bishop9c7b6e02016-12-19 12:43:36 -050030 sdbusplus::bus::bus&& bus,
Brad Bishopb9e2b072016-12-19 13:47:10 -050031 const std::string& path,
32 const char* prefix,
33 const char* root)
Brad Bishop9c7b6e02016-12-19 12:43:36 -050034 : _bus(std::move(bus)),
35 _manager(sdbusplus::server::manager::manager(_bus, root)),
36 _shutdown(false),
Brad Bishopb9e2b072016-12-19 13:47:10 -050037 _path(path),
38 _prefix(prefix),
Brad Bishop3c344d32017-01-05 11:48:39 -050039 _root(root),
40 state()
Brad Bishopd499ca62016-12-19 09:24:50 -050041{
Brad Bishop9c7b6e02016-12-19 12:43:36 -050042 if (_path.back() == '/')
43 {
44 _path.pop_back();
45 }
Brad Bishopd499ca62016-12-19 09:24:50 -050046}
47
48void MainLoop::shutdown() noexcept
49{
50 _shutdown = true;
51}
52
53void MainLoop::run()
Brad Bishope55ef3d2016-12-19 09:12:40 -050054{
55 // Check sysfs for available sensors.
Brad Bishopd499ca62016-12-19 09:24:50 -050056 auto sensors = std::make_unique<SensorSet>(_path);
Brad Bishope55ef3d2016-12-19 09:12:40 -050057 auto sensor_cache = std::make_unique<SensorCache>();
58
Brad Bishop75b4ab82017-01-06 09:33:50 -050059 for (auto& i : *sensors)
60 {
61 auto value = std::make_tuple(std::move(i.second));
62 state[std::move(i.first)] = std::move(value);
63 }
64
Brad Bishop9c7b6e02016-12-19 12:43:36 -050065 {
66 struct Free
67 {
68 void operator()(char* ptr) const
69 {
70 free(ptr);
71 }
72 };
73
74 auto copy = std::unique_ptr<char, Free>(strdup(_path.c_str()));
75 auto busname = std::string(_prefix) + '.' + basename(copy.get());
76 _bus.request_name(busname.c_str());
77 }
78
Brad Bishope55ef3d2016-12-19 09:12:40 -050079 // TODO: Issue#3 - Need to make calls to the dbus sensor cache here to
80 // ensure the objects all exist?
81
82 // Polling loop.
Brad Bishopd499ca62016-12-19 09:24:50 -050083 while (!_shutdown)
Brad Bishope55ef3d2016-12-19 09:12:40 -050084 {
85 // Iterate through all the sensors.
Brad Bishop75b4ab82017-01-06 09:33:50 -050086 for (auto& i : state)
Brad Bishope55ef3d2016-12-19 09:12:40 -050087 {
Brad Bishop75b4ab82017-01-06 09:33:50 -050088 auto& attrs = std::get<0>(i.second);
89 if (attrs.find(hwmon::entry::input) != attrs.end())
Brad Bishope55ef3d2016-12-19 09:12:40 -050090 {
91 // Read value from sensor.
92 int value = 0;
Brad Bishopd499ca62016-12-19 09:24:50 -050093 read_sysfs(make_sysfs_path(_path,
Brad Bishope55ef3d2016-12-19 09:12:40 -050094 i.first.first, i.first.second,
95 hwmon::entry::input),
96 value);
97
98 // Update sensor cache.
99 if (sensor_cache->update(i.first, value))
100 {
101 // TODO: Issue#4 - dbus event here.
102 std::cout << i.first.first << i.first.second << " = "
103 << value << std::endl;
104 }
105 }
106 }
107
Brad Bishop9c7b6e02016-12-19 12:43:36 -0500108 // Respond to DBus
109 _bus.process_discard();
110
Brad Bishope55ef3d2016-12-19 09:12:40 -0500111 // Sleep until next interval.
112 // TODO: Issue#5 - Make this configurable.
113 // TODO: Issue#6 - Optionally look at polling interval sysfs entry.
Brad Bishop9c7b6e02016-12-19 12:43:36 -0500114 _bus.wait((1000000us).count());
Brad Bishope55ef3d2016-12-19 09:12:40 -0500115
116 // TODO: Issue#7 - Should probably periodically check the SensorSet
117 // for new entries.
118 }
Brad Bishope55ef3d2016-12-19 09:12:40 -0500119}
120
121// vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4