U
    O%h                     @   s8   d Z ddlZddlZddlZdZdZG dd deZdS )zSCPI access to Red Pitaya.    Nz%Luka Golinar, Iztok Jeras, Miha GjurazCopyright 2023, Red Pitayac                   @   s  e Zd ZdZdZd_ddZdd Zd	d
 Zd`ddZdaddZ	dd Z
dbddZdd ZdcddZdd ZddddZdeeeeeeeeejeeeeeeedd$d%d&Zdfeeeeeeeeeeeedd'd(d)Zdgeeed*d+d,Zdheeeeeeeeeed-
d.d/Zdieeeeedd3d4d5Zed6d7d8Zdjeedd9d:d;Zeed<d=d>Zdkeeeedd?d@dAZed6dBdCZ dDdE Z!edFdGdHZ"dIdJ Z#dKdL Z$dMdN Z%dOdP Z&dQdR Z'dSdT Z(dUdV Z)dWdX Z*dYdZ Z+d[d\ Z,d]d^ Z-dS )lscpiz8SCPI class used to access Red Pitaya over an IP network.z
N  c              
   C   s   || _ || _|| _z:ttjtj| _|dk	r:| j| | j||f W n6 tj	k
r } zt
d||| W 5 d}~X Y nX dS )z{Initialize object and open IP connection.
        Host IP should be a string in parentheses, like '192.168.1.100'.
        Nz+SCPI >> connect({!s:s}:{:d}) failed: {!s:s})hostporttimeoutsocketZAF_INETZSOCK_STREAM_socketZ
settimeoutZconnecterrorprintformat)selfr   r   r   e r   C/dev/shm/golem/ActualShot/Devices/ITs/SignalLab-a/redpitaya_scpi.py__init__   s    zscpi.__init__c                 C   s   | j d k	r| j   d | _ d S N)r   closer   r   r   r   __del__!   s    

zscpi.__del__c                 C   s   |    dS )zClose IP connection.N)r   r   r   r   r   r   &   s    z
scpi.close   c                 C   sN   d}| j |d}||7 }t|dkr|dd | jkr|dd S qdS )z?Receive text string and return it after removing the delimiter. utf-8   N)r   recvdecodelen	delimiter)r   	chunksizemsgZchunkr   r   r   rx_txt*   s
    zscpi.rx_txtTc                 C   s   |  |}| | |S r   )r    check_error)r   r   stopr   r   r   r   rx_txt_check_error3   s    

zscpi.rx_txt_check_errorc                 C   s   d}d}t |dkr"| jd}q|dkr.dS d}t |dkrL| jd}q2t|}|dkr`dS d}t ||kr|| jd7 }qdt|}d}t ||k rt|t | d}|| j|7 }q|S )z% Recieve binary data from scpi serverr             #Fr   )r   r   r   intmin)r   Z
numOfBytesdataZnumOfNumBytesZr_sizer   r   r   rx_arb8   s*    zscpi.rx_arbc                 C   s   |   }| | |S r   )r*   r!   )r   r"   r)   r   r   r   rx_arb_check_errorS   s    
zscpi.rx_arb_check_errorc                 C   s   | j || j dS )z-Send text string ending and append delimiter.r   )r   Zsendallr   encoder   r   r   r   r   tx_txtX   s    zscpi.tx_txtc                 C   s   |  | | | d S r   )r.   r!   )r   r   r"   r   r   r   tx_txt_check_error\   s    
zscpi.tx_txt_check_errorc                 C   s   |  | |  S )zSend/receive text string.)r.   r    r-   r   r   r   txrx_txt`   s    
zscpi.txrx_txtc                 C   sh   t |  }|d@ rd|  }|dr(qdt| |d}t|dkr|rt |d dkrtd qd S )N   z0,,r   i%  r%   )r'   stb_qerr_n
startswithr
   splitr   exit)r   r"   reserrnr   r   r   r!   e   s    

 zscpi.check_errorsiner%     r         ?Fr'   )chanfuncvoltfreqoffsetphasedcycr)   burstncycnorperiodtrigsdrlabsiglabreturnc           (   
   C   s  ddddddddd	g	}d
dddg}d}d}d}d}d}d}|rHd}d}n|rPd}z|dks^t W n, t k
r } ztd|W 5 d}~X Y nX z| |kst W n6 t k
r } zt|  d|W 5 d}~X Y nX z||  k r|ksn t W n: t k
r2 } ztd||f d|W 5 d}~X Y nX zt||ksHt W n< t k
r } ztd| |f d|W 5 d}~X Y nX zt||kst W n< t k
r } ztd| |f d|W 5 d}~X Y nX z"d|  krdksn t W n4 t k
r2 } ztdd |W 5 d}~X Y nX zt||ksHt W n< t k
r } ztd | |f d!|W 5 d}~X Y nX |dk	rz|jd |kst W n4 t k
r } ztd"| |W 5 d}~X Y nX z|
dkst W n. t k
r  }  ztd#| W 5 d} ~ X Y nX z|dks2t W n. t k
rb }! ztd$|!W 5 d}!~!X Y nX |dk	rz|dks~t W n. t k
r }" ztd%|"W 5 d}"~"X Y nX z| |kst W n8 t k
r }# zt|  d&|#W 5 d}#~#X Y nX z|d'kr|d'krt W n. t k
rJ }$ ztd(|$W 5 d}$~$X Y nX g }%| d)| d*|   | d)| d+|  | |d,d- kr| d)| d.|  | d)| d/|  | d)| d0|  | dkr| d)| d1|  |dk	rT| dkrT|D ]}&|%|&d2 qd3tt	|%}'| d)| d4|'  |	r| d)| d5 | d)| d6|
  | d)| d7|  |dk	r| d)| d8|  n| d)| d9 | d)| d:|   dS );ui
  
        Set the parameters for signal generator on one channel.

        Parameters
        -----------
            chan (int) :
                Output channel (either 1 or 2).
            func (str, optional) :
                Waveform of the signal (SINE, SQUARE, TRIANGLE, SAWU,
                SAWD, PWM, ARBITRARY, DC, DC_NEG).
                Defaults to `sine`.
            volt (int, optional) :
                Amplitude of signal {-1, 1} Volts. {-5, 5} for SIGNALlab 250-12.
                Defaults to 1.
            freq (int, optional) :
                Frequency of signal. Not relevant if 'func' is "DC" or "DC_NEG".
                Defaults to 1000.
            offset (int, optional) :
                Signal offset {-1, 1} Volts. {-5, 5} for SIGNALlab 250-12.
                Defaults to 0.
            phase (int, optional) :
                Phase of signal {-360, 360} degrees.
                Defaults to 0.
            dcyc (float, optional) :
                Duty cycle, where 1 corresponds to 100%.
                Defaults to 0.5.
            data (ndarray, optional) :
                Numpy ``ndarray`` of max 16384 values, floats in range {-1,1}
                (or {-5,5} for SIGNALlab).
                Define the custom waveform if "func" is "ARBITRARY".
                Defaults to `None`.
            burst (bool, optional) :
                Enable/disable Burst mode. (`True` - BURST, `False` - CONINUOUS)
                Generate "nor" number of "ncyc" periods with total time "period". 
                Defaults to `False`.
            ncyc (int, optional) : 
                Number of periods in one burst.
                Defaults to 1.
            nor (int, optional) : 
                Number of repeated bursts.
                Defaults to 1.
            period (_type_, optional) :
                Total time of one burst in µs {1, 5e8}. Includes the signal and delay.
                Defaults to `None`.
            trig (str, optional):
                Trigger source (EXT_PE, EXT_NE, INT, GATED).
                Defaults to `int` (internal).
            sdrlab (bool, optional):
                `True` if operating with SDRlab 122-16.
                Defaults to `False`.
            siglab (bool, optional):
                `True` if operating with SIGNALlab 250-12.
                Defaults to `False`.

        The settings will work on any Red Pitaya board. If operating on a board
        other than STEMlab 125-14, change the bool value of the appropriate
        parameter to true (sdrlab, siglab)

        Raises
        ------

        Raises errors if the input parameters are out of range.
        
        ZSINEZSQUAREZTRIANGLEZSAWUZSAWDZPWMZ	ARBITRARYDCZDC_NEGZEXT_PEZEXT_NEZINTZGATED @  r%   ih  g    ׇAr      g    OAr%   r   !Channel needs to be either 1 or 2Nz is not a defined waveformzFrequency is out of range z HzzAmplitude is out of range  VzOffset is out of range zDuty Cycle is out of range )r   r%   zPhase is out of range z degz&Data array is too long. Max length is zNCYC minimum is 1zNOR minimum is 1u   Minimal burst period 1 µsz  is not a defined trigger sourceTz[Please select only one board option. 'siglab' and 'sdrlab' cannot be true at the same time.ZSOURz:FUNC z:VOLT    	   z
:FREQ:FIX z:VOLT:OFFS z:PHAS z:DCYC z.5f, z:TRAC:DATA:DATA z:BURS:STAT BURSTz:BURS:NCYC z
:BURS:NOR z:BURS:INT:PER z:BURS:STAT CONTINUOUSz:TRIG:SOUR )
AssertionError
ValueErrorupperabsshaper.   appendjoinmapstr)(r   r>   r?   r@   rA   rB   rC   rD   r)   rE   rF   rG   rH   rI   rJ   rK   Zwaveform_listZtrigger_listZ	buff_sizeZvolt_limZoffs_limZ	phase_limZfreq_up_limZfreq_down_limZchannel_errZwaveform_errZfreq_errZampl_errZoffs_errZdcyc_errZ	phase_errZdata_errZncyc_errZnor_errZ
period_errtrig_err	board_errZwf_datar:   Zcust_wfr   r   r   sour_sets   s    U&(**""*
"
&
zscpi.sour_set)dectrig_lvl
trig_delaytrig_delay_nsunitssample_format	averaginggaincouplingext_trig_lvlrK   input4rL   c              
   C   s  ddg}ddg}ddg}ddg}|r*d	}nd
}d}d}|dk	r\|D ]}|  dkrBd}d}qBzt||ksntW nB tk
r } z$td| |f dd| |W 5 d}~X Y nX z|dkstW n, tk
r } ztd|W 5 d}~X Y nX |dk	rLz|  |kstW n8 tk
rJ } zt|   d|W 5 d}~X Y nX |dk	rz|  |ksjtW n8 tk
r } zt|   d|W 5 d}~X Y nX |dk	r(z,|d   |kr|d   |kstW nJ tk
r& } z*t|d    d|d    d|W 5 d}~X Y nX |r|	dk	rz,|	d   |kr^|	d   |ksbtW nJ tk
r } z*t|	d    d|	d    d|W 5 d}~X Y nX zt|
|kstW n< tk
r } ztd| |f d|W 5 d}~X Y nX z|dkr|dkrtW n0 tk
rP } ztdd|W 5 d}~X Y nX | d|  |rt| d n
| d |r| d |  n| d!|  |dk	r| d"|    |dk	r| d#|    |dk	rt|D ](}| d$|d  d%||     q| d&|  |r|	dk	rt|D ](}| d$|d  d'|	|     qF| d(|
  dS ))aZ  

        Set the parameters for signal acquisition.

        Parameters
        -----------

            dec (int, optional) : 
                Decimation (1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048,
                4096, 8192, 16384, 32768, 65536)
                Defaults to 1.
            trig_lvl (float, optional) :
                Trigger level in Volts. {-1, 1} Volts on LV gain or {-20, 20} Volts on HV gain.
                Defaults to 0.
            trig_delay (int, optional) :
                Trigger delay in samples (if trig_delay_ns = True, then the delay is in ns)
                Defaults to 0.
            trig_delay_ns (bool, optional) :
                Change the trigger delay to nanoseconds instead of samples.
                Defaults to False.
            units (str, optional) :
                The units in which the acquired data will be returned.
                Defaults to "VOLTS".
            sample_format (str, optional) :
                The format in which the acquired data will be returned.
                Defaults to "ASCII".
            averaging (bool, optional) :
                Enable/disable averaging. When True, if decimation is higher than 1,
                each returned sample is the average of the taken samples. For example,
                if dec = 4, the returned sample will be the average of the 4 decimated
                samples.
                Defaults to True.
            gain (list(str), optional) :
                HV / LV - (High (1:20) or Low (1:1 attenuation)) 
                The first element in list applies to the SOUR1 and the second to SOUR2.
                Refers to jumper settings on Red Pitaya fast analog inputs.
                (1:20 and 1:1 attenuator for SIGNALlab 250-12)
                Defaults to ["LV","LV"].
            coupling (list(str), optional) :
                AC / DC - coupling mode for fast analog inputs.
                The first element in list applies to the SOUR1 and the second to SOUR2.
                (Only SIGNALlab 250-12)
                Defaults to ["DC","DC"].
            ext_trig_lvl (float, optional) :
                Set trigger external level in V.
                (Only SIGNALlab 250-12)
                Defaults to 0.
            siglab (bool, optional) :
                Set to True if operating with SIGNALlab 250-12.
                Defaults to False.
            input4 (bool, optional) :
                Set to True if operating with STEMlab 125-14 4-Input.
                Defaults to False.

        The settings will work on any Red Pitaya board. If operating on SIGNALlab 250-12
        or STEMlab 125-14 4-Input change the bool value of the appropriate parameter to
        true (siglab, input4). This will change the available range of input parameters.

        Raises
        ------

            Raises errors if the input parameters are out of range.

        ZLVZHVrM   ZACRAWVOLTSZBINASCIIr1   r   g      ?Ng      4@zTrigger level out of range rR   z	for gain r   z#Trigger delay cannot be less that 0z is not a defined unitz is not a defined formatr%   z or z is not a defined gainzis not a defined couplingz#External trigger level out of rangeTz$Please select only one board option.z6'siglab' and 'input4' cannot be true at the same time.zACQ:DEC z
ACQ:AVG ONzACQ:AVG OFFzACQ:TRIG:DLY:NS zACQ:TRIG:DLY zACQ:DATA:UNITS zACQ:DATA:FORMAT ACQ:SOURz:GAIN zACQ:TRIG:LEV z:COUP zACQ:TRIG:EXT:LEV )rX   rY   rV   rW   r.   range)r   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rK   rl   Z	gain_listZcoupling_listZ
units_listformat_listr:   Ztrig_lvl_limZgain_lvlir_   Ztrig_dly_errZunit_errZ
format_errZgain_errZcoupling_errZext_trig_errr`   r   r   r   acq_setN  s    S
&
&
,8,



&&zscpi.acq_set)rK   rl   rL   c              
   C   s  z|dkr|dkrt W n, t k
rD } ztd|W 5 d}~X Y nX g }|rTd}nd}|| d || d || d || d	 || d
 || d t|D ] }|| d|d  d q|r"tdD ] }|| d|d  d q|| d td|d   td|d   td|d   td|d   td|d   td|d   |rtd|d  d|d  d|d  d|d   ntd |d  d|d   |rtd!|d  d|d   td"|d#   |S )$a  

        Retrieves the settings from Red Pitaya, prints them in console and returns
        them as an array with the following sequence:
        [decimation, avearge, trig_dly, trig_dly_ns, trig_lvl, buf_size, gain_ch1, gain_ch2, coup_ch1, coup_ch2, ext_trig_lvl]
                                                                                           , gain_ch3, gain_ch4
            Decimation   - Current decimation
            Average      - Current averaging status (ON/OFF)
            Trig_dly     - Current trigger delay in samples
            Trig_dly_ns  - Current trigger delay in nanoseconds
            Trig_lvl     - Current triger level in Volts
            Buf_size     - Buffer size
            Gain_ch1-4   - Current gain on channels (CH3 and CH4 STEMlab 125-14 4-Input only)
            Coup_ch1/2   - Current coupling mode for both channels (AC/DC) (SIGNALlab only)
            Ext_trig_lvl - Current external trigger level in Volts (SIGNALlab only)

        Note:   The last three array elements won't exist if siglab = False
                Gain of channels 3 and 4 only if input4 = True

        Parameters
        ----------
            siglab (bool, optional):
                Set to True if operating with SIGNALlab 250-12.
                Defaults to False.
            input4 (bool, optional):
                Set to True if operating with STEMlab 125-14 4-Input.
                Defaults to False.

        Tz[Please select only one board option. 'siglab' and 'input4' cannot be true at the same time.Nr1   r   zACQ:DEC?zACQ:AVG?zACQ:TRIG:DLY?zACQ:TRIG:DLY:NS?zACQ:TRIG:LEV?zACQ:BUF:SIZE?rp   r%   z:GAIN?z:COUP?zACQ:TRIG:EXT:LEV?zDecimation: r   zAveraging: zTrigger delay (samples): zTrigger delay (ns):    zTrigger level (V): zBuffer size: rO   zGain CH1/CH2/CH3/CH4:    rU   rS      rT   zGain CH1/CH2: zCoupling CH1/CH2: zExternal trigger level (V): 
   )rV   rW   r[   r0   rq   r
   )r   rK   rl   r`   settingsr:   rs   r   r   r   get_settings
  sB    #2zscpi.get_settings)
r>   startendnum_samplesoldlatbinaryconvertrl   rL   c
              
      sz  d}
d}|	rLz|dkst W q t k
rH } ztd|W 5 d}~X Y qX n>z|dksZt W n, t k
r } ztd|W 5 d}~X Y nX z|dkr|dkrt W n, t k
r } ztd	|W 5 d}~X Y nX |dk	r2zd|  krdksn t W n8 t k
r0 } ztd
|
|f |W 5 d}~X Y nX |dk	rz"d|  krVdks\n t W n8 t k
r } ztd|
|f |W 5 d}~X Y nX |dk	rz"d|  krdksn t W n8 t k
r } ztd|
|f |W 5 d}~X Y nX | d}|dk	r:|dk	r:| d| d| d|  n|dk	rl|dk	rl| d| d| d|  nb|r|dk	r| d| d|  n:|r|dk	r| d| d|  n| d| d |r<|   |r6|dkr fddtdt dD }n(|dkr: fddtdt dD }n }n:|  }|rr|d	dd
d}ttt|}n|}|S )a  
        Returns the acquired data on a channel from the Red Pitaya, with the following options (for a specific channel):
            - only channel       => returns the whole buffer
            - start and end      => returns the samples between them
            - start and n        => returns 'n' samples from the start position
            - old and n          => returns 'n' oldest samples in the buffer
            - lat and n          => returns 'n' latest samples in the buffer

        Parameters
        ----------
            chan (int) :
                Input channel (either 1 or 2).
                (1-4 for STEMlab 125-14 4-Input)
            start (int, optional):
                Start position of acquired data in the buffer {0,1,...16384}
                Defaults to None.
            end (int, optional):
                End position of acquired data in the buffer {0,1,...16384}
                Defaults to None.
            n (int, optional):
                Number of samples read.
            old (bool, optional):
                Read oldest samples in the buffer.
            lat (bool, optional):
                Read latest samples in the buffer.
            bin (bool, optional):
                Set to True if working with Binary data.
                Defaults to False.
            convert (bool, optional):
                Set to True to convert data to a list of floats (VOLTS) or integers (RAW).
                Otherwise returns a list of str (VOLTS) or int (RAW).
                Defaults to False.
            input4 (bool, optional) :
                Set to True if operating with STEMlab 125-14 4-Input.
                Defaults to False.


        Raises
        ------

            Raises errors if the input parameters do not match one of the options.
        
        r   rN   )r%   r   ru   r1   z'Channel needs to be either 1, 2, 3 or 4NrP   rQ   TzHPlease select only one. 'old' and 'lat' cannot be True at the same time.zStart position out of range zEnd position out of range zSample number out of range zACQ:DATA:UNITS?rp   z:DATA:STA:END? r2   z:DATA:STA:N? z:DATA:OLD:N? z:DATA:LAT:N? z:DATA?rn   c              
      s,   g | ]$}t d t ||d  d qS )z!fr1   r   structZunpack	bytearray.0rs   Z	buff_byter   r   
<listcomp>  s     z!scpi.acq_data.<locals>.<listcomp>r1   rm   c              
      s,   g | ]$}t d t ||d  d qS )z!hr   r   r   r   r   r   r   r     s     r   {}
  r   )rV   rW   r0   r.   r*   rq   r   r    stripreplacer6   listr]   float)r   r>   r{   r|   r}   r~   r   r   r   rl   Zlow_limZup_limZ
chanel_errZarg_errZ	start_errZend_errZ
sample_errrf   ZbuffZbuff_stringr   r   r   acq_data]  sl    8
&
"&
"&

 
 zscpi.acq_data%  CS8NONE)speedbitsparityr"   r   rL   c                 C   s$  ddddddddd	d
dddddddddg}dddg}dddddg}z||ksPt W n2 t k
r }	 zt| d|	W 5 d}	~	X Y nX z||kst W n2 t k
r }
 zt| d|
W 5 d}
~
X Y nX z||kst W n4 t k
r } zt| d|W 5 d}~X Y nX z|d ks t W n. t k
rP } ztd!|W 5 d}~X Y nX z"d"|  krld#ksrn t W n6 t k
r } ztd$| d%|W 5 d}~X Y nX | d& | d'|  | d(|   | d)|  | d*|   | d+|  | d, td- dS ).a4  
        Configures the provided settings for UART.

        Args:
            speed (int, optional): Baud rate/speed of UART connection (bits per second). Defaults to 9600.
            bits (str, optional): Character size in bits (CS6, CS7, CS8). Defaults to "CS8".
            parity (str, optional): Parity (NONE, EVEN, ODD, MARK, SPACE). Defaults to "NONE".
            stop (int, optional): Number of stop bits (1 or 2). Defaults to 1.
            timeout (int, optional): Timeout for reading from UART (in 1/10 of seconds) {0,...255}. Defaults to 0.
        i  i`	  i  r   i K  i   i   i  i  i  i i@B i  i` i i%& i- ig5 i 	= ZCS6ZCS7r   r   ZEVENZODDZMARKZSPACEzJ is not a defined speed for UART connection. Please check the speed table.Nz! is not a defined character size.z is not a defined parity.rP   z*The number of stop bits can only be 1 or 2r      zTimeout z is out of range [0, 255]z	UART:INITzUART:SPEED z
UART:BITS zUART:STOPB STOPzUART:PARITY zUART:TIMEOUT z
UART:SETUPzUART is configured)rV   rW   r.   rX   r
   )r   r   r   r   r"   r   Z
speed_listZdatabase_listZparity_list	speed_errbits_errZ
parity_errZstop_errZtimeout_errr   r   r   uart_set  s>    *
""""$

zscpi.uart_set)rL   c                 C   s   g }| | d | | d | d}|dkrB| d n|dkrT| d | | d | | d	 td
|d   td|d   td|d   td|d   td|d   |S )z
        Retrieves the settings from Red Pitaya, prints them in console and returns
        them as an array with the following sequence:
        [speed, databits, stopbits, parity, timeout]

        zUART:SPEED?z
UART:BITS?zUART:STOPB?ZSTOP11ZSTOP22zUART:PARITY?zUART:TIMEOUT?zBaudrate/Speed: r   z
Databits: r%   z
Stopbits: r   zParity: ru   zTimeout (0.1 sec): r1   )r[   r0   r
   )r   ry   r"   r   r   r   uart_get_settings&  s     

zscpi.uart_get_settings)stringword_lengthrL   c                 C   sP   |r
d}nd}d dd t|| D }| dt| d|  td d	S )
aP  
        Sends a string of characters through UART.

        Args:
            string (str, optional): String that will be sent.
            word_length (bool, optional): Set to True if UART word lenght is set to 7 (ASCII) or
                                    False if UART word length is set to 8 (UTF-8). Defaults to False.
        asciir   z,#Hc                 s   s   | ]}t |d V  qdS )XN)r   r   xr   r   r   	<genexpr>_  s     z)scpi.uart_write_string.<locals>.<genexpr>z
UART:WRITEz #HzString sentN)r\   r   r.   r   r
   )r   r   r   codeZarrr   r   r   uart_write_stringH  s    zscpi.uart_write_string)lengthrL   c              
   C   s   z|dkst W n, t k
r< } ztd|W 5 d}~X Y nX | d|  |  }|dddd}dd	d
 |D }|S )z
        Reads a string of data from UART and decodes it from ASCII to string.

        Args:
            length (int): Length of data to read from UART.

        Returns:
            str: Read data in string format.
        r   zLength must be greater than 0.Nz	UART:READr   r   r   r2   c                 s   s   | ]}t t|V  qd S r   )chrr'   r   r   r   r   r   {  s     z(scpi.uart_read_string.<locals>.<genexpr>)rV   rW   r.   r    r   r   r6   r\   )r   r   Z
length_errr8   r   r   r   r   uart_read_stringd  s    zscpi.uart_read_string)spi_modecs_moder   word_lenrL   c              
   C   s  d}d}ddg}ddg}ddd	d
g}	d}
z|  |	ks:tW n2 tk
rn } zt| d|W 5 d}~X Y nX z|  |kstW n2 tk
r } zt| d|W 5 d}~X Y nX z||  kr|ksn tW n@ tk
r } z t| d| d| d|W 5 d}~X Y nX z||
ks(tW n: tk
rd } ztd|
 d| |W 5 d}~X Y nX | d|    | d|    | d|  | d|  | d td dS )a  
        Configures the provided settings for SPI.

        Args:
            spi_mode (str, optional): Sets the mode for SPI; - LISL (Low Idle level, Sample Leading edge)
                                                             - LIST (Low Idle level, Sample Trailing edge)
                                                             - HISL (High Idle level, Sample Leading edge)
                                                             - HIST (High Idle level, Sample Trailing edge)
                                                        Defaults to LISL.
            cs_mode (str, optional): Sets the mode for CS: - NORMAL (After message transmission, CS => HIGH)
                                                           - HIGH (After message transmission, CS => LOW)
                                                        Defaults to NORMAL.
            speed (int, optional): Sets the speed of the SPI connection. Defaults to 5e7.
            word_len (int, optional): Character size in bits (CS6, CS7, CS8). Defaults to "CS8".
        g    חAr%   ZNORMALZHIGHZMSBZLSBZLISLZLISTZHISLZHISTrS   z is not a defined SPI mode.Nz is not a defined CS mode.z is out of range [r2   z].z!Word length must be greater than z. Current word length: zSPI:SET:MODE zSPI:SET:CSMODE zSPI:SET:SPEED zSPI:SET:WORD zSPI:SET:SETzSPI is configured)rX   rV   rW   r.   r
   )r   r   r   r   r   Zspeed_max_limitZspeed_min_limitZcs_mode_listZ
order_listZspi_mode_listZbits_min_limitZspi_mode_errZcs_errr   r   r   r   r   spi_set  s8    "".(
zscpi.spi_setc                 C   s   |  d g }|| d || d || d || d || d td|d   td	|d
   td|d   td|d   td|d   |S )z
        Retrieves the SPI settings from Red Pitaya, prints them in console and returns
        them as an array with the following sequence:
        [mode, csmode, speed, word_len, msg_size]

        zSPI:SET:GETzSPI:SET:MODE?zSPI:SET:CSMODE?zSPI:SET:SPEED?zSPI:SET:WORD?zSPI:MSG:SIZE?z
SPI mode: r   z	CS mode: r%   zSpeed: r   zWord length: ru   zMessage queue length: r1   )r.   r[   r0   r
   )r   ry   r   r   r   spi_get_settings  s    
zscpi.spi_get_settingsc                 C   s
   |  dS )zClear Status Commandz*CLSr.   r   r   r   r   cls  s    zscpi.cls)valuec                 C   s   |  d| S )z$Standard Event Status Enable Commandz*ESE r   )r   r   r   r   r   ese  s    zscpi.esec                 C   s
   |  dS )z"Standard Event Status Enable Queryz*ESE?r0   r   r   r   r   ese_q  s    z
scpi.ese_qc                 C   s
   |  dS )z$Standard Event Status Register Queryz*ESR?r   r   r   r   r   esr_q  s    z
scpi.esr_qc                 C   s
   |  dS )zIdentification Queryz*IDN?r   r   r   r   r   idn_q  s    z
scpi.idn_qc                 C   s
   |  dS )zOperation Complete Commandz*OPCr   r   r   r   r   opc  s    zscpi.opcc                 C   s
   |  dS )zOperation Complete Queryz*OPC?r   r   r   r   r   opc_q  s    z
scpi.opc_qc                 C   s
   |  dS )zReset Commandz*RSTr   r   r   r   r   rst  s    zscpi.rstc                 C   s
   |  dS )zService Request Enable Commandz*SREr   r   r   r   r   sre  s    zscpi.srec                 C   s
   |  dS )zService Request Enable Queryz*SRE?r   r   r   r   r   sre_q  s    z
scpi.sre_qc                 C   s
   |  dS )zRead Status Byte Queryz*STB?r   r   r   r   r   r3   	  s    z
scpi.stb_qc                 C   s
   |  dS )zError count.zSYST:ERR:COUN?r   r   r   r   r   err_c  s    z
scpi.err_cc                 C   s
   |  dS )zError next.zSYST:ERR:NEXT?r   r   r   r   r   r4     s    z
scpi.err_n)Nr   )r   )r   T)T)T)T)r;   r%   r<   r   r   r=   NFr%   r%   Nr'   FF)r%   r   r   FNNTNNr   FF)FF)NNNFFFFF)r   r   r   r%   r   )F)NNNN).__name__
__module____qualname____doc__r   r   r   r   r    r#   r*   r+   r.   r/   r0   r!   r'   r^   r   npZndarrayboolra   r   rt   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   r   r4   r   r   r   r   r   
   s0  

	



               ^             ?  V              A%     C r   )	r   r   r   Znumpyr   
__author__Z__copyright__objectr   r   r   r   r   <module>   s   