예제 #1
0
 def _setup(self):
     try:
         self.controller.configure(
             'ftdi://ftdi:ft232h/1',
             frequency=100,
             direction=0xFFFF,
             initial=0x0000,
         )
         self.gpio = self.controller.get_gpio()
         valid_pins = self.gpio.all_pins
         used_pins = self.output_pins | self.input_pins
         invalid_pins = ((valid_pins | used_pins) & ~valid_pins) & used_pins
         if invalid_pins != 0:
             formatted = \
                 [i for i in range(0, 16) if invalid_pins & 1 << i != 0]
             raise HardwareError(
                 "Cannot use pin(s) {} as GPIO.".format(formatted))
         # A low bit (equal to 0) indicates an input pin.
         # A high bit (equal to 1) indicates an output pin.
         new_direction = self.output_pins & ~self.input_pins
         self.gpio.set_direction(used_pins, new_direction)
     except UsbToolsError as error:
         self.gpio = None
         raise HardwareError(error) from None
     except USBError as error:
         self.gpio = None
         raise HardwareError(error) from None
예제 #2
0
def test_set_hardware_error_is_passed_up(mocker):
    (model_mock, desk_controller_stub,
     service) = create_service(mocker, TIME_ALLOWED, ACTIVE, Timedelta(0),
                               DOWN)
    desk_controller_stub.move.side_effect = HardwareError(RuntimeError())

    with pytest.raises(HardwareError):
        service.set(UP)
예제 #3
0
def test_set_session_hardware_error_timer_cancelled(mocker):
    (timer_mock, session_service_stub, _, service) = create_service(
        mocker, TIME_ALLOWED, INACTIVE, Timedelta(0), DOWN)
    session_service_stub.set.side_effect = HardwareError(RuntimeError())

    service.set_session(ACTIVE)

    timer_mock.cancel.assert_called_once()
예제 #4
0
def test_set_desk_hardware_error_timer_cancelled(mocker, desk):
    (timer_mock, _, desk_service_stub,
     service) = create_service(mocker, TIME_ALLOWED, ACTIVE, Timedelta(0),
                               desk.next())
    desk_service_stub.set.side_effect = HardwareError(RuntimeError())

    service.set_desk(desk)

    timer_mock.cancel.assert_called_once()
예제 #5
0
async def test_button_press_after_hardware_error(client, button_pin_stub,
                                                 service_mock):
    button_pin_stub.read.side_effect = HardwareError(
        'Stubbed error for unit testing.')
    await asyncio.sleep(0.1)
    button_pin_stub.read.side_effect = None
    button_pin_stub.read.return_value = 1
    await asyncio.sleep(5)
    service_mock.toggle_session.assert_called_once()
예제 #6
0
 def _reconnect_and_try_again(self, action):
     self._connect()
     try:
         return action()
     except FtdiError as error1:
         try:
             self.disconnect()
             self._connect()
             return action()
         except FtdiError:
             raise HardwareError(error1)
예제 #7
0
def test_set_hardware_error_model_not_updated(mocker):
    (model_mock, desk_controller_stub,
     service) = create_service(mocker, TIME_ALLOWED, ACTIVE, Timedelta(0),
                               DOWN)
    desk_controller_stub.move.side_effect = HardwareError(RuntimeError())

    try:
        service.set(UP)
    except HardwareError:
        pass

    model_mock.set_desk.assert_not_called()
예제 #8
0
def test_set_hardware_error_model_still_called(mocker):
    now = Timestamp(2019, 8, 1, 13, 0)
    (model_mock, light_controller_stub,
     service) = create_service(mocker, INACTIVE, now)
    light_controller_stub.set.side_effect = HardwareError(RuntimeError())

    try:
        service.set(ACTIVE)
    except HardwareError:
        pass

    model_mock.set_session.assert_called_with(now, ACTIVE)
예제 #9
0
def test_set_hardware_error_is_passed_up(mocker):
    (_, light_controller_stub, service) = create_service(mocker, INACTIVE)
    light_controller_stub.set.side_effect = HardwareError(RuntimeError())

    with pytest.raises(HardwareError):
        service.set(ACTIVE)