U
    =Y27  ã                   @   s  d dl Z d dlZd dlZd dlZd dlZzd dlZW n  ek
rT   d dlmZ Y nX d dl	m
Z
mZmZmZmZmZ ejejejejdœZdZG dd„ de
ƒZedkr
d dlZedƒZej d	 e¡¡ ej d
¡ e d¡ e ¡  ej d e d¡¡¡ e ¡  dS )é    N)Ú
SerialBaseÚSerialExceptionÚto_bytesÚportNotOpenErrorÚwriteTimeoutErrorÚTimeout)Ú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d „ ƒZe	d!d"„ ƒZe	d#d$„ ƒZe	d%d&„ ƒZd'd(„ Zd)S ),ÚSerialz-Serial port implementation for plain sockets.)é2   éK   én   é†   é–   éÈ   i,  iX  i°  i  i`	  iÀ  i€%  i K  i –  i á  i Â c              
   C   sÈ   d| _ | jdkrtdƒ‚| jr&tdƒ‚ztj|  | j¡td| _	W n: t
k
r| } zd| _	td | j|¡ƒ‚W 5 d}~X Y nX | j	 d¡ |  ¡  d| _| js¦|  ¡  | js´|  ¡  |  ¡  |  ¡  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.)ÚtimeoutzCould not open port {}: {}FT)ÚloggerZ_portr   Úis_openÚsocketZcreate_connectionÚfrom_urlZportstrÚPOLL_TIMEOUTÚ_socketÚ	ExceptionÚformatZsetblockingÚ_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Úopen1   s&    
$zSerial.openc                 C   s(   | j dkrtdƒ‚| jr$| 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   O   s    
zSerial._reconfigure_portc                 C   sP   | j rL| jr<z| j tj¡ | j ¡  W n   Y nX d| _d| _ t d¡ dS )z
Close portNFg333333Ó?)r   r   Zshutdownr   Z	SHUT_RDWRÚcloseÚtimeÚsleepr&   r#   r#   r$   r'   Y   s    zSerial.closec              
   C   sî   t  |¡}|jdkr$td |j¡ƒ‚zŒt  |jd¡ ¡ D ]T\}}|dkr~t 	¡  t 
d¡| _| j t|d  ¡ | j d¡ q8td |¡ƒ‚q8d|j  kr¤d	k s®n td
ƒ‚W n0 tk
rà } ztd |¡ƒ‚W 5 d}~X Y nX |j|j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: {!r}i   zport not in range 0...65535z_expected a string in the form "socket://<host>:<port>[?logging={debug|info|warning|error}]": {}N)ÚurlparseZurlsplitZschemer   r   Zparse_qsZqueryÚitemsr*   ZbasicConfigZ	getLoggerr   ZsetLevelÚLOGGER_LEVELSr   Ú
ValueErrorZportZhostname)r!   ZurlÚpartsZoptionÚvaluesÚer#   r#   r$   r   h   s0    

þÿÿÿzSerial.from_urlc                 C   s,   | j s
t‚t | 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ƒ }t| jƒ}t|ƒ|k r6zVt | jgg g | ¡ ¡\}}}|sRW q6| j 	|t|ƒ ¡}|srt
dƒ‚| |¡ W n¨ tk
rÌ } z0|jtjtjtjtjtjfkr¼t
d |¡ƒ‚W 5 d}~X Y n\ tjtjfk
r& } z4|d tjtjtjtjtjfkrt
d |¡ƒ‚W 5 d}~X Y nX | ¡ rq6qt|ƒ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.
        zsocket disconnectedúread failed: {}Nr   )r   r   Ú	bytearrayr   Z_timeoutr3   r2   r   Ú	time_leftÚrecvr   ÚextendÚOSErrorÚerrnoÚEAGAINÚEALREADYÚEWOULDBLOCKÚEINPROGRESSÚEINTRr   r
   r   ÚexpiredÚbytes)r!   ÚsizeÚreadr   ÚreadyÚ_Zbufr1   r#   r#   r$   rE   ’   s,    
" zSerial.readc           
   
   C   s®  | j s
t‚t|ƒ}t|ƒ }}t| jƒ}|dkr¢z | j |¡}|jrL|W S |j	s†| 
¡ r^t‚t g | jgg | ¡ ¡\}}}|s¼t‚n6| ¡ dks–t‚t g | jgg d¡\}}}|s¼tdƒ‚||d… }||8 }W nº tk
rè   ‚ Y n¦ tk
r8 }	 z2|	jtjtjtjtjtjfkr(td |	¡ƒ‚W 5 d}	~	X Y nV tjk
rŒ }	 z4|	d tjtjtjtjtjfkr|td |	¡ƒ‚W 5 d}	~	X Y nX |js(| 
¡ r(t‚q(|t|ƒ 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.
        r   Nzwrite failed (select)zwrite failed: {})r   r   r   r3   r   Z_write_timeoutr   ÚsendZis_non_blockingZis_infiniterB   r   r2   r8   ÚAssertionErrorr   r;   r<   r=   r>   r?   r@   rA   r   r
   )
r!   ÚdataÚdZtx_lenZlengthr   ÚnrG   rF   r1   r#   r#   r$   Úwrite»   sB    

 " zSerial.writec              
   C   sè   | j s
t‚d}|rät | jgg g d¡\}}}z| j d¡ W q tk
rŠ } z0|jtjtjtj	tj
tjfkrztd |¡ƒ‚W 5 d}~X Y q tjtjfk
rà } z2|d tjtjtj	tj
tjfkrÐtd |¡ƒ‚W 5 d}~X Y qX qdS )z9Clear input buffer, discarding all that is in the buffer.Tr   i   r6   N)r   r   r2   r   r9   r;   r<   r=   r>   r?   r@   rA   r   r   r
   r   )r!   rF   rG   r1   r#   r#   r$   r   ð   s     zSerial.reset_input_bufferc                 C   s    | j s
t‚| jr| 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_bufferç      Ð?c                 C   s&   | j s
t‚| jr"| j d |¡¡ 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   )r!   Zdurationr#   r#   r$   Ú
send_break  s    zSerial.send_breakc                 C   s   | j r| j  d | j¡¡ dS )zJSet break: Controls TXD. When active, to transmitting is
        possible.z!ignored _update_break_state({!r})N)r   r	   r   Z_break_stater&   r#   r#   r$   Ú_update_break_state  s    zSerial._update_break_statec                 C   s   | j r| j  d | j¡¡ dS )z)Set terminal status line: Request To Sendzignored _update_rts_state({!r})N)r   r	   r   Z
_rts_stater&   r#   r#   r$   r   "  s    zSerial._update_rts_statec                 C   s   | j r| j  d | j¡¡ dS )z-Set terminal status line: Data Terminal Readyzignored _update_dtr_state({!r})N)r   r	   r   Z
_dtr_stater&   r#   r#   r$   r   '  s    zSerial._update_dtr_statec                 C   s    | j s
t‚| jr| j d¡ dS )z(Read terminal status line: Clear To Sendzreturning dummy for ctsTrN   r&   r#   r#   r$   Úcts,  s
    z
Serial.ctsc                 C   s    | j s
t‚| jr| j d¡ dS )z)Read terminal status line: Data Set Readyzreturning dummy for dsrTrN   r&   r#   r#   r$   Údsr5  s
    z
Serial.dsrc                 C   s    | j s
t‚| jr| j d¡ dS )z)Read terminal status line: Ring Indicatorzreturning dummy for riFrN   r&   r#   r#   r$   Úri>  s
    z	Serial.ric                 C   s    | j s
t‚| jr| j d¡ dS )z)Read terminal status line: Carrier Detectzreturning dummy for cd)TrN   r&   r#   r#   r$   ÚcdG  s
    z	Serial.cdc                 C   s
   | j  ¡ S )z@Get the file handle of the underlying socket for use with select)r   Úfilenor&   r#   r#   r$   rV   S  s    zSerial.filenoN)r5   )rO   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z	BAUDRATESr%   r   r'   r   Úpropertyr4   rE   rM   r   r    rP   rQ   r   r   rR   rS   rT   rU   rV   r#   r#   r#   r$   r   +   s2   


)5






r   Ú__main__zsocket://localhost:7000z{}
z	write...
s   hello
z	read: {}
) r<   r*   r2   r   r(   r+   ÚImportErrorZurllib.parseÚparseZserial.serialutilr   r   r   r   r   r   ÚDEBUGÚINFOZWARNINGZERRORr-   r   r   rW   ÚsysÚsÚstdoutrM   r   ÚflushrE   r'   r#   r#   r#   r$   Ú<module>   s6    ü  1

