
qV%                 @   s]  d  d l  Z  d  d l Z d  d l Z y d  d l Z Wn! e k
 rW d  d l j Z Yn Xy d  d l Z Wn e k
 r d  d l Z Yn Xd  d l	 Td e  j
 d e  j d e  j d e  j i Z Gd d   d e  Z e d	 k rYd  d l Z e d
  Z e j j d e  e j j d  e j d  e j   e j j d e j d   e j   d S)    N)*debuginfoZwarningerrorc                   s  e  Z d  Z d Z d6 Z   f d d   Z d d   Z   f d d   Z d d   Z d d   Z	 e
 d d    Z d d  d!  Z d" d#   Z d$ d%   Z d& d'   Z d( d)   Z d* d+   Z d, d-   Z e
 d. d/    Z e
 d0 d1    Z e
 d2 d3    Z e
 d4 d5    Z   S)7SerialzSSerial port implementation that simulates a loop back connection in plain software.2   K   n            ,  X      `	    %   K          c                s8   t  t |   j | |   d |  _ d  |  _ d  |  _ d  S)Ni   )superr   __init__buffer_sizequeuelogger)selfargskwargs)	__class__ A/usr/lib/python3/dist-packages/serial/urlhandler/protocol_loop.pyr   -   s    		zSerial.__init__c             C   s   |  j  r t d   d |  _ t j |  j  |  _ |  j d k rN t d   |  j |  j  |  j	   d |  _  |  j
 s |  j   |  j s |  j   |  j   |  j   d S)zx        Open port with current settings. This may throw a SerialException
        if the port cannot be opened.
        zPort is already open.Nz.Port must be configured before it can be used.T)is_openSerialExceptionr   r   Queuer   Z_portfrom_urlZport_reconfigure_portZ_dsrdtr_update_dtr_stateZ_rtscts_update_rts_statereset_input_bufferreset_output_buffer)r   r!   r!   r"   open3   s    		
		
	

zSerial.openc                sU   |  j  r> d |  _  y |  j j d   Wn t j k
 r= Yn Xt t |   j   d  S)NF)r#   r   Z
put_nowaitZFullr   r   close)r   )r    r!   r"   r-   N   s    		zSerial.closec             C   sf   t  |  j t j  s6 d |  j k  o0 d k  n rI t d |  j   |  j rb |  j j d  d S)zx        Set communication parameters on opened port. For the loop://
        protocol all settings are ignored!
        r          zinvalid baudrate: %rz_reconfigure_port()Nl        )
isinstance	_baudratenumbersZIntegral
ValueErrorr   r   )r   r!   r!   r"   r'   W   s    6	zSerial._reconfigure_portc             C   s  t  j |  } | j d k r4 t d | j f   y x t  j | j d  j   D]r \ } } | d k r t j   t j	 d  |  _
 |  j
 j t | d  |  j
 j d  qS t d | f   qS WWn5 t k
 r} z t d	 |   WYd
 d
 } ~ Xn Xd
 S)z(extract host and port from an URL stringZloopzlexpected a string in the form "loop://[?logging={debug|info|warning|error}]": not starting with loop:// (%r)TloggingzpySerial.loopr   zenabled loggingzunknown option: %rzPexpected a string in the form "loop://[?logging={debug|info|warning|error}]": %sN)urlparseZurlsplitschemer$   Zparse_qsZqueryitemsr4   ZbasicConfigZ	getLoggerr   ZsetLevelLOGGER_LEVELSr   r3   )r   ZurlpartsZoptionvalueser!   r!   r"   r&   b   s    (
zSerial.from_urlc             C   sE   |  j  s t  |  j r8 |  j j d |  j j   f  |  j j   S)z9Return the number of bytes currently in the input buffer.zin_waiting -> %d)r#   portNotOpenErrorr   r   r   qsize)r   r!   r!   r"   
in_waitingv   s
    		 zSerial.in_waiting   c             C   s  |  j  s t  |  j d k	 rC |  j d k rC t j   |  j } n d } t   } x | d k r|  j  ry |  j j d |  j  } Wn% t j k
 r |  j d k r PYn% X| d k	 r | | 7} | d 8} n P| rU t j   | k rU |  j r|  j j	 d  PqU Wt
 |  S)z        Read size bytes from the serial port. If a timeout is set it may
        return less characters as requested. With no timeout it will block
        until the requested number of bytes is read.
        Nr   timeoutr?   zread timeout)r#   r<   Z_timeouttime	bytearrayr   getEmptyr   r   bytes)r   sizer@   databr!   r!   r"   read   s*    		
	zSerial.readc             C   s   |  j  s t  t |  } d t |  |  j } |  j d k	 rf | |  j k rf t j |  j  t  x- t	 |  D] } |  j
 j | d |  j qs Wt |  S)z        Output the given byte string over the serial port. Can block if the
        connection is blocked. May raise SerialException if the connection is
        closed.
        g      $@Nr@   )r#   r<   to_byteslenr1   Z_write_timeoutrA   ZsleepZwriteTimeoutErrorZ	iterbytesr   Zput)r   rG   Ztime_used_to_sendZbyter!   r!   r"   write   s    	zSerial.writec             C   sk   |  j  s t  |  j r( |  j j d  y' x  |  j j   rM |  j j   q. WWn t j k
 rf Yn Xd S)z9Clear input buffer, discarding all that is in the buffer.zreset_input_buffer()N)r#   r<   r   r   r   r=   
get_nowaitrD   )r   r!   r!   r"   r*      s    		zSerial.reset_input_bufferc             C   sk   |  j  s t  |  j r( |  j j d  y' x  |  j j   rM |  j j   q. WWn t j k
 rf Yn Xd S)zs        Clear output buffer, aborting the current output and
        discarding all that is in the buffer.
        zreset_output_buffer()N)r#   r<   r   r   r   r=   rM   rD   )r   r!   r!   r"   r+      s    		zSerial.reset_output_bufferc             C   s'   |  j  r# |  j  j d |  j f  d S)z[        Set break: Controls TXD. When active, to transmitting is
        possible.
        z_update_break_state(%r)N)r   r   Z_break_state)r   r!   r!   r"   _update_break_state   s    	zSerial._update_break_statec             C   s'   |  j  r# |  j  j d |  j f  d S)z)Set terminal status line: Request To Sendz%_update_rts_state(%r) -> state of CTSN)r   r   
_rts_state)r   r!   r!   r"   r)      s    	zSerial._update_rts_statec             C   s'   |  j  r# |  j  j d |  j f  d S)z-Set terminal status line: Data Terminal Readyz%_update_dtr_state(%r) -> state of DSRN)r   r   
_dtr_state)r   r!   r!   r"   r(      s    	zSerial._update_dtr_statec             C   s9   |  j  s t  |  j r2 |  j j d |  j f  |  j S)z(Read terminal status line: Clear To SendzCTS -> state of RTS (%r))r#   r<   r   r   rO   )r   r!   r!   r"   cts   s
    		z
Serial.ctsc             C   s*   |  j  r# |  j  j d |  j f  |  j S)z)Read terminal status line: Data Set ReadyzDSR -> state of DTR (%r))r   r   rP   )r   r!   r!   r"   dsr   s    	z
Serial.dsrc             C   s,   |  j  s t  |  j r( |  j j d  d S)z)Read terminal status line: Ring Indicatorzreturning dummy for RIF)r#   r<   r   r   )r   r!   r!   r"   ri   s
    		z	Serial.ric             C   s,   |  j  s t  |  j r( |  j j d  d S)z)Read terminal status line: Carrier Detectzreturning dummy for CDT)r#   r<   r   r   )r   r!   r!   r"   cd   s
    		z	Serial.cd)r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname____doc__Z	BAUDRATESr   r,   r-   r'   r&   propertyr>   rI   rL   r*   r+   rN   r)   r(   rQ   rR   rS   rT   r!   r!   )r    r"   r   '   s(    	!		r   __main__zloop://z%s
z	write...
zhello
z	read: %s
   )r4   r2   rA   r5   ImportErrorZurllib.parseparser   r%   Zserial.serialutilDEBUGINFOZWARNINGZERRORr8   Z
SerialBaser   rU   syssstdoutrL   flushrI   r-   r!   r!   r!   r"   <module>   s2   
			
