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 {})Z_portr   is_openQueuer   hidZdevicer   from_urlZportstrZ	open_pathOSErrorerrnoformat_reconfigure_portclose	threadingZThread_hid_read_loopr   Z	setDaemonZsetNamestart)r   Z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 )NZcp2110zuexpected a string in the forms "cp2110:///dev/hidraw9" or "cp2110://0001:0023:00": not starting with cp2110:// {{!r}}zutf-8)urlparseZurlsplitZschemer   r#   Znetlocencodepath)r   Z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)Z_parityserialZPARITY_NONEZ
PARITY_ODDZPARITY_EVENZPARITY_MARKZPARITY_SPACE
ValueErrorr#   ZrtsctsZ	_bytesizeZ	_stopbitsZSTOPBITS_ONEZSTOPBITS_ONE_POINT_FIVEZSTOPBITS_TWOstructZpack_REPORT_GETSET_UART_CONFIGZ	_baudrater   send_feature_reportbytes_REPORT_GETSET_UART_ENABLE_ENABLE_UART_update_break_state)r   Zparity_valueZflow_control_valueZdata_bits_valueZstop_bits_valueZconfiguration_reportr   r   r   r$   }   s^   



	
zSerial._reconfigure_portc                 C   s
   | j  S r   )r   qsizer0   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   r;   r<   _REPORT_SET_PURGE_FIFOS_PURGE_RX_FIFOr   r@   getr0   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   r;   r<   rB   _PURGE_TX_FIFOr0   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   Z_break_stater;   r<   _REPORT_SET_TRANSMIT_LINE_BREAK_REPORT_SET_STOP_LINE_BREAKr0   r   r   r   r?      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   Z_timeoutlenr   r   r   rD   Z	time_leftr<   Zexpiredr   ZEmpty)r   sizedataZ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   rK   minr   write)r   rM   Ztx_lenZ
to_be_sentreportr   r   r   rR      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   )Z
timeout_msr   )	r   r   rO   poprK   r   ZputrJ   r   )r   rM   Zdata_lenr   r   r   r'      s   

zSerial._hid_read_loop)r   )__name__
__module____qualname__Z	BAUDRATESr   r*   r    r%   r$   propertyrA   rE   rG   r?   rO   rR   r'   __classcell__r   r   r   r   r   =   s    9
	
r   )r9   r&   r+   ImportErrorZurllib.parseparser   queuer   r7   Zserial.serialutilr   r   r   r   r   r=   Z_DISABLE_UARTr>   rB   rF   rC   r:   rH   rI   r   r   r   r   r   <module>   s2   