예제 #1
0
    def test_control_mode_read_write(self):
        """Registers read/written when setting/reading control modes from
        MCU."""
        for motor_port_registers in MotorControlRegisters:
            motor_port_name = motor_port_registers.name
            motor_registers = motor_port_registers.value
            control_mode_register = motor_registers[
                MotorRegisterTypes.CONTROL_MODE]

            for control_mode in MotorControlModes:
                # create instance
                controller = EncoderMotorController(port=motor_port_name)

                # setup r/w mocks
                write_byte_mock = controller._mcu_device.write_byte = Mock()
                read_unsigned_byte_mock = (
                    controller._mcu_device.read_unsigned_byte) = Mock()
                read_unsigned_byte_mock.return_value = control_mode.value

                # test
                controller.set_control_mode(control_mode)
                write_byte_mock.assert_called_with(control_mode_register,
                                                   control_mode.value)

                self.assertEquals(controller.control_mode(), control_mode)
                read_unsigned_byte_mock.assert_called_with(
                    control_mode_register)
예제 #2
0
    def test_set_power_fails_on_invalid_value(self):
        """set_power fails if called with an invalid power value."""
        controller = EncoderMotorController(port="M1")

        for power in (-1001, 1001):
            with self.assertRaises(ValueError):
                controller.set_power(power)
예제 #3
0
    def test_set_braking_type_read_write(self):
        """Registers read/written when setting/reading braking type from
        MCU."""
        for motor_port_registers in MotorControlRegisters:
            motor_port_name = motor_port_registers.name
            motor_registers = motor_port_registers.value
            brake_type_register = motor_registers[
                MotorRegisterTypes.BRAKE_TYPE]

            for braking_type in BrakingType:
                # create instance
                controller = EncoderMotorController(port=motor_port_name)

                # setup r/w mocks
                write_byte_mock = controller._mcu_device.write_byte = Mock()
                read_unsigned_byte_mock = (
                    controller._mcu_device.read_unsigned_byte) = Mock()
                read_unsigned_byte_mock.return_value = braking_type

                # test
                controller.set_braking_type(braking_type)
                write_byte_mock.assert_called_with(brake_type_register,
                                                   braking_type)

                self.assertEquals(controller.braking_type(), braking_type)
                read_unsigned_byte_mock.assert_called_with(brake_type_register)
예제 #4
0
    def test_rpm_with_rotations_returns_none_if_not_on_mode_2(self):
        """rpm_with_rotations() returns None if not on Mode 1."""
        controller = EncoderMotorController(port="M1")
        mode_mock = controller.control_mode = Mock()

        for mode in (MotorControlModes.MODE_0, MotorControlModes.MODE_1):
            mode_mock.return_value = mode
            self.assertEquals(controller.rpm_with_rotations(), None)
예제 #5
0
    def test_power_returns_none_if_not_on_mode_0(self):
        """power() returns None if not on Mode 0."""
        controller = EncoderMotorController(port="M1")
        mode_mock = controller.control_mode = Mock()

        for mode in (MotorControlModes.MODE_1, MotorControlModes.MODE_2):
            mode_mock.return_value = mode
            self.assertEquals(controller.power(), None)
예제 #6
0
    def test_set_braking_type_fails_on_invalid_value(self):
        """set_braking_type fails if called with an invalid brake_type
        value."""
        controller = EncoderMotorController(port="M1")

        for brake_type in (-100, -1, 2, 30):
            with self.assertRaises(ValueError):
                controller.set_braking_type(brake_type)
예제 #7
0
    def test_control_mode_1_read_write(self):
        """Registers read/written  when using control mode 1 methods."""
        rpm_value = 500
        for motor_port_registers in MotorControlRegisters:
            motor_port_name = motor_port_registers.name
            motor_registers = motor_port_registers.value

            mode_1_register = motor_registers[MotorRegisterTypes.MODE_1_RPM]

            # create instance
            controller = EncoderMotorController(port=motor_port_name)
            controller.set_control_mode = Mock()
            controller.control_mode = Mock()
            controller.control_mode.return_value = MotorControlModes.MODE_1

            # setup r/w mocks
            write_word_mock = controller._mcu_device.write_word = Mock()
            read_signed_word_mock = controller._mcu_device.read_signed_word = Mock(
            )
            read_signed_word_mock.return_value = rpm_value

            # test
            controller.set_rpm_control(rpm_value)
            write_word_mock.assert_called_with(mode_1_register,
                                               rpm_value,
                                               little_endian=True,
                                               signed=True)

            self.assertEquals(controller.rpm_control(), rpm_value)
            read_signed_word_mock.assert_called_with(mode_1_register,
                                                     little_endian=True)
예제 #8
0
    def test_constructor_success(self, set_braking_type_mock):
        braking_type = 1

        controller = EncoderMotorController(port="M1",
                                            braking_type=braking_type)

        self.assertEquals(controller.registers, EncoderMotorM1)
        self.assertEquals(controller._MAX_DC_MOTOR_RPM, 6000)
        set_braking_type_mock.assert_called_once_with(braking_type)
예제 #9
0
    def test_stop_works_on_all_modes(self):
        """stop() stops the motor in all modes."""
        controller = EncoderMotorController(port="M1")
        mode_mock = controller.control_mode = Mock()

        set_power_mock = controller.set_power = Mock()
        set_rpm_control_mock = controller.set_rpm_control = Mock()
        set_rpm_with_rotations_mock = controller.set_rpm_with_rotations = Mock(
        )

        test_data = [
            (MotorControlModes.MODE_0, set_power_mock, [0]),
            (MotorControlModes.MODE_1, set_rpm_control_mock, [0]),
            (MotorControlModes.MODE_2, set_rpm_with_rotations_mock, [0, 0]),
        ]

        for mode, method_called, expected_args in test_data:
            mode_mock.return_value = mode
            controller.stop()
            method_called.assert_called_with(*expected_args)
예제 #10
0
    def test_control_mode_2_read_write(self):
        """Registers read/written  when using control mode 2 methods."""
        rpm_value = 500
        rotations_value = 10
        # from rpm and rotations values, calculate byte values to use in mocks
        rpm_and_rotations_in_bytes = split_into_bytes(
            rotations_value, 2, signed=True,
            little_endian=True) + split_into_bytes(
                rpm_value, 2, signed=True, little_endian=True)
        rpm_and_rotations_read = join_bytes(rpm_and_rotations_in_bytes)

        for motor_port_registers in MotorControlRegisters:
            motor_port_name = motor_port_registers.name
            motor_registers = motor_port_registers.value

            mode_1_register = motor_registers[
                MotorRegisterTypes.MODE_2_RPM_WITH_ROTATIONS]

            # create instance
            controller = EncoderMotorController(port=motor_port_name)
            controller.set_control_mode = Mock()
            controller.control_mode = Mock()
            controller.control_mode.return_value = MotorControlModes.MODE_2

            # setup r/w mocks
            write_n_bytes_mock = controller._mcu_device.write_n_bytes = Mock()
            read_n_unsigned_bytes_mock = (
                controller._mcu_device.read_n_unsigned_bytes) = Mock()
            read_n_unsigned_bytes_mock.return_value = rpm_and_rotations_read

            # test
            controller.set_rpm_with_rotations(rpm_value, rotations_value)
            write_n_bytes_mock.assert_called_with(mode_1_register,
                                                  rpm_and_rotations_in_bytes)

            self.assertEquals(controller.rpm_with_rotations(),
                              (rpm_value, rotations_value))
            read_n_unsigned_bytes_mock.assert_called_with(mode_1_register,
                                                          4,
                                                          little_endian=True)
예제 #11
0
 def test_constructor_fails_on_incorrect_port(self):
     """Constructor fails if providing an invalid port."""
     with self.assertRaises(Exception):
         EncoderMotorController(port="invalid_port")