| #pragma once |
| |
| #include <linux/gpio.h> |
| #include "file.hpp" |
| |
| namespace witherspoon |
| { |
| namespace gpio |
| { |
| |
| typedef std::remove_reference<decltype( |
| gpiohandle_request::lineoffsets[0])>::type gpioNum_t; |
| |
| typedef std::remove_reference<decltype( |
| gpiohandle_data::values[0])>::type gpioValue_t; |
| |
| /** |
| * If the GPIO is an input or output |
| */ |
| enum class Direction |
| { |
| input, |
| output |
| }; |
| |
| /** |
| * The possible values - low or high |
| */ |
| enum class Value |
| { |
| low, |
| high |
| }; |
| |
| /** |
| * Represents a GPIO. |
| * |
| * Currently supports reading a GPIO. |
| * |
| * Write support may be added in the future. |
| */ |
| class GPIO |
| { |
| public: |
| |
| GPIO() = delete; |
| GPIO(const GPIO&) = delete; |
| GPIO(GPIO&&) = default; |
| GPIO& operator=(const GPIO&) = delete; |
| GPIO& operator=(GPIO&&) = default; |
| ~GPIO() = default; |
| |
| /** |
| * Constructor |
| * |
| * @param[in] device - the GPIO device file |
| * @param[in] gpio - the GPIO number |
| * @param[in] direction - the GPIO direction |
| */ |
| GPIO(const std::string& device, |
| gpioNum_t gpio, |
| Direction direction) : |
| device(device), |
| gpio(gpio), |
| direction(direction) |
| { |
| } |
| |
| /** |
| * Reads the GPIO value |
| * |
| * Requests the GPIO line if it hasn't been done already. |
| * |
| * @return Value - the GPIO value |
| */ |
| Value read(); |
| |
| private: |
| |
| /** |
| * Requests a GPIO line from the GPIO device |
| */ |
| void requestLine(); |
| |
| /** |
| * The GPIO device name, like /dev/gpiochip0 |
| */ |
| const std::string device; |
| |
| /** |
| * The GPIO number |
| */ |
| const gpioNum_t gpio; |
| |
| /** |
| * The GPIO direction |
| */ |
| const Direction direction; |
| |
| /** |
| * File descriptor for the GPIO line |
| */ |
| power::util::FileDescriptor lineFD; |
| }; |
| |
| } |
| } |