Add PMBus class
This class provides the interfaces to read PMBus devices
via sysfs files.
This commit provides 3 interfaces:
1) Write an integer (to provide: echo 1 > clear_faults)
2) Read a file that represents a bit in a register.
3) Read a file that represents a bit in a register within
a PMBus page (or in something that acts like a page).
Additional ones may be added in the future.
ReadFailure/WriteFailure exceptions will be thrown on errors.
Change-Id: I7ea166da00ddc558a9f25c07e6ad9a16714cc3b6
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
diff --git a/pmbus.hpp b/pmbus.hpp
new file mode 100644
index 0000000..fc269ac
--- /dev/null
+++ b/pmbus.hpp
@@ -0,0 +1,108 @@
+#pragma once
+
+#include <experimental/filesystem>
+#include <string>
+#include <vector>
+
+namespace witherspoon
+{
+namespace pmbus
+{
+
+/**
+ * @class PMBus
+ *
+ * This class is an interface to communicating with PMBus devices
+ * by reading and writing sysfs files.
+ */
+class PMBus
+{
+ public:
+
+ PMBus() = delete;
+ ~PMBus() = default;
+ PMBus(const PMBus&) = default;
+ PMBus& operator=(const PMBus&) = default;
+ PMBus(PMBus&&) = default;
+ PMBus& operator=(PMBus&&) = default;
+
+ /**
+ * Constructor
+ *
+ * @param[in] path - path to the sysfs directory
+ */
+ PMBus(const std::string& path) :
+ basePath(path)
+ {
+ }
+
+ /**
+ * Reads a file in sysfs that represents a single bit,
+ * therefore doing a PMBus read.
+ *
+ * @param[in] name - path concatenated to
+ * basePath to read
+ *
+ * @return bool - false if result was 0, else true
+ */
+ bool readBit(const std::string& name);
+
+ /**
+ * Reads a file in sysfs that represents a single bit,
+ * where the page number passed in is substituted
+ * into the name in place of the 'P' character in it.
+ *
+ * @param[in] name - path concatenated to
+ * basePath to read
+ * @param[in] page - page number
+ *
+ * @return bool - false if result was 0, else true
+ */
+ bool readBitInPage(const std::string& name,
+ size_t page);
+
+ /**
+ * Writes an integer value to the file, therefore doing
+ * a PMBus write.
+ *
+ * @param[in] name - path concatenated to
+ * basePath to write
+ * @param[in] value - the value to write
+ */
+ void write(const std::string& name, int value);
+
+ /**
+ * Returns the sysfs base path of this device
+ */
+ inline const auto& path() const
+ {
+ return basePath;
+ }
+
+ /**
+ * Replaces the 'P' in the string passed in with
+ * the page number passed in.
+ *
+ * For example:
+ * insertPageNum("inP_enable", 42)
+ * returns "in42_enable"
+ *
+ * @param[in] templateName - the name string, with a 'P' in it
+ * @param[in] page - the page number to insert where the P was
+ *
+ * @return string - the new string with the page number in it
+ */
+ static std::string insertPageNum(const std::string& templateName,
+ size_t page);
+
+ private:
+
+ /**
+ * The sysfs device path
+ */
+ std::experimental::filesystem::path basePath;
+
+};
+
+}
+}