10 #ifndef DIGITALPORT_HPP 11 #define DIGITALPORT_HPP 15 #include <condition_variable> 19 namespace duds {
namespace hardware {
namespace interface {
21 class DigitalPinAccess;
22 class DigitalPinSetAccess;
49 public std::enable_shared_from_this<DigitalPort>
93 access(nullptr), cap(capf, cur) { }
98 operator bool ()
const {
136 bool areAvailable(
const unsigned int *reqpins, std::size_t len);
142 std::unique_lock<std::mutex> &lock,
143 const unsigned int *
const reqpins,
144 const std::size_t len
181 DigitalPort(
unsigned int numpins,
unsigned int firstid);
218 return pins[localPinId].conf;
222 const std::vector<unsigned int> &pvec,
bool global
230 const std::vector<unsigned int> &localPinIds,
231 std::vector<DigitalPinConfig> &propConf,
232 std::vector<DigitalPinConfig> &initConf,
237 std::vector<DigitalPinConfig> &propConf,
238 std::vector<DigitalPinConfig> &initConf,
256 unsigned int globalPinId,
280 std::vector<DigitalPinConfig> &propConf,
281 std::vector<DigitalPinConfig> &initConf,
298 std::vector<DigitalPinConfig> &cfgs,
302 const std::vector<unsigned int> &pvec,
303 std::vector<DigitalPinConfig> &cfgs,
317 unsigned int localPinId,
332 const std::vector<DigitalPinConfig> &cfgs,
337 const std::vector<unsigned int> &pvec,
bool global
369 std::vector<bool>
input(
370 const std::vector<unsigned int> &pvec,
398 const std::vector<unsigned int> &pvec,
434 const std::vector<unsigned int> &pvec,
435 const std::vector<bool> &state,
473 const std::vector<unsigned int> &pvec,
474 const std::vector<bool> &state,
531 template <
typename T>
573 const std::vector<unsigned int> &pvec
591 const std::vector<unsigned int> &pvec
621 const std::vector<unsigned int> &pvec
639 const std::vector<unsigned int> &pvec
692 const std::vector<unsigned int> &globalPinIds,
693 std::vector<DigitalPinConfig> &propConf,
694 std::vector<DigitalPinConfig> &initConf,
699 const std::vector<unsigned int> &localPinIds,
700 std::vector<DigitalPinConfig> &propConf,
701 std::vector<DigitalPinConfig> &initConf,
707 const std::vector<unsigned int> &pins,
708 std::vector<DigitalPinConfig> &propConf,
712 std::vector<DigitalPinConfig> initConf;
713 return proposeConfig(pins, propConf, initConf, insertReason);
716 const std::vector<unsigned int> &pins,
717 std::vector<DigitalPinConfig> &propConf,
721 std::vector<DigitalPinConfig> initConf;
725 std::vector<DigitalPinConfig> &propConf,
726 std::vector<DigitalPinConfig> &initConf,
765 const std::vector<unsigned int> &
globalIds 783 const std::vector<unsigned int> &localIds
796 bool exists(
unsigned int gid)
const;
876 const unsigned int *pins,
877 const unsigned int len,
878 std::unique_ptr<DigitalPinAccess> *acc
881 template <std::
size_t Len>
883 const unsigned int pins[Len],
884 std::unique_ptr<DigitalPinAccess> acc[Len]
888 std::unique_ptr<DigitalPinAccess>
access(
const unsigned int pin);
983 const unsigned int *pins,
984 const unsigned int len,
988 const std::vector<unsigned int> &pins,
991 access(&(pins[0]), pins.size(), acc);
996 template <std::
size_t alen, std::
size_t plen>
998 static_assert(alen == plen,
999 "The arrays must have the same number of objects.");
1038 const unsigned int *pins,
1039 const unsigned int len,
1043 const unsigned int *begin,
1044 const unsigned int *end,
1047 access(begin, end - begin, acc);
1050 const std::vector<unsigned int> &pins,
1053 access(&(pins[0]), pins.size(), acc);
1055 std::unique_ptr<DigitalPinSetAccess>
access(
1056 const std::vector<unsigned int> &pins
1060 template <
class InputIter>
1062 const InputIter &begin,
1063 const InputIter &end,
1066 std::vector<unsigned int> pvec(begin, end);
1067 access(&(pvec[0]), pvec.size(), acc);
1083 typedef boost::error_info<struct Info_DigitalPortAffected, const DigitalPort*>
1114 #endif // #ifndef DIGITALPORT_HPP bool proposeFullConfig(std::vector< DigitalPinConfig > &propConf, std::vector< DigitalPinConfig > &initConf, std::function< void(DigitalPinRejectedConfiguration::Reason)> insertReason=std::function< void(DigitalPinRejectedConfiguration::Reason)>()) const
void access(const std::vector< unsigned int > &pins, DigitalPinAccess *acc)
virtual ~DigitalPort()
Derived classes should call shutdown() early in their destructors.
void access(const InputIter &begin, const InputIter &end, DigitalPinSetAccess &acc)
void markNonexistent()
Modify the pin to be non-existent.
virtual bool simultaneousOperations() const =0
True if the implementation supports operating on multiple pins simultaneously.
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...
unsigned int offset() const
Returns the offset for the port's pins.
std::vector< unsigned int > localIds(const std::vector< unsigned int > &globalIds) const
Converts the provided global pin IDs to local pin IDs.
DigitalPinAccessBase * access
A pointer to an access object, or nullptr if no access object for the pin exists. ...
void access(const unsigned int *begin, const unsigned int *end, DigitalPinSetAccess &acc)
static DigitalPinAccessBase::PortData & portData(const DigitalPinAccessBase &acc)
Returns a reference to the port specific data in the given DigitalPinAccessBase object.
Defines the configuration for a digital general purpose I/O pin.
constexpr DigitalPinCap NonexistentDigitalPin
The capabilities of a non-existent pin.
bool areAvailable(const unsigned int *reqpins, std::size_t len)
Checks a set of pins to see if they are all currently available.
unsigned int localId(unsigned int globalId) const
Returns the local ID for a pin given the global ID.
DigitalPinConfig modifyConfig(unsigned int globalPinId, const DigitalPinConfig &cfg, DigitalPinAccessBase::PortData *pdata)
Modifies the configuration of a single pin with an independent configuration.
std::vector< PinEntry > PinVector
virtual bool independentConfig() const =0
Returns true if all pins always have an independent configuration from all other pins.
const DigitalPinConfig & configRef(unsigned int localPinId) const
Returns a reference to a pin's configuration on behalf of an access object.
bool exists(unsigned int gid) const
Returns true if the pin exists in this port.
Represents an interface to a group of hardware related digital GPIO lines.
DigitalPinConfig conf
The configuration for the pin.
unsigned int globalId(unsigned int localId) const
Returns the global ID for a pin given the local ID.
virtual void configurePort(unsigned int localPinId, const DigitalPinConfig &cfg, DigitalPinAccessBase::PortData *pdata)=0
Changes the hardware configuration for a single pin.
bool proposeConfig(const std::vector< unsigned int > &pins, std::vector< DigitalPinConfig > &propConf, std::function< void(DigitalPinRejectedConfiguration::Reason)> insertReason=std::function< void(DigitalPinRejectedConfiguration::Reason)>()) const
static void portDataPtr(const DigitalPinAccessBase &acc, T **ptr)
Provides a pointer to type T stored in the port specific data of the given DigitalPinAccessBase objec...
A type for holding arbitrary port-specific data within a DigitalPinAccess or DigitalPinSetAccess obje...
virtual void madeAccess(DigitalPinAccess &acc)
Called after a new access object is made to allow a port implementation to take further action...
boost::error_info< struct Info_DigitalPortAffected, const DigitalPort * > DigitalPortAffected
Added to exceptions thrown by DigitalPort objects.
PortData portdata
Port specific information.
PinEntry(const DigitalPinCap::Flags capf, std::uint16_t cur)
Initializes access to nullptr and cap using the values specified.
void modifyFullConfig(std::vector< DigitalPinConfig > &propConf, std::vector< DigitalPinConfig > &initConf, DigitalPinAccessBase::PortData *pdata)
Does the work of the modifyConfig() functions in the case that the whole port configuration must be c...
friend DigitalPinSetAccess
std::vector< DigitalPinConfig > configurationLocalIds(const std::vector< unsigned int > &pvec) const
Returns the configuration of all the pins requested by local ID.
The base class for the digital pin access classes.
void shutdownAccessRequests()
Used by the shutdown functions to force any thread waiting on access to pins to quit waiting and fail...
std::mutex block
Used to serialize access to internal data for thread-safe operation.
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
virtual bool proposeFullConfigImpl(std::vector< DigitalPinConfig > &propConf, std::vector< DigitalPinConfig > &initConf, std::function< void(DigitalPinRejectedConfiguration::Reason)> insertReason=std::function< void(DigitalPinRejectedConfiguration::Reason)>()) const =0
virtual void retiredAccess(const DigitalPinAccess &acc) noexcept
Called just before an access object is retired to allow a port implementation to take further action...
unsigned int idOffset
An offset used to translate pin identification numbers between global scope and local scope...
constexpr bool exists() const
Returns true if the pin exists and is usable by this process.
void shutdown()
Waits for access to all pins so that any user of access objects may finish with their operation...
PinEntry()
Initializes access to nullptr; other fields are left uninitialized.
std::vector< unsigned int > globalIds(const std::vector< unsigned int > &localIds) const
Converts the provided local pin IDs to global pin IDs.
std::vector< DigitalPinCap > capabilities() const
Returns the capabilities of all pins in the port.
unsigned int size() const
The maximum number of pins on the port.
void updateAccess(const DigitalPinAccess &oldAcc, DigitalPinAccess *newAcc)
Transfers or relinquishes access to pins.
Provides access to a single pin on a DigitalPort.
int waiting
A count of the threads waiting to access pins.
void * pointer
A pointer available for use by DigitalPort implementations to manage additional implementation specif...
std::vector< DigitalPinConfig > configuration(const std::vector< unsigned int > &pvec) const
Returns the configuration of all the pins requested by global ID.
void access(const unsigned int pins[plen], DigitalPinAccess acc[alen])
This is a nice idea that may fail at compile time.
std::vector< DigitalPinCap > capabilitiesLocalIds(const std::vector< unsigned int > &pvec) const
Returns the capabilities of all the pins requested by local ID.
virtual void outputImpl(unsigned int lid, bool state, DigitalPinAccessBase::PortData *pdata)=0
Changes the output state of the given 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 ...
std::condition_variable pinwait
Used to efficently wait for resources to become available.
void access(const std::vector< unsigned int > &pins, DigitalPinSetAccess &acc)
DigitalPort(unsigned int numpins, unsigned int firstid)
Initializes internal data.
bool proposeConfigLocalIds(const std::vector< unsigned int > &pins, std::vector< DigitalPinConfig > &propConf, std::function< void(DigitalPinRejectedConfiguration::Reason)> insertReason=std::function< void(DigitalPinRejectedConfiguration::Reason)>()) const
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.
virtual bool inputImpl(unsigned int gid, DigitalPinAccessBase::PortData *pdata)=0
Reads input from the given pin.
static constexpr Flags OperationNoChange
No change to any pin operation.
void access(const unsigned int pins[Len], std::unique_ptr< DigitalPinAccess > acc[Len])
std::vector< DigitalPinConfig > configurationImpl() const
Returns the configuration of all pins in the port.
std::vector< DigitalPinCap > capabilities(const std::vector< unsigned int > &pvec) const
Returns the capabilities of all the pins requested by global ID.
PinVector pins
Data on each pin handled by the port.
Construction option for initializing all fields to defaul values.
DigitalPinCap cap
The capabilities of the pin.
Data stored for each pin controlled by the port.
std::vector< DigitalPinConfig > configuration() const
Returns the configuration of all pins in the port.
virtual DigitalPinRejectedConfiguration::Reason proposeConfigImpl(unsigned int gid, DigitalPinConfig &pconf, DigitalPinConfig &iconf) const =0
DigitalPinRejectedConfiguration::Reason proposeConfig(unsigned int gid, DigitalPinConfig &pconf) const
Proposes a configuration change for a single pin from the port's current configuration.
void waitForAvailability(std::unique_lock< std::mutex > &lock, const unsigned int *const reqpins, const std::size_t len)
Waits for all pins to become available.