hwmonio: split IoAccess object out

Split out the hwmon io access object from the sysfs namespace
into its own.

Change-Id: I8d1a45630117d1d503d0d5fa6061163911b695e8
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/hwmonio.hpp b/hwmonio.hpp
new file mode 100644
index 0000000..b254b0f
--- /dev/null
+++ b/hwmonio.hpp
@@ -0,0 +1,99 @@
+#pragma once
+
+#include <chrono>
+#include <string>
+
+namespace hwmonio {
+
+static constexpr auto retries = 10;
+static constexpr auto delay = std::chrono::milliseconds{100};
+
+/** @class HwmonIO
+ *  @brief Convenience wrappers for HWMON sysfs attribute IO.
+ *
+ *  Unburden the rest of the application from having to check
+ *  ENOENT after every hwmon attribute io operation.  Hwmon
+ *  device drivers can be unbound at any time; the program
+ *  cannot always be terminated externally before we try to
+ *  do an io.
+ */
+class HwmonIO
+{
+    public:
+        HwmonIO() = delete;
+        HwmonIO(const HwmonIO&) = default;
+        HwmonIO(HwmonIO&&) = default;
+        HwmonIO& operator=(const HwmonIO&) = default;
+        HwmonIO& operator=(HwmonIO&&) = default;
+        ~HwmonIO() = default;
+
+        /** @brief Constructor
+         *
+         *  @param[in] path - hwmon instance root - eg:
+         *      /sys/class/hwmon/hwmon<N>
+         */
+        explicit HwmonIO(const std::string& path);
+
+        /** @brief Perform formatted hwmon sysfs read.
+         *
+         *  Propagates any exceptions other than ENOENT.
+         *  ENOENT will result in a call to exit(0) in case
+         *  the underlying hwmon driver is unbound and
+         *  the program is inadvertently left running.
+         *
+         *  For possibly transient errors will retry up to
+         *  the specified number of times.
+         *
+         *  @param[in] type - The hwmon type (ex. temp).
+         *  @param[in] id - The hwmon id (ex. 1).
+         *  @param[in] sensor - The hwmon sensor (ex. input).
+         *  @param[in] retries - The number of times to retry.
+         *  @param[in] delay - The time to sleep between retry attempts.
+         *
+         *  @return val - The read value.
+         */
+        int64_t read(
+                const std::string& type,
+                const std::string& id,
+                const std::string& sensor,
+                size_t retries,
+                std::chrono::milliseconds delay,
+                bool isOCC = false) const;
+
+        /** @brief Perform formatted hwmon sysfs write.
+         *
+         *  Propagates any exceptions other than ENOENT.
+         *  ENOENT will result in a call to exit(0) in case
+         *  the underlying hwmon driver is unbound and
+         *  the program is inadvertently left running.
+         *
+         *  For possibly transient errors will retry up to
+         *  the specified number of times.
+         *
+         *  @param[in] val - The value to be written.
+         *  @param[in] type - The hwmon type (ex. fan).
+         *  @param[in] id - The hwmon id (ex. 1).
+         *  @param[in] retries - The number of times to retry.
+         *  @param[in] delay - The time to sleep between retry attempts.
+         */
+        void write(
+                uint32_t val,
+                const std::string& type,
+                const std::string& id,
+                const std::string& sensor,
+                size_t retries,
+                std::chrono::milliseconds delay) const;
+
+
+        /** @brief Hwmon instance path access.
+         *
+         *  @return path - The hwmon instance path.
+         */
+        std::string path() const;
+
+    private:
+        std::string p;
+};
+} // namespace hwmonio
+
+// vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4