mirror of
				https://github.com/KevinMidboe/python-gpiozero.git
				synced 2025-10-29 17:50:37 +00:00 
			
		
		
		
	Fix #279
Permit replacement of pin_factory without closing old factory. However, continue closing devices associated with extant pin factory at script termination.
This commit is contained in:
		| @@ -17,7 +17,7 @@ from gpiozero.pins.mock import MockPWMPin, MockPin | ||||
|  | ||||
| def setup_function(function): | ||||
|     # dirty, but it does the job | ||||
|     Device._pin_factory.pin_class = MockPWMPin if function.__name__ in ( | ||||
|     Device.pin_factory.pin_class = MockPWMPin if function.__name__ in ( | ||||
|         'test_robot', | ||||
|         'test_ryanteck_robot', | ||||
|         'test_camjam_kit_robot', | ||||
| @@ -33,18 +33,18 @@ def setup_function(function): | ||||
|         ) else MockPin | ||||
|  | ||||
| def teardown_function(function): | ||||
|     Device._pin_factory.reset() | ||||
|     Device.pin_factory.reset() | ||||
|     Device._reservations.clear() | ||||
|  | ||||
| def teardown_module(module): | ||||
|     # make sure we reset the default | ||||
|     Device._pin_factory.pwm = False | ||||
|     Device.pin_factory.pwm = False | ||||
|  | ||||
|  | ||||
| def test_composite_output_on_off(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with CompositeOutputDevice(OutputDevice(pin1), OutputDevice(pin2), foo=OutputDevice(pin3)) as device: | ||||
|         device.on() | ||||
|         assert all((pin1.state, pin2.state, pin3.state)) | ||||
| @@ -52,9 +52,9 @@ def test_composite_output_on_off(): | ||||
|         assert not any((pin1.state, pin2.state, pin3.state)) | ||||
|  | ||||
| def test_composite_output_toggle(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with CompositeOutputDevice(OutputDevice(pin1), OutputDevice(pin2), foo=OutputDevice(pin3)) as device: | ||||
|         device.toggle() | ||||
|         assert all((pin1.state, pin2.state, pin3.state)) | ||||
| @@ -65,9 +65,9 @@ def test_composite_output_toggle(): | ||||
|         assert not pin3.state | ||||
|  | ||||
| def test_composite_output_value(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with CompositeOutputDevice(OutputDevice(pin1), OutputDevice(pin2), foo=OutputDevice(pin3)) as device: | ||||
|         assert device.value == (0, 0, 0) | ||||
|         device.toggle() | ||||
| @@ -78,9 +78,9 @@ def test_composite_output_value(): | ||||
|         assert device[2].is_active | ||||
|  | ||||
| def test_led_board_on_off(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBoard(pin1, pin2, foo=pin3) as board: | ||||
|         assert isinstance(board[0], LED) | ||||
|         assert isinstance(board[1], LED) | ||||
| @@ -135,9 +135,9 @@ def test_led_board_on_off(): | ||||
|         assert pin3.state | ||||
|  | ||||
| def test_led_board_active_low(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBoard(pin1, pin2, foo=pin3, active_high=False) as board: | ||||
|         assert not board.active_high | ||||
|         assert not board[0].active_high | ||||
| @@ -159,9 +159,9 @@ def test_led_board_active_low(): | ||||
|         assert not pin3.state | ||||
|  | ||||
| def test_led_board_value(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBoard(pin1, pin2, foo=pin3) as board: | ||||
|         assert board.value == (0, 0, 0) | ||||
|         board.value = (0, 1, 0) | ||||
| @@ -170,9 +170,9 @@ def test_led_board_value(): | ||||
|         assert board.value == (1, 0, 1) | ||||
|  | ||||
| def test_led_board_pwm_value(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBoard(pin1, pin2, foo=pin3, pwm=True) as board: | ||||
|         assert board.value == (0, 0, 0) | ||||
|         board.value = (0, 1, 0) | ||||
| @@ -181,9 +181,9 @@ def test_led_board_pwm_value(): | ||||
|         assert board.value == (0.5, 0, 0.75) | ||||
|  | ||||
| def test_led_board_pwm_bad_value(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBoard(pin1, pin2, foo=pin3, pwm=True) as board: | ||||
|         with pytest.raises(ValueError): | ||||
|             board.value = (-1, 0, 0) | ||||
| @@ -191,18 +191,18 @@ def test_led_board_pwm_bad_value(): | ||||
|             board.value = (0, 2, 0) | ||||
|  | ||||
| def test_led_board_initial_value(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBoard(pin1, pin2, foo=pin3, initial_value=0) as board: | ||||
|         assert board.value == (0, 0, 0) | ||||
|     with LEDBoard(pin1, pin2, foo=pin3, initial_value=1) as board: | ||||
|         assert board.value == (1, 1, 1) | ||||
|  | ||||
| def test_led_board_pwm_initial_value(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBoard(pin1, pin2, foo=pin3, pwm=True, initial_value=0) as board: | ||||
|         assert board.value == (0, 0, 0) | ||||
|     with LEDBoard(pin1, pin2, foo=pin3, pwm=True, initial_value=1) as board: | ||||
| @@ -211,18 +211,18 @@ def test_led_board_pwm_initial_value(): | ||||
|         assert board.value == (0.5, 0.5, 0.5) | ||||
|  | ||||
| def test_led_board_pwm_bad_initial_value(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with pytest.raises(ValueError): | ||||
|         LEDBoard(pin1, pin2, foo=pin3, pwm=True, initial_value=-1) | ||||
|     with pytest.raises(ValueError): | ||||
|         LEDBoard(pin1, pin2, foo=pin3, pwm=True, initial_value=2) | ||||
|  | ||||
| def test_led_board_nested(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: | ||||
|         assert list(led.pin for led in board.leds) == [pin1, pin2, pin3] | ||||
|         assert board.value == (0, (0, 0)) | ||||
| @@ -232,9 +232,9 @@ def test_led_board_nested(): | ||||
|         assert pin3.state | ||||
|  | ||||
| def test_led_board_bad_blink(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: | ||||
|         with pytest.raises(ValueError): | ||||
|             board.blink(fade_in_time=1, fade_out_time=1) | ||||
| @@ -246,9 +246,9 @@ def test_led_board_bad_blink(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_led_board_blink_background(): | ||||
|     pin1 = Device._pin_factory.pin(4) | ||||
|     pin2 = Device._pin_factory.pin(5) | ||||
|     pin3 = Device._pin_factory.pin(6) | ||||
|     pin1 = Device.pin_factory.pin(4) | ||||
|     pin2 = Device.pin_factory.pin(5) | ||||
|     pin3 = Device.pin_factory.pin(6) | ||||
|     with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: | ||||
|         # Instantiation takes a long enough time that it throws off our timing | ||||
|         # here! | ||||
| @@ -271,9 +271,9 @@ def test_led_board_blink_background(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_led_board_blink_foreground(): | ||||
|     pin1 = Device._pin_factory.pin(4) | ||||
|     pin2 = Device._pin_factory.pin(5) | ||||
|     pin3 = Device._pin_factory.pin(6) | ||||
|     pin1 = Device.pin_factory.pin(4) | ||||
|     pin2 = Device.pin_factory.pin(5) | ||||
|     pin3 = Device.pin_factory.pin(6) | ||||
|     with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: | ||||
|         pin1.clear_states() | ||||
|         pin2.clear_states() | ||||
| @@ -293,9 +293,9 @@ def test_led_board_blink_foreground(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_led_board_blink_control(): | ||||
|     pin1 = Device._pin_factory.pin(4) | ||||
|     pin2 = Device._pin_factory.pin(5) | ||||
|     pin3 = Device._pin_factory.pin(6) | ||||
|     pin1 = Device.pin_factory.pin(4) | ||||
|     pin2 = Device.pin_factory.pin(5) | ||||
|     pin3 = Device.pin_factory.pin(6) | ||||
|     with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: | ||||
|         pin1.clear_states() | ||||
|         pin2.clear_states() | ||||
| @@ -321,9 +321,9 @@ def test_led_board_blink_control(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_led_board_blink_take_over(): | ||||
|     pin1 = Device._pin_factory.pin(4) | ||||
|     pin2 = Device._pin_factory.pin(5) | ||||
|     pin3 = Device._pin_factory.pin(6) | ||||
|     pin1 = Device.pin_factory.pin(4) | ||||
|     pin2 = Device.pin_factory.pin(5) | ||||
|     pin3 = Device.pin_factory.pin(6) | ||||
|     with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: | ||||
|         pin1.clear_states() | ||||
|         pin2.clear_states() | ||||
| @@ -346,9 +346,9 @@ def test_led_board_blink_take_over(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_led_board_blink_control_all(): | ||||
|     pin1 = Device._pin_factory.pin(4) | ||||
|     pin2 = Device._pin_factory.pin(5) | ||||
|     pin3 = Device._pin_factory.pin(6) | ||||
|     pin1 = Device.pin_factory.pin(4) | ||||
|     pin2 = Device.pin_factory.pin(5) | ||||
|     pin3 = Device.pin_factory.pin(6) | ||||
|     with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: | ||||
|         pin1.clear_states() | ||||
|         pin2.clear_states() | ||||
| @@ -371,9 +371,9 @@ def test_led_board_blink_control_all(): | ||||
|         pin3.assert_states_and_times(test) | ||||
|  | ||||
| def test_led_board_blink_interrupt_on(): | ||||
|     pin1 = Device._pin_factory.pin(4) | ||||
|     pin2 = Device._pin_factory.pin(5) | ||||
|     pin3 = Device._pin_factory.pin(6) | ||||
|     pin1 = Device.pin_factory.pin(4) | ||||
|     pin2 = Device.pin_factory.pin(5) | ||||
|     pin3 = Device.pin_factory.pin(6) | ||||
|     with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: | ||||
|         board.blink(1, 0.1) | ||||
|         sleep(0.2) | ||||
| @@ -383,9 +383,9 @@ def test_led_board_blink_interrupt_on(): | ||||
|         pin3.assert_states([False, True, False]) | ||||
|  | ||||
| def test_led_board_blink_interrupt_off(): | ||||
|     pin1 = Device._pin_factory.pin(4) | ||||
|     pin2 = Device._pin_factory.pin(5) | ||||
|     pin3 = Device._pin_factory.pin(6) | ||||
|     pin1 = Device.pin_factory.pin(4) | ||||
|     pin2 = Device.pin_factory.pin(5) | ||||
|     pin3 = Device.pin_factory.pin(6) | ||||
|     with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: | ||||
|         pin1.clear_states() | ||||
|         pin2.clear_states() | ||||
| @@ -400,9 +400,9 @@ def test_led_board_blink_interrupt_off(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_led_board_fade_background(): | ||||
|     pin1 = Device._pin_factory.pin(4) | ||||
|     pin2 = Device._pin_factory.pin(5) | ||||
|     pin3 = Device._pin_factory.pin(6) | ||||
|     pin1 = Device.pin_factory.pin(4) | ||||
|     pin2 = Device.pin_factory.pin(5) | ||||
|     pin3 = Device.pin_factory.pin(6) | ||||
|     with LEDBoard(pin1, LEDBoard(pin2, pin3, pwm=True), pwm=True) as board: | ||||
|         pin1.clear_states() | ||||
|         pin2.clear_states() | ||||
| @@ -437,9 +437,9 @@ def test_led_board_fade_background(): | ||||
|         pin3.assert_states_and_times(test) | ||||
|  | ||||
| def test_led_bar_graph_value(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBarGraph(pin1, pin2, pin3) as graph: | ||||
|         assert isinstance(graph[0], LED) | ||||
|         assert isinstance(graph[1], LED) | ||||
| @@ -470,9 +470,9 @@ def test_led_bar_graph_value(): | ||||
|         assert graph.value == -2/3 | ||||
|  | ||||
| def test_led_bar_graph_active_low(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBarGraph(pin1, pin2, pin3, active_high=False) as graph: | ||||
|         assert not graph.active_high | ||||
|         assert not graph[0].active_high | ||||
| @@ -492,9 +492,9 @@ def test_led_bar_graph_active_low(): | ||||
|         assert not pin3.state and pin1.state and pin2.state | ||||
|  | ||||
| def test_led_bar_graph_pwm_value(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBarGraph(pin1, pin2, pin3, pwm=True) as graph: | ||||
|         assert isinstance(graph[0], PWMLED) | ||||
|         assert isinstance(graph[1], PWMLED) | ||||
| @@ -519,9 +519,9 @@ def test_led_bar_graph_pwm_value(): | ||||
|         assert graph.value == -1/2 | ||||
|  | ||||
| def test_led_bar_graph_bad_value(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBarGraph(pin1, pin2, pin3) as graph: | ||||
|         with pytest.raises(ValueError): | ||||
|             graph.value = -2 | ||||
| @@ -529,9 +529,9 @@ def test_led_bar_graph_bad_value(): | ||||
|             graph.value = 2 | ||||
|  | ||||
| def test_led_bar_graph_bad_init(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with pytest.raises(TypeError): | ||||
|         LEDBarGraph(pin1, pin2, foo=pin3) | ||||
|     with pytest.raises(ValueError): | ||||
| @@ -540,9 +540,9 @@ def test_led_bar_graph_bad_init(): | ||||
|         LEDBarGraph(pin1, pin2, pin3, initial_value=2) | ||||
|  | ||||
| def test_led_bar_graph_initial_value(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBarGraph(pin1, pin2, pin3, initial_value=1/3) as graph: | ||||
|         assert graph.value == 1/3 | ||||
|         assert pin1.state and not (pin2.state or pin3.state) | ||||
| @@ -551,9 +551,9 @@ def test_led_bar_graph_initial_value(): | ||||
|         assert pin3.state and not (pin1.state or pin2.state) | ||||
|  | ||||
| def test_led_bar_graph_pwm_initial_value(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(3) | ||||
|     pin3 = Device._pin_factory.pin(4) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(3) | ||||
|     pin3 = Device.pin_factory.pin(4) | ||||
|     with LEDBarGraph(pin1, pin2, pin3, pwm=True, initial_value=0.5) as graph: | ||||
|         assert graph.value == 0.5 | ||||
|         assert (pin1.state, pin2.state, pin3.state) == (1, 0.5, 0) | ||||
| @@ -562,17 +562,17 @@ def test_led_bar_graph_pwm_initial_value(): | ||||
|         assert (pin1.state, pin2.state, pin3.state) == (0, 0.5, 1) | ||||
|  | ||||
| def test_led_borg(): | ||||
|     pins = [Device._pin_factory.pin(n) for n in (17, 27, 22)] | ||||
|     pins = [Device.pin_factory.pin(n) for n in (17, 27, 22)] | ||||
|     with LedBorg() as board: | ||||
|         assert [device.pin for device in board._leds] == pins | ||||
|  | ||||
| def test_pi_liter(): | ||||
|     pins = [Device._pin_factory.pin(n) for n in (4, 17, 27, 18, 22, 23, 24, 25)] | ||||
|     pins = [Device.pin_factory.pin(n) for n in (4, 17, 27, 18, 22, 23, 24, 25)] | ||||
|     with PiLiter() as board: | ||||
|         assert [device.pin for device in board] == pins | ||||
|  | ||||
| def test_pi_liter_graph(): | ||||
|     pins = [Device._pin_factory.pin(n) for n in (4, 17, 27, 18, 22, 23, 24, 25)] | ||||
|     pins = [Device.pin_factory.pin(n) for n in (4, 17, 27, 18, 22, 23, 24, 25)] | ||||
|     with PiLiterBarGraph() as board: | ||||
|         board.value = 0.5 | ||||
|         assert [pin.state for pin in pins] == [1, 1, 1, 1, 0, 0, 0, 0] | ||||
| @@ -580,9 +580,9 @@ def test_pi_liter_graph(): | ||||
|         assert board.value == 5/8 | ||||
|  | ||||
| def test_traffic_lights(): | ||||
|     red_pin = Device._pin_factory.pin(2) | ||||
|     amber_pin = Device._pin_factory.pin(3) | ||||
|     green_pin = Device._pin_factory.pin(4) | ||||
|     red_pin = Device.pin_factory.pin(2) | ||||
|     amber_pin = Device.pin_factory.pin(3) | ||||
|     green_pin = Device.pin_factory.pin(4) | ||||
|     with TrafficLights(red_pin, amber_pin, green_pin) as board: | ||||
|         board.red.on() | ||||
|         assert board.red.value | ||||
| @@ -611,15 +611,15 @@ def test_traffic_lights(): | ||||
| def test_traffic_lights_bad_init(): | ||||
|     with pytest.raises(ValueError): | ||||
|         TrafficLights() | ||||
|     red_pin = Device._pin_factory.pin(2) | ||||
|     amber_pin = Device._pin_factory.pin(3) | ||||
|     green_pin = Device._pin_factory.pin(4) | ||||
|     yellow_pin = Device._pin_factory.pin(5) | ||||
|     red_pin = Device.pin_factory.pin(2) | ||||
|     amber_pin = Device.pin_factory.pin(3) | ||||
|     green_pin = Device.pin_factory.pin(4) | ||||
|     yellow_pin = Device.pin_factory.pin(5) | ||||
|     with pytest.raises(ValueError): | ||||
|         TrafficLights(red=red_pin, amber=amber_pin, yellow=yellow_pin, green=green_pin) | ||||
|  | ||||
| def test_pi_traffic(): | ||||
|     pins = [Device._pin_factory.pin(n) for n in (9, 10, 11)] | ||||
|     pins = [Device.pin_factory.pin(n) for n in (9, 10, 11)] | ||||
|     with PiTraffic() as board: | ||||
|         assert [device.pin for device in board] == pins | ||||
|  | ||||
| @@ -628,27 +628,27 @@ def test_pi_stop(): | ||||
|         PiStop() | ||||
|     with pytest.raises(ValueError): | ||||
|         PiStop('E') | ||||
|     pins_a = [Device._pin_factory.pin(n) for n in (7, 8, 25)] | ||||
|     pins_a = [Device.pin_factory.pin(n) for n in (7, 8, 25)] | ||||
|     with PiStop('A') as board: | ||||
|         assert [device.pin for device in board] == pins_a | ||||
|     pins_aplus = [Device._pin_factory.pin(n) for n in (21, 20, 16)] | ||||
|     pins_aplus = [Device.pin_factory.pin(n) for n in (21, 20, 16)] | ||||
|     with PiStop('A+') as board: | ||||
|         assert [device.pin for device in board] == pins_aplus | ||||
|     pins_b = [Device._pin_factory.pin(n) for n in (10, 9, 11)] | ||||
|     pins_b = [Device.pin_factory.pin(n) for n in (10, 9, 11)] | ||||
|     with PiStop('B') as board: | ||||
|         assert [device.pin for device in board] == pins_b | ||||
|     pins_bplus = [Device._pin_factory.pin(n) for n in (13, 19, 26)] | ||||
|     pins_bplus = [Device.pin_factory.pin(n) for n in (13, 19, 26)] | ||||
|     with PiStop('B+') as board: | ||||
|         assert [device.pin for device in board] == pins_bplus | ||||
|     pins_c = [Device._pin_factory.pin(n) for n in (18, 15, 14)] | ||||
|     pins_c = [Device.pin_factory.pin(n) for n in (18, 15, 14)] | ||||
|     with PiStop('C') as board: | ||||
|         assert [device.pin for device in board] == pins_c | ||||
|     pins_d = [Device._pin_factory.pin(n) for n in (2, 3, 4)] | ||||
|     pins_d = [Device.pin_factory.pin(n) for n in (2, 3, 4)] | ||||
|     with PiStop('D') as board: | ||||
|         assert [device.pin for device in board] == pins_d | ||||
|  | ||||
| def test_snow_pi(): | ||||
|     pins = [Device._pin_factory.pin(n) for n in (23, 24, 25, 17, 18, 22, 7, 8, 9)] | ||||
|     pins = [Device.pin_factory.pin(n) for n in (23, 24, 25, 17, 18, 22, 7, 8, 9)] | ||||
|     with SnowPi() as board: | ||||
|         assert [device.pin for device in board.leds] == pins | ||||
|  | ||||
| @@ -663,17 +663,17 @@ def test_snow_pi_initial_value(): | ||||
|         assert all(device.pin.state == True for device in board.leds) | ||||
|  | ||||
| def test_snow_pi_initial_value_pwm(): | ||||
|     pins = [Device._pin_factory.pin(n) for n in (23, 24, 25, 17, 18, 22, 7, 8, 9)] | ||||
|     pins = [Device.pin_factory.pin(n) for n in (23, 24, 25, 17, 18, 22, 7, 8, 9)] | ||||
|     with SnowPi(pwm=True, initial_value=0.5) as board: | ||||
|         assert [device.pin for device in board.leds] == pins | ||||
|         assert all(device.pin.state == 0.5 for device in board.leds) | ||||
|  | ||||
| def test_traffic_lights_buzzer(): | ||||
|     red_pin = Device._pin_factory.pin(2) | ||||
|     amber_pin = Device._pin_factory.pin(3) | ||||
|     green_pin = Device._pin_factory.pin(4) | ||||
|     buzzer_pin = Device._pin_factory.pin(5) | ||||
|     button_pin = Device._pin_factory.pin(6) | ||||
|     red_pin = Device.pin_factory.pin(2) | ||||
|     amber_pin = Device.pin_factory.pin(3) | ||||
|     green_pin = Device.pin_factory.pin(4) | ||||
|     buzzer_pin = Device.pin_factory.pin(5) | ||||
|     button_pin = Device.pin_factory.pin(6) | ||||
|     with TrafficLightsBuzzer( | ||||
|             TrafficLights(red_pin, amber_pin, green_pin), | ||||
|             Buzzer(buzzer_pin), | ||||
| @@ -688,17 +688,17 @@ def test_traffic_lights_buzzer(): | ||||
|         assert board.button.is_active | ||||
|  | ||||
| def test_fish_dish(): | ||||
|     pins = [Device._pin_factory.pin(n) for n in (9, 22, 4, 8, 7)] | ||||
|     pins = [Device.pin_factory.pin(n) for n in (9, 22, 4, 8, 7)] | ||||
|     with FishDish() as board: | ||||
|         assert [led.pin for led in board.lights] + [board.buzzer.pin, board.button.pin] == pins | ||||
|  | ||||
| def test_traffic_hat(): | ||||
|     pins = [Device._pin_factory.pin(n) for n in (24, 23, 22, 5, 25)] | ||||
|     pins = [Device.pin_factory.pin(n) for n in (24, 23, 22, 5, 25)] | ||||
|     with TrafficHat() as board: | ||||
|         assert [led.pin for led in board.lights] + [board.buzzer.pin, board.button.pin] == pins | ||||
|  | ||||
| def test_robot(): | ||||
|     pins = [Device._pin_factory.pin(n) for n in (2, 3, 4, 5)] | ||||
|     pins = [Device.pin_factory.pin(n) for n in (2, 3, 4, 5)] | ||||
|     with Robot((2, 3), (4, 5)) as robot: | ||||
|         assert ( | ||||
|             [device.pin for device in robot.left_motor] + | ||||
| @@ -733,12 +733,12 @@ def test_robot(): | ||||
|         assert robot.value == (0, -0.5) | ||||
|  | ||||
| def test_ryanteck_robot(): | ||||
|     pins = [Device._pin_factory.pin(n) for n in (17, 18, 22, 23)] | ||||
|     pins = [Device.pin_factory.pin(n) for n in (17, 18, 22, 23)] | ||||
|     with RyanteckRobot() as board: | ||||
|         assert [device.pin for motor in board for device in motor] == pins | ||||
|  | ||||
| def test_camjam_kit_robot(): | ||||
|     pins = [Device._pin_factory.pin(n) for n in (9, 10, 7, 8)] | ||||
|     pins = [Device.pin_factory.pin(n) for n in (9, 10, 7, 8)] | ||||
|     with CamJamKitRobot() as board: | ||||
|         assert [device.pin for motor in board for device in motor] == pins | ||||
|  | ||||
| @@ -751,7 +751,7 @@ def test_energenie_bad_init(): | ||||
|         Energenie(5) | ||||
|  | ||||
| def test_energenie(): | ||||
|     pins = [Device._pin_factory.pin(n) for n in (17, 22, 23, 27, 24, 25)] | ||||
|     pins = [Device.pin_factory.pin(n) for n in (17, 22, 23, 27, 24, 25)] | ||||
|     with Energenie(1, initial_value=True) as device1, \ | ||||
|             Energenie(2, initial_value=False) as device2: | ||||
|         assert repr(device1) == '<gpiozero.Energenie object on socket 1>' | ||||
|   | ||||
| @@ -14,7 +14,7 @@ from gpiozero import * | ||||
|  | ||||
|  | ||||
| def teardown_function(function): | ||||
|     Device._pin_factory.reset() | ||||
|     Device.pin_factory.reset() | ||||
|  | ||||
|  | ||||
| # TODO add more devices tests! | ||||
| @@ -32,7 +32,7 @@ def test_device_non_physical(): | ||||
|         assert w[0].category == PinNonPhysical | ||||
|  | ||||
| def test_device_init(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     with GPIODevice(pin) as device: | ||||
|         assert not device.closed | ||||
|         assert device.pin == pin | ||||
| @@ -55,7 +55,7 @@ def test_device_close(): | ||||
|     assert device.pin is None | ||||
|  | ||||
| def test_device_reopen_same_pin(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     with GPIODevice(pin) as device: | ||||
|         pass | ||||
|     with GPIODevice(pin) as device2: | ||||
| @@ -122,7 +122,7 @@ def test_composite_device_bad_init(): | ||||
|     with pytest.raises(ValueError): | ||||
|         CompositeDevice(2) | ||||
|     with pytest.raises(ValueError): | ||||
|         CompositeDevice(Device._pin_factory.pin(2)) | ||||
|         CompositeDevice(Device.pin_factory.pin(2)) | ||||
|  | ||||
| def test_composite_device_read_only(): | ||||
|     with CompositeDevice( | ||||
|   | ||||
| @@ -17,12 +17,12 @@ from gpiozero import * | ||||
|  | ||||
|  | ||||
| def teardown_function(function): | ||||
|     Device._pin_factory.reset() | ||||
|     Device.pin_factory.reset() | ||||
|     Device._reservations.clear() | ||||
|  | ||||
|  | ||||
| def test_input_initial_values(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with InputDevice(pin, pull_up=True) as device: | ||||
|         assert pin.function == 'input' | ||||
|         assert pin.pull == 'up' | ||||
| @@ -32,7 +32,7 @@ def test_input_initial_values(): | ||||
|         assert not device.pull_up | ||||
|  | ||||
| def test_input_is_active_low(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     with InputDevice(pin, pull_up=True) as device: | ||||
|         pin.drive_high() | ||||
|         assert not device.is_active | ||||
| @@ -42,7 +42,7 @@ def test_input_is_active_low(): | ||||
|         assert repr(device) == '<gpiozero.InputDevice object on pin GPIO2, pull_up=True, is_active=True>' | ||||
|  | ||||
| def test_input_is_active_high(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with InputDevice(pin, pull_up=False) as device: | ||||
|         pin.drive_high() | ||||
|         assert device.is_active | ||||
| @@ -52,13 +52,13 @@ def test_input_is_active_high(): | ||||
|         assert repr(device) == '<gpiozero.InputDevice object on pin GPIO4, pull_up=False, is_active=False>' | ||||
|  | ||||
| def test_input_pulled_up(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     with pytest.raises(PinFixedPull): | ||||
|         InputDevice(pin, pull_up=False) | ||||
|  | ||||
| def test_input_event_activated(): | ||||
|     event = Event() | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with DigitalInputDevice(pin) as device: | ||||
|         device.when_activated = lambda: event.set() | ||||
|         assert not event.is_set() | ||||
| @@ -67,7 +67,7 @@ def test_input_event_activated(): | ||||
|  | ||||
| def test_input_event_deactivated(): | ||||
|     event = Event() | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with DigitalInputDevice(pin) as device: | ||||
|         device.when_deactivated = lambda: event.set() | ||||
|         assert not event.is_set() | ||||
| @@ -78,7 +78,7 @@ def test_input_event_deactivated(): | ||||
|  | ||||
| def test_input_partial_callback(): | ||||
|     event = Event() | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     def foo(a, b): | ||||
|         event.set() | ||||
|         return a + b | ||||
| @@ -91,20 +91,20 @@ def test_input_partial_callback(): | ||||
|         assert event.is_set() | ||||
|  | ||||
| def test_input_wait_active(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with DigitalInputDevice(pin) as device: | ||||
|         pin.drive_high() | ||||
|         assert device.wait_for_active(1) | ||||
|         assert not device.wait_for_inactive(0) | ||||
|  | ||||
| def test_input_wait_inactive(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with DigitalInputDevice(pin) as device: | ||||
|         assert device.wait_for_inactive(1) | ||||
|         assert not device.wait_for_active(0) | ||||
|  | ||||
| def test_input_smoothed_attrib(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with SmoothedInputDevice(pin, threshold=0.5, queue_len=5, partial=False) as device: | ||||
|         assert repr(device) == '<gpiozero.SmoothedInputDevice object on pin GPIO4, pull_up=False>' | ||||
|         assert device.threshold == 0.5 | ||||
| @@ -116,7 +116,7 @@ def test_input_smoothed_attrib(): | ||||
|             device.threshold = 1 | ||||
|  | ||||
| def test_input_smoothed_values(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with SmoothedInputDevice(pin) as device: | ||||
|         device._queue.start() | ||||
|         assert not device.is_active | ||||
| @@ -126,7 +126,7 @@ def test_input_smoothed_values(): | ||||
|         assert device.wait_for_inactive(1) | ||||
|  | ||||
| def test_input_button(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     with Button(pin) as button: | ||||
|         assert pin.pull == 'up' | ||||
|         assert not button.is_pressed | ||||
| @@ -138,7 +138,7 @@ def test_input_button(): | ||||
|         assert button.wait_for_release(1) | ||||
|  | ||||
| def test_input_line_sensor(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with LineSensor(pin) as sensor: | ||||
|         pin.drive_low() # logic is inverted for line sensor | ||||
|         assert sensor.wait_for_line(1) | ||||
| @@ -148,7 +148,7 @@ def test_input_line_sensor(): | ||||
|         assert not sensor.line_detected | ||||
|  | ||||
| def test_input_motion_sensor(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with MotionSensor(pin) as sensor: | ||||
|         pin.drive_high() | ||||
|         assert sensor.wait_for_motion(1) | ||||
| @@ -160,7 +160,7 @@ def test_input_motion_sensor(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_input_light_sensor(): | ||||
|     pin = Device._pin_factory.pin(4, pin_class=MockChargingPin) | ||||
|     pin = Device.pin_factory.pin(4, pin_class=MockChargingPin) | ||||
|     with LightSensor(pin) as sensor: | ||||
|         pin.charge_time = 0.1 | ||||
|         assert sensor.wait_for_dark(1) | ||||
| @@ -170,8 +170,8 @@ def test_input_light_sensor(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_input_distance_sensor(): | ||||
|     echo_pin = Device._pin_factory.pin(4) | ||||
|     trig_pin = Device._pin_factory.pin(5, pin_class=MockTriggerPin, echo_pin=echo_pin, echo_time=0.02) | ||||
|     echo_pin = Device.pin_factory.pin(4) | ||||
|     trig_pin = Device.pin_factory.pin(5, pin_class=MockTriggerPin, echo_pin=echo_pin, echo_time=0.02) | ||||
|     with pytest.raises(ValueError): | ||||
|         DistanceSensor(echo_pin, trig_pin, max_distance=-1) | ||||
|     # normal queue len is large (because the sensor is *really* jittery) but | ||||
|   | ||||
| @@ -16,7 +16,7 @@ from gpiozero import * | ||||
|  | ||||
|  | ||||
| def teardown_function(function): | ||||
|     Device._pin_factory.reset() | ||||
|     Device.pin_factory.reset() | ||||
|  | ||||
|  | ||||
| # Some rough tests to make sure our MockPin is up to snuff. This is just | ||||
| @@ -24,11 +24,11 @@ def teardown_function(function): | ||||
|  | ||||
| def test_mock_pin_init(): | ||||
|     with pytest.raises(ValueError): | ||||
|         Device._pin_factory.pin(60) | ||||
|     assert Device._pin_factory.pin(2).number == 2 | ||||
|         Device.pin_factory.pin(60) | ||||
|     assert Device.pin_factory.pin(2).number == 2 | ||||
|  | ||||
| def test_mock_pin_defaults(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     assert pin.bounce == None | ||||
|     assert pin.edges == 'both' | ||||
|     assert pin.frequency == None | ||||
| @@ -37,27 +37,27 @@ def test_mock_pin_defaults(): | ||||
|     assert pin.state == 0 | ||||
|     assert pin.when_changed == None | ||||
|     pin.close() | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     assert pin.pull == 'up' | ||||
|  | ||||
| def test_mock_pin_open_close(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     pin.close() | ||||
|  | ||||
| def test_mock_pin_init_twice_same_pin(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(pin1.number) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(pin1.number) | ||||
|     assert pin1 is pin2 | ||||
|  | ||||
| def test_mock_pin_init_twice_different_pin(): | ||||
|     pin1 = Device._pin_factory.pin(2) | ||||
|     pin2 = Device._pin_factory.pin(pin1.number+1) | ||||
|     pin1 = Device.pin_factory.pin(2) | ||||
|     pin2 = Device.pin_factory.pin(pin1.number+1) | ||||
|     assert pin1 != pin2 | ||||
|     assert pin1.number == 2 | ||||
|     assert pin2.number == pin1.number+1 | ||||
|  | ||||
| def test_mock_pwm_pin_defaults(): | ||||
|     pin = Device._pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     assert pin.bounce == None | ||||
|     assert pin.edges == 'both' | ||||
|     assert pin.frequency == None | ||||
| @@ -66,42 +66,42 @@ def test_mock_pwm_pin_defaults(): | ||||
|     assert pin.state == 0 | ||||
|     assert pin.when_changed == None | ||||
|     pin.close() | ||||
|     pin = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     assert pin.pull == 'up' | ||||
|  | ||||
| def test_mock_pwm_pin_open_close(): | ||||
|     pin = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     pin.close() | ||||
|  | ||||
| def test_mock_pwm_pin_init_twice_same_pin(): | ||||
|     pin1 = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     pin2 = Device._pin_factory.pin(pin1.number, pin_class=MockPWMPin) | ||||
|     pin1 = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     pin2 = Device.pin_factory.pin(pin1.number, pin_class=MockPWMPin) | ||||
|     assert pin1 is pin2 | ||||
|  | ||||
| def test_mock_pwm_pin_init_twice_different_pin(): | ||||
|     pin1 = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     pin2 = Device._pin_factory.pin(pin1.number + 1, pin_class=MockPWMPin) | ||||
|     pin1 = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     pin2 = Device.pin_factory.pin(pin1.number + 1, pin_class=MockPWMPin) | ||||
|     assert pin1 != pin2 | ||||
|     assert pin1.number == 2 | ||||
|     assert pin2.number == pin1.number+1 | ||||
|  | ||||
| def test_mock_pin_init_twice_different_modes(): | ||||
|     pin1 = Device._pin_factory.pin(2, pin_class=MockPin) | ||||
|     pin2 = Device._pin_factory.pin(pin1.number + 1, pin_class=MockPWMPin) | ||||
|     pin1 = Device.pin_factory.pin(2, pin_class=MockPin) | ||||
|     pin2 = Device.pin_factory.pin(pin1.number + 1, pin_class=MockPWMPin) | ||||
|     assert pin1 != pin2 | ||||
|     with pytest.raises(ValueError): | ||||
|         Device._pin_factory.pin(pin1.number, pin_class=MockPWMPin) | ||||
|         Device.pin_factory.pin(pin1.number, pin_class=MockPWMPin) | ||||
|     with pytest.raises(ValueError): | ||||
|         Device._pin_factory.pin(pin2.number, pin_class=MockPin) | ||||
|         Device.pin_factory.pin(pin2.number, pin_class=MockPin) | ||||
|  | ||||
| def test_mock_pin_frequency_unsupported(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     pin.frequency = None | ||||
|     with pytest.raises(PinPWMUnsupported): | ||||
|         pin.frequency = 100 | ||||
|  | ||||
| def test_mock_pin_frequency_supported(): | ||||
|     pin = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     pin.function = 'output' | ||||
|     assert pin.frequency is None | ||||
|     pin.frequency = 100 | ||||
| @@ -110,7 +110,7 @@ def test_mock_pin_frequency_supported(): | ||||
|     assert not pin.state | ||||
|  | ||||
| def test_mock_pin_pull(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     pin.function = 'input' | ||||
|     assert pin.pull == 'floating' | ||||
|     pin.pull = 'up' | ||||
| @@ -118,14 +118,14 @@ def test_mock_pin_pull(): | ||||
|     pin.pull = 'down' | ||||
|     assert not pin.state | ||||
|     pin.close() | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     pin.function = 'input' | ||||
|     assert pin.pull == 'up' | ||||
|     with pytest.raises(PinFixedPull): | ||||
|         pin.pull = 'floating' | ||||
|  | ||||
| def test_mock_pin_state(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     with pytest.raises(PinSetInput): | ||||
|         pin.state = 1 | ||||
|     pin.function = 'output' | ||||
| @@ -137,7 +137,7 @@ def test_mock_pin_state(): | ||||
|     assert pin.state == 1 | ||||
|  | ||||
| def test_mock_pwm_pin_state(): | ||||
|     pin = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     with pytest.raises(PinSetInput): | ||||
|         pin.state = 1 | ||||
|     pin.function = 'output' | ||||
| @@ -149,7 +149,7 @@ def test_mock_pwm_pin_state(): | ||||
|     assert pin.state == 0.5 | ||||
|  | ||||
| def test_mock_pin_edges(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     assert pin.when_changed is None | ||||
|     fired = Event() | ||||
|     pin.function = 'input' | ||||
|   | ||||
| @@ -21,12 +21,12 @@ from gpiozero import * | ||||
|  | ||||
|  | ||||
| def teardown_function(function): | ||||
|     Device._pin_factory.reset() | ||||
|     Device.pin_factory.reset() | ||||
|     Device._reservations.clear() | ||||
|  | ||||
|  | ||||
| def test_output_initial_values(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     with OutputDevice(pin, initial_value=False) as device: | ||||
|         assert pin.function == 'output' | ||||
|         assert not pin.state | ||||
| @@ -37,7 +37,7 @@ def test_output_initial_values(): | ||||
|         assert state == pin.state | ||||
|  | ||||
| def test_output_write_active_high(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     with OutputDevice(pin) as device: | ||||
|         device.on() | ||||
|         assert pin.state | ||||
| @@ -45,7 +45,7 @@ def test_output_write_active_high(): | ||||
|         assert not pin.state | ||||
|  | ||||
| def test_output_write_active_low(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     with OutputDevice(pin, active_high=False) as device: | ||||
|         device.on() | ||||
|         assert not pin.state | ||||
| @@ -53,7 +53,7 @@ def test_output_write_active_low(): | ||||
|         assert pin.state | ||||
|  | ||||
| def test_output_write_closed(): | ||||
|     with OutputDevice(Device._pin_factory.pin(2)) as device: | ||||
|     with OutputDevice(Device.pin_factory.pin(2)) as device: | ||||
|         device.close() | ||||
|         assert device.closed | ||||
|         device.close() | ||||
| @@ -62,14 +62,14 @@ def test_output_write_closed(): | ||||
|             device.on() | ||||
|  | ||||
| def test_output_write_silly(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     with OutputDevice(pin) as device: | ||||
|         pin.function = 'input' | ||||
|         with pytest.raises(AttributeError): | ||||
|             device.on() | ||||
|  | ||||
| def test_output_value(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     with OutputDevice(pin) as device: | ||||
|         assert not device.value | ||||
|         assert not pin.state | ||||
| @@ -81,7 +81,7 @@ def test_output_value(): | ||||
|         assert not pin.state | ||||
|  | ||||
| def test_output_digital_toggle(): | ||||
|     pin = Device._pin_factory.pin(2) | ||||
|     pin = Device.pin_factory.pin(2) | ||||
|     with DigitalOutputDevice(pin) as device: | ||||
|         assert not device.value | ||||
|         assert not pin.state | ||||
| @@ -95,7 +95,7 @@ def test_output_digital_toggle(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_output_blink_background(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with DigitalOutputDevice(pin) as device: | ||||
|         start = time() | ||||
|         device.blink(0.1, 0.1, n=2) | ||||
| @@ -113,7 +113,7 @@ def test_output_blink_background(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_output_blink_foreground(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with DigitalOutputDevice(pin) as device: | ||||
|         start = time() | ||||
|         device.blink(0.1, 0.1, n=2, background=False) | ||||
| @@ -127,7 +127,7 @@ def test_output_blink_foreground(): | ||||
|             ]) | ||||
|  | ||||
| def test_output_blink_interrupt_on(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with DigitalOutputDevice(pin) as device: | ||||
|         device.blink(1, 0.1) | ||||
|         sleep(0.2) | ||||
| @@ -135,7 +135,7 @@ def test_output_blink_interrupt_on(): | ||||
|         pin.assert_states([False, True, False]) | ||||
|  | ||||
| def test_output_blink_interrupt_off(): | ||||
|     pin = Device._pin_factory.pin(4) | ||||
|     pin = Device.pin_factory.pin(4) | ||||
|     with DigitalOutputDevice(pin) as device: | ||||
|         device.blink(0.1, 1) | ||||
|         sleep(0.2) | ||||
| @@ -144,14 +144,14 @@ def test_output_blink_interrupt_off(): | ||||
|  | ||||
| def test_output_pwm_bad_initial_value(): | ||||
|     with pytest.raises(ValueError): | ||||
|         PWMOutputDevice(Device._pin_factory.pin(2), initial_value=2) | ||||
|         PWMOutputDevice(Device.pin_factory.pin(2), initial_value=2) | ||||
|  | ||||
| def test_output_pwm_not_supported(): | ||||
|     with pytest.raises(AttributeError): | ||||
|         PWMOutputDevice(Device._pin_factory.pin(2)) | ||||
|         PWMOutputDevice(Device.pin_factory.pin(2)) | ||||
|  | ||||
| def test_output_pwm_states(): | ||||
|     pin = Device._pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     with PWMOutputDevice(pin) as device: | ||||
|         device.value = 0.1 | ||||
|         device.value = 0.2 | ||||
| @@ -159,7 +159,7 @@ def test_output_pwm_states(): | ||||
|         pin.assert_states([0.0, 0.1, 0.2, 0.0]) | ||||
|  | ||||
| def test_output_pwm_read(): | ||||
|     pin = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     with PWMOutputDevice(pin, frequency=100) as device: | ||||
|         assert device.frequency == 100 | ||||
|         device.value = 0.1 | ||||
| @@ -172,14 +172,14 @@ def test_output_pwm_read(): | ||||
|         assert device.frequency is None | ||||
|  | ||||
| def test_output_pwm_write(): | ||||
|     pin = Device._pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     with PWMOutputDevice(pin) as device: | ||||
|         device.on() | ||||
|         device.off() | ||||
|         pin.assert_states([False, True, False]) | ||||
|  | ||||
| def test_output_pwm_toggle(): | ||||
|     pin = Device._pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     with PWMOutputDevice(pin) as device: | ||||
|         device.toggle() | ||||
|         device.value = 0.5 | ||||
| @@ -189,7 +189,7 @@ def test_output_pwm_toggle(): | ||||
|         pin.assert_states([False, True, 0.5, 0.1, 0.9, False]) | ||||
|  | ||||
| def test_output_pwm_active_high_read(): | ||||
|     pin = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     with PWMOutputDevice(pin, active_high=False) as device: | ||||
|         device.value = 0.1 | ||||
|         assert isclose(device.value, 0.1) | ||||
| @@ -198,18 +198,18 @@ def test_output_pwm_active_high_read(): | ||||
|         assert device.value | ||||
|  | ||||
| def test_output_pwm_bad_value(): | ||||
|     with PWMOutputDevice(Device._pin_factory.pin(2, pin_class=MockPWMPin)) as device: | ||||
|     with PWMOutputDevice(Device.pin_factory.pin(2, pin_class=MockPWMPin)) as device: | ||||
|         with pytest.raises(ValueError): | ||||
|             device.value = 2 | ||||
|  | ||||
| def test_output_pwm_write_closed(): | ||||
|     with PWMOutputDevice(Device._pin_factory.pin(2, pin_class=MockPWMPin)) as device: | ||||
|     with PWMOutputDevice(Device.pin_factory.pin(2, pin_class=MockPWMPin)) as device: | ||||
|         device.close() | ||||
|         with pytest.raises(GPIODeviceClosed): | ||||
|             device.on() | ||||
|  | ||||
| def test_output_pwm_write_silly(): | ||||
|     pin = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     with PWMOutputDevice(pin) as device: | ||||
|         pin.function = 'input' | ||||
|         with pytest.raises(AttributeError): | ||||
| @@ -218,7 +218,7 @@ def test_output_pwm_write_silly(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_output_pwm_blink_background(): | ||||
|     pin = Device._pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     with PWMOutputDevice(pin) as device: | ||||
|         start = time() | ||||
|         device.blink(0.1, 0.1, n=2) | ||||
| @@ -236,7 +236,7 @@ def test_output_pwm_blink_background(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_output_pwm_blink_foreground(): | ||||
|     pin = Device._pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     with PWMOutputDevice(pin) as device: | ||||
|         start = time() | ||||
|         device.blink(0.1, 0.1, n=2, background=False) | ||||
| @@ -252,7 +252,7 @@ def test_output_pwm_blink_foreground(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_output_pwm_fade_background(): | ||||
|     pin = Device._pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     with PWMOutputDevice(pin) as device: | ||||
|         start = time() | ||||
|         device.blink(0, 0, 0.2, 0.2, n=2) | ||||
| @@ -286,7 +286,7 @@ def test_output_pwm_fade_background(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_output_pwm_fade_foreground(): | ||||
|     pin = Device._pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     with PWMOutputDevice(pin) as device: | ||||
|         start = time() | ||||
|         device.blink(0, 0, 0.2, 0.2, n=2, background=False) | ||||
| @@ -318,7 +318,7 @@ def test_output_pwm_fade_foreground(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_output_pwm_pulse_background(): | ||||
|     pin = Device._pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     with PWMOutputDevice(pin) as device: | ||||
|         start = time() | ||||
|         device.pulse(0.2, 0.2, n=2) | ||||
| @@ -352,7 +352,7 @@ def test_output_pwm_pulse_background(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_output_pwm_pulse_foreground(): | ||||
|     pin = Device._pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     with PWMOutputDevice(pin) as device: | ||||
|         start = time() | ||||
|         device.pulse(0.2, 0.2, n=2, background=False) | ||||
| @@ -382,7 +382,7 @@ def test_output_pwm_pulse_foreground(): | ||||
|             ]) | ||||
|  | ||||
| def test_output_pwm_blink_interrupt(): | ||||
|     pin = Device._pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     pin = Device.pin_factory.pin(4, pin_class=MockPWMPin) | ||||
|     with PWMOutputDevice(pin) as device: | ||||
|         device.blink(1, 0.1) | ||||
|         sleep(0.2) | ||||
| @@ -394,7 +394,7 @@ def test_rgbled_missing_pins(): | ||||
|         RGBLED() | ||||
|  | ||||
| def test_rgbled_initial_value(): | ||||
|     r, g, b = (Device._pin_factory.pin(i, pin_class=MockPWMPin) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i, pin_class=MockPWMPin) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b, initial_value=(0.1, 0.2, 0)) as device: | ||||
|         assert r.frequency | ||||
|         assert g.frequency | ||||
| @@ -404,24 +404,24 @@ def test_rgbled_initial_value(): | ||||
|         assert isclose(b.state, 0.0) | ||||
|  | ||||
| def test_rgbled_initial_value_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b, pwm=False, initial_value=(0, 1, 1)) as device: | ||||
|         assert r.state == 0 | ||||
|         assert g.state == 1 | ||||
|         assert b.state == 1 | ||||
|  | ||||
| def test_rgbled_initial_bad_value(): | ||||
|     r, g, b = (Device._pin_factory.pin(i, pin_class=MockPWMPin) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i, pin_class=MockPWMPin) for i in (1, 2, 3)) | ||||
|     with pytest.raises(ValueError): | ||||
|         RGBLED(r, g, b, initial_value=(0.1, 0.2, 1.2)) | ||||
|  | ||||
| def test_rgbled_initial_bad_value_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     with pytest.raises(ValueError): | ||||
|         RGBLED(r, g, b, pwm=False, initial_value=(0.1, 0.2, 0)) | ||||
|  | ||||
| def test_rgbled_value(): | ||||
|     r, g, b = (Device._pin_factory.pin(i, pin_class=MockPWMPin) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i, pin_class=MockPWMPin) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b) as device: | ||||
|         assert isinstance(device._leds[0], PWMLED) | ||||
|         assert isinstance(device._leds[1], PWMLED) | ||||
| @@ -439,7 +439,7 @@ def test_rgbled_value(): | ||||
|         assert device.value == (0.5, 0.5, 0.5) | ||||
|  | ||||
| def test_rgbled_value_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b, pwm=False) as device: | ||||
|         assert isinstance(device._leds[0], LED) | ||||
|         assert isinstance(device._leds[1], LED) | ||||
| @@ -454,7 +454,7 @@ def test_rgbled_value_nonpwm(): | ||||
|         assert device.value == (0, 0, 0) | ||||
|  | ||||
| def test_rgbled_bad_value(): | ||||
|     r, g, b = (Device._pin_factory.pin(i, pin_class=MockPWMPin) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i, pin_class=MockPWMPin) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b) as device: | ||||
|         with pytest.raises(ValueError): | ||||
|             device.value = (2, 0, 0) | ||||
| @@ -463,7 +463,7 @@ def test_rgbled_bad_value(): | ||||
|             device.value = (0, -1, 0) | ||||
|  | ||||
| def test_rgbled_bad_value_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b, pwm=False) as device: | ||||
|         with pytest.raises(ValueError): | ||||
|             device.value = (2, 0, 0) | ||||
| @@ -481,7 +481,7 @@ def test_rgbled_bad_value_nonpwm(): | ||||
|             device.value = (0, 0, 0.5) | ||||
|  | ||||
| def test_rgbled_toggle(): | ||||
|     r, g, b = (Device._pin_factory.pin(i, pin_class=MockPWMPin) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i, pin_class=MockPWMPin) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b) as device: | ||||
|         assert not device.is_active | ||||
|         assert device.value == (0, 0, 0) | ||||
| @@ -493,7 +493,7 @@ def test_rgbled_toggle(): | ||||
|         assert device.value == (0, 0, 0) | ||||
|  | ||||
| def test_rgbled_toggle_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b, pwm=False) as device: | ||||
|         assert not device.is_active | ||||
|         assert device.value == (0, 0, 0) | ||||
| @@ -505,7 +505,7 @@ def test_rgbled_toggle_nonpwm(): | ||||
|         assert device.value == (0, 0, 0) | ||||
|  | ||||
| def test_rgbled_blink_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b, pwm=False) as device: | ||||
|         with pytest.raises(ValueError): | ||||
|             device.blink(fade_in_time=1) | ||||
| @@ -515,7 +515,7 @@ def test_rgbled_blink_nonpwm(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_rgbled_blink_background(): | ||||
|     r, g, b = (Device._pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     r, g, b = (Device.pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     with RGBLED(r, g, b) as device: | ||||
|         start = time() | ||||
|         device.blink(0.1, 0.1, n=2) | ||||
| @@ -536,7 +536,7 @@ def test_rgbled_blink_background(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_rgbled_blink_background_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (4, 5, 6)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (4, 5, 6)) | ||||
|     with RGBLED(r, g, b, pwm=False) as device: | ||||
|         start = time() | ||||
|         device.blink(0.1, 0.1, n=2) | ||||
| @@ -557,7 +557,7 @@ def test_rgbled_blink_background_nonpwm(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_rgbled_blink_foreground(): | ||||
|     r, g, b = (Device._pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     r, g, b = (Device.pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     with RGBLED(r, g, b) as device: | ||||
|         start = time() | ||||
|         device.blink(0.1, 0.1, n=2, background=False) | ||||
| @@ -576,7 +576,7 @@ def test_rgbled_blink_foreground(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_rgbled_blink_foreground_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (4, 5, 6)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (4, 5, 6)) | ||||
|     with RGBLED(r, g, b, pwm=False) as device: | ||||
|         start = time() | ||||
|         device.blink(0.1, 0.1, n=2, background=False) | ||||
| @@ -595,7 +595,7 @@ def test_rgbled_blink_foreground_nonpwm(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_rgbled_fade_background(): | ||||
|     r, g, b = (Device._pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     r, g, b = (Device.pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     with RGBLED(r, g, b) as device: | ||||
|         start = time() | ||||
|         device.blink(0, 0, 0.2, 0.2, n=2) | ||||
| @@ -630,7 +630,7 @@ def test_rgbled_fade_background(): | ||||
|         b.assert_states_and_times(expected) | ||||
|  | ||||
| def test_rgbled_fade_background_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b, pwm=False) as device: | ||||
|         with pytest.raises(ValueError): | ||||
|             device.blink(0, 0, 0.2, 0.2, n=2) | ||||
| @@ -638,7 +638,7 @@ def test_rgbled_fade_background_nonpwm(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_rgbled_fade_foreground(): | ||||
|     r, g, b = (Device._pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     r, g, b = (Device.pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     with RGBLED(r, g, b) as device: | ||||
|         start = time() | ||||
|         device.blink(0, 0, 0.2, 0.2, n=2, background=False) | ||||
| @@ -671,7 +671,7 @@ def test_rgbled_fade_foreground(): | ||||
|         b.assert_states_and_times(expected) | ||||
|  | ||||
| def test_rgbled_fade_foreground_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b, pwm=False) as device: | ||||
|         with pytest.raises(ValueError): | ||||
|             device.blink(0, 0, 0.2, 0.2, n=2, background=False) | ||||
| @@ -679,7 +679,7 @@ def test_rgbled_fade_foreground_nonpwm(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_rgbled_pulse_background(): | ||||
|     r, g, b = (Device._pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     r, g, b = (Device.pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     with RGBLED(r, g, b) as device: | ||||
|         start = time() | ||||
|         device.pulse(0.2, 0.2, n=2) | ||||
| @@ -714,7 +714,7 @@ def test_rgbled_pulse_background(): | ||||
|         b.assert_states_and_times(expected) | ||||
|  | ||||
| def test_rgbled_pulse_background_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b, pwm=False) as device: | ||||
|         with pytest.raises(ValueError): | ||||
|             device.pulse(0.2, 0.2, n=2) | ||||
| @@ -722,7 +722,7 @@ def test_rgbled_pulse_background_nonpwm(): | ||||
| @pytest.mark.skipif(hasattr(sys, 'pypy_version_info'), | ||||
|                     reason='timing is too random on pypy') | ||||
| def test_rgbled_pulse_foreground(): | ||||
|     r, g, b = (Device._pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     r, g, b = (Device.pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     with RGBLED(r, g, b) as device: | ||||
|         start = time() | ||||
|         device.pulse(0.2, 0.2, n=2, background=False) | ||||
| @@ -755,13 +755,13 @@ def test_rgbled_pulse_foreground(): | ||||
|         b.assert_states_and_times(expected) | ||||
|  | ||||
| def test_rgbled_pulse_foreground_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b, pwm=False) as device: | ||||
|         with pytest.raises(ValueError): | ||||
|             device.pulse(0.2, 0.2, n=2, background=False) | ||||
|  | ||||
| def test_rgbled_blink_interrupt(): | ||||
|     r, g, b = (Device._pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     r, g, b = (Device.pin_factory.pin(i, pin_class=MockPWMPin) for i in (4, 5, 6)) | ||||
|     with RGBLED(r, g, b) as device: | ||||
|         device.blink(1, 0.1) | ||||
|         sleep(0.2) | ||||
| @@ -771,7 +771,7 @@ def test_rgbled_blink_interrupt(): | ||||
|         b.assert_states([0, 1, 0]) | ||||
|  | ||||
| def test_rgbled_blink_interrupt_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (4, 5, 6)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (4, 5, 6)) | ||||
|     with RGBLED(r, g, b, pwm=False) as device: | ||||
|         device.blink(1, 0.1) | ||||
|         sleep(0.2) | ||||
| @@ -781,7 +781,7 @@ def test_rgbled_blink_interrupt_nonpwm(): | ||||
|         b.assert_states([0, 1, 0]) | ||||
|  | ||||
| def test_rgbled_close(): | ||||
|     r, g, b = (Device._pin_factory.pin(i, pin_class=MockPWMPin) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i, pin_class=MockPWMPin) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b) as device: | ||||
|         assert not device.closed | ||||
|         device.close() | ||||
| @@ -790,7 +790,7 @@ def test_rgbled_close(): | ||||
|         assert device.closed | ||||
|  | ||||
| def test_rgbled_close_nonpwm(): | ||||
|     r, g, b = (Device._pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     r, g, b = (Device.pin_factory.pin(i) for i in (1, 2, 3)) | ||||
|     with RGBLED(r, g, b, pwm=False) as device: | ||||
|         assert not device.closed | ||||
|         device.close() | ||||
| @@ -803,8 +803,8 @@ def test_motor_missing_pins(): | ||||
|         Motor() | ||||
|  | ||||
| def test_motor_pins(): | ||||
|     f = Device._pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     b = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     f = Device.pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     b = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     with Motor(f, b) as device: | ||||
|         assert device.forward_device.pin is f | ||||
|         assert isinstance(device.forward_device, PWMOutputDevice) | ||||
| @@ -812,8 +812,8 @@ def test_motor_pins(): | ||||
|         assert isinstance(device.backward_device, PWMOutputDevice) | ||||
|  | ||||
| def test_motor_pins_nonpwm(): | ||||
|     f = Device._pin_factory.pin(1) | ||||
|     b = Device._pin_factory.pin(2) | ||||
|     f = Device.pin_factory.pin(1) | ||||
|     b = Device.pin_factory.pin(2) | ||||
|     with Motor(f, b, pwm=False) as device: | ||||
|         assert device.forward_device.pin is f | ||||
|         assert isinstance(device.forward_device, DigitalOutputDevice) | ||||
| @@ -821,8 +821,8 @@ def test_motor_pins_nonpwm(): | ||||
|         assert isinstance(device.backward_device, DigitalOutputDevice) | ||||
|  | ||||
| def test_motor_close(): | ||||
|     f = Device._pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     b = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     f = Device.pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     b = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     with Motor(f, b) as device: | ||||
|         device.close() | ||||
|         assert device.closed | ||||
| @@ -832,8 +832,8 @@ def test_motor_close(): | ||||
|         assert device.closed | ||||
|  | ||||
| def test_motor_close_nonpwm(): | ||||
|     f = Device._pin_factory.pin(1) | ||||
|     b = Device._pin_factory.pin(2) | ||||
|     f = Device.pin_factory.pin(1) | ||||
|     b = Device.pin_factory.pin(2) | ||||
|     with Motor(f, b, pwm=False) as device: | ||||
|         device.close() | ||||
|         assert device.closed | ||||
| @@ -841,8 +841,8 @@ def test_motor_close_nonpwm(): | ||||
|         assert device.backward_device.pin is None | ||||
|  | ||||
| def test_motor_value(): | ||||
|     f = Device._pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     b = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     f = Device.pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     b = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     with Motor(f, b) as device: | ||||
|         device.value = -1 | ||||
|         assert device.is_active | ||||
| @@ -866,8 +866,8 @@ def test_motor_value(): | ||||
|         assert b.state == 0 and f.state == 0 | ||||
|  | ||||
| def test_motor_value_nonpwm(): | ||||
|     f = Device._pin_factory.pin(1) | ||||
|     b = Device._pin_factory.pin(2) | ||||
|     f = Device.pin_factory.pin(1) | ||||
|     b = Device.pin_factory.pin(2) | ||||
|     with Motor(f, b, pwm=False) as device: | ||||
|         device.value = -1 | ||||
|         assert device.is_active | ||||
| @@ -883,8 +883,8 @@ def test_motor_value_nonpwm(): | ||||
|         assert b.state == 0 and f.state == 0 | ||||
|  | ||||
| def test_motor_bad_value(): | ||||
|     f = Device._pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     b = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     f = Device.pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     b = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     with Motor(f, b) as device: | ||||
|         with pytest.raises(ValueError): | ||||
|             device.value = -2 | ||||
| @@ -896,8 +896,8 @@ def test_motor_bad_value(): | ||||
|             device.backward(2) | ||||
|  | ||||
| def test_motor_bad_value_nonpwm(): | ||||
|     f = Device._pin_factory.pin(1) | ||||
|     b = Device._pin_factory.pin(2) | ||||
|     f = Device.pin_factory.pin(1) | ||||
|     b = Device.pin_factory.pin(2) | ||||
|     with Motor(f, b, pwm=False) as device: | ||||
|         with pytest.raises(ValueError): | ||||
|             device.value = -2 | ||||
| @@ -909,8 +909,8 @@ def test_motor_bad_value_nonpwm(): | ||||
|             device.value = -0.5 | ||||
|  | ||||
| def test_motor_reverse(): | ||||
|     f = Device._pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     b = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     f = Device.pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     b = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     with Motor(f, b) as device: | ||||
|         device.forward() | ||||
|         assert device.value == 1 | ||||
| @@ -926,8 +926,8 @@ def test_motor_reverse(): | ||||
|         assert b.state == 0 and f.state == 0.5 | ||||
|  | ||||
| def test_motor_reverse_nonpwm(): | ||||
|     f = Device._pin_factory.pin(1) | ||||
|     b = Device._pin_factory.pin(2) | ||||
|     f = Device.pin_factory.pin(1) | ||||
|     b = Device.pin_factory.pin(2) | ||||
|     with Motor(f, b, pwm=False) as device: | ||||
|         device.forward() | ||||
|         assert device.value == 1 | ||||
| @@ -937,13 +937,13 @@ def test_motor_reverse_nonpwm(): | ||||
|         assert b.state == 1 and f.state == 0 | ||||
|  | ||||
| def test_servo_pins(): | ||||
|     p = Device._pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     p = Device.pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     with Servo(p) as device: | ||||
|         assert device.pwm_device.pin is p | ||||
|         assert isinstance(device.pwm_device, PWMOutputDevice) | ||||
|  | ||||
| def test_servo_bad_value(): | ||||
|     p = Device._pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     p = Device.pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     with pytest.raises(ValueError): | ||||
|         Servo(p, initial_value=2) | ||||
|     with pytest.raises(ValueError): | ||||
| @@ -952,12 +952,12 @@ def test_servo_bad_value(): | ||||
|         Servo(p, max_pulse_width=30/1000) | ||||
|  | ||||
| def test_servo_pins_nonpwm(): | ||||
|     p = Device._pin_factory.pin(2) | ||||
|     p = Device.pin_factory.pin(2) | ||||
|     with pytest.raises(PinPWMUnsupported): | ||||
|         Servo(p) | ||||
|  | ||||
| def test_servo_close(): | ||||
|     p = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     p = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     with Servo(p) as device: | ||||
|         device.close() | ||||
|         assert device.closed | ||||
| @@ -966,7 +966,7 @@ def test_servo_close(): | ||||
|         assert device.closed | ||||
|  | ||||
| def test_servo_pulse_width(): | ||||
|     p = Device._pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     p = Device.pin_factory.pin(2, pin_class=MockPWMPin) | ||||
|     with Servo(p, min_pulse_width=5/10000, max_pulse_width=25/10000) as device: | ||||
|         assert isclose(device.min_pulse_width, 5/10000) | ||||
|         assert isclose(device.max_pulse_width, 25/10000) | ||||
| @@ -980,7 +980,7 @@ def test_servo_pulse_width(): | ||||
|         assert device.pulse_width is None | ||||
|  | ||||
| def test_servo_values(): | ||||
|     p = Device._pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     p = Device.pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     with Servo(p) as device: | ||||
|         device.min() | ||||
|         assert device.is_active | ||||
| @@ -1007,13 +1007,13 @@ def test_servo_values(): | ||||
|         assert device.value is None | ||||
|  | ||||
| def test_angular_servo_range(): | ||||
|     p = Device._pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     p = Device.pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     with AngularServo(p, initial_angle=15, min_angle=0, max_angle=90) as device: | ||||
|         assert device.min_angle == 0 | ||||
|         assert device.max_angle == 90 | ||||
|  | ||||
| def test_angular_servo_angles(): | ||||
|     p = Device._pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     p = Device.pin_factory.pin(1, pin_class=MockPWMPin) | ||||
|     with AngularServo(p) as device: | ||||
|         device.angle = 0 | ||||
|         assert device.angle == 0 | ||||
|   | ||||
| @@ -19,9 +19,7 @@ from gpiozero import * | ||||
|  | ||||
|  | ||||
| def test_pi_revision(): | ||||
|     # We're not using _set_pin_factory here because we don't want to implicitly | ||||
|     # close the old instance, just replace it while we test stuff | ||||
|     with patch('gpiozero.devices.Device._pin_factory', LocalPiFactory()): | ||||
|     with patch('gpiozero.devices.Device.pin_factory', LocalPiFactory()): | ||||
|         # Can't use MockPin for this as we want something that'll actually try | ||||
|         # and read /proc/cpuinfo (MockPin simply parrots the 2B's data); | ||||
|         # LocalPiFactory is used as we can definitely instantiate it (strictly | ||||
| @@ -32,20 +30,20 @@ def test_pi_revision(): | ||||
|             assert pi_info().revision == '0002' | ||||
|             # LocalPiFactory caches the revision (because realistically it | ||||
|             # isn't going to change at runtime); we need to wipe it here though | ||||
|             Device._pin_factory._info = None | ||||
|             Device.pin_factory._info = None | ||||
|             m.return_value.__enter__.return_value = ['Revision: a21042'] | ||||
|             assert pi_info().revision == 'a21042' | ||||
|             # Check over-volting result (some argument over whether this is 7 or | ||||
|             # 8 character result; make sure both work) | ||||
|             Device._pin_factory._info = None | ||||
|             Device.pin_factory._info = None | ||||
|             m.return_value.__enter__.return_value = ['Revision: 1000003'] | ||||
|             assert pi_info().revision == '0003' | ||||
|             Device._pin_factory._info = None | ||||
|             Device.pin_factory._info = None | ||||
|             m.return_value.__enter__.return_value = ['Revision: 100003'] | ||||
|             assert pi_info().revision == '0003' | ||||
|             with pytest.raises(PinUnknownPi): | ||||
|                 m.return_value.__enter__.return_value = ['nothing', 'relevant', 'at all'] | ||||
|                 Device._pin_factory._info = None | ||||
|                 Device.pin_factory._info = None | ||||
|                 pi_info() | ||||
|             with pytest.raises(PinUnknownPi): | ||||
|                 pi_info('0fff') | ||||
|   | ||||
| @@ -52,9 +52,9 @@ def pin_factory(request): | ||||
|     except Exception as e: | ||||
|         pytest.skip("skipped factory %s: %s" % (request.param, str(e))) | ||||
|     else: | ||||
|         Device._set_pin_factory(factory) | ||||
|         Device.pin_factory = factory | ||||
|         def fin(): | ||||
|             Device._set_pin_factory(MockFactory()) | ||||
|             Device.pin_factory = MockFactory() | ||||
|         request.addfinalizer(fin) | ||||
|         return factory | ||||
|  | ||||
| @@ -147,7 +147,7 @@ def test_bad_duty_cycle(pins): | ||||
|         # NOTE: There's some race in RPi.GPIO that causes a segfault if we | ||||
|         # don't pause before starting PWM; only seems to happen when stopping | ||||
|         # and restarting PWM very rapidly (i.e. between test cases). | ||||
|         if Device._pin_factory.__class__.__name__ == 'RPiGPIOFactory': | ||||
|         if Device.pin_factory.__class__.__name__ == 'RPiGPIOFactory': | ||||
|             sleep(0.1) | ||||
|         test_pin.frequency = 100 | ||||
|     except PinPWMUnsupported: | ||||
| @@ -164,7 +164,7 @@ def test_duty_cycles(pins): | ||||
|     test_pin.function = 'output' | ||||
|     try: | ||||
|         # NOTE: see above | ||||
|         if Device._pin_factory.__class__.__name__ == 'RPiGPIOFactory': | ||||
|         if Device.pin_factory.__class__.__name__ == 'RPiGPIOFactory': | ||||
|             sleep(0.1) | ||||
|         test_pin.frequency = 100 | ||||
|     except PinPWMUnsupported: | ||||
|   | ||||
| @@ -26,80 +26,80 @@ from gpiozero import * | ||||
|  | ||||
|  | ||||
| def teardown_function(function): | ||||
|     Device._pin_factory.reset() | ||||
|     Device.pin_factory.reset() | ||||
|  | ||||
|  | ||||
| def test_spi_hardware_params(): | ||||
|     with patch('os.open'), patch('mmap.mmap') as mmap_mmap, patch('io.open') as io_open: | ||||
|         mmap_mmap.return_value = array(nstr('B'), (0,) * 4096) | ||||
|         io_open.return_value.__enter__.return_value = ['Revision: a21042'] | ||||
|         with patch('gpiozero.devices.Device._pin_factory', NativeFactory()), \ | ||||
|         with patch('gpiozero.devices.Device.pin_factory', NativeFactory()), \ | ||||
|                 patch('gpiozero.pins.local.SpiDev'): | ||||
|             with Device._pin_factory.spi() as device: | ||||
|             with Device.pin_factory.spi() as device: | ||||
|                 assert isinstance(device, LocalPiHardwareSPI) | ||||
|             with Device._pin_factory.spi(port=0, device=0) as device: | ||||
|             with Device.pin_factory.spi(port=0, device=0) as device: | ||||
|                 assert isinstance(device, LocalPiHardwareSPI) | ||||
|             with Device._pin_factory.spi(port=0, device=1) as device: | ||||
|             with Device.pin_factory.spi(port=0, device=1) as device: | ||||
|                 assert isinstance(device, LocalPiHardwareSPI) | ||||
|             with Device._pin_factory.spi(clock_pin=11) as device: | ||||
|             with Device.pin_factory.spi(clock_pin=11) as device: | ||||
|                 assert isinstance(device, LocalPiHardwareSPI) | ||||
|             with Device._pin_factory.spi(clock_pin=11, mosi_pin=10, select_pin=8) as device: | ||||
|             with Device.pin_factory.spi(clock_pin=11, mosi_pin=10, select_pin=8) as device: | ||||
|                 assert isinstance(device, LocalPiHardwareSPI) | ||||
|             with Device._pin_factory.spi(clock_pin=11, mosi_pin=10, select_pin=7) as device: | ||||
|             with Device.pin_factory.spi(clock_pin=11, mosi_pin=10, select_pin=7) as device: | ||||
|                 assert isinstance(device, LocalPiHardwareSPI) | ||||
|             with Device._pin_factory.spi(shared=True) as device: | ||||
|             with Device.pin_factory.spi(shared=True) as device: | ||||
|                 assert isinstance(device, LocalPiHardwareSPIShared) | ||||
|             with pytest.raises(ValueError): | ||||
|                 Device._pin_factory.spi(port=1) | ||||
|                 Device.pin_factory.spi(port=1) | ||||
|             with pytest.raises(ValueError): | ||||
|                 Device._pin_factory.spi(device=2) | ||||
|                 Device.pin_factory.spi(device=2) | ||||
|             with pytest.raises(ValueError): | ||||
|                 Device._pin_factory.spi(port=0, clock_pin=12) | ||||
|                 Device.pin_factory.spi(port=0, clock_pin=12) | ||||
|             with pytest.raises(ValueError): | ||||
|                 Device._pin_factory.spi(foo='bar') | ||||
|                 Device.pin_factory.spi(foo='bar') | ||||
|  | ||||
| def test_spi_software_params(): | ||||
|     with patch('os.open'), patch('mmap.mmap') as mmap_mmap, patch('io.open') as io_open: | ||||
|         mmap_mmap.return_value = array(nstr('B'), (0,) * 4096) | ||||
|         io_open.return_value.__enter__.return_value = ['Revision: a21042'] | ||||
|         with patch('gpiozero.devices.Device._pin_factory', NativeFactory()), \ | ||||
|         with patch('gpiozero.devices.Device.pin_factory', NativeFactory()), \ | ||||
|                 patch('gpiozero.pins.local.SpiDev'): | ||||
|             with Device._pin_factory.spi(select_pin=6) as device: | ||||
|             with Device.pin_factory.spi(select_pin=6) as device: | ||||
|                 assert isinstance(device, LocalPiSoftwareSPI) | ||||
|             with Device._pin_factory.spi(clock_pin=11, mosi_pin=9, miso_pin=10) as device: | ||||
|             with Device.pin_factory.spi(clock_pin=11, mosi_pin=9, miso_pin=10) as device: | ||||
|                 assert isinstance(device, LocalPiSoftwareSPI) | ||||
|             with Device._pin_factory.spi(select_pin=6, shared=True) as device: | ||||
|             with Device.pin_factory.spi(select_pin=6, shared=True) as device: | ||||
|                 assert isinstance(device, LocalPiSoftwareSPIShared) | ||||
|         with patch('gpiozero.devices.Device._pin_factory', NativeFactory()), \ | ||||
|         with patch('gpiozero.devices.Device.pin_factory', NativeFactory()), \ | ||||
|                 patch('gpiozero.pins.local.SpiDev', None): | ||||
|             # Clear out the old factory's pins cache (this is only necessary | ||||
|             # because we're being very naughty switching out pin factories) | ||||
|             Device._pin_factory.pins.clear() | ||||
|             Device.pin_factory.pins.clear() | ||||
|             # Ensure software fallback works when SpiDev isn't present | ||||
|             with Device._pin_factory.spi() as device: | ||||
|             with Device.pin_factory.spi() as device: | ||||
|                 assert isinstance(device, LocalPiSoftwareSPI) | ||||
|  | ||||
| def test_spi_hardware_conflict(): | ||||
|     with patch('gpiozero.pins.local.SpiDev') as spidev: | ||||
|         with LED(11) as led: | ||||
|             with pytest.raises(GPIOPinInUse): | ||||
|                 Device._pin_factory.spi(port=0, device=0) | ||||
|                 Device.pin_factory.spi(port=0, device=0) | ||||
|     with patch('gpiozero.pins.local.SpiDev') as spidev: | ||||
|         with Device._pin_factory.spi(port=0, device=0) as spi: | ||||
|         with Device.pin_factory.spi(port=0, device=0) as spi: | ||||
|             with pytest.raises(GPIOPinInUse): | ||||
|                 LED(11) | ||||
|  | ||||
| def test_spi_hardware_read(): | ||||
|     with patch('gpiozero.pins.local.SpiDev') as spidev: | ||||
|         spidev.return_value.xfer2.side_effect = lambda data: list(range(10))[:len(data)] | ||||
|         with Device._pin_factory.spi() as device: | ||||
|         with Device.pin_factory.spi() as device: | ||||
|             assert device.read(3) == [0, 1, 2] | ||||
|             assert device.read(6) == list(range(6)) | ||||
|  | ||||
| def test_spi_hardware_write(): | ||||
|     with patch('gpiozero.pins.local.SpiDev') as spidev: | ||||
|         spidev.return_value.xfer2.side_effect = lambda data: list(range(10))[:len(data)] | ||||
|         with Device._pin_factory.spi() as device: | ||||
|         with Device.pin_factory.spi() as device: | ||||
|             assert device.write([0, 1, 2]) == 3 | ||||
|             assert spidev.return_value.xfer2.called_with([0, 1, 2]) | ||||
|             assert device.write(list(range(6))) == 6 | ||||
| @@ -111,7 +111,7 @@ def test_spi_hardware_modes(): | ||||
|         spidev.return_value.lsbfirst = False | ||||
|         spidev.return_value.cshigh = True | ||||
|         spidev.return_value.bits_per_word = 8 | ||||
|         with Device._pin_factory.spi() as device: | ||||
|         with Device.pin_factory.spi() as device: | ||||
|             assert device.clock_mode == 0 | ||||
|             assert not device.clock_polarity | ||||
|             assert not device.clock_phase | ||||
| @@ -139,7 +139,7 @@ def test_spi_software_read(): | ||||
|                 self.tx_word(i) | ||||
|     with patch('gpiozero.pins.local.SpiDev', None), \ | ||||
|             SPISlave(11, 10, 9, 8) as slave, \ | ||||
|             Device._pin_factory.spi() as master: | ||||
|             Device.pin_factory.spi() as master: | ||||
|         assert master.read(3) == [0, 1, 2] | ||||
|         assert master.read(6) == [0, 1, 2, 3, 4, 5] | ||||
|         slave.clock_phase = True | ||||
| @@ -150,7 +150,7 @@ def test_spi_software_read(): | ||||
| def test_spi_software_write(): | ||||
|     with patch('gpiozero.pins.local.SpiDev', None), \ | ||||
|             MockSPIDevice(11, 10, 9, 8) as test_device, \ | ||||
|             Device._pin_factory.spi() as master: | ||||
|             Device.pin_factory.spi() as master: | ||||
|         master.write([0]) | ||||
|         assert test_device.rx_word() == 0 | ||||
|         master.write([2, 0]) | ||||
| @@ -160,7 +160,7 @@ def test_spi_software_write(): | ||||
|  | ||||
| def test_spi_software_clock_mode(): | ||||
|     with patch('gpiozero.pins.local.SpiDev', None), \ | ||||
|             Device._pin_factory.spi() as master: | ||||
|             Device.pin_factory.spi() as master: | ||||
|         assert master.clock_mode == 0 | ||||
|         assert not master.clock_polarity | ||||
|         assert not master.clock_phase | ||||
| @@ -178,7 +178,7 @@ def test_spi_software_clock_mode(): | ||||
|  | ||||
| def test_spi_software_attr(): | ||||
|     with patch('gpiozero.pins.local.SpiDev', None), \ | ||||
|             Device._pin_factory.spi() as master: | ||||
|             Device.pin_factory.spi() as master: | ||||
|         assert not master.lsb_first | ||||
|         assert not master.select_high | ||||
|         assert master.bits_per_word == 8 | ||||
|   | ||||
| @@ -21,7 +21,7 @@ from gpiozero import * | ||||
|  | ||||
|  | ||||
| def teardown_function(function): | ||||
|     Device._pin_factory.reset() | ||||
|     Device.pin_factory.reset() | ||||
|  | ||||
| def clamp(v, min_value, max_value): | ||||
|     return min(max_value, max(min_value, v)) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user