
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
MÊ]Wê%  ã               @   s"  d dl Z d dlZd dlZyd dlZW n ek
rB   d dljZY nX yd dlZW n ek
rl   d dl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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Úto_bytesÚ	iterbytesÚwriteTimeoutErrorÚportNotOpenError)ÚdebugÚinfoZwarningÚerrorc                   s¾   e Zd ZdZd6Z‡ fdd„Zdd„ Z‡ fdd„Zdd„ Zdd„ Z	e
dd„ ƒZd7d 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
d0d1„ ƒZe
d2d3„ ƒZe
d4d5„ ƒZ‡  ZS )8ÚSerialzSSerial port implementation that simulates a loop back connection in plain software.é2   éK   én   é†   é–   éÈ   é,  éX  é°  é  é`	  éÀ  é€%  é K  é –  é á  é Â c                s(   t t| ƒj||Ž d| _d | _d | _d S )Ni   )Úsuperr   Ú__init__Úbuffer_sizeÚqueueÚlogger)ÚselfÚargsÚkwargs)Ú	__class__© ú#/usr/lib/python3.6/protocol_loop.pyr   -   s    zSerial.__init__c             C   s~   | j rtdƒ‚d| _tj| jƒ| _| jdkr4tdƒ‚| j| jƒ | j	ƒ  d| _ | j
s\| jƒ  | jsj| 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_openr   r!   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                sF   | j r4d| _ y| jjd ƒ W n tjk
r2   Y nX tt| ƒjƒ  d S )NF)r(   r    Z
put_nowaitZFullr   r   Úclose)r"   )r%   r&   r'   r1   N   s    zSerial.closec             C   sR   t | jtjƒ s,d| j  k o$dk n   r<tdj| jƒƒ‚| jrN| jjdƒ dS )zx        Set communication parameters on opened port. For the loop://
        protocol all settings are ignored!
        r   é   é    zinvalid baudrate: {!r}z_reconfigure_port()Nl        )Ú
isinstanceÚ	_baudrateÚnumbersZIntegralÚ
ValueErrorÚformatr!   r	   )r"   r&   r&   r'   r+   W   s    ,zSerial._reconfigure_portc             C   sÊ   t j|ƒ}|jdkr$tdj|jƒƒ‚ypxjt 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 W n0 tk
rÄ } ztd	j|ƒƒ‚W Y d
d
}~X nX d
S )z(extract host and port from an URL stringZloopznexpected 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: {!r}zPexpected a string in the form "loop://[?logging={debug|info|warning|error}]": {}N)ÚurlparseZurlsplitÚschemer   r8   Zparse_qsZqueryÚitemsr9   ZbasicConfigZ	getLoggerr!   ZsetLevelÚLOGGER_LEVELSr   r7   )r"   ZurlÚpartsZoptionÚvaluesÚer&   r&   r'   r*   b   s"    


zSerial.from_urlc             C   s2   | j s
t‚| jr(| jjdj| jjƒ ƒƒ | jjƒ S )z9Return the number of bytes currently in the input buffer.zin_waiting -> {:d})r(   r   r!   r   r8   r    Úqsize)r"   r&   r&   r'   Ú
in_waiting{   s
    zSerial.in_waitingé   c             C   sÌ   | j s
t‚| jdk	r.| jdkr.tjƒ | j }nd}tƒ }xŠ|dkrÂ| j rÂy| jj| jd�}W n" tjk
r~   | jdkrzP Y nX |dk	rš||7 }|d8 }nP |r:tjƒ |kr:| jr¾| jj	dƒ P 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.
        Nr   )ÚtimeoutrC   zread timeout)r(   r   Z_timeoutÚtimeÚ	bytearrayr    ÚgetÚEmptyr!   r	   Úbytes)r"   ÚsizerD   ÚdataÚbr&   r&   r'   Úread†   s*    

zSerial.readc             C   st   | j s
t‚t|ƒ}dt|ƒ | j }| jdk	rH|| jkrHtj| jƒ t‚x"t	|ƒD ]}| j
j|| jd� qRW 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.
        g      $@N)rD   )r(   r   r   Úlenr5   Z_write_timeoutrE   Zsleepr   r   r    Zput)r"   rK   Ztime_used_to_sendZbyter&   r&   r'   Úwrite§   s    zSerial.writec             C   sV   | j s
t‚| jr| jjdƒ yx| jjƒ r6| jjƒ  q W W n tjk
rP   Y nX dS )z9Clear input buffer, discarding all that is in the buffer.zreset_input_buffer()N)r(   r   r!   r	   r    rA   Ú
get_nowaitrH   )r"   r&   r&   r'   r.   »   s    zSerial.reset_input_bufferc             C   sV   | j s
t‚| jr| jjdƒ yx| jjƒ r6| jjƒ  q W W n tjk
rP   Y nX d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    rA   rP   rH   )r"   r&   r&   r'   r/   Ç   s    zSerial.reset_output_bufferc             C   s   | j r| j jdj| jƒƒ dS )z[        Set break: Controls TXD. When active, to transmitting is
        possible.
        z_update_break_state({!r})N)r!   r	   r8   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'_update_rts_state({!r}) -> state of CTSN)r!   r	   r8   Ú
_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'_update_dtr_state({!r}) -> state of DSRN)r!   r	   r8   Ú
_dtr_state)r"   r&   r&   r'   r,   ã   s    zSerial._update_dtr_statec             C   s*   | j s
t‚| jr$| jjdj| jƒƒ | jS )z(Read terminal status line: Clear To SendzCTS -> state of RTS ({!r}))r(   r   r!   r	   r8   rR   )r"   r&   r&   r'   Úctsè   s
    z
Serial.ctsc             C   s    | j r| j jdj| jƒƒ | jS )z)Read terminal status line: Data Set ReadyzDSR -> state of DTR ({!r}))r!   r	   r8   rS   )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   )rC   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z	BAUDRATESr   r0   r1   r+   r*   ÚpropertyrB   rM   rO   r.   r/   rQ   r-   r,   rT   rU   rV   rW   Ú__classcell__r&   r&   )r%   r'   r   '   s(    	
!		r   Ú__main__zloop://z{}
z	write...
zhello
zread: {!r}
é   )r9   r6   rE   r:   ÚImportErrorZurllib.parseÚparser    r)   Zserial.serialutilr   r   r   r   r   r   ÚDEBUGÚINFOZWARNINGZERRORr=   r   rX   ÚsysÚsÚstdoutrO   r8   ÚflushrM   r1   r&   r&   r&   r'   Ú<module>   s4    
 i

