1 #pragma once
2 
3 #include "file.hpp"
4 
5 #include <linux/gpio.h>
6 
7 #include <string>
8 #include <type_traits>
9 
10 namespace witherspoon
11 {
12 namespace gpio
13 {
14 
15 typedef std::remove_reference<
16     decltype(gpiohandle_request::lineoffsets[0])>::type gpioNum_t;
17 
18 typedef std::remove_reference<decltype(gpiohandle_data::values[0])>::type
19     gpioValue_t;
20 
21 /**
22  * If the GPIO is an input or output
23  */
24 enum class Direction
25 {
26     input,
27     output
28 };
29 
30 /**
31  * The possible values - low or high
32  */
33 enum class Value
34 {
35     low,
36     high
37 };
38 
39 /**
40  * Represents a GPIO.
41  *
42  * Currently supports reading a GPIO.
43  *
44  * Write support may be added in the future.
45  */
46 class GPIO
47 {
48   public:
49     GPIO() = delete;
50     GPIO(const GPIO&) = delete;
51     GPIO(GPIO&&) = default;
52     GPIO& operator=(const GPIO&) = delete;
53     GPIO& operator=(GPIO&&) = default;
54     ~GPIO() = default;
55 
56     /**
57      * Constructor
58      *
59      * @param[in] device - the GPIO device file
60      * @param[in] gpio - the GPIO number
61      * @param[in] direction - the GPIO direction
62      */
63     GPIO(const std::string& device, gpioNum_t gpio, Direction direction) :
64         device(device), gpio(gpio), direction(direction)
65     {}
66 
67     /**
68      * Reads the GPIO value
69      *
70      * Requests the GPIO line if it hasn't been done already.
71      *
72      * @return Value - the GPIO value
73      */
74     Value read();
75 
76     /**
77      * Sets the GPIO value to low or high
78      *
79      * Requests the GPIO line if it hasn't been done already.
80      *
81      * @param[in] Value - the value to set
82      */
83     void set(Value value);
84 
85   private:
86     /**
87      * Requests a GPIO line from the GPIO device
88      *
89      * @param[in] defaultValue - The default value, required for
90      *                           output GPIOs only.
91      */
92     void requestLine(Value defaultValue = Value::high);
93 
94     /**
95      * The GPIO device name, like /dev/gpiochip0
96      */
97     const std::string device;
98 
99     /**
100      * The GPIO number
101      */
102     const gpioNum_t gpio;
103 
104     /**
105      * The GPIO direction
106      */
107     const Direction direction;
108 
109     /**
110      * File descriptor for the GPIO line
111      */
112     power::util::FileDescriptor lineFD;
113 };
114 
115 } // namespace gpio
116 } // namespace witherspoon
117