예제 #1
0
def initialize(
        hardware_server: bool = False,
        hardware_server_socket: str = None) \
        -> ThreadManager:
    """
    Initialize the Opentrons hardware returning a hardware instance.

    :param hardware_server: Run a jsonrpc server allowing rpc to the  hardware
     controller. Only works on buildroot because extra dependencies are
     required.
    :param hardware_server_socket: Override for the hardware server socket
    """
    checked_socket = hardware_server_socket\
        or "/var/run/opentrons-hardware.sock"
    robot_conf = robot_configs.load()
    logging_config.log_init(robot_conf.log_level)

    log.info(f"API server version:  {__version__}")
    log.info(f"Robot Name: {name()}")

    loop = asyncio.get_event_loop()
    hardware = loop.run_until_complete(initialize_robot())

    if hardware_server:
        #  TODO: BC 2020-02-25 adapt hardware socket server to ThreadManager
        loop.run_until_complete(
            install_hardware_server(checked_socket, hardware))  # type: ignore

    return hardware
예제 #2
0
def run(hardware, **kwargs):  # noqa(C901)
    """
    This function was necessary to separate from main() to accommodate for
    server startup path on system 3.0, which is server.main. In the case where
    the api is on system 3.0, server.main will redirect to this function with
    an additional argument of 'patch_old_init'. kwargs are hence used to allow
    the use of different length args
    """
    loop = asyncio.get_event_loop()

    if ff.use_protocol_api_v2():
        robot_conf = loop.run_until_complete(hardware.get_config())
    else:
        robot_conf = hardware.config

    logging_config.log_init(robot_conf.log_level)

    log.info("API server version:  {}".format(__version__))
    if not os.environ.get("ENABLE_VIRTUAL_SMOOTHIE"):
        initialize_robot(loop, hardware)
        if ff.use_protocol_api_v2():
            loop.run_until_complete(hardware.cache_instruments())
        if not ff.disable_home_on_boot():
            log.info("Homing Z axes")
            if ff.use_protocol_api_v2():
                loop.run_until_complete(hardware.home_z())
            else:
                hardware.home_z()
        try:
            udev.setup_rules_file()
        except Exception:
            log.exception(
                "Could not setup udev rules, modules may not be detected")

    if kwargs.get('hardware_server'):
        if ff.use_protocol_api_v2():
            loop.run_until_complete(
                install_hardware_server(kwargs['hardware_server_socket'],
                                        hardware._api))
        else:
            log.warning(
                "Hardware server requested but apiv1 selected, not starting")
    server.run(
        hardware,
        kwargs.get('hostname'),
        kwargs.get('port'),
        kwargs.get('path'),
        loop)
예제 #3
0
    def __init__(self,
                 point_set,
                 hardware,
                 pickup_tip=None,
                 loop=None,
                 log_level=None):
        # URWID user interface objects
        if not loop:
            loop = asyncio.get_event_loop()
        loop = urwid.main_loop.AsyncioEventLoop(loop=loop)

        controls = '\n'.join([
            'arrow keys: move the gantry',
            'q/a:        move the pipette up/down',
            '=/-:        increase/decrease the distance moved on each step',
            '1/2/3:      go to calibration point 1/2/3',
            'enter:      confirm current calibration point position',
            'space:      save data (after confirming all 3 points)',
            'p:          perform tip probe (after saving calibration data)',
            'esc:        exit calibration tool',
            '?:          Full Instructions'
        ])
        self._tip_text_box = urwid.Text(controls)
        self._status_text_box = urwid.Text('')
        self._pile = urwid.Pile([self._tip_text_box, self._status_text_box])
        self._filler = urwid.Filler(self._pile, 'top')
        self.hardware = hardware
        self._pipettes = {}
        if not feature_flags.use_protocol_api_v2():
            self._current_mount = right
        else:
            self._current_mount = types.Mount.RIGHT

        self.update_pipette_models()
        self.current_transform = identity_deck_transform()
        self._tip_length = DEFAULT_TIP_LENGTH
        # Other state
        if not pickup_tip:
            self._tip_length =\
                self._pipettes[self._current_mount]._fallback_tip_length
            if feature_flags.use_protocol_api_v2():
                self.hardware.add_tip(types.Mount.RIGHT, self._tip_length)
                if self._pipettes[types.Mount.LEFT]:
                    self.hardware.add_tip(
                        types.Mount.LEFT,
                        self._pipettes[types.Mount.LEFT]._fallback_tip_length)
            else:
                for pip in self._pipettes.values():
                    if pip:
                        pip._add_tip(pip._tip_length)

        self.current_position = (0, 0, 0)
        self._steps = [0.1, 0.25, 0.5, 1, 5, 10, 20, 40, 80]
        self._steps_index = 2
        self._current_point = 1
        self.model_offset = self._pipettes[self._current_mount].model_offset
        deck_height = 0
        if not feature_flags.use_protocol_api_v2():
            deck_height = self._tip_length

        self.actual_points = {1: (0, 0), 2: (0, 0), 3: (0, 0)}

        self._expected_points = self.set_deck_height_expected_points(
            deck_height, point_set)
        self._test_points = self.set_deck_height_test_points(deck_height)

        slot5 = self._test_points['slot5']
        log_val = self.hardware.config.log_level
        if log_level:
            log_val = log_level.upper()
        logging_config.log_init(log_val)
        self.key_map = {
            '-':
            lambda: self.decrease_step(),
            '=':
            lambda: self.increase_step(),
            'z':
            lambda: self.save_z_value(),
            'p':
            lambda: self.probe(slot5),
            'enter':
            lambda: self.save_point(),
            '\\':
            lambda: self.home(),
            ' ':
            lambda: self.save_transform(),
            'esc':
            lambda: self.exit(),
            'q':
            lambda: self._jog(self._current_mount, +1, self.current_step()),
            'a':
            lambda: self._jog(self._current_mount, -1, self.current_step()),
            'n':
            lambda: self.update_pipette_models(),
            'up':
            lambda: self._jog('Y', +1, self.current_step()),
            'down':
            lambda: self._jog('Y', -1, self.current_step()),
            'left':
            lambda: self._jog('X', -1, self.current_step()),
            'right':
            lambda: self._jog('X', +1, self.current_step()),
            'm':
            lambda: self.validate_mount_offset(),
            's':
            lambda: self.switch_mounts(),
            't':
            lambda: self.try_pickup_tip(),
            '1':
            lambda: self.validate(self._expected_points[1], 1, self.
                                  _current_mount),
            '2':
            lambda: self.validate(self._expected_points[2], 2, self.
                                  _current_mount),
            '3':
            lambda: self.validate(self._expected_points[3], 3, self.
                                  _current_mount),
            '4':
            lambda: self.validate(self._test_points['slot5'], 4, self.
                                  _current_mount),
            '5':
            lambda: self.validate(self._test_points['corner3'], 5, self.
                                  _current_mount),
            '6':
            lambda: self.validate(self._test_points['corner8'], 6, self.
                                  _current_mount),
            '7':
            lambda: self.validate(self._test_points['corner9'], 7, self.
                                  _current_mount),
            '?':
            lambda: self.print_instructions(),
        }

        self.ui_loop = urwid.MainLoop(self._filler,
                                      handle_mouse=False,
                                      unhandled_input=self._on_key_press,
                                      event_loop=loop)
        log.debug("Starting gantry calibration command line interface (CLI)")