diff --git a/docs/api_pins.rst b/docs/api_pins.rst index fd8e0e6..fda62cf 100644 --- a/docs/api_pins.rst +++ b/docs/api_pins.rst @@ -32,6 +32,31 @@ The default pin factory can be replaced by specifying a value for the >>> gpiozero.Device._pin_factory +To set the ``GPIOZERO_PIN_FACTORY`` for the rest of your session you can +export this value: + +.. code-block:: console + + pi@raspberrypi $ export GPIOZERO_PIN_FACTORY=native + pi@raspberrypi $ python + Python 3.4.2 (default, Oct 19 2014, 13:31:11) + [GCC 4.9.1] on linux + Type "help", "copyright", "credits" or "license" for more information. + >>> import gpiozero + >>> gpiozero.Device._pin_factory + + >>> quit() + pi@raspberrypi $ python + Python 3.4.2 (default, Oct 19 2014, 13:31:11) + [GCC 4.9.1] on linux + Type "help", "copyright", "credits" or "license" for more information. + >>> import gpiozero + >>> gpiozero.Device._pin_factory + + +If you add the ``export`` command to your :file:`~/.bashrc` file, you'll set +the default pin factory for all future sessions too. + The following values, and the corresponding :class:`Factory` and :class:`Pin` classes are listed in the table below. Factories are listed in the order that they are tried by default. @@ -71,8 +96,10 @@ script: .. code-block:: console - $ export GPIOZERO_PIN_FACTORY=pigpio - $ PIGPIO_ADDR=remote-pi python3 my_script.py + $ GPIOZERO_PIN_FACTORY=pigpio PIGPIO_ADDR=remote-pi python3 my_script.py + +Like the ``GPIOZERO_PIN_FACTORY`` value, these can be exported from your +:file:`~/.bashrc` script too. .. warning:: diff --git a/gpiozero/pins/__init__.py b/gpiozero/pins/__init__.py index 71d3939..df30f61 100644 --- a/gpiozero/pins/__init__.py +++ b/gpiozero/pins/__init__.py @@ -26,12 +26,14 @@ 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: + base class for pin factories. Descendents *must* override the following + methods: * :meth:`_get_address` * :meth:`pin_address` - Descendents may override: + Descendents *may* additionally override the following methods, if + applicable: * :meth:`close` * :meth:`pin` @@ -123,15 +125,16 @@ class Pin(object): be it GPIO, SPI, ADC, etc. Descendents should override property getters and setters to accurately - represent the capabilities of pins. The following functions *must* be - overridden: + represent the capabilities of pins. Descendents *must* override the + following methods: * :meth:`_get_address` * :meth:`_get_function` * :meth:`_set_function` * :meth:`_get_state` - The following functions *may* be overridden if applicable: + Descendents *may* additionally override the following methods, if + applicable: * :meth:`close` * :meth:`output_with_state` @@ -389,13 +392,13 @@ class Pin(object): class SPI(object): """ - Abstract interface for `Serial Peripheral Interface`_ (SPI) implementations. - Descendents *must* override the following: + Abstract interface for `Serial Peripheral Interface`_ (SPI) + implementations. Descendents *must* override the following methods: * :meth:`transfer` * :meth:`_get_clock_mode` - Descendents *may* override the following methods: + Descendents *may* override the following methods, if applicable: * :meth:`read` * :meth:`write` diff --git a/gpiozero/pins/mock.py b/gpiozero/pins/mock.py index 8cced75..4b97647 100644 --- a/gpiozero/pins/mock.py +++ b/gpiozero/pins/mock.py @@ -7,6 +7,7 @@ from __future__ import ( str = type('') +import os from collections import namedtuple from time import time, sleep from threading import Thread, Event @@ -15,6 +16,8 @@ try: except ImportError: from ..compat import isclose +import pkg_resources + from ..exc import PinPWMUnsupported, PinSetInput, PinFixedPull from ..devices import Device from .pi import PiPin @@ -387,9 +390,17 @@ class MockSPIDevice(object): class MockFactory(LocalPiFactory): - def __init__(self, revision='a21041', pin_class=MockPin): + def __init__( + self, revision=os.getenv('GPIOZERO_MOCK_REVISION', 'a21041'), + pin_class=os.getenv('GPIOZERO_MOCK_PIN_CLASS', MockPin)): super(MockFactory, self).__init__() self._revision = revision + if not issubclass(pin_class, MockPin): + if isinstance(pin_class, bytes): + pin_class = pin_class.decode('ascii') + dist = pkg_resources.get_distribution('gpiozero') + group = 'gpiozero_mock_pin_classes' + pin_class = pkg_resources.load_entry_point(dist, group, pin_class.lower()) self.pin_class = pin_class def _get_address(self): diff --git a/setup.py b/setup.py index 3540700..9801fb8 100644 --- a/setup.py +++ b/setup.py @@ -73,7 +73,13 @@ __entry_points__ = { 'rpio = gpiozero.pins.rpio:RPIOFactory', 'native = gpiozero.pins.native:NativeFactory', 'mock = gpiozero.pins.mock:MockFactory', - 'mockpwm = gpiozero.pins.mock:MockPWMFactory', + ], + 'gpiozero_mock_pin_classes': [ + 'mockpin = gpiozero.pins.mock:MockPin', + 'mockpwmpin = gpiozero.pins.mock:MockPWMPin', + 'mockpulleduppin = gpiozero.pins.mock:MockPulledUpPin', + 'mockchargingpin = gpiozero.pins.mock:MockChargingPin', + 'mocktriggerpin = gpiozero.pins.mock:MockTriggerPin', ], 'console_scripts': [ 'pinout = gpiozero.cli.pinout:main',