DUDS
Distributed Update of Data from Something
DigitalPinConfig.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 #include <cstdint>
12 #include <iostream>
13 
14 namespace duds { namespace hardware { namespace interface {
15 
16 struct DigitalPinCap;
17 
30  // direction
35  static constexpr Flags DirInput = Flags::Bit(0);
47  static constexpr Flags DirOutput = Flags::Bit(1); // normally implies bit 7
55  static constexpr Flags DirImmaterial = Flags::Bit(2);
59  static constexpr Flags DirNoChange = Flags::Zero();
63  static constexpr Flags DirMask =
64  DirInput | DirOutput;
65  // input options - pull up/down
69  static constexpr Flags InputNoPull = Flags::Bit(3);
73  static constexpr Flags InputPulldown = Flags::Bit(4);
77  static constexpr Flags InputPullup = Flags::Bit(5);
86  static constexpr Flags InputPullImmaterial = Flags::Bit(6);
90  static constexpr Flags InputPullNoChange = Flags::Zero();
94  static constexpr Flags InputPullMask =
95  InputNoPull | InputPullup | InputPulldown;
96  // input options - event
100  static constexpr Flags EventNone = Flags::Bit(7);
104  static constexpr Flags EventEdgeFalling = Flags::Bit(8);
108  static constexpr Flags EventEdgeRising = Flags::Bit(9);
112  static constexpr Flags EventEdge = EventEdgeFalling | EventEdgeRising;
116  static constexpr Flags EventLevelLow = Flags::Bit(10);
120  static constexpr Flags EventLevelHigh = Flags::Bit(11);
129  static constexpr Flags EventImmaterial = Flags::Bit(12);
133  static constexpr Flags EventNoChange = Flags::Zero();
137  static constexpr Flags EventMask =
138  EventNone | EventEdgeRising | EventEdgeFalling |
139  EventLevelLow | EventLevelHigh;
140  // input options - interrupt
144  static constexpr Flags InterruptNone = Flags::Bit(13);
148  static constexpr Flags InterruptOnEvent = Flags::Bit(14);
157  static constexpr Flags InterruptImmaterial = Flags::Bit(15);
161  static constexpr Flags InterruptNoChange = Flags::Zero();
165  static constexpr Flags InterruptMask = InterruptNone | InterruptOnEvent;
166  // output options
174  static constexpr Flags OutputDriveLow = Flags::Bit(16);
182  static constexpr Flags OutputDriveHigh = Flags::Bit(17);
186  static constexpr Flags OutputPushPull = OutputDriveLow | OutputDriveHigh;
190  static constexpr Flags OutputHighImpedance = Flags::Bit(18);
199  static constexpr Flags OutputImmaterial = Flags::Bit(19);
203  static constexpr Flags OutputNoChange = Flags::Zero();
207  static constexpr Flags OutputMask =
208  OutputDriveLow | OutputDriveHigh | OutputPushPull |
213  static constexpr Flags OperationNoChange = Flags::Zero();
220  static constexpr Flags InputState = Flags::Bit(20);
227  static constexpr Flags OutputState = Flags::Bit(21);
238  std::uint16_t minOutputCurrent;
246  std::uint16_t maxOutputCurrent;
250  DigitalPinConfig() = default;
259  constexpr DigitalPinConfig(
260  const Flags opt,
261  const std::uint16_t minOut = 0,
262  const std::uint16_t maxOut = 0
263  ) :
264  options(opt),
265  minOutputCurrent(minOut),
266  maxOutputCurrent(maxOut)
267  { }
271  struct ClearAll { };
275  constexpr DigitalPinConfig(const ClearAll) :
276  options(Flags::Zero()),
277  minOutputCurrent(0),
278  maxOutputCurrent(0)
279  { }
290  void checkValidity() const;
302  void combine(const DigitalPinConfig &newCfg);
315  static DigitalPinConfig combine(
316  const DigitalPinConfig &oldCfg,
317  const DigitalPinConfig &newCfg
318  );
324  void reverseCombine(const DigitalPinConfig &oldCfg) {
325  DigitalPinConfig oc(oldCfg);
326  oc.combine(*this);
327  *this = oc;
328  }
345  const DigitalPinCap &cap
346  ) const;
347 };
348 
349 typedef boost::error_info<
350  struct Info_DigitalPinConfig, DigitalPinConfig
352 
353 inline std::ostream &operator<<(std::ostream &os, const DigitalPinConfig &c) {
354  return os << '(' << c.options.flags() << ',' << c.minOutputCurrent << ',' <<
355  c.maxOutputCurrent << ')';
356 }
357 
359  const DigitalPinConfig &cap,
360  const DigitalPinConfig::Flags &flg
361 ) {
362  return cap.options & flg;
363 }
364 
366  const DigitalPinConfig::Flags &flg,
367  const DigitalPinConfig &cap
368 ) {
369  return flg & cap.options;
370 }
371 
373  const DigitalPinConfig &cap,
374  const DigitalPinConfig::Flags &flg
375 ) {
376  return cap.options | flg;
377 }
378 
380  const DigitalPinConfig::Flags &flg,
381  const DigitalPinConfig &cap
382 ) {
383  return flg | cap.options;
384 }
385 
387  const DigitalPinConfig &cap,
388  const DigitalPinConfig::Flags &flg
389 ) {
390  return cap.options ^ flg;
391 }
392 
394  const DigitalPinConfig::Flags &flg,
395  const DigitalPinConfig &cap
396 ) {
397  return flg ^ cap.options;
398 }
399 
400 constexpr bool operator == (
401  const DigitalPinConfig &cap,
402  const DigitalPinConfig::Flags &flg
403 ) {
404  return cap.options == flg;
405 }
406 
407 constexpr bool operator == (
408  const DigitalPinConfig::Flags &flg,
409  const DigitalPinConfig &cap
410 ) {
411  return flg == cap.options;
412 }
413 
414 constexpr bool operator != (
415  const DigitalPinConfig &cap,
416  const DigitalPinConfig::Flags &flg
417 ) {
418  return cap.options != flg;
419 }
420 
421 constexpr bool operator != (
422  const DigitalPinConfig::Flags &flg,
423  const DigitalPinConfig &cap
424 ) {
425  return flg != cap.options;
426 }
427 
428 } } }
boost::error_info< struct Info_DigitalPinConfig, DigitalPinConfig > DigitalPinConfigInfo
static constexpr Flags DirMask
A bit mask for all direction flags.
constexpr bool operator==(const DigitalPinCap &cap, const DigitalPinCap::Flags &flg)
static constexpr Flags DirInput
Configure the pin for input.
static constexpr Flags DirImmaterial
Do not care about the pin&#39;s direction.
static constexpr Flags InterruptMask
A bit mask for the interrupt configuration flags.
static constexpr Flags InterruptNone
Configure the pin to not trigger an interrupt.
Defines the configuration for a digital general purpose I/O pin.
static constexpr Flags EventNoChange
Do not change the pin&#39;s event configuration.
static constexpr Flags EventNone
Configure the pin to not flag an event when the input state changes.
static constexpr BitFlags Zero()
Makes a bit flags container with all flags cleared.
Definition: BitFlags.hpp:133
static constexpr Flags EventLevelHigh
Configure the pin to flag an event on a high level input.
static constexpr Flags OutputHighImpedance
Configure the pin to have a high impedance or floating output.
static constexpr Flags InputPulldown
Configure the pin to have a pull-down resistor.
static constexpr Flags EventEdge
Configure the pin to flag an event on any edge.
static constexpr Flags InterruptImmaterial
Do not care about the pin&#39;s interrupt configuration.
static constexpr Flags OutputPushPull
Configure the pin to drive output both high and low.
static constexpr Flags EventEdgeFalling
Configure the pin to flag an event on the falling edge.
constexpr DigitalPinCap::Flags operator|(const DigitalPinCap &cap, const DigitalPinCap::Flags &flg)
static constexpr Flags OutputImmaterial
Do not care about the pin&#39;s output configuration.
duds::general::BitFlags< struct DigitalPinConfigFlags, std::uint32_t > Flags
A container of flags that control the operation of a digital pin.
static constexpr BitFlags Bit(std::uint32_t b)
Makes a bit flags container with a single bit set that is specified by digit number rather than value...
Definition: BitFlags.hpp:141
static constexpr Flags InputPullMask
A bit mask for the pull-up and pull-down resistor flags.
static constexpr Flags InputPullImmaterial
Do not care about the pin&#39;s use of a pull-up or pull-down resistor.
constexpr DigitalPinCap::Flags operator&(const DigitalPinCap &cap, const DigitalPinCap::Flags &flg)
constexpr bool operator!=(const DigitalPinCap &cap, const DigitalPinCap::Flags &flg)
static constexpr Flags InterruptNoChange
Do not change the pin&#39;s interrupt configuration.
static constexpr Flags OutputDriveLow
Configure the pin to be able to drive the output low.
static constexpr Flags InputPullup
Configure the pin to have a pull-up resistor.
void reverseCombine(const DigitalPinConfig &oldCfg)
Combines an old (initial) configuration with a new configuration in this object and stores the result...
static constexpr Flags OutputDriveHigh
Configure the pin to be able to drive the output high.
std::uint16_t maxOutputCurrent
The selected maximum output current in milliamps (?) for the pin, or zero for no change and immateria...
DigitalPinRejectedConfiguration::Reason compatible(const DigitalPinCap &cap) const
Returns a set of flags that indicate certain incompatible conditions in the given pin configuration i...
static constexpr Flags DirNoChange
Do not change the pin&#39;s direction.
DigitalPinConfig()=default
Construct uninitialized.
Various errors involving the use of digital GPIO hardware.
void combine(const DigitalPinConfig &newCfg)
Combines this configuration with a newer configuration taking into account requests to not change cer...
static constexpr Flags OutputNoChange
Do not change the pin&#39;s output configuration.
std::uint16_t minOutputCurrent
The selected minimum output current in milliamps (?) for the pin, or zero for no change and immateria...
ConversationVector & operator<<(ConversationVector &cv, const Int &i)
Insertion operator to add an integer to a ConversationVector object.
static constexpr Flags OutputMask
A bit mask for the output options.
static constexpr Flags EventLevelLow
Configure the pin to flag an event on a low level input.
static constexpr Flags InputNoPull
Configure the pin to not use a pull-up or pull-down resistor.
constexpr DigitalPinConfig(const Flags opt, const std::uint16_t minOut=0, const std::uint16_t maxOut=0)
Construct with initial flags and current values.
static constexpr Flags DirOutput
Configure the pin for output.
constexpr BitsType flags() const
Returns the value stored in the object.
Definition: BitFlags.hpp:147
static constexpr Flags InterruptOnEvent
Configure the pin to trigger an interrupt when an event occurs.
Defines the capabilites of a digital general purpose I/O pin.
static constexpr Flags EventMask
A bit mask for the event configuration flags.
static constexpr Flags OperationNoChange
No change to any pin operation.
void checkValidity() const
Checks for the use of obviously invalid data, such as the use of mutually exclusive options...
Flags options
The control options requested for a digital pin.
static constexpr Flags OutputState
The set output state for the pin.
constexpr DigitalPinCap::Flags operator^(const DigitalPinCap &cap, const DigitalPinCap::Flags &flg)
Construction option for initializing all fields to defaul values.
constexpr DigitalPinConfig(const ClearAll)
Construct with all values initialized to zero.
static constexpr Flags EventEdgeRising
Configure the pin to flag an event on the rising edge.
static constexpr Flags InputPullNoChange
Do not change the use or non-use of a pull-up or pull-down resistor.
static constexpr Flags EventImmaterial
Do not care about the pin&#39;s event configuration.
static constexpr Flags InputState
The last known input state from the pin.