Changed pin.function so that it's always read-write, which in turn
permits InputDevice to force pin.function to "input" rather than
checking that it's not "input" first. This ensures internal state in
RPi.GPIO and RPIO reflects the reality of each pin's function (see
discussion under the ticket for more detail).
This commit is contained in:
Dave Jones
2016-04-03 15:41:52 +01:00
parent 00373b608c
commit 7826e60c3d
4 changed files with 7 additions and 11 deletions

View File

@@ -27,7 +27,6 @@ from .exc import (
OutputDeviceError, OutputDeviceError,
OutputDeviceBadValue, OutputDeviceBadValue,
PinError, PinError,
PinFixedFunction,
PinInvalidFunction, PinInvalidFunction,
PinInvalidState, PinInvalidState,
PinInvalidPull, PinInvalidPull,

View File

@@ -64,9 +64,6 @@ class OutputDeviceBadValue(OutputDeviceError, ValueError):
class PinError(GPIOZeroError): class PinError(GPIOZeroError):
"Base class for errors related to pin implementations" "Base class for errors related to pin implementations"
class PinFixedFunction(PinError, AttributeError):
"Error raised when attempting to change the function of a fixed type pin"
class PinInvalidFunction(PinError, ValueError): class PinInvalidFunction(PinError, ValueError):
"Error raised when attempting to change the function of a pin to an invalid value" "Error raised when attempting to change the function of a pin to an invalid value"

View File

@@ -39,8 +39,7 @@ class InputDevice(GPIODevice):
def __init__(self, pin=None, pull_up=False): def __init__(self, pin=None, pull_up=False):
super(InputDevice, self).__init__(pin) super(InputDevice, self).__init__(pin)
try: try:
if self.pin.function != 'input': self.pin.function = 'input'
self.pin.function = 'input'
pull = 'up' if pull_up else 'down' pull = 'up' if pull_up else 'down'
if self.pin.pull != pull: if self.pin.pull != pull:
self.pin.pull = pull self.pin.pull = pull

View File

@@ -7,7 +7,7 @@ from __future__ import (
str = type('') str = type('')
from ..exc import ( from ..exc import (
PinFixedFunction, PinInvalidFunction,
PinSetInput, PinSetInput,
PinFixedPull, PinFixedPull,
PinPWMUnsupported, PinPWMUnsupported,
@@ -30,12 +30,12 @@ class Pin(object):
overridden: overridden:
* :meth:`_get_function` * :meth:`_get_function`
* :meth:`_set_function`
* :meth:`_get_state` * :meth:`_get_state`
The following functions *may* be overridden if applicable: The following functions *may* be overridden if applicable:
* :meth:`close` * :meth:`close`
* :meth:`_set_function`
* :meth:`_set_state` * :meth:`_set_state`
* :meth:`_get_frequency` * :meth:`_get_frequency`
* :meth:`_set_frequency` * :meth:`_set_frequency`
@@ -105,7 +105,9 @@ class Pin(object):
return "input" return "input"
def _set_function(self, value): def _set_function(self, value):
raise PinFixedFunction("Cannot set the function of pin %r" % self) if value != "input":
raise PinInvalidFunction(
"Cannot set the function of pin %r to %s" % (self, value))
function = property( function = property(
lambda self: self._get_function(), lambda self: self._get_function(),
@@ -119,8 +121,7 @@ class Pin(object):
With certain pin types (e.g. GPIO pins), this attribute can be changed With certain pin types (e.g. GPIO pins), this attribute can be changed
to configure the function of a pin. If an invalid function is to configure the function of a pin. If an invalid function is
specified, for this attribute, :exc:`PinInvalidFunction` will be specified, for this attribute, :exc:`PinInvalidFunction` will be
raised. If this pin is fixed function and an attempt is made to set raised.
this attribute, :exc:`PinFixedFunction` will be raised.
""") """)
def _get_state(self): def _get_state(self):