mirror of
https://github.com/KevinMidboe/python-gpiozero.git
synced 2025-10-29 17:50:37 +00:00
Add pin_factory param to all devices
And some docs ...
This commit is contained in:
@@ -36,9 +36,15 @@ class OutputDevice(SourceMixin, GPIODevice):
|
||||
``None``, the device will be left in whatever state the pin is found in
|
||||
when configured for output (warning: this can be on). If ``True``, the
|
||||
device will be switched on initially.
|
||||
|
||||
:param Factory pin_factory:
|
||||
See :doc:`api_pins` for more information (this is an advanced feature
|
||||
which most users can ignore).
|
||||
"""
|
||||
def __init__(self, pin=None, active_high=True, initial_value=False):
|
||||
super(OutputDevice, self).__init__(pin)
|
||||
def __init__(
|
||||
self, pin=None, active_high=True, initial_value=False,
|
||||
pin_factory=None):
|
||||
super(OutputDevice, self).__init__(pin, pin_factory=pin_factory)
|
||||
self._lock = Lock()
|
||||
self.active_high = active_high
|
||||
if initial_value is None:
|
||||
@@ -126,10 +132,14 @@ class DigitalOutputDevice(OutputDevice):
|
||||
uses an optional background thread to handle toggling the device state
|
||||
without further interaction.
|
||||
"""
|
||||
def __init__(self, pin=None, active_high=True, initial_value=False):
|
||||
def __init__(
|
||||
self, pin=None, active_high=True, initial_value=False,
|
||||
pin_factory=None):
|
||||
self._blink_thread = None
|
||||
self._controller = None
|
||||
super(DigitalOutputDevice, self).__init__(pin, active_high, initial_value)
|
||||
super(DigitalOutputDevice, self).__init__(
|
||||
pin, active_high, initial_value, pin_factory=pin_factory
|
||||
)
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
@@ -230,6 +240,10 @@ class LED(DigitalOutputDevice):
|
||||
``None``, the LED will be left in whatever state the pin is found in
|
||||
when configured for output (warning: this can be on). If ``True``, the
|
||||
LED will be switched on initially.
|
||||
|
||||
:param Factory pin_factory:
|
||||
See :doc:`api_pins` for more information (this is an advanced feature
|
||||
which most users can ignore).
|
||||
"""
|
||||
pass
|
||||
|
||||
@@ -265,6 +279,10 @@ class Buzzer(DigitalOutputDevice):
|
||||
``None``, the buzzer will be left in whatever state the pin is found in
|
||||
when configured for output (warning: this can be on). If ``True``, the
|
||||
buzzer will be switched on initially.
|
||||
|
||||
:param Factory pin_factory:
|
||||
See :doc:`api_pins` for more information (this is an advanced feature
|
||||
which most users can ignore).
|
||||
"""
|
||||
pass
|
||||
|
||||
@@ -293,13 +311,21 @@ class PWMOutputDevice(OutputDevice):
|
||||
:param int frequency:
|
||||
The frequency (in Hz) of pulses emitted to drive the device. Defaults
|
||||
to 100Hz.
|
||||
|
||||
:param Factory pin_factory:
|
||||
See :doc:`api_pins` for more information (this is an advanced feature
|
||||
which most users can ignore).
|
||||
"""
|
||||
def __init__(self, pin=None, active_high=True, initial_value=0, frequency=100):
|
||||
def __init__(
|
||||
self, pin=None, active_high=True, initial_value=0, frequency=100,
|
||||
pin_factory=None):
|
||||
self._blink_thread = None
|
||||
self._controller = None
|
||||
if not 0 <= initial_value <= 1:
|
||||
raise OutputDeviceBadValue("initial_value must be between 0 and 1")
|
||||
super(PWMOutputDevice, self).__init__(pin, active_high, initial_value=None)
|
||||
super(PWMOutputDevice, self).__init__(
|
||||
pin, active_high, initial_value=None, pin_factory=pin_factory
|
||||
)
|
||||
try:
|
||||
# XXX need a way of setting these together
|
||||
self.pin.frequency = frequency
|
||||
@@ -500,6 +526,10 @@ class PWMLED(PWMOutputDevice):
|
||||
:param int frequency:
|
||||
The frequency (in Hz) of pulses emitted to drive the LED. Defaults
|
||||
to 100Hz.
|
||||
|
||||
:param Factory pin_factory:
|
||||
See :doc:`api_pins` for more information (this is an advanced feature
|
||||
which most users can ignore).
|
||||
"""
|
||||
pass
|
||||
|
||||
@@ -552,17 +582,24 @@ class RGBLED(SourceMixin, Device):
|
||||
If ``True`` (the default), construct :class:`PWMLED` instances for
|
||||
each component of the RGBLED. If ``False``, construct regular
|
||||
:class:`LED` instances, which prevents smooth color graduations.
|
||||
|
||||
:param Factory pin_factory:
|
||||
See :doc:`api_pins` for more information (this is an advanced feature
|
||||
which most users can ignore).
|
||||
"""
|
||||
def __init__(
|
||||
self, red=None, green=None, blue=None, active_high=True,
|
||||
initial_value=(0, 0, 0), pwm=True):
|
||||
initial_value=(0, 0, 0), pwm=True, pin_factory=None):
|
||||
self._leds = ()
|
||||
self._blink_thread = None
|
||||
if not all(p is not None for p in [red, green, blue]):
|
||||
raise GPIOPinMissing('red, green, and blue pins must be provided')
|
||||
LEDClass = PWMLED if pwm else LED
|
||||
super(RGBLED, self).__init__()
|
||||
self._leds = tuple(LEDClass(pin, active_high) for pin in (red, green, blue))
|
||||
super(RGBLED, self).__init__(pin_factory=pin_factory)
|
||||
self._leds = tuple(
|
||||
LEDClass(pin, active_high, pin_factory=pin_factory)
|
||||
for pin in (red, green, blue)
|
||||
)
|
||||
self.value = initial_value
|
||||
|
||||
red = _led_property(0)
|
||||
@@ -803,17 +840,23 @@ class Motor(SourceMixin, CompositeDevice):
|
||||
variable speed control. If ``False``, construct
|
||||
:class:`DigitalOutputDevice` instances, allowing only direction
|
||||
control.
|
||||
|
||||
:param Factory pin_factory:
|
||||
See :doc:`api_pins` for more information (this is an advanced feature
|
||||
which most users can ignore).
|
||||
"""
|
||||
def __init__(self, forward=None, backward=None, pwm=True):
|
||||
def __init__(self, forward=None, backward=None, pwm=True, pin_factory=None):
|
||||
if not all(p is not None for p in [forward, backward]):
|
||||
raise GPIOPinMissing(
|
||||
'forward and backward pins must be provided'
|
||||
)
|
||||
PinClass = PWMOutputDevice if pwm else DigitalOutputDevice
|
||||
super(Motor, self).__init__(
|
||||
forward_device=PinClass(forward),
|
||||
backward_device=PinClass(backward),
|
||||
_order=('forward_device', 'backward_device'))
|
||||
forward_device=PinClass(forward, pin_factory=pin_factory),
|
||||
backward_device=PinClass(backward, pin_factory=pin_factory),
|
||||
_order=('forward_device', 'backward_device'),
|
||||
pin_factory=pin_factory
|
||||
)
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
@@ -946,11 +989,15 @@ class Servo(SourceMixin, CompositeDevice):
|
||||
:param float frame_width:
|
||||
The length of time between servo control pulses measured in seconds.
|
||||
This defaults to 20ms which is a common value for servos.
|
||||
|
||||
:param Factory pin_factory:
|
||||
See :doc:`api_pins` for more information (this is an advanced feature
|
||||
which most users can ignore).
|
||||
"""
|
||||
def __init__(
|
||||
self, pin=None, initial_value=0.0,
|
||||
min_pulse_width=1/1000, max_pulse_width=2/1000,
|
||||
frame_width=20/1000):
|
||||
frame_width=20/1000, pin_factory=None):
|
||||
if min_pulse_width >= max_pulse_width:
|
||||
raise ValueError('min_pulse_width must be less than max_pulse_width')
|
||||
if max_pulse_width >= frame_width:
|
||||
@@ -961,7 +1008,11 @@ class Servo(SourceMixin, CompositeDevice):
|
||||
self._min_value = -1
|
||||
self._value_range = 2
|
||||
super(Servo, self).__init__(
|
||||
pwm_device=PWMOutputDevice(pin, frequency=int(1 / frame_width)))
|
||||
pwm_device=PWMOutputDevice(
|
||||
pin, frequency=int(1 / frame_width), pin_factory=pin_factory
|
||||
),
|
||||
pin_factory=pin_factory
|
||||
)
|
||||
try:
|
||||
self.value = initial_value
|
||||
except:
|
||||
@@ -1146,17 +1197,23 @@ class AngularServo(Servo):
|
||||
:param float frame_width:
|
||||
The length of time between servo control pulses measured in seconds.
|
||||
This defaults to 20ms which is a common value for servos.
|
||||
|
||||
:param Factory pin_factory:
|
||||
See :doc:`api_pins` for more information (this is an advanced feature
|
||||
which most users can ignore).
|
||||
"""
|
||||
def __init__(
|
||||
self, pin=None, initial_angle=0.0,
|
||||
min_angle=-90, max_angle=90,
|
||||
min_pulse_width=1/1000, max_pulse_width=2/1000,
|
||||
frame_width=20/1000):
|
||||
frame_width=20/1000, pin_factory=None):
|
||||
self._min_angle = min_angle
|
||||
self._angular_range = max_angle - min_angle
|
||||
initial_value = 2 * ((initial_angle - min_angle) / self._angular_range) - 1
|
||||
super(AngularServo, self).__init__(
|
||||
pin, initial_value, min_pulse_width, max_pulse_width, frame_width)
|
||||
pin, initial_value, min_pulse_width, max_pulse_width, frame_width,
|
||||
pin_factory=pin_factory
|
||||
)
|
||||
|
||||
@property
|
||||
def min_angle(self):
|
||||
|
||||
Reference in New Issue
Block a user