GpioDriver
public
interface
GpioDriver
implements
Gpio
com.google.android.things.userdriver.pio.GpioDriver |
GPIO user driver.
A GpioDriver must implement all Gpio
functions, but additionally this class provides an
open() function that will be called whenever a process obtains ownership of the GPIO, to match
the existing close() function.
Summary
Inherited constants |
---|
From
interface
com.google.android.things.pio.Gpio
|
Public methods | |
---|---|
abstract
void
|
close()
Closes the GPIO pin. |
default
String
|
getName()
Returns null. |
abstract
void
|
open()
Opens the GPIO pin. |
abstract
void
|
registerGpioCallback(Handler handler, GpioCallback callback)
Registers a callback for GPIO edge interrupts. |
abstract
void
|
unregisterGpioCallback(GpioCallback callback)
Unregisters an interrupt callback. |
Inherited methods | |
---|---|
From
interface
com.google.android.things.pio.Gpio
| |
From
interface
java.io.Closeable
| |
From
interface
java.lang.AutoCloseable
|
Public methods
close
void close ()
Closes the GPIO pin. This will be called when the GPIO is closed by its owner. Any resources that need to be cleaned up should be done so here. This method may throw IOException to indicate I/O failure, but the GPIO will still be considered closed and may attempt to be re-opened in the future.
Throws | |
---|---|
IOException |
on I/O failure; the driver will still be considered closed. |
getName
String getName ()
Returns null. I/O user drivers can be registered under any name so this returns null by default. Child classes may override this if other behavior is desired.
Returns | |
---|---|
String |
open
void open ()
Opens the GPIO pin. This will be called when ownership of a GPIO is obtained. The driver should do any initialization needed to configure the GPIO pin for use here.
Throws | |
---|---|
IOException |
on I/O failure; the driver will remain closed. |
registerGpioCallback
void registerGpioCallback (Handler handler, GpioCallback callback)
Registers a callback for GPIO edge interrupts.
This API is shared with a standard Gpio
, but for a GpioDriver some simplifying
assumptions can be made:
- Only one
GpioCallback
will ever be registered at a time. - The Gpio argument to the GpioCallback methods are not needed, so any value
(or
null
) may be provided when making callbacks. - The return value from
onGpioEdge(Gpio)
will always be true and can be safely ignored. - The driver is allowed but not required to post callbacks on the provided Handler.
- Currently the error value passed to
onGpioError(Gpio, int)
is ignored andOsConstants.ENODEV
is always used instead.
Example: Shared GPIO interrupt line
This is common with I2C-to-GPIO expanders, where a bank of GPIOs will share one common interrupt line. The idea is that the GpioDriver receives the common interrupt signal, figures out which of the expander's GPIOs it actually came from, and then dispatch the interrupt to that particular GpioDriver.// Implements a single GPIO on the expander. public class SharedInterruptGpioDriver implements GpioDriver { // The underlying GPIO shared between the whole GPIO bank. private Gpio mInterruptGpio; // Our callback implementation to handle shared GPIO interrupts. private SharedGpioCallback mSharedCallback;@Override
public void registerGpioCallback(Handler handler, GpioCallback callback) throws IOException { mSharedCallback = new SharedGpioCallback(callback); mInterruptGpio.registerGpioCallback(handler, mSharedCallback); }@Override
public void unregisterGpioCallback(GpioCallback callback) { mInterruptGpio.unregisterGpioCallback(mSharedCallback); mSharedCallback = null; } // Intercept the shared GPIO callback and if it was meant for us, dispatch to the // user-facing callback. private class SharedGpioCallback implements GpioCallback { // The callback registers on this GPIO driver that we dispatch events to. private final GpioCallback mRegisteredCallback; public SharedGpioCallback(GpioCallback registeredCallback) { mRegisteredCallback = registeredCallback; }@Override
public boolean onGpioEdge(Gpio gpio) { // Do any checking necessary to determine if this is the GPIO that fired. // // This is for example purposes only and may be inefficient since each GPIO // checks the interrupt - better would be a single interrupt handler which // dispatches to the proper GPIO driver. if (thisGpioHadInterrupt()) { return mRegisteredCallback.onGpioEdge(gpio); } // If it wasn't meant for this GPIO, do nothing and return true to keep // listening for events. return true; }@Override
public void onGpioError(Gpio gpio, int error) { // The underlying interrupt GPIO failed, we won't get any more callbacks. mRegisteredCallback.onGpioError(gpio, error); } } }
Parameters | |
---|---|
handler |
Handler : Handler to optionally run callbacks on. Provided as a convenience if needed,
but it's not required to execute callbacks on this. |
callback |
GpioCallback : GpioCallback to register; only one will ever be registered at a time. |
Throws | |
---|---|
IOException |
if this GPIO doesn't support interrupts. |
unregisterGpioCallback
void unregisterGpioCallback (GpioCallback callback)
Unregisters an interrupt callback. Will only be called if a GpioCallback has been previously registered.
Parameters | |
---|---|
callback |
GpioCallback : GpioCallback to unregister. |
Interfaces
Classes