12 namespace duds {
namespace hardware {
namespace interface {
20 const std::vector<unsigned int> &pvec,
21 std::vector<DigitalPinConfig> &propConf,
22 std::vector<DigitalPinConfig> &initConf,
26 if ((propConf.size() != pvec.size()) || (
27 !initConf.empty() && initConf.size() != pvec.size()
34 if (initConf.empty()) {
41 std::vector<DigitalPinConfig> pc(
pins.size()), ic(
pins.size());
43 std::vector<bool> visited(
pins.size(),
false);
45 std::vector<unsigned int>::const_iterator piter = pvec.cbegin();
46 std::vector<DigitalPinConfig>::iterator pConfIter = propConf.begin();
47 std::vector<DigitalPinConfig>::iterator iConfIter = initConf.begin();
48 unsigned int pos = 0, neg = 0;
49 for (; piter != pvec.cend(); ++piter, ++pos, ++pConfIter, ++iConfIter) {
51 if (visited[*piter]) {
61 else if ((*piter <
pins.size()) && (
pins[*piter] || (
68 ic[*piter] = *iConfIter =
pins[*piter].conf;
70 ic[*piter] = *iConfIter;
72 pc[*piter] = *pConfIter;
80 if ((pvec.size() - neg) <
pins.size()) {
82 std::vector<bool>::iterator viter = visited.begin();
83 pConfIter = pc.begin();
84 iConfIter = ic.begin();
85 PinVector::const_iterator piniter =
pins.cbegin();
86 for (; viter != visited.end(); ++piter, ++pConfIter, ++iConfIter, ++piniter) {
90 *pConfIter = *iConfIter = piniter->conf;
96 for (piter = pvec.cbegin(); piter != pvec.cend(); ++piter) {
102 if ((*piter >=
pins.size()) || (!
pins[*piter] && (
109 }
else if (
pins[*piter]) {
138 pConfIter = propConf.begin();
140 piter = pvec.cbegin();
141 for (; piter != pvec.cend(); ++piter, ++pConfIter ) {
142 *pConfIter = pc[*piter];
149 std::vector<DigitalPinConfig> &propConf,
150 std::vector<DigitalPinConfig> &initConf,
154 if ((propConf.size() !=
pins.size()) || (
155 !initConf.empty() && initConf.size() !=
pins.size()
162 if (initConf.empty()) {
165 std::vector<DigitalPinConfig>::iterator pConfIter = propConf.begin();
166 std::vector<DigitalPinConfig>::iterator iConfIter = initConf.begin();
167 PinVector::const_iterator pvIter =
pins.cbegin();
168 unsigned int pos = 0;
171 for (; pvIter !=
pins.cend(); ++pos, ++iConfIter, ++ pConfIter, ++pvIter) {
182 }
else if (*pvIter) {
186 *iConfIter = pvIter->conf;
189 pConfIter->reverseCombine(*iConfIter);
224 unsigned int lid =
localId(gid);
225 if ((lid >=
pins.size()) || !
pins[lid]) {
231 iconf =
pins[lid].conf;
237 return pins[lid].cap.compatible(pconf);
240 std::vector<DigitalPinConfig> propConf { pconf };
241 std::vector<DigitalPinConfig> initConf { iconf };
242 std::vector<unsigned int>
pins { lid };
Defines the configuration for a digital general purpose I/O pin.
unsigned int localId(unsigned int globalId) const
Returns the local ID for a pin given the global ID.
constexpr Reason Unsupported
Completely unsupported.
unsigned int globalId(unsigned int localId) const
Returns the global ID for a pin given the local ID.
boost::error_info< struct Info_PinId, unsigned int > PinErrorId
The pin global ID involved in the error.
virtual DigitalPinRejectedConfiguration::Reason proposeConfigImpl(unsigned int gid, DigitalPinConfig &pconf, DigitalPinConfig &iconf) const
Considers the proposed configuration for one pin, but may consider changes to other pins if the chang...
boost::error_info< struct Info_DigitalPortAffected, const DigitalPort * > DigitalPortAffected
Added to exceptions thrown by DigitalPort objects.
void reverseCombine(const DigitalPinConfig &oldCfg)
Combines an old (initial) configuration with a new configuration in this object and stores the result...
virtual bool independentConfig() const
Some pins have a configuration that is dependent on other pins, so this function always returns false...
constexpr Reason NotRejected
There is no error with the requested pin configuration for the referenced pin.
A type-safe bit flag storage class.
virtual DigitalPinRejectedConfiguration::Reason inspectProposal(unsigned int localPinId, std::vector< DigitalPinConfig > &proposed, std::vector< DigitalPinConfig > &initial) const =0
Inspects a proposed change to the pin configuration to assure it meets all requirements and constrain...
Indicates that the specified configuration data includes too many or too few items, or has parallel data structures of inconsistent sizes.
virtual bool proposeFullConfigImpl(std::vector< DigitalPinConfig > &propConf, std::vector< DigitalPinConfig > &initConf, std::function< void(DigitalPinRejectedConfiguration::Reason)> insertReason=std::function< void(DigitalPinRejectedConfiguration::Reason)>()) const
Considers the proposed configuration one pin at a time for all pins in the port.
Indicates that an operation specified more than one configuration for a pin.
static constexpr Flags OperationNoChange
No change to any pin operation.
std::vector< DigitalPinConfig > configurationImpl() const
Returns the configuration of all pins in the port.
PinVector pins
Data on each pin handled by the port.
DigitalPinRejectedConfiguration::Reason compatible(const DigitalPinConfig &cfg) const
Returns a set of flags that indicate certain incompatible conditions in the given pin configuration i...
DigitalPinCap cap
The capabilities of the pin.
Data stored for each pin controlled by the port.
#define DUDS_THROW_EXCEPTION(x)
Works like BOOST_THROW_EXCEPTION, but includes a stack trace if DUDS_ERRORS_VERBOSE is defined...