U
    ÏÐ~d)  ã                   @   s0  d dl mZ d dlZd dlZd dlZzd dlZW n  ek
rP   d dlmZ Y nX zd dl	Z	W n ek
rz   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 d	 e¡¡ ej d
¡ e d¡ e ¡  ej d e d¡¡¡ e  ¡  dS )é    )Úabsolute_importN)Ú
SerialBaseÚSerialExceptionÚto_bytesÚ	iterbytesÚSerialTimeoutExceptionÚPortNotOpenError)ÚdebugÚinfoÚwarningÚerrorc                       sÚ   e Zd ZdZdZ‡ fdd„Zdd„ Z‡ f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„ Zdd„ Ze
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‡  ZS )-ÚSerialzSSerial port implementation that simulates a loop back connection in plain software.)é2   éK   én   é†   é–   éÈ   i,  iX  i°  i  i`	  iÀ  i€%  i K  i –  i á  i Â c                    s.   d| _ d | _d | _d| _tt| ƒj||Ž d S )Ni   F)Úbuffer_sizeÚqueueÚloggerÚ_cancel_writeÚsuperr   Ú__init__)ÚselfÚargsÚkwargs©Ú	__class__© ú\/var/www/html/myproject/myenv/lib/python3.8/site-packages/serial/urlhandler/protocol_loop.pyr   /   s
    zSerial.__init__c                 C   s~   | j rtdƒ‚d| _t | j¡| _| jdkr4tdƒ‚|  | j¡ |  	¡  d| _ | j
s\|  ¡  | jsj|  ¡  |  ¡  |  ¡  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_urlÚportÚ_reconfigure_portZ_dsrdtrÚ_update_dtr_stateZ_rtsctsÚ_update_rts_stateÚreset_input_bufferÚreset_output_buffer©r   r   r   r    Úopen6   s    
zSerial.openc                    sF   | j r4d| _ z| j d ¡ W n tjk
r2   Y nX tt| ƒ ¡  d S )NF)r!   r   Ú
put_nowaitÚFullr   r   Úcloser*   r   r   r    r.   Q   s    zSerial.closec                 C   sL   t | jtjƒr&d| j  k r$dk s6n td | j¡ƒ‚| jrH| j d¡ dS )zx        Set communication parameters on opened port. For the loop://
        protocol all settings are ignored!
        r   l        zinvalid baudrate: {!r}z_reconfigure_port()N)Ú
isinstanceÚ	_baudrateÚnumbersÚIntegralÚ
ValueErrorÚformatr   r
   r*   r   r   r    r%   Z   s    &zSerial._reconfigure_portc              
   C   sÆ   t  |¡}|jdkr$td |j¡ƒ‚zlt  |jd¡ ¡ D ]T\}}|dkr~t 	¡  t 
d¡| _| j t|d  ¡ | j d¡ q8td |¡ƒ‚q8W n0 tk
rÀ } ztd	 |¡ƒ‚W 5 d
}~X Y nX d
S )z(extract host and port from an URL stringÚ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)ÚurlparseÚurlsplitÚschemer   r4   Úparse_qsÚqueryÚitemsr6   ÚbasicConfigÚ	getLoggerr   ÚsetLevelÚLOGGER_LEVELSr	   r3   )r   ÚurlÚpartsÚoptionÚvaluesÚer   r   r    r#   e   s*    

þÿÿÿzSerial.from_urlc                 C   s4   | j stƒ ‚| jr*| j d | j ¡ ¡¡ | j ¡ S )z9Return the number of bytes currently in the input buffer.zin_waiting -> {:d}©r!   r   r   r	   r4   r   Úqsizer*   r   r   r    Ú
in_waiting~   s
    zSerial.in_waitingé   c                 C   sÌ   | j stƒ ‚| jdk	r0| jdkr0t ¡ | j }nd}tƒ }|dkrÄ| j rÄz| jj| jd}W n$ tjk
r€   | jdkr|Y qÄY nX |dk	rÄ||7 }|d8 }nqÄ|r:t ¡ |kr:| jrÄ| j 	d¡ qÄq: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   ©ÚtimeoutrI   zread timeout)r!   r   Ú_timeoutÚtimeÚ	bytearrayr   ÚgetÚEmptyr   r
   Úbytes)r   ÚsizerK   ÚdataÚbr   r   r    Úread‰   s*    


zSerial.readc                 C   s   | j  d ¡ d S )N)r   r,   r*   r   r   r    Úcancel_readª   s    zSerial.cancel_readc                 C   s
   d| _ d S )NT)r   r*   r   r   r    Úcancel_write­   s    zSerial.cancel_writec                 C   s¨   d| _ | jstƒ ‚t|ƒ}dt|ƒ | j }| jdk	r€|| jkr€| j}|dkrn| j snt t	|dƒ¡ |d8 }qF| j rxdS t
dƒ‚t|ƒD ]}| jj|| jd 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.
        Fg      $@Nr   g      à?zWrite timeoutrJ   )r   r!   r   r   Úlenr0   Z_write_timeoutrM   ÚsleepÚminr   r   r   Úput)r   rS   Ztime_used_to_sendZ	time_leftÚbyter   r   r    Úwrite°   s     
zSerial.writec                 C   sT   | j stƒ ‚| jr| j d¡ z| j ¡ r6| j ¡  q W n tjk
rN   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   rG   Ú
get_nowaitrP   r*   r   r   r    r(   Ë   s    
zSerial.reset_input_bufferc                 C   sT   | j stƒ ‚| jr| j d¡ z| j ¡ r6| j ¡  q W n tjk
rN   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()Nr^   r*   r   r   r    r)   ×   s    
zSerial.reset_output_bufferc                 C   s4   | j stƒ ‚| jr*| j d | j ¡ ¡¡ | j ¡ S )z0Return how many bytes the in the outgoing bufferzout_waiting -> {:d}rF   r*   r   r   r    Úout_waitingæ   s
    zSerial.out_waitingc                 C   s   | j r| j  d | j¡¡ dS )z[        Set break: Controls TXD. When active, to transmitting is
        possible.
        z_update_break_state({!r})N)r   r
   r4   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'_update_rts_state({!r}) -> state of CTSN)r   r
   r4   Ú
_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'_update_dtr_state({!r}) -> state of DSRN©r   r
   r4   Z
_dtr_stater*   r   r   r    r&   þ   s    zSerial._update_dtr_statec                 C   s,   | j stƒ ‚| jr&| j d | j¡¡ | jS )z(Read terminal status line: Clear To SendzCTS -> state of RTS ({!r}))r!   r   r   r
   r4   rb   r*   r   r   r    Úcts  s
    z
Serial.ctsc                 C   s    | j r| j  d | j¡¡ | jS )z)Read terminal status line: Data Set ReadyzDSR -> state of DTR ({!r})rc   r*   r   r   r    Údsr  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 RIF©r!   r   r   r
   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 CDTrf   r*   r   r   r    Úcd  s
    z	Serial.cd)rI   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z	BAUDRATESr   r+   r.   r%   r#   ÚpropertyrH   rU   rV   rW   r]   r(   r)   r`   ra   r'   r&   rd   re   rg   rh   Ú__classcell__r   r   r   r    r   )   s8   	


!




r   Ú__main__zloop://z{}
z	write...
zhello
zread: {!r}
é   )!Ú
__future__r   r6   r1   rM   r7   ÚImportErrorÚurllib.parseÚparser   r"   Zserial.serialutilr   r   r   r   r   r   ÚDEBUGÚINFOÚWARNINGÚERRORr@   r   ri   ÚsysÚsÚstdoutr]   r4   ÚflushrU   r.   r   r   r   r    Ú<module>   s:    ü  

