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)
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
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))
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]) )
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))
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']) }
# 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')] }
# 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) }