
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
MÊ]W�+  ã               @   s  d dl Z d dlZd dlZd dlZd dlZyd dlZW n ek
rR   d dljZY nX d dl	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jd	jeƒƒ ejjd
ƒ ejdƒ ejƒ  ejjdj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	d1d2„ ƒZe	d3d4„ ƒZe	d5d6„ ƒZd7d8„ Zd9S )=ÚSerialz-Serial port implementation for plain sockets.é2   éK   én   é†   é–   éÈ   é,  éX  é°  é  é`	  éÀ  é€%  é K  é –  é á  é Â c             C   s¼   d| _ | jdkrtdƒ‚| jr&tdƒ‚ytj| j| jƒtd�| _	W n: t
k
r| } zd| _	tdj| j|ƒƒ‚W Y dd}~X nX | 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.)ÚtimeoutzCould not open port {}: {}T)ÚloggerZ_portr   Úis_openÚsocketZcreate_connectionÚfrom_urlZportstrÚPOLL_TIMEOUTÚ_socketÚ	ExceptionÚformatÚ_reconfigure_portZ_dsrdtrÚ_update_dtr_stateZ_rtsctsÚ_update_rts_stateÚreset_input_bufferÚreset_output_buffer)ÚselfÚmsg© r,   ú%/usr/lib/python3.6/protocol_socket.pyÚopen0   s$    
$zSerial.openc             C   s(   | j dkrtdƒ‚| jr$| 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   sP   | j rL| jr<y| jjtjƒ | jjƒ  W n   Y nX d| _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   sô   t j|ƒ}|jdkr$tdj|jƒƒ‚y’xjt j|jdƒjƒ D ]T\}}|dkr€tj	ƒ  tj
dƒ| _| jjt|d  ƒ | jjdƒ q:tdj|ƒƒ‚q:W d|j  ko¦d	k n  s´td
ƒ‚W n0 tk
ræ } ztdj|ƒƒ‚W Y dd}~X 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urlsplitÚschemer   r$   Zparse_qsZqueryÚitemsr1   ZbasicConfigZ	getLoggerr   ZsetLevelÚLOGGER_LEVELSr   Ú
ValueErrorZportZhostname)r*   ZurlÚpartsZoptionÚvaluesÚ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   st  | j s
t‚tƒ }| j}�xRt|ƒ|k �rjyxtjƒ }tj| jgg g |ƒ\}}}|sRP | jj|t|ƒ ƒ}|srt	dƒ‚|j
|ƒ |dk	rž|tjƒ | 8 }|dkržP W q tjk
r¶   Y q tjk
ræ } zt	dj|ƒƒ‚W Y dd}~X q tk
�r$ } z"|jtjk�rt	dj|ƒƒ‚W Y dd}~X q tjk
�rf } z$|d tjk�rVt	dj|ƒƒ‚W Y dd}~X qX qW 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 disconnectedNr   zconnection failed ({})zread failed: {})r   r   Ú	bytearrayZ_timeoutr;   r0   r:   r"   Zrecvr   Úextendr   r   r   r$   ÚOSErrorÚerrnoZEAGAINÚbytes)	r*   ÚsizeÚreadr   Z
start_timeZreadyÚ_Zbufr9   r,   r,   r-   rD   �   s:    
$zSerial.readc             C   sZ   | j s
t‚y| jjt|ƒƒ W n2 tjk
rP } ztdj|ƒƒ‚W Y dd}~X nX 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.
        zsocket connection failed: {}N)
r   r   r"   Zsendallr   r   r   r   r$   r;   )r*   Údatar9   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_bufferç      Ð?c             C   s&   | j s
t‚| jr"| jjdj|ƒƒ 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 jdj| 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_state)r*   r,   r,   r-   Ú_update_break_stateê   s    zSerial._update_break_statec             C   s   | j r| j jdj| jƒƒ dS )z)Set terminal status line: Request To Sendzignored _update_rts_state({!r})N)r   r   r$   Z
_rts_state)r*   r,   r,   r-   r'   ð   s    zSerial._update_rts_statec             C   s   | j r| j jdj| jƒƒ dS )z-Set terminal status line: Data Terminal Readyzignored _update_dtr_state({!r})N)r   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-   rO   !  s    zSerial.filenoN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r=   )rH   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z	BAUDRATESr.   r%   r/   r    Úpropertyr<   rD   rG   r(   r)   rI   rJ   r'   r&   rK   rL   rM   rN   rO   r,   r,   r,   r-   r
   *   s*    

1


			r
   Ú__main__zsocket://localhost:7000z{}
z	write...
s   hello
z	read: {}
)rA   r1   r:   r   r0   r2   ÚImportErrorZurllib.parseÚparseZserial.serialutilr   r   r   r   ÚDEBUGÚINFOZWARNINGZERRORr5   r!   r
   rP   ÚsysÚsÚstdoutrG   r$   ÚflushrD   r/   r,   r,   r,   r-   Ú<module>   s4   
   
