Initial read-daemon for hwmon entries
Discoveres hwmon entries for fans, input voltage, and temperature
sensors. Polls entries on a 1s interval and displays a message to
stdout if one of the entries have changed.
diff --git a/readd.C b/readd.C
new file mode 100644
index 0000000..467ecbf
--- /dev/null
+++ b/readd.C
@@ -0,0 +1,79 @@
+#include <iostream>
+#include <memory>
+#include <thread>
+#include "argument.H"
+#include "sensorset.H"
+#include "sensorcache.H"
+#include "hwmon.H"
+#include "sysfs.H"
+
+static void exit_with_error(const char* err, char** argv)
+{
+ ArgumentParser::usage(argv);
+ std::cerr << std::endl;
+ std::cerr << "ERROR: " << err << std::endl;
+ exit(-1);
+}
+
+int main(int argc, char** argv)
+{
+ // Read arguments.
+ auto options = std::make_unique<ArgumentParser>(argc, argv);
+
+ // Parse out path argument.
+ auto path = (*options)["path"];
+ if (path == ArgumentParser::empty_string)
+ {
+ exit_with_error("Path not specified.", argv);
+ }
+
+ // Finished getting options out, so release the parser.
+ options.release();
+
+ // Check sysfs for available sensors.
+ auto sensors = std::make_unique<SensorSet>(path);
+ auto sensor_cache = std::make_unique<SensorCache>();
+
+ // TODO: Issue#3 - Need to make calls to the dbus sensor cache here to
+ // ensure the objects all exist?
+
+ // Polling loop.
+ while(true)
+ {
+ // Iterate through all the sensors.
+ for(auto& i : *sensors)
+ {
+ if (i.second.find(hwmon::entry::input) != i.second.end())
+ {
+ // Read value from sensor.
+ int value = 0;
+ read_sysfs(make_sysfs_path(path,
+ i.first.first, i.first.second,
+ hwmon::entry::input),
+ value);
+
+ // Update sensor cache.
+ if (sensor_cache->update(i.first, value))
+ {
+ // TODO: Issue#4 - dbus event here.
+ std::cout << i.first.first << i.first.second << " = "
+ << value << std::endl;
+ }
+ }
+ }
+
+ // Sleep until next interval.
+ // TODO: Issue#5 - Make this configurable.
+ // TODO: Issue#6 - Optionally look at polling interval sysfs entry.
+ {
+ using namespace std::literals::chrono_literals;
+ std::this_thread::sleep_for(1s);
+ }
+
+ // TODO: Issue#7 - Should probably periodically check the SensorSet
+ // for new entries.
+ }
+
+ return 0;
+}
+