o
    È¦^_Û7  ã                   @   s  d dl mZ 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y/   d dl	m
Z Y nw 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 dS )é    )Úabsolute_importN)Ú
SerialBaseÚSerialExceptionÚto_bytesÚPortNotOpenErrorÚSerialTimeoutExceptionÚTimeout)ÚdebugÚinfoÚ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u rtdƒ‚| jrtdƒ‚ztj|  | j¡td�| _	W n t
y9 } zd| _	td | j|¡ƒ‚d}~ww | j	 d¡ |  ¡  d| _| jsN|  ¡  | jsU|  ¡  |  ¡  |  ¡  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)ÚloggerÚ_portr   Úis_openÚsocketÚcreate_connectionÚfrom_urlÚportstrÚPOLL_TIMEOUTÚ_socketÚ	ExceptionÚformatÚsetblockingÚ_reconfigure_portÚ_dsrdtrÚ_update_dtr_stateÚ_rtsctsÚ_update_rts_stateÚreset_input_bufferÚreset_output_buffer)ÚselfÚmsg© r+   úC/usr/lib/python3/dist-packages/serial/urlhandler/protocol_socket.pyÚopen3   s*   
€þzSerial.openc                 C   s,   | j du r	tdƒ‚| jr| j d¡ dS 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"   Q   s
   
ÿzSerial._reconfigure_portc                 C   sP   | j r&| jrz| j tj¡ | j ¡  W n   Y d| _d| _ t d¡ dS dS )z
Close portNFg333333Ó?)r   r   Úshutdownr   Ú	SHUT_RDWRÚcloseÚtimeÚsleepr.   r+   r+   r,   r1   [   s   õzSerial.closec              
   C   sè   t  |¡}|jdkrtd |j¡ƒ‚zHt  |jd¡ ¡ D ])\}}|dkr?t 	¡  t 
d¡| _| j t|d  ¡ | j d¡ qtd |¡ƒ‚d|j  krTd	k sYtd
ƒ‚ td
ƒ‚W n tym } ztd |¡ƒ‚d}~ww |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)ÚurlparseÚurlsplitÚschemer   r    Úparse_qsÚqueryÚitemsr4   ÚbasicConfigÚ	getLoggerr   ÚsetLevelÚLOGGER_LEVELSr	   Ú
ValueErrorÚportÚhostname)r)   ÚurlÚpartsÚoptionÚvaluesÚer+   r+   r,   r   j   s6   

ýÿÿþ€ÿ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)   ÚlrÚlwÚlxr+   r+   r,   Ú
in_waiting‡   s   zSerial.in_waitingé   c              
   C   sR  | j stƒ ‚tƒ }t| jƒ}t|ƒ|k r¥z-t | jgg g | ¡ ¡\}}}|s+W t|ƒS | j 	|t|ƒ ¡}|s;t
dƒ‚| |¡ W nT tyi } z|jtjtjtjtjtjfvr_t
d |¡ƒ‚W Y d}~n1d}~w tjtjfy• } z|d tjtjtjtjtjfvr‹t
d |¡ƒ‚W Y d}~nd}~ww | ¡ rŸ	 t|ƒS t|ƒ|k s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   Ú_timeoutrH   rG   r   Ú	time_leftÚrecvr   ÚextendÚOSErrorÚerrnoÚEAGAINÚEALREADYÚEWOULDBLOCKÚEINPROGRESSÚEINTRr    r   r   ÚexpiredÚbytes)r)   ÚsizeÚreadr   ÚreadyÚ_ÚbufrF   r+   r+   r,   r^   ”   s<   
ìÿ€ ÿ€üãzSerial.readc           
   
   C   s¶  | j stƒ ‚t|ƒ}t|ƒ }}t| jƒ}|dkrÕzT| j |¡}|jr&|W S |j	sG| 
¡ r1tdƒ‚t g | jgg | ¡ ¡\}}}|sFtdƒ‚n| ¡ du sOJ ‚t g | jgg d¡\}}}|sbtdƒ‚||d… }||8 }W nX tyu   ‚  tyœ }	 z|	jtjtjtjtjtjfvr’td |	¡ƒ‚W Y d}	~	n.d}	~	w tjyÅ }	 z|	d tjtjtjtjtjfvr»td |	¡ƒ‚W Y d}	~	nd}	~	ww |jsÑ| 
¡ rÑtdƒ‚|dks|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   zWrite timeoutNzwrite failed (select)zwrite failed: {})r   r   r   rH   r   Ú_write_timeoutr   ÚsendÚis_non_blockingÚis_infiniter[   r   rG   rQ   r   rT   rU   rV   rW   rX   rY   rZ   r    r   )
r)   ÚdataÚdÚtx_lenÚlengthr   Únr`   r_   rF   r+   r+   r,   Úwrite½   sP   
ÿÿ€ ÿ€üÚ'zSerial.writec              
   C   sø   | j stƒ ‚d}|rzt | jgg g d¡\}}}z
|r | j d¡}W nT tyI } z|jtjtjtj	tj
tjfvr?td |¡ƒ‚W Y d}~n1d}~w tjtjfyu } z|d tjtjtj	tj
tjfvrktd |¡ƒ‚W Y d}~nd}~ww |s
dS dS )z9Clear input buffer, discarding all that is in the buffer.Tr   i   rN   N)r   r   rG   r   rR   rT   rU   rV   rW   rX   rY   rZ   r   r    r   r   )r)   r_   r`   rF   r+   r+   r,   r'   ò   s*   €ÿ€ ÿ€üõzSerial.reset_input_bufferc                 C   s&   | j stƒ ‚| jr| j d¡ dS 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 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)   Údurationr+   r+   r,   Ú
send_break  s
   ÿzSerial.send_breakc                 C   ó"   | j r| j  d | j¡¡ dS dS )zJSet break: Controls TXD. When active, to transmitting is
        possible.z!ignored _update_break_state({!r})N)r   r
   r    Ú_break_stater.   r+   r+   r,   Ú_update_break_state  s   ÿzSerial._update_break_statec                 C   rp   )z)Set terminal status line: Request To Sendzignored _update_rts_state({!r})N)r   r
   r    Ú
_rts_stater.   r+   r+   r,   r&   %  ó   ÿzSerial._update_rts_statec                 C   rp   )z-Set terminal status line: Data Terminal Readyzignored _update_dtr_state({!r})N)r   r
   r    Ú
_dtr_stater.   r+   r+   r,   r$   *  rt   zSerial._update_dtr_statec                 C   ó"   | j stƒ ‚| jr| j d¡ dS )z(Read terminal status line: Clear To Sendzreturning dummy for ctsTrl   r.   r+   r+   r,   Úcts/  ó
   z
Serial.ctsc                 C   rv   )z)Read terminal status line: Data Set Readyzreturning dummy for dsrTrl   r.   r+   r+   r,   Údsr8  rx   z
Serial.dsrc                 C   rv   )z)Read terminal status line: Ring Indicatorzreturning dummy for riFrl   r.   r+   r+   r,   ÚriA  rx   z	Serial.ric                 C   rv   )z)Read terminal status line: Carrier Detectzreturning dummy for cd)Trl   r.   r+   r+   r,   ÚcdJ  rx   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,   r|   V  s   
zSerial.filenoN)rM   )rm   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	BAUDRATESr-   r"   r1   r   ÚpropertyrL   r^   rk   r'   r(   ro   rr   r&   r$   rw   ry   rz   r{   r|   r+   r+   r+   r,   r   -   s4    


)5






r   Ú__main__zsocket://localhost:7000z{}
z	write...
s   hello
z	read: {}
)"Ú
__future__r   rU   r4   rG   r   r2   r5   ÚImportErrorÚurllib.parseÚparseÚserial.serialutilr   r   r   r   r   r   ÚDEBUGÚINFOÚWARNINGÚERRORr>   r   r   r}   ÚsysÚsÚstdoutrk   r    Úflushr^   r1   r+   r+   r+   r,   Ú<module>   s>   ÿ ü  2
ö