From: Kent Gibson <warthog618@gmail.com>
To: linux-gpio@vger.kernel.org, bgolaszewski@baylibre.com
Cc: Kent Gibson <warthog618@gmail.com>
Subject: [libgpiod] [PATCH 14/19] bindings: cxx: add support for SET_CONFIG
Date: Fri, 15 Nov 2019 22:43:50 +0800 [thread overview]
Message-ID: <20191115144355.975-15-warthog618@gmail.com> (raw)
In-Reply-To: <20191115144355.975-1-warthog618@gmail.com>
Add methods to support setting line configuration.
Signed-off-by: Kent Gibson <warthog618@gmail.com>
---
bindings/cxx/gpiod.hpp | 55 +++++++++++++++++++++++++
bindings/cxx/line.cpp | 37 +++++++++++++++++
bindings/cxx/line_bulk.cpp | 83 ++++++++++++++++++++++++++++++++++++++
3 files changed, 175 insertions(+)
diff --git a/bindings/cxx/gpiod.hpp b/bindings/cxx/gpiod.hpp
index 2b1a6ab..dcae431 100644
--- a/bindings/cxx/gpiod.hpp
+++ b/bindings/cxx/gpiod.hpp
@@ -381,6 +381,32 @@ public:
*/
GPIOD_API void set_value(int val) const;
+ /**
+ * @brief Set configuration of this line.
+ * @param direction New direction.
+ * @param flags Replacement flags.
+ * @param value New value (0 or 1) - only matters for OUTPUT direction.
+ */
+ GPIOD_API void set_config(int direction, ::std::bitset<32> flags,
+ int value = 0) const;
+
+ /**
+ * @brief Set configuration flags of this line.
+ * @param flags Replacement flags.
+ */
+ GPIOD_API void set_flags(::std::bitset<32> flags) const;
+
+ /**
+ * @brief Change the direction this line to input.
+ */
+ GPIOD_API void set_direction_input() const;
+
+ /**
+ * @brief Change the direction this lines to output.
+ * @param value New value (0 or 1).
+ */
+ GPIOD_API void set_direction_output(int value = 0) const;
+
/**
* @brief Wait for an event on this line.
* @param timeout Time to wait before returning if no event occurred.
@@ -648,6 +674,35 @@ public:
*/
GPIOD_API void set_values(const ::std::vector<int>& values) const;
+ /**
+ * @brief Set configuration of all lines held by this object.
+ * @param direction New direction.
+ * @param flags Replacement flags.
+ * @param values Vector of values to set. Must be the same size as the
+ * number of lines held by this line_bulk.
+ * Only relevant for output direction requests.
+ */
+ GPIOD_API void set_config(int direction, ::std::bitset<32> flags,
+ const ::std::vector<int> values = std::vector<int>()) const;
+
+ /**
+ * @brief Set configuration flags of all lines held by this object.
+ * @param flags Replacement flags.
+ */
+ GPIOD_API void set_flags(::std::bitset<32> flags) const;
+
+ /**
+ * @brief Change the direction all lines held by this object to input.
+ */
+ GPIOD_API void set_direction_input() const;
+
+ /**
+ * @brief Change the direction all lines held by this object to output.
+ * @param values Vector of values to set. Must be the same size as the
+ * number of lines held by this line_bulk.
+ */
+ GPIOD_API void set_direction_output(const ::std::vector<int>& values) const;
+
/**
* @brief Poll the set of lines for line events.
* @param timeout Number of nanoseconds to wait before returning an
diff --git a/bindings/cxx/line.cpp b/bindings/cxx/line.cpp
index dd6bb6a..a688b5d 100644
--- a/bindings/cxx/line.cpp
+++ b/bindings/cxx/line.cpp
@@ -158,6 +158,43 @@ void line::set_value(int val) const
bulk.set_values({ val });
}
+void line::set_config(int direction, ::std::bitset<32> flags,
+ int value) const
+{
+ this->throw_if_null();
+
+ line_bulk bulk({ *this });
+
+ bulk.set_config(direction, flags, { value });
+}
+
+void line::set_flags(::std::bitset<32> flags) const
+{
+ this->throw_if_null();
+
+ line_bulk bulk({ *this });
+
+ bulk.set_flags(flags);
+}
+
+void line::set_direction_input() const
+{
+ this->throw_if_null();
+
+ line_bulk bulk({ *this });
+
+ bulk.set_direction_input();
+}
+
+void line::set_direction_output(int value) const
+{
+ this->throw_if_null();
+
+ line_bulk bulk({ *this });
+
+ bulk.set_direction_output({ value });
+}
+
bool line::event_wait(const ::std::chrono::nanoseconds& timeout) const
{
this->throw_if_null();
diff --git a/bindings/cxx/line_bulk.cpp b/bindings/cxx/line_bulk.cpp
index 5f1cac4..6f7d161 100644
--- a/bindings/cxx/line_bulk.cpp
+++ b/bindings/cxx/line_bulk.cpp
@@ -176,6 +176,89 @@ void line_bulk::set_values(const ::std::vector<int>& values) const
"error setting GPIO line values");
}
+void line_bulk::set_config(int direction, ::std::bitset<32> flags,
+ const ::std::vector<int> values) const
+{
+ this->throw_if_empty();
+
+ if (!values.empty() && this->_m_bulk.size() != values.size())
+ throw ::std::invalid_argument("the number of default values must correspond with the number of lines");
+
+ ::gpiod_line_bulk bulk;
+ int rv, gflags;
+
+ gflags = 0;
+
+ for (auto& it: reqflag_mapping) {
+ if ((it.first & flags).to_ulong())
+ gflags |= it.second;
+ }
+
+ this->to_line_bulk(::std::addressof(bulk));
+
+ rv = ::gpiod_line_set_config_bulk(::std::addressof(bulk), direction,
+ gflags, values.data());
+ if (rv)
+ throw ::std::system_error(errno, ::std::system_category(),
+ "error setting GPIO line config");
+}
+
+void line_bulk::set_flags(::std::bitset<32> flags) const
+{
+ this->throw_if_empty();
+
+ ::gpiod_line_bulk bulk;
+ int rv, gflags;
+
+ this->to_line_bulk(::std::addressof(bulk));
+
+ gflags = 0;
+
+ for (auto& it: reqflag_mapping) {
+ if ((it.first & flags).to_ulong())
+ gflags |= it.second;
+ }
+
+ rv = ::gpiod_line_set_flags_bulk(::std::addressof(bulk), gflags);
+ if (rv)
+ throw ::std::system_error(errno, ::std::system_category(),
+ "error setting GPIO line flags");
+}
+
+void line_bulk::set_direction_input() const
+{
+ this->throw_if_empty();
+
+ ::gpiod_line_bulk bulk;
+ int rv;
+
+ this->to_line_bulk(::std::addressof(bulk));
+
+ rv = ::gpiod_line_set_direction_bulk_input(::std::addressof(bulk));
+ if (rv)
+ throw ::std::system_error(errno, ::std::system_category(),
+ "error setting GPIO line direction to input");
+}
+
+void line_bulk::set_direction_output(const ::std::vector<int>& values) const
+{
+ this->throw_if_empty();
+
+ if (values.size() != this->_m_bulk.size())
+ throw ::std::invalid_argument("the size of values array must correspond with the number of lines");
+
+ ::gpiod_line_bulk bulk;
+ int rv;
+
+ this->to_line_bulk(::std::addressof(bulk));
+
+ rv = ::gpiod_line_set_direction_bulk_output(::std::addressof(bulk),
+ values.data());
+ if (rv)
+ throw ::std::system_error(errno, ::std::system_category(),
+ "error setting GPIO line direction to output");
+}
+
line_bulk line_bulk::event_wait(const ::std::chrono::nanoseconds& timeout) const
{
this->throw_if_empty();
--
2.24.0
next prev parent reply other threads:[~2019-11-15 14:45 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-15 14:43 [libgpiod] [PATCH 00/19] Add support for bias flags and SET_CONFIG Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 01/19] core: move request flag to handle flag conversion into a separate function Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 02/19] API: add support for bias flags Kent Gibson
2019-11-18 13:51 ` Bartosz Golaszewski
2019-11-18 14:12 ` Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 03/19] core: fix misspelling of parameter Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 04/19] tests: add tests for bias flags Kent Gibson
2019-11-18 13:51 ` Bartosz Golaszewski
2019-11-18 14:14 ` Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 05/19] bindings: cxx: drop noexcept from direction and active_state Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 06/19] bindings: cxx: initialise bitset with integer instead of string Kent Gibson
2019-11-18 13:51 ` Bartosz Golaszewski
2019-11-18 14:17 ` Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 07/19] bindings: cxx: add support for bias flags Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 08/19] bindings: cxx: tests: add tests " Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 09/19] bindings: python: add support " Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 10/19] bindings: python: tests: add tests " Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 11/19] API: add support for SET_CONFIG Kent Gibson
2019-11-18 13:52 ` Bartosz Golaszewski
2019-11-18 14:48 ` Kent Gibson
2019-11-19 15:52 ` Kent Gibson
2019-11-20 11:00 ` Bartosz Golaszewski
2019-11-20 13:58 ` Kent Gibson
2019-11-20 14:08 ` Bartosz Golaszewski
2019-11-20 14:13 ` Kent Gibson
2019-11-20 14:18 ` Bartosz Golaszewski
2019-11-20 14:36 ` Kent Gibson
2019-11-20 15:18 ` Bartosz Golaszewski
2019-11-21 0:34 ` Kent Gibson
2019-11-21 7:13 ` Bartosz Golaszewski
2019-11-21 7:46 ` Kent Gibson
2019-11-21 8:46 ` Bartosz Golaszewski
2019-11-21 9:30 ` Kent Gibson
2019-11-21 10:03 ` Bartosz Golaszewski
2019-11-21 10:18 ` Kent Gibson
2019-11-21 10:27 ` Bartosz Golaszewski
2019-11-21 10:31 ` Bartosz Golaszewski
2019-11-21 11:07 ` Kent Gibson
2019-11-21 15:22 ` Bartosz Golaszewski
2019-11-21 10:59 ` Kent Gibson
2019-11-21 15:20 ` Bartosz Golaszewski
2019-11-15 14:43 ` [libgpiod] [PATCH 12/19] tests: add tests " Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 13/19] core: allow gpiod_line_set_value_bulk to accept null values Kent Gibson
2019-11-15 14:43 ` Kent Gibson [this message]
2019-11-15 14:43 ` [libgpiod] [PATCH 15/19] bindings: cxx: tests: add tests for SET_CONFIG methods Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 16/19] bindings: python: add support for SET_CONFIG Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 17/19] bindings: python: tests: add tests for SET_CONFIG methods Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 18/19] tools: add support for bias flags Kent Gibson
2019-11-16 15:40 ` Kent Gibson
2019-11-17 12:18 ` Bartosz Golaszewski
2019-11-17 12:28 ` Kent Gibson
2019-11-17 13:12 ` Kent Gibson
2019-11-15 14:43 ` [libgpiod] [PATCH 19/19] treewide: change "correspond with" to "correspond to" Kent Gibson
2019-11-18 13:52 ` Bartosz Golaszewski
2019-11-18 15:01 ` Kent Gibson
2019-11-18 13:50 ` [libgpiod] [PATCH 00/19] Add support for bias flags and SET_CONFIG Bartosz Golaszewski
2019-11-18 14:09 ` Kent Gibson
2019-11-18 14:55 ` Bartosz Golaszewski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191115144355.975-15-warthog618@gmail.com \
--to=warthog618@gmail.com \
--cc=bgolaszewski@baylibre.com \
--cc=linux-gpio@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.