Source code for genericroboticarm.sila_server.feature_implementations.robotcontroller_impl
# Generated by sila2.code_generator; sila2.__version__: 0.10.4
from __future__ import annotations
from typing import TYPE_CHECKING
from sila2.server import MetadataDict, ObservableCommandInstance
from ..generated.robotcontroller import (
EmergencyStop_Responses,
LostPlate,
MovePlate_Responses,
MoveToPosition_Responses,
PickPlate_Responses,
PlacePlate_Responses,
Reinitialize_Responses,
RobotControllerBase,
SetAcceleration_Responses,
SetSpeed_Responses,
Site,
)
from datetime import datetime
if TYPE_CHECKING:
from ..server import Server
[docs]
def _raise_if_gripping_plate(robot) -> None:
"""
Guard against starting a pick while a plate is already held: the pick would open the
gripper at the current location and drop it. Only robots that can report their gripper
state (e.g. the PreciseFlex) are checked; others are left untouched.
"""
if getattr(robot, "currently_gripping_plate", False):
raise LostPlate(
"Refusing to pick a plate: the gripper is already holding one. Picking now "
"would open the gripper and drop the held plate. Recover the held plate first."
)
[docs]
class RobotControllerImpl(RobotControllerBase):
def __init__(self, parent_server: Server) -> None:
super().__init__(parent_server=parent_server)
self.robot = parent_server.robot
[docs]
def Reinitialize(self, *, metadata: MetadataDict) -> Reinitialize_Responses:
with self.parent_server.robot_command():
self.robot.init_connection()
[docs]
def PickPlate(self, Site: Site, *, metadata: MetadataDict) -> PickPlate_Responses:
with self.parent_server.robot_command():
_raise_if_gripping_plate(self.robot)
self.robot.pick_from_device(*Site)
[docs]
def PlacePlate(self, Site: Site, *, metadata: MetadataDict) -> PlacePlate_Responses:
with self.parent_server.robot_command():
self.robot.place_at_device(*Site)
[docs]
def SetSpeed(self, Percentage: float, *, metadata: MetadataDict) -> SetSpeed_Responses:
self.robot.set_speed(Percentage)
[docs]
def SetAcceleration(self, Percentage: float, *, metadata: MetadataDict) -> SetAcceleration_Responses:
self.robot.set_acceleration(Percentage)
[docs]
def EmergencyStop(self, *, metadata: MetadataDict) -> EmergencyStop_Responses:
self.robot.stop_moving()
[docs]
def MoveToPosition(
self, Position: str, *, metadata: MetadataDict, instance: ObservableCommandInstance
) -> MoveToPosition_Responses:
with self.parent_server.robot_command():
instance.begin_execution() # set execution status from `waiting` to `running`
self.robot.move_to_position(Position)
[docs]
def MovePlate(
self, OriginSite: Site, DestinationSite: Site, *, metadata: MetadataDict, instance: ObservableCommandInstance
) -> MovePlate_Responses:
with self.parent_server.robot_command():
instance.begin_execution() # set execution status from `waiting` to `running`
print(f"{datetime.now()}: Moving a plate from {OriginSite} to {DestinationSite}")
_raise_if_gripping_plate(self.robot)
self.robot.pick_from_device(*OriginSite)
self.robot.place_at_device(*DestinationSite)