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TimeoutA      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rd}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   