mirror of
https://github.com/KevinMidboe/python-gpiozero.git
synced 2025-10-29 09:40:36 +00:00
Fix #565
Add mock pins docs and tidy up some other bits of the pins docs
This commit is contained in:
@@ -135,36 +135,22 @@ Like the ``GPIOZERO_PIN_FACTORY`` value, these can be exported from your
|
||||
Sensible uses of multiple pin factories are given in :doc:`remote_gpio`.
|
||||
|
||||
|
||||
RPi.GPIO
|
||||
========
|
||||
Mock pins
|
||||
=========
|
||||
|
||||
.. autoclass:: gpiozero.pins.rpigpio.RPiGPIOFactory
|
||||
There's also a :class:`gpiozero.pins.mock.MockFactory` which generates entirely
|
||||
fake pins. This was originally intended for GPIO Zero developers who wish to
|
||||
write tests for devices without having to have the physical device wired in to
|
||||
their Pi. However, they have also proven relatively useful in developing GPIO
|
||||
Zero scripts without having a Pi to hand. This pin factory will never be loaded
|
||||
by default; it must be explicitly specified. For example:
|
||||
|
||||
.. autoclass:: gpiozero.pins.rpigpio.RPiGPIOPin
|
||||
.. literalinclude:: examples/mock_demo.py
|
||||
|
||||
|
||||
RPIO
|
||||
====
|
||||
|
||||
.. autoclass:: gpiozero.pins.rpio.RPIOFactory
|
||||
|
||||
.. autoclass:: gpiozero.pins.rpio.RPIOPin
|
||||
|
||||
|
||||
PiGPIO
|
||||
======
|
||||
|
||||
.. autoclass:: gpiozero.pins.pigpio.PiGPIOFactory
|
||||
|
||||
.. autoclass:: gpiozero.pins.pigpio.PiGPIOPin
|
||||
|
||||
|
||||
Native
|
||||
======
|
||||
|
||||
.. autoclass:: gpiozero.pins.native.NativeFactory
|
||||
|
||||
.. autoclass:: gpiozero.pins.native.NativePin
|
||||
Several sub-classes of mock pins exist for emulating various other things
|
||||
(pins that do/don't support PWM, pins that are connected together, pins that
|
||||
drive high after a delay, etc). Interested users are invited to read the GPIO
|
||||
Zero test suite for further examples of usage.
|
||||
|
||||
|
||||
Base classes
|
||||
@@ -196,22 +182,62 @@ Base classes
|
||||
:members:
|
||||
|
||||
|
||||
Utilities
|
||||
=========
|
||||
RPi.GPIO
|
||||
========
|
||||
|
||||
The pins module also contains a database of information about the various
|
||||
revisions of Raspberry Pi. This is used internally to raise warnings when
|
||||
non-physical pins are used, or to raise exceptions when pull-downs are
|
||||
requested on pins with physical pull-up resistors attached. The following
|
||||
functions and classes can be used to query this database:
|
||||
.. currentmodule:: gpiozero.pins.rpigpio
|
||||
|
||||
.. currentmodule:: gpiozero
|
||||
.. autoclass:: gpiozero.pins.rpigpio.RPiGPIOFactory
|
||||
|
||||
.. autofunction:: pi_info
|
||||
.. autoclass:: gpiozero.pins.rpigpio.RPiGPIOPin
|
||||
|
||||
.. autoclass:: PiBoardInfo
|
||||
|
||||
.. autoclass:: HeaderInfo
|
||||
RPIO
|
||||
====
|
||||
|
||||
.. autoclass:: PinInfo
|
||||
.. currentmodule:: gpiozero.pins.rpio
|
||||
|
||||
.. autoclass:: gpiozero.pins.rpio.RPIOFactory
|
||||
|
||||
.. autoclass:: gpiozero.pins.rpio.RPIOPin
|
||||
|
||||
|
||||
PiGPIO
|
||||
======
|
||||
|
||||
.. currentmodule:: gpiozero.pins.pigpio
|
||||
|
||||
.. autoclass:: gpiozero.pins.pigpio.PiGPIOFactory
|
||||
|
||||
.. autoclass:: gpiozero.pins.pigpio.PiGPIOPin
|
||||
|
||||
|
||||
Native
|
||||
======
|
||||
|
||||
.. currentmodule:: gpiozero.pins.native
|
||||
|
||||
.. autoclass:: gpiozero.pins.native.NativeFactory
|
||||
|
||||
.. autoclass:: gpiozero.pins.native.NativePin
|
||||
|
||||
|
||||
Mock
|
||||
====
|
||||
|
||||
.. currentmodule:: gpiozero.pins.mock
|
||||
|
||||
.. autoclass:: gpiozero.pins.mock.MockFactory
|
||||
:members:
|
||||
|
||||
.. autoclass:: gpiozero.pins.mock.MockPin
|
||||
:members:
|
||||
|
||||
.. autoclass:: gpiozero.pins.mock.MockPWMPin
|
||||
|
||||
.. autoclass:: gpiozero.pins.mock.MockConnectedPin
|
||||
|
||||
.. autoclass:: gpiozero.pins.mock.MockChargingPin
|
||||
|
||||
.. autoclass:: gpiozero.pins.mock.MockTriggerPin
|
||||
|
||||
|
||||
20
docs/api_utils.rst
Normal file
20
docs/api_utils.rst
Normal file
@@ -0,0 +1,20 @@
|
||||
=========
|
||||
Utilities
|
||||
=========
|
||||
|
||||
.. currentmodule:: gpiozero
|
||||
|
||||
The GPIO Zero library also contains a database of information about the various
|
||||
revisions of Raspberry Pi. This is used internally to raise warnings when
|
||||
non-physical pins are used, or to raise exceptions when pull-downs are
|
||||
requested on pins with physical pull-up resistors attached. The following
|
||||
functions and classes can be used to query this database:
|
||||
|
||||
.. autofunction:: pi_info
|
||||
|
||||
.. autoclass:: PiBoardInfo
|
||||
|
||||
.. autoclass:: HeaderInfo
|
||||
|
||||
.. autoclass:: PinInfo
|
||||
|
||||
28
docs/examples/mock_demo.py
Normal file
28
docs/examples/mock_demo.py
Normal file
@@ -0,0 +1,28 @@
|
||||
from gpiozero.pins.mock import MockFactory
|
||||
from gpiozero import Device, Button, LED
|
||||
from time import sleep
|
||||
|
||||
# Set the default pin factory to a mock factory
|
||||
Device.pin_factory = MockFactory()
|
||||
|
||||
# Construct a couple of devices attached to mock pins 16 and 17, and link the
|
||||
# devices
|
||||
led = LED(17)
|
||||
btn = Button(16)
|
||||
led.source = btn.values
|
||||
|
||||
# Here the button isn't "pushed" so the LED's value should be False
|
||||
print(led.value)
|
||||
|
||||
# Get a reference to mock pin 16 (used by the button)
|
||||
btn_pin = Device.pin_factory.pin(16)
|
||||
|
||||
# Drive the pin low (this is what would happen eletrically when the button is
|
||||
# pushed)
|
||||
btn_pin.drive_low()
|
||||
sleep(0.1) # give source some time to re-read the button state
|
||||
print(led.value)
|
||||
|
||||
btn_pin.drive_high()
|
||||
sleep(0.1)
|
||||
print(led.value)
|
||||
@@ -17,6 +17,7 @@ Table of Contents
|
||||
api_generic
|
||||
api_tools
|
||||
api_pins
|
||||
api_utils
|
||||
api_exc
|
||||
cli_tools
|
||||
source_values
|
||||
|
||||
@@ -30,15 +30,9 @@ from ..exc import (
|
||||
|
||||
class Factory(object):
|
||||
"""
|
||||
Generates pins, SPI, and I2C interfaces for devices. This is an abstract
|
||||
base class for pin factories. Descendents *must* override the following
|
||||
methods:
|
||||
|
||||
* :meth:`_get_address`
|
||||
* :meth:`pin_address`
|
||||
|
||||
Descendents *may* additionally override the following methods, if
|
||||
applicable:
|
||||
Generates pins and SPI interfaces for devices. This is an abstract
|
||||
base class for pin factories. Descendents *may* override the following
|
||||
methods, if applicable:
|
||||
|
||||
* :meth:`close`
|
||||
* :meth:`reserve_pins`
|
||||
@@ -129,9 +123,6 @@ class Factory(object):
|
||||
"""
|
||||
raise PinSPIUnsupported('SPI not supported by this pin factory')
|
||||
|
||||
def _get_address(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def _get_pi_info(self):
|
||||
return None
|
||||
|
||||
|
||||
@@ -216,7 +216,7 @@ class MockChargingPin(MockPin):
|
||||
class MockTriggerPin(MockPin):
|
||||
"""
|
||||
This derivative of :class:`MockPin` is intended to be used with another
|
||||
:class:`MockPin` to emulate a distance sensor. Set :attr:`echo_pin` to the
|
||||
:class:`MockPin` to emulate a distance sensor. Set *echo_pin* to the
|
||||
corresponding pin instance. When this pin is driven high it will trigger
|
||||
the echo pin to drive high for the echo time.
|
||||
"""
|
||||
@@ -410,6 +410,14 @@ class MockSPIDevice(object):
|
||||
|
||||
|
||||
class MockFactory(LocalPiFactory):
|
||||
"""
|
||||
Factory for generating mock pins. The *revision* parameter specifies what
|
||||
revision of Pi the mock factory pretends to be (this affects the result of
|
||||
the :attr:`pi_info` attribute as well as where pull-ups are assumed to be).
|
||||
The *pin_class* attribute specifies which mock pin class will be generated
|
||||
by the :meth:`pin` method by default. This can be changed after
|
||||
construction by modifying the :attr:`pin_class` attribute.
|
||||
"""
|
||||
def __init__(
|
||||
self, revision=os.getenv('GPIOZERO_MOCK_REVISION', 'a02082'),
|
||||
pin_class=os.getenv('GPIOZERO_MOCK_PIN_CLASS', MockPin)):
|
||||
@@ -427,10 +435,22 @@ class MockFactory(LocalPiFactory):
|
||||
return self._revision
|
||||
|
||||
def reset(self):
|
||||
"""
|
||||
Clears the pins and reservations sets. This is primarily useful in
|
||||
test suites to ensure the pin factory is back in a "clean" state before
|
||||
the next set of tests are run.
|
||||
"""
|
||||
self.pins.clear()
|
||||
self._reservations.clear()
|
||||
|
||||
def pin(self, spec, pin_class=None, **kwargs):
|
||||
"""
|
||||
The pin method for :class:`MockFactory` additionally takes a *pin_class*
|
||||
attribute which can be used to override the class' :attr:`pin_class`
|
||||
attribute. Any additional keyword arguments will be passed along to the
|
||||
pin constructor (useful with things like :class:`MockConnectedPin` which
|
||||
expect to be constructed with another pin).
|
||||
"""
|
||||
if pin_class is None:
|
||||
pin_class = self.pin_class
|
||||
n = self._to_gpio(spec)
|
||||
|
||||
@@ -178,6 +178,9 @@ class NativeFactory(LocalPiFactory):
|
||||
|
||||
|
||||
class NativePin(LocalPiPin):
|
||||
"""
|
||||
Native pin implementation. See :class:`NativeFactory` for more information.
|
||||
"""
|
||||
GPIO_FUNCTIONS = {
|
||||
'input': 0b000,
|
||||
'output': 0b001,
|
||||
|
||||
@@ -133,6 +133,12 @@ class PiGPIOFactory(PiFactory):
|
||||
|
||||
|
||||
class PiGPIOPin(PiPin):
|
||||
"""
|
||||
Pin implementation for the `pigpio`_ library. See :class:`PiGPIOFactory`
|
||||
for more information.
|
||||
|
||||
.. _pigpio: http://abyz.co.uk/rpi/pigpio/
|
||||
"""
|
||||
_CONNECTIONS = {} # maps (host, port) to (connection, pi_info)
|
||||
GPIO_FUNCTIONS = {
|
||||
'input': pigpio.INPUT,
|
||||
@@ -290,6 +296,12 @@ class PiGPIOPin(PiPin):
|
||||
|
||||
|
||||
class PiGPIOHardwareSPI(SPI, Device):
|
||||
"""
|
||||
Hardware SPI implementation for the `pigpio`_ library. Uses the ``spi_*``
|
||||
functions from the pigpio API.
|
||||
|
||||
.. _pigpio: http://abyz.co.uk/rpi/pigpio/
|
||||
"""
|
||||
def __init__(self, factory, port, device):
|
||||
self._port = port
|
||||
self._device = device
|
||||
@@ -386,6 +398,12 @@ class PiGPIOHardwareSPI(SPI, Device):
|
||||
|
||||
|
||||
class PiGPIOSoftwareSPI(SPI, Device):
|
||||
"""
|
||||
Software SPI implementation for the `pigpio`_ library. Uses the ``bb_spi_*``
|
||||
functions from the pigpio API.
|
||||
|
||||
.. _pigpio: http://abyz.co.uk/rpi/pigpio/
|
||||
"""
|
||||
def __init__(self, factory, clock_pin, mosi_pin, miso_pin, select_pin):
|
||||
self._closed = True
|
||||
self._select_pin = select_pin
|
||||
|
||||
@@ -58,6 +58,12 @@ class RPiGPIOFactory(LocalPiFactory):
|
||||
|
||||
|
||||
class RPiGPIOPin(LocalPiPin):
|
||||
"""
|
||||
Pin implementation for the `RPi.GPIO`_ library. See :class:`RPiGPIOFactory`
|
||||
for more information.
|
||||
|
||||
.. _RPi.GPIO: https://pypi.python.org/pypi/RPi.GPIO
|
||||
"""
|
||||
GPIO_FUNCTIONS = {
|
||||
'input': GPIO.IN,
|
||||
'output': GPIO.OUT,
|
||||
|
||||
@@ -64,6 +64,12 @@ class RPIOFactory(LocalPiFactory):
|
||||
|
||||
|
||||
class RPIOPin(LocalPiPin):
|
||||
"""
|
||||
Pin implementation for the `RPIO`_ library. See :class:`RPIOFactory` for
|
||||
more information.
|
||||
|
||||
.. _RPIO: https://pythonhosted.org/RPIO/
|
||||
"""
|
||||
GPIO_FUNCTIONS = {
|
||||
'input': RPIO.IN,
|
||||
'output': RPIO.OUT,
|
||||
|
||||
Reference in New Issue
Block a user