TrafficLights.value also reports 'yellow' instead of 'amber' when appropriate

This commit is contained in:
Andrew Scheller
2016-06-10 02:28:44 +01:00
parent 38262a125f
commit f96ab609e2
2 changed files with 32 additions and 8 deletions

View File

@@ -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)

View File

@@ -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)]