예제 #1
0
def setup_robot():
    robot = Robot()
    for port in list_of_ports:
        trycon(robot, port)
    if (robot.is_simulating()):
        print("no connection made")
    else:
        robot.home()
        robot._driver.speeds['z'] = 1200
    for (axis, pipette) in robot.get_instruments():
        pipette.load_persisted_data()
    try:
        yield robot
    finally:
        robot.disconnect()
예제 #2
0
class OpenTronsTest(unittest.TestCase):
    def setUp(self):
        global reset_time
        self.robot = Robot()

        # set this to True if testing with a robot connected
        # testing while connected allows the response handlers
        # and serial handshakes to be tested

        options = {
            'firmware': 'v1.0.5',
            'limit_switches': True,
            'config': {
                'alpha_steps_per_mm': 80.0,
                'beta_steps_per_mm': 80.0
            }
        }

        self.robot.disconnect()
        self.robot.connect(options=options)

        self.motor = self.robot._driver

    def test_is_simulating(self):
        self.assertTrue(self.motor.is_simulating())

    def test_reset(self):
        self.motor.reset()
        self.assertFalse(self.motor.is_connected())

    def test_write_with_lost_connection(self):
        self.motor.connection.serial_port.close()

        def _temp():
            return True

        old_method = getattr(self.motor, 'is_connected')
        setattr(self.motor, 'is_connected', _temp)

        self.assertTrue(self.motor.is_connected())
        self.assertRaises(RuntimeError, self.motor.calm_down)

        setattr(self.motor, 'is_connected', old_method)

    def test_version_compatible(self):
        self.motor.versions_compatible()

        kwargs = {
            'options': {
                'firmware': 'v2.0.0',
                'config': {
                    'version': 'v3.1.2',
                    'ot_version': 'hoodie'
                }
            }
        }
        self.assertRaises(RuntimeError, self.robot.connect, **kwargs)

    def test_invalid_coordinate_system(self):
        self.assertRaises(ValueError, self.motor.set_coordinate_system, 'andy')

    def test_message_timeout(self):
        self.robot._driver.connection.flush_input()
        self.assertRaises(RuntimeWarning, self.motor.readline_from_serial, 0.1)

    def test_set_plunger_speed(self):
        self.motor.set_plunger_speed(400, 'a')
        self.assertRaises(ValueError, self.motor.set_plunger_speed, 400, 'x')

    def test_set_speed(self):
        self.motor.set_speed(4000)
        self.assertEquals(self.motor.speeds['x'], 4000)
        self.assertEquals(self.motor.speeds['y'], 4000)

        self.motor.set_speed(3000, z=2000, a=700, b=600)
        self.assertEquals(self.motor.speeds['x'], 3000)
        self.assertEquals(self.motor.speeds['y'], 3000)
        self.assertEquals(self.motor.speeds['z'], 2000)
        self.assertEquals(self.motor.speeds['a'], 700)
        self.assertEquals(self.motor.speeds['b'], 600)

    def test_get_connected_port(self):
        res = self.motor.get_connected_port()
        self.assertEquals(res, drivers.VIRTUAL_SMOOTHIE_PORT)
        self.motor.disconnect()
        res = self.motor.get_connected_port()
        self.assertEquals(res, 'Virtual Smoothie')
        self.assertFalse(self.motor.is_connected())

    def test_get_dimensions(self):
        self.motor.ot_version = None
        res = self.motor.get_dimensions()
        self.assertEquals(res, Vector(400.00, 400.00, 100.00))

    def test_pause_resume(self):
        self.motor.home()

        self.motor.pause()

        def _move_head():
            self.motor.move_head(x=100, y=0, z=0)

        thread = Thread(target=_move_head)
        thread.start()

        self.motor.resume()
        thread.join()

        coords = self.motor.get_head_position()
        expected_coords = {'target': (100, 0, 0), 'current': (100, 0, 0)}
        self.assertDictEqual(coords, expected_coords)

    def test_stop(self):
        self.motor.home()

        self.motor.pause()

        def _move_head():
            self.assertRaises(RuntimeWarning, self.motor.move_head, **{
                'x': 100,
                'y': 0,
                'z': 0
            })

        thread = Thread(target=_move_head)
        thread.start()

        self.motor.stop()

        thread.join()

        coords = self.motor.get_head_position()
        expected_coords = {'target': (0, 400, 100), 'current': (0, 400, 100)}
        self.assertDictEqual(coords, expected_coords)

        self.motor.move_head(x=100, y=0, z=0)
        coords = self.motor.get_head_position()
        expected_coords = {'target': (100, 0, 0), 'current': (100, 0, 0)}
        self.assertDictEqual(coords, expected_coords)

    def test_halt(self):
        self.motor.home()

        self.motor.pause()

        def _move_head():
            self.assertRaises(RuntimeWarning, self.motor.move_head, **{
                'x': 100,
                'y': 0,
                'z': 0
            })

        thread = Thread(target=_move_head)
        thread.start()

        self.motor.halt()

        thread.join()

        coords = self.motor.get_head_position()
        expected_coords = {'target': (0, 400, 100), 'current': (0, 400, 100)}
        self.assertDictEqual(coords, expected_coords)

        self.motor.move_head(x=100, y=0, z=0)
        coords = self.motor.get_head_position()
        expected_coords = {'target': (100, 0, 0), 'current': (100, 0, 0)}
        self.assertDictEqual(coords, expected_coords)

    def test_get_position(self):
        self.motor.home()
        self.motor.ot_version = None
        self.motor.move_head(x=100)
        coords = self.motor.get_head_position()
        expected_coords = {
            'target': (100, 400, 100),
            'current': (100, 400, 100)
        }
        self.assertDictEqual(coords, expected_coords)

    def test_home(self):

        self.motor.home('x', 'y')
        pos = self.motor.get_head_position()['current']
        self.assertEquals(pos['x'], 0)

        self.motor.home('ba')
        pos = self.motor.get_plunger_positions()['current']
        self.assertEquals(pos['a'], 0)
        self.assertEquals(pos['b'], 0)

    def test_limit_hit_exception(self):
        self.motor.home()
        try:
            self.motor.move_head(x=-100)
            self.motor.wait_for_arrival()
        except RuntimeWarning as e:
            self.assertEqual(
                str(RuntimeWarning('Robot Error: limit switch hit')), str(e))

        self.motor.home()

    def test_move(self):
        self.motor.ot_version = None
        for axis in 'xyz':
            self.motor.move(**{axis: 30})
            pos = self.motor.get_head_position()['current']
            self.assertEquals(pos[axis], 30)

        for axis in 'ab':
            self.motor.move(**{axis: 30})
            pos = self.motor.get_plunger_positions()['current']
            self.assertEquals(pos[axis], 30)

    def test_send_command(self):
        res = self.motor.send_command('G0 X1 Y1 Z1')
        self.assertEquals(res, 'ok')
        if self.motor.firmware_version != 'v1.0.5':
            self.assertEquals(self.motor.readline_from_serial(), 'ok')
        pos = self.motor.get_head_position()['current']
        self.assertEquals(pos['x'], 1)
        self.assertEquals(pos['y'], 399)
        self.assertEquals(pos['z'], 99)

    def test_send_command_with_kwargs(self):
        res = self.motor.send_command('G0', X=1, Y=2, Z=3)
        self.assertEquals(res, 'ok')
        if self.motor.firmware_version != 'v1.0.5':
            self.assertEquals(self.motor.readline_from_serial(), 'ok')
        pos = self.motor.get_head_position()['current']
        self.assertEquals(pos['x'], 1)
        self.assertEquals(pos['y'], 398)
        self.assertEquals(pos['z'], 97)

    def test_wait(self):
        # do not use Virtual Smoothie for this test
        old_method = getattr(self.motor.connection, 'device')

        def _temp():
            return int()

        setattr(self.motor.connection, 'device', _temp)

        start_time = time.time()
        self.motor.wait(1.234)
        end_time = time.time()
        self.assertAlmostEquals(end_time - start_time, 1.234, places=1)

        start_time = time.time()
        self.motor.wait(1.0)
        end_time = time.time()
        self.assertAlmostEquals(end_time - start_time, 1.0, places=1)

        setattr(self.motor.connection, 'device', old_method)

    def test_wait_for_arrival(self):
        self.motor.home()
        self.motor.move_head(x=200, y=200)
        self.motor.move_head(z=30)
        self.motor.wait_for_arrival()

        old_coords = dict(self.motor.connection.serial_port.coordinates)
        vs = self.motor.connection.serial_port
        for ax in vs.coordinates['target'].keys():
            vs.coordinates['target'][ax] += 10
        self.assertRaises(RuntimeError, self.motor.wait_for_arrival)
        vs.coordinates = old_coords

    def test_move_relative(self):
        self.motor.home()
        self.motor.move_head(x=100, y=100, z=100)
        self.motor.move_head(x=0, mode='relative')
        self.motor.move_head(x=100, mode='absolute')

    def test_calibrate_steps_per_mm(self):
        self.motor.home()
        self.motor.set_steps_per_mm('x', 80.0)
        self.motor.set_steps_per_mm('y', 80.0)
        self.motor.set_steps_per_mm('z', 400)
        self.motor.move_head(x=200, y=200)

        self.motor.calibrate_steps_per_mm('x', 200, 198)
        self.motor.calibrate_steps_per_mm('y', 200, 202)
        self.motor.calibrate_steps_per_mm('z', 100, 101)

        new_x_steps = self.motor.get_steps_per_mm('x')
        new_y_steps = self.motor.get_steps_per_mm('y')
        new_z_steps = self.motor.get_steps_per_mm('z')

        exptected_x = round((200 / 198) * 80.0, 2)
        exptected_y = round((200 / 202) * 80.0, 2)
        exptected_z = round((100 / 101) * 400, 2)

        self.assertEqual(exptected_x, new_x_steps)
        self.assertEqual(exptected_y, new_y_steps)
        self.assertEqual(exptected_z, new_z_steps)

        self.assertRaises(ValueError, self.motor.get_steps_per_mm, 'd')
        self.assertRaises(ValueError, self.motor.set_steps_per_mm, 'd', 80.0)

        self.motor.set_steps_per_mm('x', 80.0)
        self.motor.set_steps_per_mm('y', 80.0)
        self.motor.set_steps_per_mm('z', 400)

    def test_get_endstop_switches(self):
        res = self.motor.get_endstop_switches()
        expected = {'x': False, 'y': False, 'z': False, 'a': False, 'b': False}
        self.assertEquals(res, expected)
        try:
            self.motor.move_head(x=-100)
            self.motor.move_head(x=-101)
        except Exception:
            pass
        res = self.motor.get_endstop_switches()
        expected = {'x': True, 'y': False, 'z': False, 'a': False, 'b': False}
        self.assertEquals(res, expected)

    def test_set_mosfet(self):
        res = self.motor.set_mosfet(0, True)
        self.assertTrue(res)

        res = self.motor.set_mosfet(5, False)
        self.assertTrue(res)

        self.assertRaises(IndexError, self.motor.set_mosfet, 6, True)

    def test_power_on_off(self):
        self.motor.power_on()

        self.motor.power_off()

        assert True