Example #1
0
	def board_connect(self):
		""" Connect to the board """
		try:
			self.conn = connect(self.host, self.port)
			self.RP = RedPitaya(self.conn)
		except Exception as e:
			self.connection_error(e)
		else:
			self.set_state_ok(DevState.ON)
 def init_device(self):
     """Initialize the device."""
     # Initialize variables
     self.deadline = None
     self.interface = None
     self.connection = None
     self.waveform1 = None
     self.waveform2 = None
     # Initialize settings
     self.trigger = None
     self.decimation = None
     self.frequency = None
     self.time_range = None
     self.time_position = None
     self.delay_length = None
     # Initialize hardware
     try:
         context = 'parsing properties'
         super(RpScope, self).init_device()
         context = 'connecting to the red pitaya'
         self.connection = connect(self.Host, self.port)
         context = 'instantiating interface'
         self.interface = RedPitaya(self.connection).scope
         context = 'setting trigger source and edge'
         self.trigger = self.interface.trigger_source = \
             self.TRIGGER_DICT[self.TriggerSource, self.TriggerEdge]
         context = 'setting trigger level'
         self.interface.threshold_ch1 = self.volts_to_int(self.TriggerLevel)
         self.interface.threshold_ch2 = self.volts_to_int(self.TriggerLevel)
         context = 'finding settings'
         settings = find_settings(self.TimeRange, self.TimePosition)
         self.decimation, self.frequency, self.time_range, \
             self.time_position, self.delay_length = settings
         context = 'setting trigger delay'
         self.interface.trigger_delay = BASE_LENGTH - self.delay_length
         context = 'setting decimation'
         self.interface.decimation = self.decimation
         context = 'building time base'
         self.time_base = self.build_time_base()
         context = 'running first acquisition'
         self.check_acquisition()
     # Fault state
     except Exception as exc:
         return self.register_exception(exc, context)
     # Running state
     else:
         self.set_state(DevState.RUNNING)
         self.set_status("Red pitaya connected, configured and running.")
Example #3
0
#---------------------------------------------------
# INITILISATION DU REDPITAYA
#
rediptayaIP = "172.16.6.41"  # ip redpitaya

#---------------------------------------------------
# MAIN NE PAS MODIFIER

if __name__ == '__main__':

    if PIDtype == 1 or PIDtype == 2:

        #Penser a demarer le server sur le  REDPITAYA (commande : rpyc_server)
        #Demarage de la connexion avec le REDPITAYA
        conn = connect(rediptayaIP, port=18861)
        redpitaya = RedPitaya(conn)  # connexion

        # setup de 2 voie d'adc du REDPITAYA
        redpitaya.scope.setup(frequency=100, trigger_source=1)

        # setup du DAC du REDPITAYA
        redpitaya.asga.scale = 2**13
        redpitaya.asga.offset = 0
        redpitaya.asga.frequency = 0.1
        redpitaya.asga.sm_onetimetrigger = True
        redpitaya.asga.sm_wrappointer = False
        redpitaya.asga.output_zero = False
        redpitaya.asga.sm_reset = False

    else:
        device.read_attribute(attribute)
class RpScope(Device):
    """Tango Device for a Red Pitaya charge transformer.

    Device states description:
        - **DevState.RUNNING**: the board is acquiring
        - **DevState.FAULT**: any error
    """
    __metaclass__ = DeviceMeta

    # Constants
    SOURCES = ['CHA', 'CHB', 'EXT']
    EDGES = ['PE', 'NE']
    TRIGGERS = [
        TriggerSource.chA_posedge,
        TriggerSource.chA_negedge,
        TriggerSource.chB_posedge,
        TriggerSource.chB_negedge,
        TriggerSource.ext_posedge,
        TriggerSource.ext_negedge]
    TRIGGER_DICT = dict(zip(itertools.product(SOURCES, EDGES), TRIGGERS))

    # Settings
    port = 18861
    acquisition_timeout = 2.0

    # Device properties

    Host = device_property(
        dtype=str,
        doc='Host name of the RedPitaya.')

    TriggerSource = device_property(
        dtype=str,
        default_value='CHA',
        doc="Can be CHA for channel A, CHB for channel B or EXT for external.")

    TriggerEdge = device_property(
        dtype=str,
        default_value='PE',
        doc="Can be PE for positive edge or NE for negative edge.")

    TriggerLevel = device_property(
        dtype=float,
        default_value=0.0,
        doc="Trigger level in volts.")

    TimeRange = device_property(
        dtype=float,
        default_value=1e-3,
        doc="Minimum time range for the waveforms.")

    TimePosition = device_property(
        dtype=float,
        default_value=0.0,
        doc="Minimum time position for the waveforms")

    Gain = device_property(
        dtype=float,
        default_value=1.0)

    Offset = device_property(
        dtype=float,
        default_value=0.0)

    # Waveform attributes

    Waveform1 = attribute(
        dtype=(float,),
        max_dim_x=10**6,
        label='Waveform 1',
        doc="Waveform on channel 1.")

    def read_Waveform1(self):
        return self.waveform1

    def is_Waveform1_allowed(self, attr):
        return self.connected

    Waveform2 = attribute(
        dtype=(float,),
        max_dim_x=10**6,
        label='Waveform 2',
        doc="Waveform on channel 2.")

    def read_Waveform2(self):
        return self.waveform2

    def is_Waveform2_allowed(self, attr):
        return self.connected

    TimeBase = attribute(
        dtype=(float,),
        max_dim_x=10**6,
        label='Time base',
        doc="Time base for the waveforms")

    def read_TimeBase(self):
        return self.timebase

    def is_TimeBase_allowed(self, attr):
        return self.connected

    # State methods

    @property
    def connected(self):
        return self.get_state() != DevState.FAULT

    def register_exception(self, exc, context=None, method=None):
        if context is not None:
            status = 'Exception while {0}: {1!r}'.format(context, exc)
        elif method is not None:
            status = "Exception in '{0}': {1!r}".format(method.__name__, exc)
        else:
            status = 'Exception: {1!r}'.format(exc)
        self.error_stream(status)
        self.debug_stream(traceback.format_exc().replace('%', '%%'))
        self.set_status(status)
        self.set_state(DevState.FAULT)

    # Initialization and deletion

    def get_device_properties(self):
        super(RpScope, self).get_device_properties()
        if self.TriggerSource not in self.SOURCES:
            msg = "'{0}' is not a valid trigger source"
            raise ValueError(msg.format(self.TriggerSource))
        if self.TriggerEdge not in self.EDGES:
            msg = "'{0}' is not a valid trigger edge"
            raise ValueError(msg.format(self.TriggerEdge))

    def init_device(self):
        """Initialize the device."""
        # Initialize variables
        self.deadline = None
        self.interface = None
        self.connection = None
        self.waveform1 = None
        self.waveform2 = None
        # Initialize settings
        self.trigger = None
        self.decimation = None
        self.frequency = None
        self.time_range = None
        self.time_position = None
        self.delay_length = None
        # Initialize hardware
        try:
            context = 'parsing properties'
            super(RpScope, self).init_device()
            context = 'connecting to the red pitaya'
            self.connection = connect(self.Host, self.port)
            context = 'instantiating interface'
            self.interface = RedPitaya(self.connection).scope
            context = 'setting trigger source and edge'
            self.trigger = self.interface.trigger_source = \
                self.TRIGGER_DICT[self.TriggerSource, self.TriggerEdge]
            context = 'setting trigger level'
            self.interface.threshold_ch1 = self.volts_to_int(self.TriggerLevel)
            self.interface.threshold_ch2 = self.volts_to_int(self.TriggerLevel)
            context = 'finding settings'
            settings = find_settings(self.TimeRange, self.TimePosition)
            self.decimation, self.frequency, self.time_range, \
                self.time_position, self.delay_length = settings
            context = 'setting trigger delay'
            self.interface.trigger_delay = BASE_LENGTH - self.delay_length
            context = 'setting decimation'
            self.interface.decimation = self.decimation
            context = 'building time base'
            self.time_base = self.build_time_base()
            context = 'running first acquisition'
            self.check_acquisition()
        # Fault state
        except Exception as exc:
            return self.register_exception(exc, context)
        # Running state
        else:
            self.set_state(DevState.RUNNING)
            self.set_status("Red pitaya connected, configured and running.")

    def build_time_base(self):
        start = -self.time_position
        step = self.frequency
        stop = BASE_LENGTH * step + start
        return np.arange(start, step, stop)

    def prepare_acquisition(self):
        self.interface.reset_writestate_machine()
        self.interface.trigger_source = self.trigger
        self.interface.arm_trigger()
        time.sleep(self.time_position)
        self.deadline = time.time() + self.acquisition_timeout

    def check_acquisition(self):
        if self.deadline is None:
            self.prepare_acquisition()
        if time.time() > self.deadline:
            raise RuntimeError("Acquisition timed out")
        if self.interface.trigger_source != 0:
            return False
        self.get_waveforms()
        self.prepare_acquisition()
        return True

    def get_waveforms(self):
        # Acquire waveforms
        raw1, raw2 = self.interface.rawdata_ch1, self.interface.rawdata_ch2
        # Fix PyRedPitaya bug
        raw1[raw1 >= 2**13] -= 2**14
        raw2[raw2 >= 2**13] -= 2**14
        # Roll and convert waveforms
        offset = self.delay_length - int(self.interface.write_pointer_trigger)
        self.waveform1 = self.int_to_volts(np.roll(raw1, offset))
        self.waveform2 = self.int_to_volts(np.roll(raw2, offset))

    def int_to_volts(self, value):
        normalized = value / float(2**14)
        return normalized * self.Gain + self.Offset

    def volts_to_int(self, value):
        normalized = (value - self.Offset) / self.Gain
        return int(normalized * 2**14)

    def delete_device(self):
        """Delete device."""
        try:
            if self.connection:
                self.connection.close()
        except Exception as exc:
            self.register_exception(exc, 'closing connection')
        finally:
            self.connection = None
            self.interface = None

    # Commands

    @command
    def PolledRun(self):
        """Poll this command for continuous acquisition."""
        try:
            self.check_acquisition()
        except Exception as exc:
            self.register_exception(exc, 'checking acquisition')

    def is_PolledRun_allowed(self):
        return self.get_state() == DevState.RUNNING

    @command
    def RunSingle(self):
        """Run a single acquisition."""
        try:
            self.prepare_acquisition()
            while not self.check_acquisition():
                pass
        except Exception as exc:
            self.register_exception(exc, 'running acquisition')

    def is_RunSingle_allowed(self):
        return self.get_state() == DevState.RUNNING

    # Run class method

    @classmethod
    def run_server(cls, args=None, **kwargs):
        """Run the class as a device server.
        It is based on the PyTango.server.run method.

        The difference is that the device class
        and server name are automatically given.

        Args:
            args (iterable): args as given in the PyTango.server.run method
                             without the server name. If None, the sys.argv
                             list is used
            kwargs: the other keywords argument are as given
                    in the PyTango.server.run method.
        """
        if args is None:
            args = sys.argv[1:]
        args = [cls.__name__] + list(args)
        return server.run((cls,), args, **kwargs)