summaryrefslogtreecommitdiffstats
path: root/sysfs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sysfs.cpp')
-rw-r--r--sysfs.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/sysfs.cpp b/sysfs.cpp
new file mode 100644
index 0000000..44ad8d6
--- /dev/null
+++ b/sysfs.cpp
@@ -0,0 +1,107 @@
+/**
+ * Copyright © 2019 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "sysfs.hpp"
+
+#include <fstream>
+#include <iostream>
+#include <string>
+
+namespace fs = std::experimental::filesystem;
+
+namespace phosphor
+{
+namespace led
+{
+
+constexpr char SysfsLed::BRIGHTNESS[];
+constexpr char SysfsLed::MAX_BRIGHTNESS[];
+constexpr char SysfsLed::TRIGGER[];
+constexpr char SysfsLed::DELAY_ON[];
+constexpr char SysfsLed::DELAY_OFF[];
+
+template <typename T>
+T get_sysfs_attr(const fs::path& path);
+
+template <>
+std::string get_sysfs_attr(const fs::path& path)
+{
+ std::string content;
+ std::ifstream file(path);
+ file >> content;
+ return content;
+}
+
+template <>
+unsigned long get_sysfs_attr(const fs::path& path)
+{
+ std::string content = get_sysfs_attr<std::string>(std::move(path));
+ return std::strtoul(content.c_str(), nullptr, 0);
+}
+
+template <typename T>
+void set_sysfs_attr(const fs::path& path, const T& value)
+{
+ std::ofstream file(path);
+ file << value;
+}
+
+unsigned long SysfsLed::getBrightness()
+{
+ return get_sysfs_attr<unsigned long>(root / BRIGHTNESS);
+}
+
+void SysfsLed::setBrightness(unsigned long brightness)
+{
+ set_sysfs_attr<unsigned long>(root / BRIGHTNESS, brightness);
+}
+
+unsigned long SysfsLed::getMaxBrightness()
+{
+ return get_sysfs_attr<unsigned long>(root / MAX_BRIGHTNESS);
+}
+
+std::string SysfsLed::getTrigger()
+{
+ return get_sysfs_attr<std::string>(root / TRIGGER);
+}
+
+void SysfsLed::setTrigger(const std::string& trigger)
+{
+ set_sysfs_attr<std::string>(root / TRIGGER, trigger);
+}
+
+unsigned long SysfsLed::getDelayOn()
+{
+ return get_sysfs_attr<unsigned long>(root / DELAY_ON);
+}
+
+void SysfsLed::setDelayOn(unsigned long ms)
+{
+ set_sysfs_attr<unsigned long>(root / DELAY_ON, ms);
+}
+
+unsigned long SysfsLed::getDelayOff()
+{
+ return get_sysfs_attr<unsigned long>(root / DELAY_OFF);
+}
+
+void SysfsLed::setDelayOff(unsigned long ms)
+{
+ set_sysfs_attr<unsigned long>(root / DELAY_OFF, ms);
+}
+} // namespace led
+} // namespace phosphor
OpenPOWER on IntegriCloud