|
DUDS
|
Distributed Update of Data from Something
|
A GPIO implementation using the Linux kernel's GPIO character devices. More...
#include <GpioDevPort.hpp>
Public Member Functions | |
| GpioDevPort (const std::string &path="/dev/gpiochip0", unsigned int firstid=0, const std::string &username="DUDS") | |
| Make a GpioDevPort object with all the pins available to the device. More... | |
| GpioDevPort (const std::vector< unsigned int > &ids, const std::string &path="/dev/gpiochip0", unsigned int firstid=0, const std::string &username="DUDS") | |
| Make a GpioDevPort object with the given pins. More... | |
| virtual | ~GpioDevPort () |
| virtual bool | simultaneousOperations () const |
| Simultaneous operations are supported; returns true. More... | |
Public Member Functions inherited from duds::hardware::interface::DigitalPortIndependentPins | |
| virtual bool | independentConfig () const |
| Always true. More... | |
| virtual bool | independentConfig (unsigned int, const DigitalPinConfig &, const DigitalPinConfig &) const |
| Always true. More... | |
Public Member Functions inherited from duds::hardware::interface::DigitalPort | |
| virtual | ~DigitalPort () |
| Derived classes should call shutdown() early in their destructors. More... | |
| void | access (const unsigned int *pins, const unsigned int len, std::unique_ptr< DigitalPinAccess > *acc) |
| Obtain access objects to use a set of pins. More... | |
| template<std::size_t Len> | |
| void | access (const unsigned int pins[Len], std::unique_ptr< DigitalPinAccess > acc[Len]) |
| std::unique_ptr< DigitalPinAccess > | access (const unsigned int pin) |
| void | access (const unsigned int *pins, const unsigned int len, DigitalPinAccess *acc) |
| Obtain access objects to use a set of pins. More... | |
| void | access (const std::vector< unsigned int > &pins, DigitalPinAccess *acc) |
| template<std::size_t alen, std::size_t plen> | |
| void | access (const unsigned int pins[plen], DigitalPinAccess acc[alen]) |
| This is a nice idea that may fail at compile time. More... | |
| void | access (const unsigned int *pins, const unsigned int len, DigitalPinSetAccess &acc) |
| Obtain access objects to use a set of pins. More... | |
| void | access (const unsigned int *begin, const unsigned int *end, DigitalPinSetAccess &acc) |
| void | access (const std::vector< unsigned int > &pins, DigitalPinSetAccess &acc) |
| std::unique_ptr< DigitalPinSetAccess > | access (const std::vector< unsigned int > &pins) |
| template<class InputIter > | |
| void | access (const InputIter &begin, const InputIter &end, DigitalPinSetAccess &acc) |
| DigitalPinCap | capabilities (unsigned int globalPinId) const |
| Returns the capabilities of a pin. More... | |
| std::vector< DigitalPinCap > | capabilities () const |
| Returns the capabilities of all pins in the port. More... | |
| std::vector< DigitalPinCap > | capabilities (const std::vector< unsigned int > &pvec) const |
| Returns the capabilities of all the pins requested by global ID. More... | |
| std::vector< DigitalPinCap > | capabilitiesLocalIds (const std::vector< unsigned int > &pvec) const |
| Returns the capabilities of all the pins requested by local ID. More... | |
| DigitalPinConfig | configuration (unsigned int globalPinId) const |
| Returns the current configuration of a pin. More... | |
| std::vector< DigitalPinConfig > | configuration () const |
| Returns the configuration of all pins in the port. More... | |
| std::vector< DigitalPinConfig > | configuration (const std::vector< unsigned int > &pvec) const |
| Returns the configuration of all the pins requested by global ID. More... | |
| std::vector< DigitalPinConfig > | configurationLocalIds (const std::vector< unsigned int > &pvec) const |
| Returns the configuration of all the pins requested by local ID. More... | |
| bool | exists (unsigned int gid) const |
| Returns true if the pin exists in this port. More... | |
| unsigned int | globalId (unsigned int localId) const |
| Returns the global ID for a pin given the local ID. More... | |
| std::vector< unsigned int > | globalIds (const std::vector< unsigned int > &localIds) const |
| Converts the provided local pin IDs to global pin IDs. More... | |
| unsigned int | localId (unsigned int globalId) const |
| Returns the local ID for a pin given the global ID. More... | |
| std::vector< unsigned int > | localIds (const std::vector< unsigned int > &globalIds) const |
| Converts the provided global pin IDs to local pin IDs. More... | |
| unsigned int | offset () const |
| Returns the offset for the port's pins. More... | |
| void | poll () |
| void | pollInput () |
| void | pollSignal () |
| DigitalPinRejectedConfiguration::Reason | proposeConfig (unsigned int gid, DigitalPinConfig &pconf, DigitalPinConfig &iconf) const |
| Proposes a configuration change for a single pin. More... | |
| DigitalPinRejectedConfiguration::Reason | proposeConfig (unsigned int gid, DigitalPinConfig &pconf) const |
| Proposes a configuration change for a single pin from the port's current configuration. More... | |
| bool | proposeConfig (const std::vector< unsigned int > &globalPinIds, std::vector< DigitalPinConfig > &propConf, std::vector< DigitalPinConfig > &initConf, std::function< void(DigitalPinRejectedConfiguration::Reason)> insertReason=std::function< void(DigitalPinRejectedConfiguration::Reason)>()) const |
| bool | proposeConfig (const std::vector< unsigned int > &pins, std::vector< DigitalPinConfig > &propConf, std::function< void(DigitalPinRejectedConfiguration::Reason)> insertReason=std::function< void(DigitalPinRejectedConfiguration::Reason)>()) const |
| 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 |
| bool | proposeConfigLocalIds (const std::vector< unsigned int > &pins, std::vector< DigitalPinConfig > &propConf, std::function< void(DigitalPinRejectedConfiguration::Reason)> insertReason=std::function< void(DigitalPinRejectedConfiguration::Reason)>()) const |
| bool | proposeFullConfig (std::vector< DigitalPinConfig > &propConf, std::vector< DigitalPinConfig > &initConf, std::function< void(DigitalPinRejectedConfiguration::Reason)> insertReason=std::function< void(DigitalPinRejectedConfiguration::Reason)>()) const |
| unsigned int | size () const |
| The maximum number of pins on the port. More... | |
Static Public Member Functions | |
| static std::shared_ptr< GpioDevPort > | makeConfiguredPort (PinConfiguration &pc, const std::string &name="default", const std::string &defaultPath="/dev/gpiochip0", bool forceDefault=false) |
| Make a GpioDevPort object according to the given configuration, and attach to the configuration. More... | |
Protected Member Functions | |
| virtual void | configurePort (unsigned int localPinId, const DigitalPinConfig &cfg, DigitalPinAccessBase::PortData *pdata) |
| Changes the hardware configuration for a single pin. More... | |
| virtual bool | inputImpl (unsigned int gid, DigitalPinAccessBase::PortData *pdata) |
| Reads input from the given pin. More... | |
| virtual std::vector< bool > | inputImpl (const std::vector< unsigned int > &pvec, DigitalPinAccessBase::PortData *pdata) |
| Reads input from the requested pins. More... | |
| virtual void | madeAccess (DigitalPinAccess &acc) |
| Called after a new access object is made to allow a port implementation to take further action. More... | |
| virtual void | madeAccess (DigitalPinSetAccess &acc) |
| Called after a new access object is made to allow a port implementation to take further action. More... | |
| virtual void | outputImpl (unsigned int lid, bool state, DigitalPinAccessBase::PortData *pdata) |
| Changes the output state of the given pin. More... | |
| virtual void | outputImpl (const std::vector< unsigned int > &pvec, const std::vector< bool > &state, DigitalPinAccessBase::PortData *pdata) |
| Changes the outputs of several pins. More... | |
| virtual void | retiredAccess (const DigitalPinAccess &acc) noexcept |
| Called just before an access object is retired to allow a port implementation to take further action. More... | |
| virtual void | retiredAccess (const DigitalPinSetAccess &acc) noexcept |
| Called just before an access object is retired to allow a port implementation to take further action. More... | |
Protected Member Functions inherited from duds::hardware::interface::DigitalPortIndependentPins | |
| DigitalPortIndependentPins (unsigned int numpins, unsigned int firstid) | |
| virtual void | configurePort (const std::vector< DigitalPinConfig > &cfgs, DigitalPinAccessBase::PortData *pdata) |
| Changes the hardware configuration for the whole port by calling configurePort(const DigitalPinConfig &, unsigned int, DigitalPinAccessBase::PortData *) for each pin. More... | |
| virtual DigitalPinRejectedConfiguration::Reason | proposeConfigImpl (unsigned int gid, DigitalPinConfig &pconf, DigitalPinConfig &iconf) const |
| Considers the proposed configuration for one pin. More... | |
| virtual bool | proposeConfigImpl (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 |
| Considers the proposed configuration one pin at a time in the order specified in pins. More... | |
| 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. More... | |
Protected Member Functions inherited from duds::hardware::interface::DigitalPort | |
| DigitalPort (unsigned int numpins, unsigned int firstid) | |
| Initializes internal data. More... | |
| std::vector< DigitalPinCap > | capabilities (const std::vector< unsigned int > &pvec, bool global) const |
| const DigitalPinConfig & | configRef (unsigned int localPinId) const |
| Returns a reference to a pin's configuration on behalf of an access object. More... | |
| std::vector< DigitalPinConfig > | configuration (const std::vector< unsigned int > &pvec, bool global) const |
| std::vector< DigitalPinConfig > | configurationImpl () const |
| Returns the configuration of all pins in the port. More... | |
| 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. More... | |
| std::vector< bool > | input (const std::vector< unsigned int > &pvec, DigitalPinAccessBase::PortData *pdata) |
| Does error checking in advance of calling inputImpl(const std::vector<unsigned int> &) to read the input of a set of pins. More... | |
| DigitalPinConfig | modifyConfig (unsigned int globalPinId, const DigitalPinConfig &cfg, DigitalPinAccessBase::PortData *pdata) |
| Modifies the configuration of a single pin with an independent configuration. More... | |
| void | modifyConfig (std::vector< DigitalPinConfig > &cfgs, DigitalPinAccessBase::PortData *pdata) |
| Modifies the configuration of multiple pins. More... | |
| void | modifyConfig (const std::vector< unsigned int > &pvec, std::vector< DigitalPinConfig > &cfgs, DigitalPinAccessBase::PortData *pdata) |
| 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 considered for possible changes. More... | |
| 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 given pin. More... | |
| void | output (const std::vector< unsigned int > &pvec, const std::vector< bool > &state, DigitalPinAccessBase::PortData *pdata) |
| Does error checking in advance of calling outputImpl(const std::vector<unsigned int> &,const std::vector<bool> &) to change the output of a set of pins. More... | |
| void | shutdown () |
| Waits for access to all pins so that any user of access objects may finish with their operation, then destroys all pin data and awakens threads waiting on access, but they will not receive access. More... | |
Private Member Functions | |
| void | initPin (std::uint32_t offset, unsigned int pid) |
| Initializes a PinEntry with data on a GPIO line. More... | |
Private Attributes | |
| int | chipFd |
| File descriptor for GPIO chip device file. More... | |
| std::string | consumer |
| The consumer name given to the kernel when requesting the use of GPIO lines. More... | |
| std::string | devpath |
| The path of the device file; retained only for error reporting purposes. More... | |
| std::string | name |
| The reported name of the GPIO chip device. More... | |
Additional Inherited Members | |
Protected Types inherited from duds::hardware::interface::DigitalPort | |
| typedef std::vector< PinEntry > | PinVector |
Static Protected Member Functions inherited from duds::hardware::interface::DigitalPort | |
| static DigitalPinAccessBase::PortData & | portData (const DigitalPinAccessBase &acc) |
| Returns a reference to the port specific data in the given DigitalPinAccessBase object. More... | |
| template<typename T > | |
| static void | portDataPtr (const DigitalPinAccessBase &acc, T **ptr) |
| Provides a pointer to type T stored in the port specific data of the given DigitalPinAccessBase object. More... | |
Protected Attributes inherited from duds::hardware::interface::DigitalPort | |
| PinVector | pins |
| Data on each pin handled by the port. More... | |
A GPIO implementation using the Linux kernel's GPIO character devices.
Limitations:
While some hardware may have some or all of these limitations, other hardware does not. Using the Linux kernel GPIO character device will impose these limitations on the system.
It is assumed that the process using this object for a given pin will be the only process on the host using the pin. This should be a fairly safe assumption since it should only be violated by bad behavior.
Definition at line 92 of file GpioDevPort.hpp.
| duds::hardware::interface::linux::GpioDevPort::GpioDevPort | ( | const std::string & | path = "/dev/gpiochip0", |
| unsigned int | firstid = 0, |
||
| const std::string & | username = "DUDS" |
||
| ) |
Make a GpioDevPort object with all the pins available to the device.
If the program will be using a known subset of the pins, the GpioDevPort(const std::vector<unsigned int> &, const std::string &, unsigned int) constructor should be used instead to prevent and find unintentional use of other pins.
| path | The path to the GPIO device file. |
| firstid | The gloabl ID that will be assigned to the first pin (local ID zero) of this port. |
| username | The name provided to the GPIO device for the consumer. |
| DigitalPortDoesNotExistError | The device file could not be opened, or the request for information on the GPIO device ended in error. |
| DigitalPortLacksPinError | A request for information on a pin ended in error. |
Definition at line 450 of file GpioDevPort.cpp.
| duds::hardware::interface::linux::GpioDevPort::GpioDevPort | ( | const std::vector< unsigned int > & | ids, |
| const std::string & | path = "/dev/gpiochip0", |
||
| unsigned int | firstid = 0, |
||
| const std::string & | username = "DUDS" |
||
| ) |
Make a GpioDevPort object with the given pins.
| ids | The pin numbers from the filesystem. The index of each inside ids will be the local pin ID used by this port. A value of -1 will create an unavailable pin and may be used multiple times. Other values must only be used once. |
| path | The path to the GPIO device file. |
| firstid | The gloabl ID that will be assigned to the first pin (local ID zero) of this port. |
| username | The name provided to the GPIO device for the consumer. |
| DigitalPortDoesNotExistError | The device file could not be opened, or the request for information on the GPIO device ended in error. |
| DigitalPortLacksPinError | A request for information on a pin ended in error. |
Definition at line 477 of file GpioDevPort.cpp.
|
virtual |
Definition at line 555 of file GpioDevPort.cpp.
|
protectedvirtual |
Changes the hardware configuration for a single pin.
If this function does not throw, its caller will record the configuration change inside pins. It is only called after error checking is performed on its parameters.
| cfg | The new configuration. |
| localPinId | The local ID for the pin to modify. |
| pdata | A pointer to the port specific data stored in the corresponding access object for the pin. |
Implements duds::hardware::interface::DigitalPortIndependentPins.
Definition at line 656 of file GpioDevPort.cpp.
|
private |
Initializes a PinEntry with data on a GPIO line.
| offset | The line offset for the pin on the GPIO chip device. |
| pid | The assigned port specific pin ID. |
| DigitalPortLacksPinError | The attempt to obtain information on the GPIO line ended with an error. |
Definition at line 560 of file GpioDevPort.cpp.
Referenced by GpioDevPort().
|
protectedvirtual |
Reads input from the given pin.
| gid | The global ID of the pin to read. |
| pdata | A pointer to the port specific data stored in the corresponding access object for the pin. |
Implements duds::hardware::interface::DigitalPort.
Definition at line 683 of file GpioDevPort.cpp.
|
protectedvirtual |
Reads input from the requested pins.
The implementation in DigitalPort calls input(unsigned int). This only makes sense for ports that do not support simultaneous operations. An assertion exists to prevent such misuse.
| pvec | The global IDs of the pins to read. |
| pdata | A pointer to the port specific data stored in the corresponding access object for the pins. |
Reimplemented from duds::hardware::interface::DigitalPort.
Definition at line 697 of file GpioDevPort.cpp.
|
protectedvirtual |
Called after a new access object is made to allow a port implementation to take further action.
The call is made while there is a lock on block. The default implementation does nothing.
| acc | The newly made access object. |
| exception | Any thrown exception will cause the access object to be retired and then the exception will be rethrown. |
Reimplemented from duds::hardware::interface::DigitalPort.
Definition at line 618 of file GpioDevPort.cpp.
|
protectedvirtual |
Called after a new access object is made to allow a port implementation to take further action.
The call is made while there is a lock on block. The default implementation does nothing.
| acc | The newly made access object. |
| exception | Any thrown exception will cause the access object to be retired and then the exception will be rethrown. |
Reimplemented from duds::hardware::interface::DigitalPort.
Definition at line 622 of file GpioDevPort.cpp.
|
static |
Make a GpioDevPort object according to the given configuration, and attach to the configuration.
| pc | The object with the port configuration data. |
| name | The name of the port in the configuration. |
| defaultPath | The default path to the port's device file. This will be used if not specified in the configuration. |
| forceDefault | If true, the value in defaultPath will be used even if the device file is specified in the configuration. |
| PortDoesNotExistError | There is no port called name in the given configuration. |
| DigitalPortDoesNotExistError | The device file could not be opened, or the request for information on the GPIO device ended in error. |
| DigitalPortLacksPinError | A request for information on a pin ended in error. |
Definition at line 506 of file GpioDevPort.cpp.
|
protectedvirtual |
Changes the output state of the given pin.
If the pin is not configured as an output, its configuration will not change. However, this new state will be the output state once the configuration is changed to output.
| lid | The local ID of the pin to change. |
| state | The new output state. |
| pdata | A pointer to the port specific data stored in the corresponding access object for the pin. |
Implements duds::hardware::interface::DigitalPort.
Definition at line 727 of file GpioDevPort.cpp.
|
protectedvirtual |
Changes the outputs of several pins.
If any of the pins are not configured as an output, thier configuration will not change. However, this new state will be the output state once the configuration is changed to output.
The implementation in DigitalPort calls output(unsigned int, bool). This only makes sense for ports that do not support simultaneous operations. An assertion exists to prevent such misuse.
| pvec | The local ID of the pins to alter. |
| state | The new output states. |
| pdata | A pointer to the port specific data stored in the corresponding access object for the pins. |
Reimplemented from duds::hardware::interface::DigitalPort.
Definition at line 748 of file GpioDevPort.cpp.
|
protectedvirtualnoexcept |
Called just before an access object is retired to allow a port implementation to take further action.
The call is made while there is a lock on block. The default implementation does nothing.
| acc | The access object that will be retired. |
Reimplemented from duds::hardware::interface::DigitalPort.
Definition at line 644 of file GpioDevPort.cpp.
|
protectedvirtualnoexcept |
Called just before an access object is retired to allow a port implementation to take further action.
The call is made while there is a lock on block. The default implementation does nothing.
| acc | The access object that will be retired. |
Reimplemented from duds::hardware::interface::DigitalPort.
Definition at line 650 of file GpioDevPort.cpp.
|
virtual |
Simultaneous operations are supported; returns true.
Implements duds::hardware::interface::DigitalPort.
Definition at line 614 of file GpioDevPort.cpp.
|
private |
File descriptor for GPIO chip device file.
Definition at line 109 of file GpioDevPort.hpp.
Referenced by configurePort(), GpioDevPort(), initPin(), inputImpl(), outputImpl(), and ~GpioDevPort().
|
private |
The consumer name given to the kernel when requesting the use of GPIO lines.
Definition at line 101 of file GpioDevPort.hpp.
Referenced by madeAccess().
|
private |
The path of the device file; retained only for error reporting purposes.
Definition at line 105 of file GpioDevPort.hpp.
Referenced by configurePort(), initPin(), inputImpl(), and outputImpl().
|
private |
The reported name of the GPIO chip device.
Definition at line 96 of file GpioDevPort.hpp.
Referenced by GpioDevPort().