B
    _¾  ã               @   sô   d Z ddlZddlZddlZddlZdejkrNddlZddlZe 	¡ ej
d< nddlZddlZddlZddlmZ dd„ ZG dd„ dƒZed	krðeƒ Zedd
Zejejd\ZZeejdƒZx(eeeƒD ]\ZZe deef ¡ qÊW e  ¡  dS )z¸
.. module:: keithley
    :platform: unix
    :synopsis: This module is for communicating with the keithley instruments.

.. codeauthor:: Michael Coughlin, Eric Coughlin, Nick Mondrik
é    NZTESTENVIRONMENTÚvisac              C   sz   t  ¡ } | jdddd | jdddd | jdddd | jdddd | jd	d
dtd | jdddd |  ¡ \}}|S )Nz--doKeithleyÚ
store_trueF)ÚactionÚdefaultz
--doSinglez	--doResetz--doShutterTz-dz
--durationé   )r   Útypez-fz--photonFilez/home/pi/CBP/keithley/test.dat)r   )ÚoptparseÚOptionParserÚ
add_optionÚintÚ
parse_args)ÚparserÚoptsÚargs© r   ú/home/cbp/cbp/cbp/keithley.pyÚparse_commandline   s    r   c               @   sj   e Zd Zddd„Zddd	„Zd
d„ Zddd„Zd dd„Zd!dd„Zdd„ Z	dd„ Z
d"dd„Zd#dd„ZdS )$ÚKeithleyNÚcurrr   Fc          
   C   sP  d d dœ| _ d| _y<t d¡| _| jjd |¡dd }| j |¡| _|| _	W nl t
k
rº } zNtd |¡ƒ y$| jjddd }| j |¡| _W n   td	ƒ ‚ Y nX W d d }~X Y nX d
| j_d
| j_d| j_d| j_|  d¡ |r| j d¡ | j d¡ | j||d | j d¡ | j d¡ | j d¡ d| j |< d d dœ| _d S )N)r   r   r   z@pyz?*/dev/ttyUSB{:d})Úqueryr   zGError opening Keithley on /dev/ttyUSB{:d}.  Trying /dev/ttyUSB.KEITHLEYz?*/dev/ttyUSB.KEITHLEYz2Failed to open on /dev/ttyUSB.KEITHLEY... AbortingÚ
iˆ  g        Tz*RSTÚINIT)ÚnplczSYST:ZCH ONzSYST:ZCH OFFzSYST:ZCOR OFFÚ	connected)ÚstatusÚnreadsr   ÚResourceManagerÚrmÚlist_resourcesÚformatÚopen_resourceÚinsÚresnumÚ	ExceptionÚprintÚwrite_terminationÚread_terminationÚtimeoutÚquery_delayÚdisponÚwriteÚ
selectmodeÚphotodiode_reading)Úselfr   r"   Úmoder   Údo_resetÚdevttyÚer   r   r   Ú__init__(   s:    


zKeithley.__init__Tc             C   s$   d}||rdnd7 }| j  |¡ d S )Nz	SYST:ZCH ÚONÚOFF)r!   r*   )r-   ÚenableÚmsgr   r   r   Ú
zero_checkK   s    zKeithley.zero_checkc          
   C   sJ   y|   ¡  W n8 tk
rD } zt |¡ d| j| j< W d d }~X Y nX d S )Nznot connected)Úgetreadr#   ÚloggingÚ	exceptionr   r"   )r-   r1   r   r   r   Úcheck_statusP   s
    
zKeithley.check_statusc             C   sl   |  ¡ dkstd |  ¡ ¡ƒ‚t|ƒtdƒks2t‚|  d¡ | j d| ¡ |f ¡ | j d| ¡  ¡ dS )z»
        :param mode: the mode to switch keithley to.
        :param nplc: Number of power line cycles to average over
        :return: switches the keithley to a particular mode
        )ÚvoltÚcharr   Úresz
No mode {}r   TzSENS:%s:NPLC %dz	FUNC '%s'N)ÚlowerÚAssertionErrorr   r   r7   r!   r*   Úupper)r-   r.   r   r   r   r   r+   W   s
    
zKeithley.selectmodec             C   s$   d}||rdnd7 }| j  |¡ dS )zc
        :param enable: Tells the display to be on (True) or off (False).
        :return:
        zDISP: ENAB Ú1Ú0N)r!   r*   )r-   r5   r6   r   r   r   r)   d   s    zKeithley.disponc             C   sb   t |ƒtkstdƒ‚|| jkr4| j d| ¡ || _t | j d¡ 	d¡¡}| 
tj¡ |df¡S )z€
        :param nreads: Number of readings to take
        :return: a numpy array of a float from the keithley reading.
        znreads must be an integerzTRIG:COUN %dzREAD?ú,é   )r   r   r@   r   r!   r*   ÚnpÚarrayr   ÚsplitÚastypeÚfloatÚreshape)r-   r   Útotor   r   r   r8   m   s    

zKeithley.getreadc             C   s   | j  |¡S )zs
        :param query: a query to send to the keithley
        :return: returns the response to the query.
        )r!   r   )r-   r   r   r   r   Úgetquery~   s    zKeithley.getqueryc             C   s   | j  ¡  | j ¡  dS )zm
        closes the connection to the keithley

        :return: a closed connection to the keithley
        N)r!   Úcloser   )r-   r   r   r   rN   …   s    
zKeithley.closer=   c             C   s4   | j  d¡ d| _|r"| j  d¡ | j||d dS )zï
        :param mode: Mode to change the instrument to
        :param nplc: Number of power line cycles to average over
        :param reset_time: Boolean - resets timer on keithley, increasing timestamp precision
        :return:
        z*RSTr   zSYST:TIME:RES)r   N)r!   r*   r   r+   )r-   r.   r   Ú
reset_timer   r   r   r/   Ž   s
    zKeithley.do_resetéè  é
   c       
      C   s  t  ¡ }|jdkr&|r&td |j¡ƒ‚| d¡ | |¡ |d }d}t d¡}| j	ddd	 |  
d
¡ t d¡ |  
d¡ t ||  |¡f¡}t ¡ }|r¤| ¡  t ¡ }	x.t ||  d¡f¡}t ¡ |	 || kr®P q®W t ||  |¡f¡}|dd…df |dd…df fS )z—
        :param duration:
        :param doShutter:
        :param nprepost: Number of pre and post reads to take (both same)
        :return:
        Úonz?keithley_update: get_charge_timeseries: Laser reports state: {}ÚBurstg     @@é   )r   rE   r=   r   )r.   r   TFNr   )ÚntÚLaserSerialInterfaceÚstateÚRuntimeErrorr   Úset_modeÚset_npulsesrF   Úemptyr/   r7   ÚtimeÚsleepÚvstackr8   Útrigger_burst)
r-   ÚnpulsesÚnprepostÚ	use_laserÚlaserÚexpected_run_timeÚrun_time_bufferÚdataÚstartÚ
start_timer   r   r   Úget_charge_timeseries›   s.    





zKeithley.get_charge_timeseries)NNr   r   F)T)r   )T)r   )r=   r   T)rP   rQ   T)Ú__name__Ú
__module__Ú__qualname__r2   r7   r;   r+   r)   r8   rM   rN   r/   ri   r   r   r   r   r   '   s   
#


	
	
r   Ú__main__)r"   )ÚdurationÚwz
%.5f %.5e
)!Ú__doc__r   r\   ÚnumpyrF   ÚosÚenvironÚmockÚsysZMockÚmodulesr   r9   Ú	cbp.nt252Únt252rU   r   r   rj   r   r   ri   rn   ÚtimesZphotolÚopenZ
photonFileÚfidÚzipÚttZphotr*   rN   r   r   r   r   Ú<module>   s.   
 
