DUDS
Distributed Update of Data from Something
DigitalPinSetAccess.hpp
Go to the documentation of this file.
1 /*
2  * This file is part of the DUDS project. It is subject to the BSD-style
3  * license terms in the LICENSE file found in the top-level directory of this
4  * distribution and at https://github.com/jjackowski/duds/blob/master/LICENSE.
5  * No part of DUDS, including this file, may be copied, modified, propagated,
6  * or distributed except according to the terms contained in the LICENSE file.
7  *
8  * Copyright (C) 2017 Jeff Jackowski
9  */
10 #ifndef DIGITALPINSETACCESS_HPP
11 #define DIGITALPINSETACCESS_HPP
12 
15 
16 namespace duds { namespace hardware { namespace interface {
17 
35  std::vector<unsigned int> pinvec;
39  DigitalPinSetAccess(DigitalPort *port, std::vector<unsigned int> &&pids) :
40  DigitalPinAccessBase(port), pinvec(std::move(pids)) { }
46  void reserveAdditional(unsigned int len);
47  friend DigitalPort;
48 public:
52  DigitalPinSetAccess() = default;
57  retire();
58  }
59  /*
60  * A move constructor. Causes troubles internal to DigitalPort.
61  */
62  //DigitalPinSetAccess(DigitalPinAccess &&old) noexcept;
66  void retire() noexcept;
73  void retire(unsigned int pos);
84  const std::vector<unsigned int> &localIds() const {
85  return pinvec;
86  }
91  std::vector<unsigned int> globalIds() const {
92  return port()->globalIds(pinvec);
93  }
97  bool havePins() const {
98  return (port() != nullptr) && !pinvec.empty();
99  }
105  bool exists(unsigned int pos) const {
106  return (pos < pinvec.size()) && (pinvec[pos] != -1);
107  }
112  unsigned int size() const {
113  return (unsigned int)pinvec.size();
114  }
120  unsigned int localId(unsigned int pos) const {
121  // check range using at()
122  return pinvec.at(pos);
123  }
129  unsigned int globalId(unsigned int pos) const {
130  // check range using at()
131  return port()->globalId(pinvec.at(pos));
132  }
137  DigitalPinCap capabilities(unsigned int pos) const {
138  return port()->capabilities(globalId(pos));
139  }
145  std::vector<DigitalPinCap> capabilities() const {
146  return port()->capabilitiesLocalIds(pinvec);
147  }
152  DigitalPinConfig configuration(unsigned int pos) const {
153  return port()->configuration(globalId(pos));
154  }
160  std::vector<DigitalPinConfig> configuration() const {
161  return port()->configurationLocalIds(pinvec);
162  }
174  std::vector<unsigned int> subset(const std::vector<unsigned int> &pos) const;
186  unsigned int pos,
187  DigitalPinConfig &conf
188  ) const {
189  return port()->proposeConfig(globalId(pos), conf);
190  }
205  unsigned int pos,
206  DigitalPinConfig &proposed,
207  DigitalPinConfig &initial
208  ) const {
209  return port()->proposeConfig(globalId(pos), proposed, initial);
210  }
229  std::vector<DigitalPinConfig> &propConf,
230  std::vector<DigitalPinConfig> &initConf,
231  std::function<void(DigitalPinRejectedConfiguration::Reason)> insertReason
232  = std::function<void(DigitalPinRejectedConfiguration::Reason)>()
233  ) {
234  return port()->proposeConfigLocalIds(
235  pinvec,
236  propConf,
237  initConf,
238  insertReason
239  );
240  }
241  /*
242  template <class FwdConfIter>
243  std::vector<DigitalPinConfig> proposeConfig(
244  const FwdConfIter &begin,
245  const FwdConfIter &end,
246  ) const {
247  // need to have a copy of the configs for changes
248  std::vector<DigitalPinConfig> proposed(begin, end);
249  port()->proposeConfig(proposed, pinvec);
250  return proposed;
251  // provide DigitalPinRejectedConfiguration ???
252  }
253  template <class FwdConfIter>
254  void modifyConfig(const FwdConfIter &begin, const FwdConfIter &end) const;
255  */
266  unsigned int pos,
267  const DigitalPinConfig &conf
268  ) const {
269  return port()->modifyConfig(globalId(pos), conf, &portdata);
270  }
278  void modifyConfig(const DigitalPinConfig &conf) const;
289  void modifyConfig(std::vector<DigitalPinConfig> &conf) const {
290  port()->modifyConfig(pinvec, conf, &portdata);
291  }
305  const std::vector<unsigned int> &pos,
306  std::vector<DigitalPinConfig> &conf
307  ) const {
308  port()->modifyConfig(subset(pos), conf, &portdata);
309  }
315  bool input(unsigned int pos) const {
316  return port()->input(globalId(pos), &portdata);
317  }
323  std::vector<bool> input() const {
324  return port()->input(pinvec, &portdata);
325  }
333  std::vector<bool> input(const std::vector<unsigned int> &pos) const {
334  return port()->input(subset(pos), &portdata);
335  }
343  void output(unsigned int pos, bool state) const {
344  port()->output(globalId(pos), state, &portdata);
345  }
354  void output(const std::vector<bool> &state) const {
355  port()->output(pinvec, state, &portdata);
356  }
365  void output(bool state) const;
377  void output(
378  const std::vector<unsigned int> &pos,
379  const std::vector<bool> &state
380  ) const {
381  port()->output(subset(pos), state, &portdata);
382  }
383 
384  // convenience functions -- may expand later
385 
391  bool simultaneousOperations() const {
392  return port()->simultaneousOperations();
393  }
398  bool independentConfig() const {
399  return port()->independentConfig();
400  }
405  bool isInput(unsigned int pos) const {
407  }
412  bool isOutput(unsigned int pos) const {
414  }
419  bool canBeInput(unsigned int pos) const {
420  return capabilities(pos) & DigitalPinCap::Input;
421  }
426  bool canBeOutput(unsigned int pos) const {
427  return capabilities(pos) & (
431  );
432  }
438  bool canFloat(unsigned int pos) const {
440  }
455  template <typename Int>
456  void write(Int val, int bits) const {
457  // range check; must have enough pins
458  if ((bits < 1) || (bits > pinvec.size())) {
460  }
461  // range check; value must fit
463  if (val >= (1 << bits)) {
466  );
467  }
468  // prepare a place to store the output.
469  std::vector<bool> out;
470  out.reserve(bits);
471  // produce the output
472  for (; bits; --bits) {
473  out.push_back(val & 1);
474  val >>= 1;
475  }
476  // whole set?
477  if (out.size() == pinvec.size()) {
478  // write the value using all pins
479  port()->output(pinvec, out, &portdata);
480  } else {
481  // produce a subset of the pins
482  std::vector<unsigned int> pins(
483  pinvec.begin(),
484  pinvec.begin() + out.size()
485  );
486  // write out the number
487  port()->output(pins, out, &portdata);
488  }
489  }
498  template <typename Int>
499  void write(Int val) const {
500  write(val, pinvec.size());
501  }
502 };
503 
504 // maybe a full-port access object?
505 
506 } } }
507 
508 #endif // #ifndef DIGITALPINSETACCESS_HPP
bool input(unsigned int pos) const
Samples the input state of a pin.
An attempt was made to output a number in binary on a set of pins that was too small to represent the...
virtual bool simultaneousOperations() const =0
True if the implementation supports operating on multiple pins simultaneously.
std::vector< bool > input() const
Samples the input state of all the pins.
boost::error_info< struct Info_DigitalPinNumericBits, int > DigitalPinNumericBits
The number of bits available for a numeric output.
static constexpr Flags Input
Input operation is supported.
Provides access to multiple pins on a DigitalPort.
bool input(unsigned int gid, DigitalPinAccessBase::PortData *pdata)
Does error checking in advance of calling inputImpl(unsigned int) to read the input of the given pin...
bool canBeOutput(unsigned int pos) const
Returns true if the pin can operate as an output.
DigitalPort * port() const
Returns a pointer to the port that controls the pin(s) that are operated through this object...
bool canBeInput(unsigned int pos) const
Returns true if the pin can operate as an input.
void write(Int val, int bits) const
Writes out a number in binary to the pins.
static constexpr Flags OutputDriveLow
The output is or can be an open collector or open drain type.
static constexpr Flags DirInput
Configure the pin for input.
Defines the configuration for a digital general purpose I/O pin.
bool isInput(unsigned int pos) const
Returns true if the pin is configured as an input.
The operation has too few or much data to work on the pins, which can alternately be stated as having...
Definition: PinErrors.hpp:50
std::vector< unsigned int > subset(const std::vector< unsigned int > &pos) const
Produces a vector with port local pin IDs that are a subset of the pins in this access object...
boost::error_info< struct Info_DigitalPinNumericOutput, std::int64_t > DigitalPinNumericOutput
The requested number to output; seen with DigitalPinNumericRangeError exceptions. ...
DigitalPinConfig modifyConfig(unsigned int globalPinId, const DigitalPinConfig &cfg, DigitalPinAccessBase::PortData *pdata)
Modifies the configuration of a single pin with an independent configuration.
static constexpr Flags OutputDriveHigh
The output is or can be an open emitter type.
bool isOutput(unsigned int pos) const
Returns true if the pin is configured as an output.
~DigitalPinSetAccess()
Relinquish access on destruction.
std::vector< DigitalPinConfig > configuration() const
Returns the current configuration all pins in this set.
STL namespace.
DigitalPinSetAccess()=default
Constructs an access object with nothing to access.
void modifyConfig(const std::vector< unsigned int > &pos, std::vector< DigitalPinConfig > &conf) const
Sets the configuration for a subset of the pins.
move_impl move(unsigned int c, unsigned int r)
Display stream manipulator that moves the display cursor to the given location.
bool proposeConfig(std::vector< DigitalPinConfig > &propConf, std::vector< DigitalPinConfig > &initConf, std::function< void(DigitalPinRejectedConfiguration::Reason)> insertReason=std::function< void(DigitalPinRejectedConfiguration::Reason)>())
Propose a new configuration for the entire pin set using a hypothetical given initial configuration...
Represents an interface to a group of hardware related digital GPIO lines.
Definition: DigitalPort.hpp:47
unsigned int globalId(unsigned int localId) const
Returns the global ID for a pin given the local ID.
DigitalPinConfig modifyConfig(unsigned int pos, const DigitalPinConfig &conf) const
Modifies the configuration of a pin.
DigitalPinSetAccess & operator=(DigitalPinSetAccess &&old) noexcept
A move assignment.
bool independentConfig() const
Returns true if all pins on the port always have an independent configuration from all other pins...
std::vector< DigitalPinCap > capabilities(const std::vector< unsigned int > &pvec, bool global) const
void output(const std::vector< bool > &state) const
Changes the output state of all the pins.
bool canFloat(unsigned int pos) const
Returns true if the pin can provide a non-input high impedence state (or maybe allow input state...
PortData portdata
Port specific information.
std::vector< DigitalPinConfig > configurationLocalIds(const std::vector< unsigned int > &pvec) const
Returns the configuration of all the pins requested by local ID.
bool simultaneousOperations() const
True if the port supports operating on multiple pins simultaneously.
The base class for the digital pin access classes.
DigitalPinRejectedConfiguration::Reason proposeConfig(unsigned int pos, DigitalPinConfig &conf) const
Propose a new configuration for the given pin using the current configuration as the initial configur...
bool proposeConfigLocalIds(const std::vector< unsigned int > &localPinIds, std::vector< DigitalPinConfig > &propConf, std::vector< DigitalPinConfig > &initConf, std::function< void(DigitalPinRejectedConfiguration::Reason)> insertReason=std::function< void(DigitalPinRejectedConfiguration::Reason)>()) const
DigitalPinCap capabilities(unsigned int pos) const
Returns the capabilities of the specified pin.
void output(const std::vector< unsigned int > &pos, const std::vector< bool > &state) const
Changes the output state of a subset of the pins.
DigitalPinConfig configuration(unsigned int pos) const
Returns the current configuration of the specified pin.
void reserveAdditional(unsigned int len)
Reserves additional space in pins so that upcoming pushes onto the vector will not cause multiple mem...
DigitalPinSetAccess(DigitalPort *port, std::vector< unsigned int > &&pids)
Used by DigitalPort.
void modifyConfig(std::vector< DigitalPinConfig > &conf) const
Sets the configuration for all the pins.
std::vector< unsigned int > globalIds(const std::vector< unsigned int > &localIds) const
Converts the provided local pin IDs to global pin IDs.
Definition: DigitalPort.cpp:78
A type-safe bit flag storage class.
Definition: BitFlags.hpp:101
bool havePins() const
Returns true if this object has been given any pins to access.
std::vector< DigitalPinCap > capabilitiesLocalIds(const std::vector< unsigned int > &pvec) const
Returns the capabilities of all the pins requested by local ID.
void output(unsigned int pos, bool state) const
Changes the output state of a pin.
void output(unsigned int gid, bool state, DigitalPinAccessBase::PortData *pdata)
Does error checking in advance of calling outputImpl(unsigned int, bool) to change the output of the ...
virtual bool independentConfig(unsigned int gid, const DigitalPinConfig &newcfg, const DigitalPinConfig &initcfg) const =0
Returns true if the given configuration for the given pin does not affect any other pins in the port...
static constexpr Flags OutputPushPull
The output can drive the line either low or high.
static constexpr Flags OutputHighImpedance
The pin supports a high impedance state without input.
static constexpr Flags DirOutput
Configure the pin for output.
DigitalPinRejectedConfiguration::Reason proposeConfig(unsigned int gid, DigitalPinConfig &pconf, DigitalPinConfig &iconf) const
Proposes a configuration change for a single pin.
Defines the capabilites of a digital general purpose I/O pin.
unsigned int globalId(unsigned int pos) const
Returns the global pin ID of the pin at the given position inside this set of pins.
void write(Int val) const
Writes out a number in binary to the pins.
std::vector< bool > input(const std::vector< unsigned int > &pos) const
Samples the input state of a subset of the pins.
const std::vector< unsigned int > & localIds() const
Provides access to the internal vector of local pin IDs.
unsigned int localId(unsigned int pos) const
Returns the local pin ID of the pin at the given position inside this set of pins.
std::vector< unsigned int > pinvec
The port local pin IDs this object may use.
std::vector< DigitalPinCap > capabilities() const
Returns the capabilities of all the pins in this set.
bool exists(unsigned int pos) const
Returns true if the given position is for an existent pin rather than a gap or a position past the en...
#define DUDS_THROW_EXCEPTION(x)
Works like BOOST_THROW_EXCEPTION, but includes a stack trace if DUDS_ERRORS_VERBOSE is defined...
Definition: Errors.hpp:48
unsigned int size() const
Returns the number of pins in this access object.
DigitalPinRejectedConfiguration::Reason proposeConfig(unsigned int pos, DigitalPinConfig &proposed, DigitalPinConfig &initial) const
Propose a new configuration for the given pin using a hypothetical given initial configuration.
std::vector< unsigned int > globalIds() const
Returns a vector of global pin IDs for the pins accessed by this object.
std::vector< DigitalPinConfig > configuration(const std::vector< unsigned int > &pvec, bool global) const