o
    Ê¦^_\!  ã                   @   sÈ   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 zd dlZW n ey1   d dlZY nw d dlZd dl	Z	d dl
mZmZmZmZmZ dZd ZdZdZdZdZdZdZd	ZG d
d„ deƒZdS )é    N)Ú
SerialBaseÚSerialExceptionÚPortNotOpenErrorÚto_bytesÚTimeoutéA   é   éC   é   éP   éQ   éR   c                       s~   e Zd ZdZ‡ f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ddd„Zdd„ Zdd„ Z‡  ZS )ÚSerial)i,  iw  iX  i°  i  i`	  iÀ  i€%  i K  i –  i á  i Â i „ i  i ¡ i Ê i  i@B c                    s,   d | _ d | _d | _tt| ƒj|i |¤Ž d S ©N)Ú_hid_handleÚ_read_bufferÚ_threadÚsuperr   Ú__init__)ÚselfÚargsÚkwargs©Ú	__class__© úC/usr/lib/python3/dist-packages/serial/urlhandler/protocol_cp2110.pyr   E   s   zSerial.__init__c              
   C   sþ   | j d u r	tdƒ‚| jrtdƒ‚t ¡ | _t ¡ | _z|  | j	¡}| j 
|¡ W n ty? } zt|jd | j |¡ƒ‚d }~ww z|  ¡  W n   z
| j ¡  W d | _‚    Y d | _‚ d| _tj| jd�| _| j d¡ | j d | j ¡¡ | j ¡  d S )Nz.Port must be configured before it can be used.zPort is already open.zcould not open port {}: {}T)Útargetz$pySerial CP2110 reader thread for {})Ú_portr   Úis_openÚQueuer   ÚhidÚdevicer   Úfrom_urlÚportstrÚ	open_pathÚOSErrorÚerrnoÚformatÚ_reconfigure_portÚcloseÚ	threadingÚThreadÚ_hid_read_loopr   Ú	setDaemonÚsetNameÚstart)r   ÚportpathÚmsgr   r   r   ÚopenK   s:   


€ÿýzSerial.openc                 C   sB   t  |¡}|jdkrtd |j¡ƒ‚|jr|j d¡S |j d¡S )NÚcp2110zuexpected a string in the forms "cp2110:///dev/hidraw9" or "cp2110://0001:0023:00": not starting with cp2110:// {{!r}}zutf-8)ÚurlparseÚurlsplitÚschemer   r'   ÚnetlocÚencodeÚpath)r   ÚurlÚpartsr   r   r   r"   j   s   

ýzSerial.from_urlc                 C   s2   d| _ | jr| j d¡ d | _| j ¡  d | _d S )NFr   )r   r   Újoinr   r)   ©r   r   r   r   r)   u   s   

zSerial.closec              	   C   s`  d }| j tjkrd}n,| j tjkrd}n#| j tjkrd}n| j tjkr&d}n| j tjkr/d}ntd | j ¡ƒ‚| j	r=d}nd}d }| j
dkrId}n | j
dkrQd}n| j
d	krYd}n| j
d
krad}ntd | j
¡ƒ‚d }| jtjkrtd}n| jtjkr}d}n| jtjkr†d}ntd | j¡ƒ‚t dt| j||||¡}| j |¡ | j tttfƒ¡ |  ¡  d S )Nr   r   r
   é   é   zInvalid parity: {!r}é   é   é   é   zInvalid char len: {!r}z$Invalid stop bit specification: {!r}z>BLBBBB)Ú_parityÚserialÚPARITY_NONEÚ
PARITY_ODDÚPARITY_EVENÚPARITY_MARKÚPARITY_SPACEÚ
ValueErrorr'   ÚrtsctsÚ	_bytesizeÚ	_stopbitsÚSTOPBITS_ONEÚSTOPBITS_ONE_POINT_FIVEÚSTOPBITS_TWOÚstructÚpackÚ_REPORT_GETSET_UART_CONFIGÚ	_baudrater   Úsend_feature_reportÚbytesÚ_REPORT_GETSET_UART_ENABLEÚ_ENABLE_UARTÚ_update_break_state)r   Úparity_valueÚflow_control_valueÚdata_bits_valueÚstop_bits_valueÚconfiguration_reportr   r   r   r(   }   s^   



ù	
ÿzSerial._reconfigure_portc                 C   s
   | j  ¡ S r   )r   Úqsizer=   r   r   r   Ú
in_waiting¶   s   
zSerial.in_waitingc                 C   sH   | j stƒ ‚| j tttfƒ¡ | j ¡ r"| j 	d¡ | j ¡ sd S d S )NF)
r   r   r   rV   rW   Ú_REPORT_SET_PURGE_FIFOSÚ_PURGE_RX_FIFOr   r`   Úgetr=   r   r   r   Úreset_input_bufferº   s   
ÿ
ÿzSerial.reset_input_bufferc                 C   s$   | j stƒ ‚| j tttfƒ¡ d S r   )r   r   r   rV   rW   rb   Ú_PURGE_TX_FIFOr=   r   r   r   Úreset_output_bufferÃ   s
   
ÿzSerial.reset_output_bufferc                 C   sB   | j stƒ ‚| jr| j  ttdfƒ¡ d S | j  ttdfƒ¡ d S )Nr   )r   r   Ú_break_staterV   rW   Ú_REPORT_SET_TRANSMIT_LINE_BREAKÚ_REPORT_SET_STOP_LINE_BREAKr=   r   r   r   rZ   É   s   
ÿ
ÿzSerial._update_break_stater   c                 C   s¶   | j stƒ ‚tƒ }zDt| jƒ}t|ƒ|k rD| jd u rtdƒ‚| j 	d| 
¡ ¡}|d u r0t|ƒW S ||7 }| ¡ r9nt|ƒ|k sW t|ƒS W t|ƒS W t|ƒS  tjyZ   Y t|ƒS w )Nz&connection failed (reader thread died)T)r   r   Ú	bytearrayr   Ú_timeoutÚlenr   r   r   rd   Ú	time_leftrW   Úexpiredr   ÚEmpty)r   ÚsizeÚdataÚtimeoutÚbufr   r   r   Úread×   s0   


øõýþþzSerial.readc                 C   st   | j stƒ ‚t|ƒ}t|ƒ}|dkr8t|dƒ}t|gƒ|d |…  }| j |¡ ||d … }t|ƒ}|dksd S d S )Nr   é?   )r   r   r   rm   Úminr   Úwrite)r   rr   Útx_lenÚ
to_be_sentÚreportr   r   r   rx   ë   s   
úzSerial.writec                 C   sn   z2| j r-| jjddd�}|sq| d¡}|t|ƒksJ ‚| j t|ƒ¡ | j sW d | _d S W d | _d S d | _w )Né@   éd   )Ú
timeout_msr   )	r   r   ru   Úpoprm   r   Úputrk   r   )r   rr   Údata_lenr   r   r   r,   ø   s   
ú
øzSerial._hid_read_loop)r   )Ú__name__Ú
__module__Ú__qualname__Ú	BAUDRATESr   r2   r"   r)   r(   Úpropertyra   re   rg   rZ   ru   rx   r,   Ú__classcell__r   r   r   r   r   =   s    9
	
r   )rR   r*   r4   ÚImportErrorÚurllib.parseÚparser   Úqueuer    rE   Úserial.serialutilr   r   r   r   r   rX   Ú_DISABLE_UARTrY   rb   rf   rc   rT   ri   rj   r   r   r   r   r   Ú<module>   s2   ÿÿ