mirror of
https://github.com/KevinMidboe/python-gpiozero.git
synced 2025-10-29 17:50:37 +00:00
TrafficLights.value also reports 'yellow' instead of 'amber' when appropriate
This commit is contained in:
@@ -12,6 +12,7 @@ except ImportError:
|
|||||||
from time import sleep
|
from time import sleep
|
||||||
from itertools import repeat, cycle, chain
|
from itertools import repeat, cycle, chain
|
||||||
from threading import Lock
|
from threading import Lock
|
||||||
|
from collections import OrderedDict
|
||||||
|
|
||||||
from .exc import (
|
from .exc import (
|
||||||
DeviceClosed,
|
DeviceClosed,
|
||||||
@@ -578,24 +579,33 @@ class TrafficLights(LEDBoard):
|
|||||||
raise OutputDeviceBadValue(
|
raise OutputDeviceBadValue(
|
||||||
'Only one of amber or yellow can be specified'
|
'Only one of amber or yellow can be specified'
|
||||||
)
|
)
|
||||||
if amber is None:
|
devices = OrderedDict((('red', red), ))
|
||||||
amber = yellow
|
self._display_yellow = amber is None and yellow is not None
|
||||||
if not all(p is not None for p in [red, amber, green]):
|
if self._display_yellow:
|
||||||
|
devices['yellow'] = yellow
|
||||||
|
else:
|
||||||
|
devices['amber'] = amber
|
||||||
|
devices['green'] = green
|
||||||
|
if not all(p is not None for p in devices.values()):
|
||||||
raise GPIOPinMissing(
|
raise GPIOPinMissing(
|
||||||
'red, amber and green pins must be provided'
|
', '.join(devices.keys())+' pins must be provided'
|
||||||
)
|
)
|
||||||
super(TrafficLights, self).__init__(
|
super(TrafficLights, self).__init__(
|
||||||
red=red, amber=amber, green=green,
|
|
||||||
pwm=pwm, initial_value=initial_value,
|
pwm=pwm, initial_value=initial_value,
|
||||||
_order=('red', 'amber', 'green'))
|
_order=devices.keys(),
|
||||||
|
**devices)
|
||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
if name == 'yellow':
|
if name == 'amber' and self._display_yellow:
|
||||||
|
name = 'yellow'
|
||||||
|
elif name == 'yellow' and not self._display_yellow:
|
||||||
name = 'amber'
|
name = 'amber'
|
||||||
return super(TrafficLights, self).__getattr__(name)
|
return super(TrafficLights, self).__getattr__(name)
|
||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
if name == 'yellow':
|
if name == 'amber' and self._display_yellow:
|
||||||
|
name = 'yellow'
|
||||||
|
elif name == 'yellow' and not self._display_yellow:
|
||||||
name = 'amber'
|
name = 'amber'
|
||||||
return super(TrafficLights, self).__setattr__(name, value)
|
return super(TrafficLights, self).__setattr__(name, value)
|
||||||
|
|
||||||
|
|||||||
@@ -548,11 +548,19 @@ def test_traffic_lights():
|
|||||||
green_pin = MockPin(4)
|
green_pin = MockPin(4)
|
||||||
with TrafficLights(red_pin, amber_pin, green_pin) as board:
|
with TrafficLights(red_pin, amber_pin, green_pin) as board:
|
||||||
board.red.on()
|
board.red.on()
|
||||||
|
assert board.red.value
|
||||||
|
assert not board.amber.value
|
||||||
|
assert not board.yellow.value
|
||||||
|
assert not board.green.value
|
||||||
assert red_pin.state
|
assert red_pin.state
|
||||||
assert not amber_pin.state
|
assert not amber_pin.state
|
||||||
assert not green_pin.state
|
assert not green_pin.state
|
||||||
with TrafficLights(red=red_pin, yellow=amber_pin, green=green_pin) as board:
|
with TrafficLights(red=red_pin, yellow=amber_pin, green=green_pin) as board:
|
||||||
board.yellow.on()
|
board.yellow.on()
|
||||||
|
assert not board.red.value
|
||||||
|
assert board.amber.value
|
||||||
|
assert board.yellow.value
|
||||||
|
assert not board.green.value
|
||||||
assert not red_pin.state
|
assert not red_pin.state
|
||||||
assert amber_pin.state
|
assert amber_pin.state
|
||||||
assert not green_pin.state
|
assert not green_pin.state
|
||||||
@@ -560,6 +568,12 @@ def test_traffic_lights():
|
|||||||
def test_traffic_lights_bad_init():
|
def test_traffic_lights_bad_init():
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
TrafficLights()
|
TrafficLights()
|
||||||
|
red_pin = MockPin(2)
|
||||||
|
amber_pin = MockPin(3)
|
||||||
|
green_pin = MockPin(4)
|
||||||
|
yellow_pin = MockPin(5)
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
TrafficLights(red=red_pin, amber=amber_pin, yellow=yellow_pin, green=green_pin)
|
||||||
|
|
||||||
def test_pi_traffic():
|
def test_pi_traffic():
|
||||||
pins = [MockPin(n) for n in (9, 10, 11)]
|
pins = [MockPin(n) for n in (9, 10, 11)]
|
||||||
|
|||||||
Reference in New Issue
Block a user