Beispiel #1
0
async def robot_joints_event(robot_inst: Robot) -> None:

    logger.info(f"Sending joints for {robot_inst.name} started.")
    while scene_started() and glob.ROBOT_JOINTS_REGISTERED_UIS[robot_inst.id]:

        start = time.monotonic()

        try:
            evt = RobotJoints(RobotJoints.Data(robot_inst.id, (await robot.get_robot_joints(robot_inst, None, True))))
        except Arcor2Exception as e:
            logger.error(f"Failed to get joints for {robot_inst.name}. {str(e)}")
            await asyncio.sleep(1)
            continue

        evt_json = evt.to_json()
        await asyncio.gather(
            *[ws_server.send_json_to_client(ui, evt_json) for ui in glob.ROBOT_JOINTS_REGISTERED_UIS[robot_inst.id]]
        )

        end = time.monotonic()
        await asyncio.sleep(EVENT_PERIOD - (end - start))

    ROBOT_JOINTS_TASKS.pop(robot_inst.id, None)

    # TODO notify UIs that registration was cancelled
    glob.ROBOT_JOINTS_REGISTERED_UIS.pop(robot_inst.id, None)

    logger.info(f"Sending joints for {robot_inst.name} stopped.")
Beispiel #2
0
async def robot_eef_pose_event(robot_inst: Robot) -> None:

    global EEF_POSE_TASKS

    glob.logger.info(f"Sending '{sevts.r.RobotEef.__name__}' for robot '{robot_inst.id}' started.")

    while scene_started() and glob.ROBOT_EEF_REGISTERED_UIS[robot_inst.id]:

        start = time.monotonic()

        evt = sevts.r.RobotEef(sevts.r.RobotEef.Data(robot_inst.id))

        try:
            evt.data.end_effectors = await asyncio.gather(
                *[eef_pose(robot_inst, eef_id) for eef_id in (await robot.get_end_effectors(robot_inst))]
            )
        except Arcor2Exception as e:
            glob.logger.error(f"Failed to get eef pose for {robot_inst.id}. {str(e)}")
            break

        evt_json = evt.to_json()
        await asyncio.gather(
            *[ws_server.send_json_to_client(ui, evt_json) for ui in glob.ROBOT_EEF_REGISTERED_UIS[robot_inst.id]]
        )

        end = time.monotonic()
        await asyncio.sleep(EVENT_PERIOD - (end - start))

    del EEF_POSE_TASKS[robot_inst.id]

    # TODO notify UIs that registration was cancelled
    del glob.ROBOT_EEF_REGISTERED_UIS[robot_inst.id]

    glob.logger.info(f"Sending '{sevts.r.RobotEef.__name__}' for robot '{robot_inst.id}' stopped.")
Beispiel #3
0
async def robot_joints_event(robot_inst: Robot) -> None:

    global ROBOT_JOINTS_TASKS

    glob.logger.info(f"Sending '{sevts.r.RobotJoints.__name__}' for robot '{robot_inst.id}' started.")
    while scene_started() and glob.ROBOT_JOINTS_REGISTERED_UIS[robot_inst.id]:

        start = time.monotonic()

        try:
            evt = sevts.r.RobotJoints(
                sevts.r.RobotJoints.Data(robot_inst.id, (await robot.get_robot_joints(robot_inst)))
            )
        except Arcor2Exception as e:
            glob.logger.error(f"Failed to get joints for {robot_inst.id}. {str(e)}")
            break

        evt_json = evt.to_json()
        await asyncio.gather(
            *[ws_server.send_json_to_client(ui, evt_json) for ui in glob.ROBOT_JOINTS_REGISTERED_UIS[robot_inst.id]]
        )

        end = time.monotonic()
        await asyncio.sleep(EVENT_PERIOD - (end - start))

    del ROBOT_JOINTS_TASKS[robot_inst.id]

    # TODO notify UIs that registration was cancelled
    del glob.ROBOT_JOINTS_REGISTERED_UIS[robot_inst.id]

    glob.logger.info(f"Sending '{sevts.r.RobotJoints.__name__}' for robot '{robot_inst.id}' stopped.")
Beispiel #4
0
async def broadcast_event(event: events.Event) -> None:

    logger.debug(event)

    if glob.USERS.interfaces:
        message = event.to_json()
        await asyncio.gather(*[ws_server.send_json_to_client(intf, message) for intf in glob.USERS.interfaces])
Beispiel #5
0
async def broadcast_event(
        event: events.Event,
        exclude_ui: Optional[WebSocketServerProtocol] = None) -> None:

    if (exclude_ui is None
            and glob.INTERFACES) or (exclude_ui and len(glob.INTERFACES) > 1):
        message = event.to_json()
        await asyncio.gather(*[
            ws_server.send_json_to_client(intf, message)
            for intf in glob.INTERFACES if intf != exclude_ui
        ])
Beispiel #6
0
async def robot_eef_pose_event(robot_inst: Robot) -> None:

    eefs: dict[Optional[str], set[str]] = {}

    try:
        try:
            for arm_id in await robot.get_arms(robot_inst):
                eefs[arm_id] = await robot.get_end_effectors(robot_inst, arm_id)
        except robot.SingleArmRobotException:
            eefs = {None: await robot.get_end_effectors(robot_inst, None)}
    except Arcor2Exception as e:
        logger.error(f"Failed to start sending poses for {robot_inst.name}. {str(e)}")
    else:

        logger.info(f"Sending poses for {robot_inst.name} started. Arms/EEFs: {eefs}.")

        while scene_started() and glob.ROBOT_EEF_REGISTERED_UIS[robot_inst.id]:

            start = time.monotonic()

            evt = RobotEef(RobotEef.Data(robot_inst.id))

            try:
                evt.data.end_effectors = await asyncio.gather(
                    *[eef_pose(robot_inst, eef_id, arm_id) for arm_id in eefs.keys() for eef_id in eefs[arm_id]]
                )
            except Arcor2Exception as e:
                logger.error(f"Failed to get eef pose for {robot_inst.name}. {str(e)}")
                await asyncio.sleep(1)
                continue

            evt_json = evt.to_json()
            await asyncio.gather(
                *[ws_server.send_json_to_client(ui, evt_json) for ui in glob.ROBOT_EEF_REGISTERED_UIS[robot_inst.id]]
            )

            end = time.monotonic()
            await asyncio.sleep(EVENT_PERIOD - (end - start))

    EEF_POSE_TASKS.pop(robot_inst.id, None)

    # TODO notify UIs that registration was cancelled
    glob.ROBOT_EEF_REGISTERED_UIS.pop(robot_inst.id, None)

    logger.info(f"Sending poses for {robot_inst.name} stopped.")
Beispiel #7
0
async def handle_manager_incoming_messages(manager_client) -> None:

    event_mapping: Dict[str, Type[events.Event]] = {
        evt.__name__: evt
        for evt in EXE_EVENTS
    }
    rpc_mapping: Dict[str, Type[rpc.common.RPC]] = {
        r.__name__: r
        for r in EXE_RPCS
    }

    try:

        async for message in manager_client:

            msg = json.loads(message)

            if "event" in msg:

                if glob.USERS.interfaces:
                    await asyncio.gather(*[
                        ws_server.send_json_to_client(intf, message)
                        for intf in glob.USERS.interfaces
                    ])

                try:
                    evt = event_mapping[msg["event"]].from_dict(msg)
                except ValidationError as e:
                    glob.logger.error("Invalid event: {}, error: {}".format(
                        msg, e))
                    continue

                if isinstance(evt, events.PackageInfo):
                    glob.PACKAGE_INFO = evt.data
                elif isinstance(evt, events.PackageState):
                    glob.PACKAGE_STATE = evt.data

                    if evt.data.state == events.PackageState.Data.StateEnum.STOPPED:

                        if not glob.TEMPORARY_PACKAGE:
                            # after (ordinary) package is finished, show list of packages
                            glob.MAIN_SCREEN = evts.c.ShowMainScreen.Data(
                                evts.c.ShowMainScreen.Data.WhatEnum.
                                PackagesList)
                            await notif.broadcast_event(
                                evts.c.ShowMainScreen(
                                    evts.c.ShowMainScreen.Data(
                                        evts.c.ShowMainScreen.Data.WhatEnum.
                                        PackagesList, evt.data.package_id)))

                        # temporary package is handled elsewhere
                        server_events.package_stopped.set()
                        server_events.package_started.clear()

                        glob.ACTION_STATE_BEFORE = None
                        glob.PACKAGE_INFO = None

                    else:
                        server_events.package_stopped.clear()
                        server_events.package_started.set()

                elif isinstance(evt, events.ActionStateBefore):
                    glob.ACTION_STATE_BEFORE = evt.data

            elif "response" in msg:

                # TODO handle potential errors
                rpc_cls = rpc_mapping[msg["response"]]
                resp = rpc_cls.Response.from_dict(msg)
                exe.MANAGER_RPC_RESPONSES[resp.id].put_nowait(resp)

    except websockets.exceptions.ConnectionClosed:
        glob.logger.error("Connection to manager closed.")