
qVj&                 @   sV  d  d l  Z  d  d l Z d  d l Z d  d l Z y d  d l Z Wn! e k
 rc d  d l j Z Yn Xd  d l m	 Z	 m
 Z
 m Z m Z d e  j d e  j d e  j d e  j i Z d Z Gd d	   d	 e	  Z e d
 k rR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)
SerialBaseSerialExceptionportNotOpenErrorto_bytesdebuginfoZwarningerror   c               @   s  e  Z d  Z d Z d: Z d d   Z 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' d(  Z d) d*   Z d+ d,   Z d- d.   Z e	 d/ d0    Z e	 d1 d2    Z e	 d3 d4    Z e	 d5 d6    Z d7 d8   Z d9 S);Serialz-Serial port implementation for plain sockets.2   K   n            ,  X      `	    %   K          c             C   s  d |  _  |  j d k r$ t d   |  j r9 t d   y" t j |  j |  j   |  _ WnG t	 k
 r } z' d |  _ t d |  j | f   WYd d } ~ Xn X|  j j
 t  |  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.
        Nz.Port must be configured before it can be used.zPort is already open.zCould not open port %s: %sT)loggerZ_portr   is_opensocketZcreate_connectionfrom_urlZportstr_socket	ExceptionZ
settimeoutPOLL_TIMEOUT_reconfigure_portZ_dsrdtr_update_dtr_stateZ_rtscts_update_rts_statereset_input_bufferreset_output_buffer)selfmsg r*   C/usr/lib/python3/dist-packages/serial/urlhandler/protocol_socket.pyopen/   s&    		"	,
		
	

zSerial.openc             C   s8   |  j  d k r t d   |  j r4 |  j j d  d S)zz        Set communication parameters on opened port. For the socket://
        protocol all settings are ignored!
        NzCan only operate on open portsz!ignored port configuration change)r    r   r   r   )r(   r*   r*   r+   r#   L   s    	zSerial._reconfigure_portc          	   C   sd   |  j  r` |  j rJ y$ |  j j t j  |  j j   Wn Yn Xd |  _ d |  _  t j d  d S)z
Close portNFg333333?)r   r    Zshutdownr   Z	SHUT_RDWRclosetimeZsleep)r(   r*   r*   r+   r-   V   s    				zSerial.closec             C   sG  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 W| j | j } } d | k o d	 k  n st d
   Wn5 t k
 r<} z t d |   WYd d } ~ Xn X| | f S)z(extract host and port from an URL stringr   z}expected a string in the form "socket://<host>:<port>[?logging={debug|info|warning|error}]": not starting with socket:// (%r)TloggingzpySerial.socketr   zenabled loggingzunknown option: %ri   zport not in range 0...65535z_expected a string in the form "socket://<host>:<port>[?logging={debug|info|warning|error}]": %sN)urlparseZurlsplitschemer   Zparse_qsZqueryitemsr/   ZbasicConfigZ	getLoggerr   ZsetLevelLOGGER_LEVELSr   
ValueErrorZhostnameport)r(   ZurlpartsZoptionvalueshostr5   er*   r*   r+   r   e   s"    (
#zSerial.from_urlc             C   s@   |  j  s t  t j |  j g g  g  d  \ } } } t |  S)z9Return the number of bytes currently in the input buffer.r   )r   r   selectr    len)r(   ZlrZlwZlxr*   r*   r+   
in_waiting~   s    	'zSerial.in_waiting   c             C   s  |  j  s t  t   } |  j d k	 r= t j   |  j } n d } x t |  | k  r y7 |  j j | t |   } | r | j |  n PWnL t	 j
 k
 r Yn8 t	 j k
 r } z t d |   WYd d } ~ Xn X| d k	 rF t j   | k rF PqF 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.
        Nzconnection failed (%s))r   r   	bytearrayZ_timeoutr.   r;   r    Zrecvextendr   timeoutr   r   bytes)r(   sizedatar@   blockr9   r*   r*   r+   read   s&    		#zSerial.readc             C   sn   |  j  s t  y |  j j t |   Wn8 t j k
 rc } z t d |   WYd d } ~ Xn Xt |  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.
        zsocket connection failed: %sN)	r   r   r    Zsendallr   r   r   r   r;   )r(   rC   r9   r*   r*   r+   write   s    	#zSerial.writec             C   s,   |  j  s t  |  j r( |  j j d  d S)z9Clear input buffer, discarding all that is in the buffer.zignored reset_input_bufferN)r   r   r   r   )r(   r*   r*   r+   r&      s    		zSerial.reset_input_bufferc             C   s,   |  j  s t  |  j r( |  j j d  d S)zs        Clear output buffer, aborting the current output and
        discarding all that is in the buffer.
        zignored reset_output_bufferN)r   r   r   r   )r(   r*   r*   r+   r'      s    		zSerial.reset_output_bufferg      ?c             C   s3   |  j  s t  |  j r/ |  j j d | f  d S)za        Send break condition. Timed, returns to idle state after given
        duration.
        zignored send_break(%r)N)r   r   r   r   )r(   Zdurationr*   r*   r+   
send_break   s    		zSerial.send_breakc             C   s'   |  j  r# |  j  j d |  j f  d S)zJSet break: Controls TXD. When active, to transmitting is
        possible.zignored _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ignored _update_rts_state(%r)N)r   r   Z
_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ignored _update_dtr_state(%r)N)r   r   Z
_dtr_state)r(   r*   r*   r+   r$      s    	zSerial._update_dtr_statec             C   s,   |  j  s t  |  j r( |  j j d  d S)z(Read terminal status line: Clear To Sendzreturning dummy for ctsT)r   r   r   r   )r(   r*   r*   r+   cts   s
    		z
Serial.ctsc             C   s,   |  j  s t  |  j r( |  j j d  d S)z)Read terminal status line: Data Set Readyzreturning dummy for dsrT)r   r   r   r   )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 cd)T)r   r   r   r   )r(   r*   r*   r+   cd   s
    		z	Serial.cdc             C   s   |  j  j   S)z@Get the file handle of the underlying socket for use with select)r    fileno)r(   r*   r*   r+   rM     s    zSerial.filenoN)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   propertyr<   rE   rF   r&   r'   rG   rH   r%   r$   rI   rJ   rK   rL   rM   r*   r*   r*   r+   r
   )   s*    

"

			r
   __main__zsocket://localhost:7000z%s
z	write...
s   hello
z	read: %s
   )r/   r:   r   r.   r0   ImportErrorZurllib.parseparseZserial.serialutilr   r   r   r   DEBUGINFOZWARNINGZERRORr3   r"   r
   rN   syssstdoutrF   flushrE   r-   r*   r*   r*   r+   <module>   s.   "			
