U
    ÏÐ~dÛ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k
r`   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 )é    )Ú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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ÚsocketÚcreate_connectionÚfrom_urlZportstrÚPOLL_TIMEOUTÚ_socketÚ	ExceptionÚformatÚsetblockingÚ_reconfigure_portZ_dsrdtrÚ_update_dtr_stateZ_rtsctsÚ_update_rts_stateÚreset_input_bufferÚreset_output_buffer)ÚselfÚmsg© r'   ú^/var/www/html/myproject/myenv/lib/python3.8/site-packages/serial/urlhandler/protocol_socket.pyÚopen3   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    Q   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   Úshutdownr   Ú	SHUT_RDWRÚcloseÚtimeÚsleepr*   r'   r'   r(   r-   [   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)ÚurlparseÚurlsplitÚschemer   r   Úparse_qsÚqueryÚitemsr0   ÚbasicConfigÚ	getLoggerr   ÚsetLevelÚLOGGER_LEVELSr	   Ú
ValueErrorÚportÚhostname)r%   ÚurlÚpartsÚoptionÚvaluesÚer'   r'   r(   r   j   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%   ÚlrZlwÚlxr'   r'   r(   Ú
in_waiting‡   s    zSerial.in_waitingé   c              
   C   s@  | j stƒ ‚tƒ }t| jƒ}t|ƒ|k r8zVt | jgg g | ¡ ¡\}}}|sTW q8| j 	|t|ƒ ¡}|stt
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q8q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   Ú_timeoutrD   rC   r   Ú	time_leftÚrecvr   ÚextendÚOSErrorÚerrnoÚEAGAINÚEALREADYÚEWOULDBLOCKÚEINPROGRESSÚEINTRr   r   r   ÚexpiredÚbytes)r%   ÚsizeÚreadr   ÚreadyÚ_ÚbufrB   r'   r'   r(   rY   ”   s,    
" zSerial.readc           
   
   C   s¼  | j stƒ ‚t|ƒ}t|ƒ }}t| jƒ}|dkr°z¨| j |¡}|jrN|W S |j	s| 
¡ rdtdƒ‚t g | jgg | ¡ ¡\}}}|sÆtdƒ‚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
rB }	 z2|	jtjtjtjtjtjfkr2t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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.
        r   zWrite timeoutNzwrite failed (select)zwrite failed: {})r   r   r   rD   r   Z_write_timeoutr   ÚsendZis_non_blockingÚis_infiniterV   r   rC   rL   ÚAssertionErrorr   rO   rP   rQ   rR   rS   rT   rU   r   r   )
r%   ÚdataÚdZtx_lenÚlengthr   Únr[   rZ   rB   r'   r'   r(   Úwrite½   sB    


 " 
zSerial.writec              
   C   sî   | j stƒ ‚d}|rêt | jgg g d¡\}}}z|r@| j d¡}W q 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 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   rI   N)r   r   rC   r   rM   rO   rP   rQ   rR   rS   rT   rU   r   r   r   r   )r%   rZ   r[   rB   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%   Ú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 ctsTre   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 dsrTre   r*   r'   r'   r(   Údsr8  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 riFre   r*   r'   r'   r(   ÚriA  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)Tre   r*   r'   r'   r(   ÚcdJ  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(   rn   V  s    zSerial.filenoN)rH   )rf   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z	BAUDRATESr)   r    r-   r   ÚpropertyrG   rY   rd   r#   r$   rh   ri   r"   r!   rj   rk   rl   rm   rn   r'   r'   r'   r(   r   -   s2   


)5






r   Ú__main__zsocket://localhost:7000z{}
z	write...
s   hello
z	read: {}
)"Ú
__future__r   rP   r0   rC   r   r.   r1   ÚImportErrorÚurllib.parseÚparseZserial.serialutilr   r   r   r   r   r   ÚDEBUGÚINFOÚWARNINGÚERRORr:   r   r   ro   ÚsysÚsÚstdoutrd   r   ÚflushrY   r-   r'   r'   r'   r(   Ú<module>   s8    ü  2

