libgpiod  1.6.1
gpiod.hpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 /*
3  * This file is part of libgpiod.
4  *
5  * Copyright (C) 2017-2018 Bartosz Golaszewski <bartekgola@gmail.com>
6  */
7 
8 #ifndef __LIBGPIOD_GPIOD_CXX_HPP__
9 #define __LIBGPIOD_GPIOD_CXX_HPP__
10 
11 #include <bitset>
12 #include <chrono>
13 #include <gpiod.h>
14 #include <memory>
15 #include <string>
16 #include <vector>
17 
18 namespace gpiod {
19 
20 class line;
21 class line_bulk;
22 class line_iter;
23 class chip_iter;
24 struct line_event;
25 
42 class chip
43 {
44 public:
45 
49  GPIOD_API chip(void) = default;
50 
56  GPIOD_API chip(const ::std::string& device, int how = OPEN_LOOKUP);
57 
62  GPIOD_API chip(const chip& other) = default;
63 
68  GPIOD_API chip(chip&& other) = default;
69 
75  GPIOD_API chip& operator=(const chip& other) = default;
76 
82  GPIOD_API chip& operator=(chip&& other) = default;
83 
87  GPIOD_API ~chip(void) = default;
88 
97  GPIOD_API void open(const ::std::string &device, int how = OPEN_LOOKUP);
98 
102  GPIOD_API void reset(void) noexcept;
103 
108  GPIOD_API ::std::string name(void) const;
109 
114  GPIOD_API ::std::string label(void) const;
115 
120  GPIOD_API unsigned int num_lines(void) const;
121 
127  GPIOD_API line get_line(unsigned int offset) const;
128 
134  GPIOD_API line find_line(const ::std::string& name) const;
135 
141  GPIOD_API line_bulk get_lines(const ::std::vector<unsigned int>& offsets) const;
142 
147  GPIOD_API line_bulk get_all_lines(void) const;
148 
154  GPIOD_API line_bulk find_lines(const ::std::vector<::std::string>& names) const;
155 
161  GPIOD_API bool operator==(const chip& rhs) const noexcept;
162 
168  GPIOD_API bool operator!=(const chip& rhs) const noexcept;
169 
174  GPIOD_API explicit operator bool(void) const noexcept;
175 
180  GPIOD_API bool operator!(void) const noexcept;
181 
186  enum : int {
197  };
198 
199 private:
200 
201  chip(::gpiod_chip* chip);
202 
203  void throw_if_noref(void) const;
204 
205  ::std::shared_ptr<::gpiod_chip> _m_chip;
206 
207  friend chip_iter;
208  friend line_iter;
209 };
210 
215 {
219  enum : int {
232  };
233 
234  GPIOD_API static const ::std::bitset<32> FLAG_ACTIVE_LOW;
236  GPIOD_API static const ::std::bitset<32> FLAG_OPEN_SOURCE;
238  GPIOD_API static const ::std::bitset<32> FLAG_OPEN_DRAIN;
240  GPIOD_API static const ::std::bitset<32> FLAG_BIAS_DISABLE;
242  GPIOD_API static const ::std::bitset<32> FLAG_BIAS_PULL_DOWN;
244  GPIOD_API static const ::std::bitset<32> FLAG_BIAS_PULL_UP;
247  ::std::string consumer;
251  ::std::bitset<32> flags;
253 };
254 
262 class line
263 {
264 public:
265 
269  GPIOD_API line(void);
270 
275  GPIOD_API line(const line& other) = default;
276 
281  GPIOD_API line(line&& other) = default;
282 
288  GPIOD_API line& operator=(const line& other) = default;
289 
295  GPIOD_API line& operator=(line&& other) = default;
296 
300  GPIOD_API ~line(void) = default;
301 
306  GPIOD_API unsigned int offset(void) const;
307 
312  GPIOD_API ::std::string name(void) const;
313 
319  GPIOD_API ::std::string consumer(void) const;
320 
325  GPIOD_API int direction(void) const;
326 
331  GPIOD_API int active_state(void) const;
332 
337  GPIOD_API int bias(void) const;
338 
344  GPIOD_API bool is_used(void) const;
345 
350  GPIOD_API bool is_open_drain(void) const;
351 
356  GPIOD_API bool is_open_source(void) const;
357 
363  GPIOD_API void request(const line_request& config, int default_val = 0) const;
364 
368  GPIOD_API void release(void) const;
369 
374  GPIOD_API bool is_requested(void) const;
375 
380  GPIOD_API int get_value(void) const;
381 
386  GPIOD_API void set_value(int val) const;
387 
394  GPIOD_API void set_config(int direction, ::std::bitset<32> flags,
395  int value = 0) const;
396 
401  GPIOD_API void set_flags(::std::bitset<32> flags) const;
402 
406  GPIOD_API void set_direction_input() const;
407 
412  GPIOD_API void set_direction_output(int value = 0) const;
413 
420  GPIOD_API bool event_wait(const ::std::chrono::nanoseconds& timeout) const;
421 
426  GPIOD_API line_event event_read(void) const;
427 
432  GPIOD_API ::std::vector<line_event> event_read_multiple(void) const;
433 
438  GPIOD_API int event_get_fd(void) const;
439 
444  GPIOD_API const chip& get_chip(void) const;
445 
449  GPIOD_API void update(void) const;
450 
458  GPIOD_API void reset(void);
459 
465  GPIOD_API bool operator==(const line& rhs) const noexcept;
466 
472  GPIOD_API bool operator!=(const line& rhs) const noexcept;
473 
478  GPIOD_API explicit operator bool(void) const noexcept;
479 
485  GPIOD_API bool operator!(void) const noexcept;
486 
490  enum : int {
495  };
496 
500  enum : int {
505  };
506 
510  enum : int {
519  };
520 
521 private:
522 
523  line(::gpiod_line* line, const chip& owner);
524 
525  void throw_if_null(void) const;
526  line_event make_line_event(const ::gpiod_line_event& event) const noexcept;
527 
528  ::gpiod_line* _m_line;
529  chip _m_chip;
530 
531  friend chip;
532  friend line_bulk;
533  friend line_iter;
534 };
535 
541 GPIOD_API line find_line(const ::std::string& name);
542 
547 {
551  enum : int {
556  };
557 
558  ::std::chrono::nanoseconds timestamp;
564 };
565 
573 {
574 public:
575 
579  GPIOD_API line_bulk(void) = default;
580 
586  GPIOD_API line_bulk(const ::std::vector<line>& lines);
587 
592  GPIOD_API line_bulk(const line_bulk& other) = default;
593 
598  GPIOD_API line_bulk(line_bulk&& other) = default;
599 
605  GPIOD_API line_bulk& operator=(const line_bulk& other) = default;
606 
612  GPIOD_API line_bulk& operator=(line_bulk&& other) = default;
613 
617  GPIOD_API ~line_bulk(void) = default;
618 
625  GPIOD_API void append(const line& new_line);
626 
632  GPIOD_API line& get(unsigned int offset);
633 
640  GPIOD_API line& operator[](unsigned int offset);
641 
646  GPIOD_API unsigned int size(void) const noexcept;
647 
652  GPIOD_API bool empty(void) const noexcept;
653 
657  GPIOD_API void clear(void);
658 
665  GPIOD_API void request(const line_request& config,
666  const ::std::vector<int> default_vals = ::std::vector<int>()) const;
667 
671  GPIOD_API void release(void) const;
672 
678  GPIOD_API ::std::vector<int> get_values(void) const;
679 
685  GPIOD_API void set_values(const ::std::vector<int>& values) const;
686 
695  GPIOD_API void set_config(int direction, ::std::bitset<32> flags,
696  const ::std::vector<int> values = ::std::vector<int>()) const;
697 
702  GPIOD_API void set_flags(::std::bitset<32> flags) const;
703 
707  GPIOD_API void set_direction_input() const;
708 
714  GPIOD_API void set_direction_output(const ::std::vector<int>& values) const;
715 
723  GPIOD_API line_bulk event_wait(const ::std::chrono::nanoseconds& timeout) const;
724 
729  GPIOD_API explicit operator bool(void) const noexcept;
730 
735  GPIOD_API bool operator!(void) const noexcept;
736 
740  GPIOD_API static const unsigned int MAX_LINES;
741 
745  class iterator
746  {
747  public:
748 
752  GPIOD_API iterator(void) = default;
753 
758  GPIOD_API iterator(const iterator& other) = default;
759 
764  GPIOD_API iterator(iterator&& other) = default;
765 
771  GPIOD_API iterator& operator=(const iterator& other) = default;
772 
778  GPIOD_API iterator& operator=(iterator&& other) = default;
779 
783  GPIOD_API ~iterator(void) = default;
784 
790 
795  GPIOD_API const line& operator*(void) const;
796 
801  GPIOD_API const line* operator->(void) const;
802 
809  GPIOD_API bool operator==(const iterator& rhs) const noexcept;
810 
817  GPIOD_API bool operator!=(const iterator& rhs) const noexcept;
818 
819  private:
820 
821  iterator(const ::std::vector<line>::iterator& it);
822 
823  ::std::vector<line>::iterator _m_iter;
824 
825  friend line_bulk;
826  };
827 
832  GPIOD_API iterator begin(void) noexcept;
833 
838  GPIOD_API iterator end(void) noexcept;
839 
840 private:
841 
842  void throw_if_empty(void) const;
843  void to_line_bulk(::gpiod_line_bulk* bulk) const;
844 
845  ::std::vector<line> _m_bulk;
846 };
847 
855 
861 GPIOD_API chip_iter begin(chip_iter iter) noexcept;
862 
868 GPIOD_API chip_iter end(const chip_iter& iter) noexcept;
869 
874 {
875 public:
876 
880  GPIOD_API chip_iter(void) = default;
881 
886  GPIOD_API chip_iter(const chip_iter& other) = default;
887 
892  GPIOD_API chip_iter(chip_iter&& other) = default;
893 
899  GPIOD_API chip_iter& operator=(const chip_iter& other) = default;
900 
906  GPIOD_API chip_iter& operator=(chip_iter&& other) = default;
907 
911  GPIOD_API ~chip_iter(void) = default;
912 
917  GPIOD_API chip_iter& operator++(void);
918 
923  GPIOD_API const chip& operator*(void) const;
924 
929  GPIOD_API const chip* operator->(void) const;
930 
937  GPIOD_API bool operator==(const chip_iter& rhs) const noexcept;
938 
945  GPIOD_API bool operator!=(const chip_iter& rhs) const noexcept;
946 
947 private:
948 
949  chip_iter(::gpiod_chip_iter* iter);
950 
951  ::std::shared_ptr<::gpiod_chip_iter> _m_iter;
952  chip _m_current;
953 
954  friend chip_iter make_chip_iter(void);
955 };
956 
962 GPIOD_API line_iter begin(line_iter iter) noexcept;
963 
969 GPIOD_API line_iter end(const line_iter& iter) noexcept;
970 
975 {
976 public:
977 
981  GPIOD_API line_iter(void) = default;
982 
987  GPIOD_API line_iter(const chip& owner);
988 
993  GPIOD_API line_iter(const line_iter& other) = default;
994 
999  GPIOD_API line_iter(line_iter&& other) = default;
1000 
1006  GPIOD_API line_iter& operator=(const line_iter& other) = default;
1007 
1013  GPIOD_API line_iter& operator=(line_iter&& other) = default;
1014 
1018  GPIOD_API ~line_iter(void) = default;
1019 
1024  GPIOD_API line_iter& operator++(void);
1025 
1030  GPIOD_API const line& operator*(void) const;
1031 
1036  GPIOD_API const line* operator->(void) const;
1037 
1044  GPIOD_API bool operator==(const line_iter& rhs) const noexcept;
1045 
1052  GPIOD_API bool operator!=(const line_iter& rhs) const noexcept;
1053 
1054 private:
1055 
1056  ::std::shared_ptr<::gpiod_line_iter> _m_iter;
1057  line _m_current;
1058 };
1059 
1064 } /* namespace gpiod */
1065 
1066 #endif /* __LIBGPIOD_GPIOD_CXX_HPP__ */
Definition: gpiod.hpp:18
GPIOD_API::std::string name(void) const
Return the name of the chip held by this object.
static GPIOD_API const ::std::bitset< 32 > FLAG_OPEN_SOURCE
The line is an open-source port.
Definition: gpiod.hpp:236
GPIOD_API bool is_open_source(void) const
Check if this line represents an open-source GPIO.
GPIOD_API void append(const line &new_line)
Add a line to this line_bulk object.
GPIOD_API bool is_used(void) const
Check if this line is used by the kernel or other user space process.
GPIOD_API void request(const line_request &config, const ::std::vector< int > default_vals=::std::vector< int >()) const
Request all lines held by this object.
GPIOD_API void set_flags(::std::bitset< 32 > flags) const
Set configuration flags of this line.
GPIOD_API void clear(void)
Remove all lines from this object.
Listen for falling edge events.
Definition: gpiod.hpp:226
GPIOD_API void set_direction_output(const ::std::vector< int > &values) const
Change the direction all lines held by this object to output.
GPIOD_API void release(void) const
Release all lines held by this object.
Stores the configuration for line requests.
Definition: gpiod.hpp:214
GPIOD_API void set_config(int direction,::std::bitset< 32 > flags, const ::std::vector< int > values=::std::vector< int >()) const
Set configuration of all lines held by this object.
GPIOD_API line_bulk get_all_lines(void) const
Get all lines exposed by this chip.
GPIOD_API::std::string consumer(void) const
Get the consumer of this line (if any).
static GPIOD_API const ::std::bitset< 32 > FLAG_OPEN_DRAIN
The line is an open-drain port.
Definition: gpiod.hpp:238
::std::chrono::nanoseconds timestamp
Best estimate of time of event occurrence in nanoseconds.
Definition: gpiod.hpp:558
::std::bitset< 32 > flags
Additional request flags.
Definition: gpiod.hpp:251
GPIOD_API iterator & operator=(const iterator &other)=default
Assignment operator.
Represents a single GPIO line.
Definition: gpiod.hpp:262
GPIOD_API void set_values(const ::std::vector< int > &values) const
Set values of all lines held by this object.
Represents a set of GPIO lines.
Definition: gpiod.hpp:572
Rising edge event.
Definition: gpiod.hpp:552
Line's bias state is unknown.
Definition: gpiod.hpp:511
GPIOD_API bool operator!(void) const noexcept
Check if this object doesn't hold a reference to a GPIO chip.
GPIOD_API void open(const ::std::string &device, int how=OPEN_LOOKUP)
Open a GPIO chip.
GPIOD_API line_bulk find_lines(const ::std::vector<::std::string > &names) const
Get a set of lines exposed by this chip by their names.
static GPIOD_API const unsigned int MAX_LINES
Max number of lines that this object can hold.
Definition: gpiod.hpp:740
Open based on the best guess what the supplied string is.
Definition: gpiod.hpp:187
GPIOD_API line find_line(const ::std::string &name)
Find a GPIO line by name.
GPIOD_API bool operator!(void) const noexcept
Check if this object doesn't reference any GPIO line.
GPIOD_API int event_get_fd(void) const
Get the event file descriptor associated with this line.
GPIOD_API line(void)
Default constructor.
GPIOD_API void set_direction_input() const
Change the direction this line to input.
GPIOD_API line_event event_read(void) const
Read a line event.
int request_type
Type of the request.
Definition: gpiod.hpp:249
GPIOD_API bool operator==(const chip &rhs) const noexcept
Equality operator.
GPIOD_API bool operator!=(const line &rhs) const noexcept
Check if two line objects reference different GPIO lines.
GPIOD_API line & operator[](unsigned int offset)
Get the line at given offset without bounds checking.
GPIOD_API line & operator=(const line &other)=default
Assignment operator.
Request for driving the GPIO lines.
Definition: gpiod.hpp:224
GPIOD_API void reset(void) noexcept
Reset the internal smart pointer owned by this object.
GPIOD_API ~line(void)=default
Destructor.
GPIOD_API void set_flags(::std::bitset< 32 > flags) const
Set configuration flags of all lines held by this object.
GPIOD_API bool operator!=(const chip &rhs) const noexcept
Inequality operator.
GPIOD_API line_bulk event_wait(const ::std::chrono::nanoseconds &timeout) const
Poll the set of lines for line events.
GPIOD_API line_bulk get_lines(const ::std::vector< unsigned int > &offsets) const
Get a set of lines exposed by this chip at given offsets.
Allows to iterate over all lines owned by a GPIO chip.
Definition: gpiod.hpp:974
GPIOD_API iterator(void)=default
Default constructor.
static GPIOD_API const ::std::bitset< 32 > FLAG_BIAS_PULL_DOWN
The line has a configurable pull-down resistor enabled.
Definition: gpiod.hpp:242
GPIOD_API bool operator!=(const iterator &rhs) const noexcept
Check if this operator doesn't point to the same element.
GPIOD_API const line & operator*(void) const
Dereference current element.
GPIOD_API bool operator!(void) const noexcept
Check if this object doesn't hold any lines.
GPIOD_API int get_value(void) const
Read the line value.
Assume the string is a path to the GPIO chardev.
Definition: gpiod.hpp:189
Request for values, don't change the direction.
Definition: gpiod.hpp:220
GPIOD_API bool is_open_drain(void) const
Check if this line represents an open-drain GPIO.
GPIOD_API ~iterator(void)=default
Destructor.
Represents a GPIO chip.
Definition: gpiod.hpp:42
Iterator for iterating over lines held by line_bulk.
Definition: gpiod.hpp:745
Assume the string is the label of the GPIO chip.
Definition: gpiod.hpp:193
GPIOD_API::std::string name(void) const
Get the name of this line (if any).
GPIOD_API bool is_requested(void) const
Check if this user has ownership of this line.
GPIOD_API::std::string label(void) const
Return the label of the chip held by this object.
Helper structure for storing a set of GPIO line objects.
Definition: gpiod.h:722
Falling edge event.
Definition: gpiod.hpp:554
static GPIOD_API const ::std::bitset< 32 > FLAG_ACTIVE_LOW
Set the active state to 'low' (high is the default).
Definition: gpiod.hpp:234
GPIOD_API void set_config(int direction,::std::bitset< 32 > flags, int value=0) const
Set configuration of this line.
Line's direction setting is input.
Definition: gpiod.hpp:491
GPIOD_API chip(void)=default
Default constructor.
::std::string consumer
Consumer name to pass to the request.
Definition: gpiod.hpp:247
GPIOD_API bool operator==(const iterator &rhs) const noexcept
Check if this operator points to the same element.
GPIOD_API chip_iter make_chip_iter(void)
Create a new chip_iter.
GPIOD_API const chip & get_chip(void) const
Get the reference to the parent chip.
Line's active state is low.
Definition: gpiod.hpp:501
Request for reading line values.
Definition: gpiod.hpp:222
GPIOD_API iterator & operator++(void)
Advance the iterator by one element.
Assume the string is the name of the chip.
Definition: gpiod.hpp:191
GPIOD_API::std::vector< line_event > event_read_multiple(void) const
Read multiple line events.
GPIOD_API const line * operator->(void) const
Member access operator.
GPIOD_API void set_direction_output(int value=0) const
Change the direction this lines to output.
GPIOD_API bool empty(void) const noexcept
Check if this line_bulk doesn't hold any lines.
GPIOD_API line find_line(const ::std::string &name) const
Get the line exposed by this chip by name.
GPIOD_API ~line_bulk(void)=default
Destructor.
GPIOD_API bool operator==(const line &rhs) const noexcept
Check if two line objects reference the same GPIO line.
Line's internal bias is disabled.
Definition: gpiod.hpp:513
line source
Line object referencing the GPIO line on which the event occurred.
Definition: gpiod.hpp:562
GPIOD_API line_bulk & operator=(const line_bulk &other)=default
Assignment operator.
Line's internal pull-down bias is enabled.
Definition: gpiod.hpp:517
GPIOD_API iterator begin(void) noexcept
Returns an iterator to the first line.
GPIOD_API line get_line(unsigned int offset) const
Get the line exposed by this chip at given offset.
GPIOD_API void release(void) const
Release the line if it was previously requested.
GPIOD_API ~chip(void)=default
Destructor.
Listen for rising edge events.
Definition: gpiod.hpp:228
Listen for all types of events.
Definition: gpiod.hpp:230
GPIOD_API int active_state(void) const
Get current active state of this line.
GPIOD_API void set_value(int val) const
Set the value of this line.
GPIOD_API iterator end(void) noexcept
Returns an iterator to the element following the last line.
GPIOD_API::std::vector< int > get_values(void) const
Read values from all lines held by this object.
GPIOD_API unsigned int offset(void) const
Get the offset of this line.
GPIOD_API unsigned int num_lines(void) const
Return the number of lines exposed by this chip.
GPIOD_API int bias(void) const
Get current bias of this line.
GPIOD_API void update(void) const
Re-read the line info from the kernel.
GPIOD_API void request(const line_request &config, int default_val=0) const
Request this line.
int event_type
Type of the event that occurred.
Definition: gpiod.hpp:560
GPIOD_API void reset(void)
Reset the state of this object.
GPIOD_API line_bulk(void)=default
Default constructor.
GPIOD_API int direction(void) const
Get current direction of this line.
Line's direction setting is output.
Definition: gpiod.hpp:493
Describes a single GPIO line event.
Definition: gpiod.hpp:546
GPIOD_API unsigned int size(void) const noexcept
Get the number of lines currently held by this object.
GPIOD_API void set_direction_input() const
Change the direction all lines held by this object to input.
GPIOD_API bool event_wait(const ::std::chrono::nanoseconds &timeout) const
Wait for an event on this line.
Allows to iterate over all GPIO chips present on the system.
Definition: gpiod.hpp:873
Assume the string is the number of the GPIO chip.
Definition: gpiod.hpp:195
static GPIOD_API const ::std::bitset< 32 > FLAG_BIAS_PULL_UP
The line has a configurable pull-up resistor enabled.
Definition: gpiod.hpp:244
Line's active state is high.
Definition: gpiod.hpp:503
Line's internal pull-up bias is enabled.
Definition: gpiod.hpp:515
GPIOD_API chip & operator=(const chip &other)=default
Assignment operator.
static GPIOD_API const ::std::bitset< 32 > FLAG_BIAS_DISABLE
The line has neither pull-up nor pull-down resistor enabled.
Definition: gpiod.hpp:240
#define GPIOD_API
Makes symbol visible.
Definition: gpiod.h:62