U
    ~d\!                     @   s   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 zd dlZW n ek
rf   d dlZY nX 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|| d S N)_hid_handle_read_buffer_threadsuperr   __init__)selfargskwargs	__class__ ^/var/www/html/myproject/myenv/lib/python3.8/site-packages/serial/urlhandler/protocol_cp2110.pyr   E   s    zSerial.__init__c              
   C   s  | j d krtd| jr tdt | _t | _z| | j	}| j
| W n8 tk
r } zt|jd| j |W 5 d }~X Y nX z|   W n0   z| j  W n   Y nX d | _ Y nBX 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	threadingThread_hid_read_loopr   	setDaemonsetNamestart)r   Zportpathmsgr   r   r   openK   s2    


(zSerial.openc                 C   sB   t |}|jdkr$td|j|jr6|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)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   sb  d }| j tjkrd}nX| j tjkr(d}nF| j tjkr:d}n4| j tjkrLd}n"| j tjkr^d}ntd| j | j	rzd}nd}d }| j
dkrd}n@| j
dkrd}n0| j
d	krd}n | j
d
krd}ntd| j
d }| jtjkrd}n6| jtjkrd}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)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struct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   qsizer7   r   r   r   
in_waiting   s    zSerial.in_waitingc                 C   s<   | j st | jtttf | j r8| j	d q d S )NF)
r   r   r   rC   rD   _REPORT_SET_PURGE_FIFOS_PURGE_RX_FIFOr   rH   getr7   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   rC   rD   rJ   _PURGE_TX_FIFOr7   r   r   r   reset_output_buffer   s
    
zSerial.reset_output_bufferc                 C   s@   | j st | jr(| j ttdf n| j ttdf d S )Nr   )r   r   Z_break_staterC   rD   _REPORT_SET_TRANSMIT_LINE_BREAK_REPORT_SET_STOP_LINE_BREAKr7   r   r   r   rG      s    

zSerial._update_break_stater   c                 C   s   | j st t }zdt| j}t||k rt| jd kr<td| j	d|
 }|d kr`t|W S ||7 }| rqtqW n tjk
r   Y nX t|S )Nz&connection failed (reader thread died)T)r   r   	bytearrayr   _timeoutlenr   r   r   rL   Z	time_leftrD   Zexpiredr   Empty)r   sizedatatimeoutbufr   r   r   read   s"    


zSerial.readc                 C   sj   | j st t|}t|}|dkrft|d}t|g|d |  }| j| ||d  }t|}qd S )Nr   ?   )r   r   r   rT   minr   write)r   rW   Ztx_lenZ
to_be_sentreportr   r   r   r]      s    
zSerial.writec                 C   sZ   zL| jrJ| jjddd}|sq|d}|t|ks8t| jt	| qW 5 d | _ X d S )N@   d   )Z
timeout_msr   )
r   r   r   rZ   poprT   AssertionErrorr   putrR   )r   rW   data_lenr   r   r   r(      s    
zSerial._hid_read_loop)r   )__name__
__module____qualname__Z	BAUDRATESr   r-   r    r%   r$   propertyrI   rM   rO   rG   rZ   r]   r(   __classcell__r   r   r   r   r   =   s   9
	
r   )r@   r&   r.   ImportErrorurllib.parseparser   queuer   r>   Zserial.serialutilr   r   r   r   r   rE   Z_DISABLE_UARTrF   rJ   rN   rK   rB   rP   rQ   r   r   r   r   r   <module>   s,   