示例#1
0
    def Get_NumberOfPositions(self, request, context: grpc.ServicerContext) \
            -> ValvePositionController_pb2.Get_NumberOfPositions_Responses:
        """
        Requests the unobservable property Number Of Positions
            The number of the valve positions available.

        :param request: An empty gRPC request object (properties have no parameters)
        :param context: gRPC :class:`~grpc.ServicerContext` object providing gRPC-specific information

        :returns: A response object with the following fields:
            NumberOfPositions (Number Of Positions): The number of the valve positions available.
        """

        # initialise the return value
        return_value: ValvePositionController_pb2.Get_NumberOfPositions_Responses = None

        # TODO:
        #   Add implementation of Simulation for property NumberOfPositions here and write the resulting response
        #   in return_value

        # fallback to default
        if return_value is None:
            return_value = ValvePositionController_pb2.Get_NumberOfPositions_Responses(
                #**default_dict['Get_NumberOfPositions_Responses']
                NumberOfPositions=silaFW_pb2.Integer(value=1)
            )

        return return_value
    def Subscribe_Position(self, request, context: grpc.ServicerContext) \
            -> ValvePositionController_pb2.Subscribe_Position_Responses:
        """
        Requests the observable property Position
            The current logical valve position. This is a value between 0 and NumberOfPositions - 1.

        :param request: An empty gRPC request object (properties have no parameters)
        :param context: gRPC :class:`~grpc.ServicerContext` object providing gRPC-specific information

        :returns: A response object with the following fields:
            Position (Position): The current logical valve position. This is a value between 0 and NumberOfPositions - 1.
        """

        valve = self._get_valve(context.invocation_metadata(), "Property")

        new_valve_position = self._get_valve_position(valve)
        valve_position = new_valve_position + 1 # force sending the first value
        while not self.system.state.shutting_down():
            if self.system.state.is_operational():
                new_valve_position = self._get_valve_position(valve)
            if new_valve_position != valve_position:
                valve_position = new_valve_position
                yield ValvePositionController_pb2.Subscribe_Position_Responses(
                    Position=silaFW_pb2.Integer(value=valve_position)
                )
            # we add a small delay to give the client a chance to keep up.
            time.sleep(0.1)
示例#3
0
    def Subscribe_Position(self, request, context: grpc.ServicerContext) \
            -> ValvePositionController_pb2.Subscribe_Position_Responses:
        """
        Requests the observable property Position
            The current logical valve position. This is a value between 0 and NumberOfPositions - 1.

        :param request: An empty gRPC request object (properties have no parameters)
        :param context: gRPC :class:`~grpc.ServicerContext` object providing gRPC-specific information

        :returns: A response object with the following fields:
            Position (Position): The current logical valve position. This is a value between 0 and NumberOfPositions - 1.
        """

        # initialise the return value
        return_value: ValvePositionController_pb2.Subscribe_Position_Responses = None

        # we could use a timeout here if we wanted
        while True:
            # TODO:
            #   Add implementation of Simulation for property Position here and write the resulting
            #   response in return_value

            # create the default value
            if return_value is None:
                return_value = ValvePositionController_pb2.Subscribe_Position_Responses(
                    #**default_dict['Subscribe_Position_Responses']
                    Position=silaFW_pb2.Integer(value=1)
                )


            yield return_value
示例#4
0
 def _serialize_channel_id(self, channel_id: int) -> bytes:
     """
     Converts the given Channel Index from its string representation into
     a serialized protobuf message
     """
     return pb2.Metadata_ChannelIndex(ChannelIndex=silaFW_pb2.Integer(
         value=channel_id)).SerializeToString()
    def SwitchToPosition(self,
                         valve_id: int,
                         Position: int = 1):  # -> (ValvePositionController):
        """
        Wrapper to call the unobservable command SwitchToPosition on the server.

        :param valve_id: The index of the valve to use. Will be sent along as metadata
                        of the call
        :param Position: The target position that the valve should be switched to.

        :returns: A gRPC object with the response that has been defined for this command.
        """
        # noinspection PyUnusedLocal - type definition, just for convenience
        grpc_err: grpc.Call

        logging.debug(f"Calling SwitchToPosition for valve {valve_id}:")
        try:
            parameter = ValvePositionController_pb2.SwitchToPosition_Parameters(
                Position=silaFW_pb2.Integer(value=Position))
            metadata = ((METADATA_VALVE_INDEX,
                         self._serialize_valve_id(valve_id)), )

            response = self.ValvePositionController_stub.SwitchToPosition(
                parameter, metadata=metadata)
            logging.debug(f"SwitchToPosition response: {response}")

        except grpc.RpcError as grpc_err:
            self.grpc_error_handling(grpc_err)
            return None

        return
 def _serialize_valve_id(self, valve_id: int) -> bytes:
     """
     Converts the given Valve Index from its integer representation into
     a serialized protobuf message
     """
     return ValveGatewayService_pb2.Metadata_ValveIndex(
         ValveIndex=silaFW_pb2.Integer(value=valve_id)).SerializeToString()
    def Get_NumberOfValves(self, request, context: grpc.ServicerContext) \
            -> ValveGatewayService_pb2.Get_NumberOfValves_Responses:
        """
        Requests the unobservable property Number Of Valves
            The number of valves of a terminal

        :param request: An empty gRPC request object (properties have no parameters)
        :param context: gRPC :class:`~grpc.ServicerContext` object providing gRPC-specific information

        :returns: A response object with the following fields:
            NumberOfValves (Number Of Valves): The number of valves of a terminal
        """

        return ValveGatewayService_pb2.Get_NumberOfValves_Responses(
            NumberOfValves=silaFW_pb2.Integer(value=self.num_valves))
示例#8
0
    def Get_NumberOfChannels(self, request, context: grpc.ServicerContext) \
            -> AnalogOutChannelController_pb2.Get_NumberOfChannels_Responses:
        """
        Requests the unobservable property Number Of Channels
            The number of analog output channels. This value is 0-indexed, i.e. the first channel has index 0, the second one index 1 and so on.

        :param request: An empty gRPC request object (properties have no parameters)
        :param context: gRPC :class:`~grpc.ServicerContext` object providing gRPC-specific information

        :returns: A response object with the following fields:
            NumberOfChannels (Number Of Channels): The number of analog output channels. This value is 0-indexed, i.e. the first channel has index 0, the second one index 1 and so on.
        """

        logging.debug(
            "Property NumberOfChannels requested in {current_mode} mode".
            format(current_mode=(
                'simulation' if self.simulation_mode else 'real')))
        return AnalogOutChannelController_pb2.Get_NumberOfChannels_Responses(
            NumberOfChannels=silaFW_pb2.Integer(value=self.num_channels))
    def Get_NumberOfPositions(self, request, context: grpc.ServicerContext) \
            -> ValvePositionController_pb2.Get_NumberOfPositions_Responses:
        """
        Requests the unobservable property Number Of Positions
            The number of the valve positions available.

        :param request: An empty gRPC request object (properties have no parameters)
        :param context: gRPC :class:`~grpc.ServicerContext` object providing gRPC-specific information

        :returns: A response object with the following fields:
            NumberOfPositions (Number Of Positions): The number of the valve positions available.
        """

        valve = self._get_valve(context.invocation_metadata(), "Property")
        if valve not in self.valve_positions:
            self.valve_positions[valve] = valve.number_of_valve_positions()

        return ValvePositionController_pb2.Get_NumberOfPositions_Responses(
            NumberOfPositions=silaFW_pb2.Integer(value=self.valve_positions[valve])
        )
示例#10
0
    def RunProtocol(self, request, context: grpc.ServicerContext) \
            -> Ot2Controller_pb2.RunProtocol_Responses:
        """
        Executes the unobservable command "Run Protocol"
            Runs the given Protocol on the OT-2.

        :param request: gRPC request containing the parameters passed:
            request.ProtocolFile (Protocol File): The file name of the Protocol to run.
            request.IsSimulating (Is Simulating): Defines whether the protocol gets just simulated or actually executed.
        :param context: gRPC :class:`~grpc.ServicerContext` object providing gRPC-specific information

        :returns: The return object defined for the command with the following fields:
            request.ReturnValue (Return Value): The returned value.
        """
        is_simulating: bool = request.IsSimulating.value
        if is_simulating:
            cmd: str = "python3 -m opentrons.simulate " + USER_STORAGE_DIR + request.ProtocolFile.value
        else:
            cmd: str = "python3 -m opentrons.execute " + USER_STORAGE_DIR + request.ProtocolFile.value

        logging.debug(f"run '{cmd}'")
        ssh_stdin, ssh_stdout, ssh_stderr = self.ssh.exec_command(cmd)

        for line in ssh_stderr.readlines():
            print(line, end='')

        for line in ssh_stdout.readlines():
            print(line, end='')

        run_ret: int = ssh_stdout.channel.recv_exit_status()
        logging.debug("run returned '" + str(run_ret) + "'")

        if is_simulating and run_ret != 0:
            raise ValueError("The simulation of the protocol was not successful.")

        return Ot2Controller_pb2.RunProtocol_Responses(ReturnValue=silaFW_pb2.Integer(value=run_ret))
示例#11
0
import sila2lib.framework.SiLABinaryTransfer_pb2 as silaBinary_pb2
from .gRPC import AxisSystemPositionController_pb2 as pb2

# initialise the default dictionary so we can add keys.
#   We need to do this separately/add keys separately, so we can access keys already defined e.g.
#   for the use in data type identifiers
default_dict = dict()
default_dict['DataType_Position'] = {
    'Position':
    pb2.DataType_Position.Position_Struct(X=silaFW_pb2.Real(value=1.0),
                                          Y=silaFW_pb2.Real(value=1.0))
}

default_dict['MoveToPosition_Parameters'] = {
    'Position': pb2.DataType_Position(**default_dict['DataType_Position']),
    'Velocity': silaFW_pb2.Integer(value=1)
}

default_dict['MoveToPosition_Responses'] = {}

default_dict['MoveToHomePosition_Parameters'] = {}

default_dict['MoveToHomePosition_Responses'] = {}

default_dict['StopMoving_Parameters'] = {}

default_dict['StopMoving_Responses'] = {}

default_dict['Subscribe_Position_Responses'] = {
    'Position': pb2.DataType_Position(**default_dict['DataType_Position'])
}
示例#12
0
# This file contains default values that are used for the implementations to supply them with
#   working, albeit mostly useless arguments.
#   You can also use this file as an example to create your custom responses. Feel free to remove
#   Once you have replaced every occurrence of the defaults with more reasonable values.
#   Or you continue using this file, supplying good defaults..

# import the required packages
import sila2lib.framework.SiLAFramework_pb2 as silaFW_pb2
import sila2lib.framework.SiLABinaryTransfer_pb2 as silaBinary_pb2
from .gRPC import ValveGatewayService_pb2 as pb2

# initialise the default dictionary so we can add keys.
#   We need to do this separately/add keys separately, so we can access keys already defined e.g.
#   for the use in data type identifiers
default_dict = dict()

default_dict['Get_NumberOfValves_Responses'] = {
    'NumberOfValves': silaFW_pb2.Integer(value=1)
}

default_dict['Get_FCPAffectedByMetadata_ValveIndex_Responses'] = {
    'AffectedCalls': [silaFW_pb2.String(value='default string')]
}
#   Once you have replaced every occurrence of the defaults with more reasonable values.
#   Or you continue using this file, supplying good defaults..

# import the required packages
import sila2lib.framework.SiLAFramework_pb2 as silaFW_pb2
import sila2lib.framework.SiLABinaryTransfer_pb2 as silaBinary_pb2
from .gRPC import AnalogOutChannelController_pb2 as pb2

# initialise the default dictionary so we can add keys.
#   We need to do this separately/add keys separately, so we can access keys already defined e.g.
#   for the use in data type identifiers
default_dict = dict()

default_dict['SetOutputValue_Parameters'] = {
    'Value': silaFW_pb2.Real(value=1.0)
}

default_dict['SetOutputValue_Responses'] = {}

default_dict['Get_NumberOfChannels_Responses'] = {
    'NumberOfChannels': silaFW_pb2.Integer(value=1)
}

default_dict['Subscribe_Value_Responses'] = {
    'Value': silaFW_pb2.Real(value=1.0)
}

default_dict['Get_FCPAffectedByMetadata_ChannelIndex_Responses'] = {
    'AffectedCalls': [silaFW_pb2.String(value='default string')]
}
示例#14
0
#   You can also use this file as an example to create your custom responses. Feel free to remove
#   Once you have replaced every occurrence of the defaults with more reasonable values.
#   Or you continue using this file, supplying good defaults..

# import the required packages
import sila2lib.framework.SiLAFramework_pb2 as silaFW_pb2
import sila2lib.framework.SiLABinaryTransfer_pb2 as silaBinary_pb2
from .gRPC import ValvePositionController_pb2 as pb2

# initialise the default dictionary so we can add keys.
#   We need to do this separately/add keys separately, so we can access keys already defined e.g.
#   for the use in data type identifiers
default_dict = dict()

default_dict['SwitchToPosition_Parameters'] = {
    'Position': silaFW_pb2.Integer(value=1)
}

default_dict['SwitchToPosition_Responses'] = {}

default_dict['TogglePosition_Parameters'] = {}

default_dict['TogglePosition_Responses'] = {}

default_dict['Get_NumberOfPositions_Responses'] = {
    'NumberOfPositions': silaFW_pb2.Integer(value=1)
}

default_dict['Subscribe_Position_Responses'] = {
    'Position': silaFW_pb2.Integer(value=1)
}