
*qVG                 @   s  d  d l  Z  d  d l Z d  d l m Z d  d l Z d  d l m Z m Z m Z m Z m	 Z	 Gd d   d e  Z
 e d k r
d  d l Z e
 d   Z e j j d e  e
   Z e j j d e  d e _ d	 e _ e j   d  e _ e j   e j j d e  d S)
    N)win32)
SerialBaseSerialExceptionto_bytesportNotOpenErrorwriteTimeoutErrorc                   sZ  e  Z d  Z d Z dC Z   f d 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)   Z d* d+   Z d, d-   Z d. d/   Z d0 d1   Z e
 d2 d3    Z e
 d4 d5    Z e
 d6 d7    Z e
 d8 d9    Z d: d; d< d=  Z d> d? d@  Z e
 dA dB    Z   S)DSerialz5Serial port implementation for Win32 based on ctypes.2   K   n            ,  X      `	    %   K          c                sE   t  t |   j   d  |  _ d  |  _ d  |  _ t j |  | |  d  S)N)superr   __init___port_handle_overlapped_read_overlapped_write)selfargskwargs)	__class__ 4/usr/lib/python3/dist-packages/serial/serialwin32.pyr      s
    			zSerial.__init__c             C   s  |  j  d k r t d   |  j r0 t d   |  j } y? | j   j d  rw t | d d   d k rw d | } Wn t k
 r Yn Xt j	 | t j
 t j Bd d t j t j t j Bd  |  _ |  j t j k rd |  _ t d	 |  j t j   f   y t j   |  _ t j d d
 d d  |  j _ t j   |  _ t j d d d d  |  j _ t j |  j d d  t j   |  _ t j |  j t j |  j   |  j   t j |  j t j  t j! Bt j" Bt j# B Wn- y |  j$   Wn Yn Xd |  _   Yn
 Xd |  _ 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.ZCOM      z\\.\r   zcould not open port %r: %r   i   T)%Z_portr   is_opennameupper
startswithint
ValueErrorr   Z
CreateFileZGENERIC_READZGENERIC_WRITEZOPEN_EXISTINGFILE_ATTRIBUTE_NORMALZFILE_FLAG_OVERLAPPEDr   ZINVALID_HANDLE_VALUEZportstrctypesWinErrorZ
OVERLAPPEDr   ZCreateEventhEventr   	SetupCommCOMMTIMEOUTS_orgTimeoutsZGetCommTimeoutsbyref_reconfigure_port	PurgeCommPURGE_TXCLEARPURGE_TXABORTPURGE_RXCLEARPURGE_RXABORT_close)r   portr#   r#   r$   open!   sR    		1	
#	zSerial.openc             C   sD  |  j  s t d   t j   } |  j d k r3 n= |  j d k rQ t j | _ n t t |  j d  d  | _	 |  j d k r |  j
 d k	 r t t |  j
 d  d  | _ |  j d k r n= |  j d k r t j | _ n t t |  j d  d  | _ t j |  j  t j |   t j |  j  t j  t j   } t j |  j  t j |   |  j | _ |  j t j k rd | _ nm |  j t j k rd | _ nO |  j t j k rd | _ n1 |  j t j k rd	 | _ n t d
 |  j   |  j t j k rt j  | _! d | _" n |  j t j# k rAt j$ | _! d | _" n |  j t j% k rkt j& | _! d | _" ng |  j t j' k rt j( | _! d | _" n= |  j t j) k rt j* | _! d | _" n t d |  j   |  j+ t j, k rt j- | _. nU |  j+ t j/ k rt j0 | _. n4 |  j+ t j1 k r5t j2 | _. n t d |  j+   d | _3 |  j4 d k r|  j5 rxt j6 | _7 n |  j8 rt j9 n t j: | _7 |  j5 | _; n |  j4 j< st d |  j4 j< f   |  j4 j= rt d |  j4 j= f   |  j4 j> d k	 rt d |  j4 j> f   |  j4 j? d k	 rEt d |  j4 j? f   |  j4 j@ rjt d |  j4 j@ f   t jA | _7 d | _; |  jB rt jC | _D n |  jE rt jF n t jG | _D |  jB | _H |  jI | _J |  jI | _K d | _L d | _M d | _N t jO | _P t jQ | _R t jS |  j  t j |   s@t d t jT     d S)z,Set communication parameters on opened port.z'Can only operate on a valid port handleNr   i  r'            r&   z#Unsupported number of data bits: %rzUnsupported parity mode: %rz#Unsupported number of stop bits: %rz8Unsupported value for RS485Settings.rts_level_for_tx: %rz8Unsupported value for RS485Settings.rts_level_for_rx: %rz7Unsupported value for RS485Settings.delay_before_tx: %rz7Unsupported value for RS485Settings.delay_before_rx: %rz0Unsupported value for RS485Settings.loopback: %rzACannot configure port, something went wrong. Original message: %r)Ur   r   r   r3   Z_timeoutZMAXDWORDZReadIntervalTimeoutmaxr,   ZReadTotalTimeoutConstantZ_inter_byte_timeout_write_timeoutZWriteTotalTimeoutConstantSetCommTimeoutsr/   r5   ZSetCommMaskZEV_ERRZDCBZGetCommStateZ	_baudrateZBaudRateZ	_bytesizeserialZFIVEBITSZByteSizeZSIXBITSZ	SEVENBITSZ	EIGHTBITSr-   Z_parityZPARITY_NONEZNOPARITYZParityZfParityZPARITY_EVENZ
EVENPARITYZ
PARITY_ODDZ	ODDPARITYZPARITY_MARKZ
MARKPARITYZPARITY_SPACEZSPACEPARITYZ	_stopbitsZSTOPBITS_ONEZ
ONESTOPBITZStopBitsZSTOPBITS_ONE_POINT_FIVEZONE5STOPBITSZSTOPBITS_TWOZTWOSTOPBITSZfBinaryZ_rs485_modeZ_rtsctsZRTS_CONTROL_HANDSHAKEZfRtsControl
_rts_stateZRTS_CONTROL_ENABLEZRTS_CONTROL_DISABLEZfOutxCtsFlowZrts_level_for_txZrts_level_for_rxZdelay_before_txZdelay_before_rxZloopbackZRTS_CONTROL_TOGGLEZ_dsrdtrZDTR_CONTROL_HANDSHAKEZfDtrControl
_dtr_stateZDTR_CONTROL_ENABLEZDTR_CONTROL_DISABLEZfOutxDsrFlowZ_xonxoffZfOutXZfInXZfNullZ
fErrorCharZfAbortOnErrorZXONZXonCharZXOFFZXoffCharZSetCommStater0   )r   ZtimeoutsZcomDCBr#   r#   r$   r6   b   s    								zSerial._reconfigure_portc             C   s   |  j  r t j |  j  |  j  t j |  j   |  j d k	 rZ t j |  j j  d |  _ |  j d k	 r t j |  j j  d |  _ d |  _  d S)zinternal close port helperN)r   r   rD   r4   ZCloseHandler   r1   r   )r   r#   r#   r$   r<      s    			zSerial._closec             C   s    |  j  r |  j   d |  _  d S)z
Close portFN)r(   r<   )r   r#   r#   r$   close   s    	
zSerial.closec             C   sU   t  j   } t  j   } t  j |  j t j |  t j |   sN t d   | j S)z9Return the number of bytes currently in the input buffer.zcall to ClearCommError failed)	r   DWORDCOMSTATClearCommErrorr   r/   r5   r   cbInQue)r   flagscomstatr#   r#   r$   
in_waiting   s
    *zSerial.in_waitingr'   c       	      C   sh  |  j  s t  | d k rUt j |  j j  t j   } t j   } t j |  j  t	 j
 |  t	 j
 |   s| t d   |  j d k rt | j |  } | d k ryt	 j |  } t j   } t j |  j  | | t	 j
 |  t	 j
 |  j   } | r2t j   t j t j f k r2t d t	 j     t j |  j  t	 j
 |  j  t	 j
 |  d  | j d | j  } qRt   } q^t	 j |  } t j   } t j |  j  | | t	 j
 |  t	 j
 |  j   } | rt j   t j t j f k rt d t	 j     t j |  j  t	 j
 |  j  t	 j
 |  d  | j d | j  } n	 t   } 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.r   zcall to ClearCommError failedzReadFile failed (%r)TN)r   r   r   Z
ResetEventr   r1   rI   rJ   rK   r/   r5   r   ZtimeoutminrL   Zcreate_string_bufferZReadFileGetLastErrorZERROR_SUCCESSERROR_IO_PENDINGr0   GetOverlappedResultrawvaluebytes)	r   sizerM   rN   nZbufrcZread_okreadr#   r#   r$   rZ     s8    	*3%.3%.	zSerial.readc             C   s   |  j  s t  t |  } | r t j   } t j |  j  | t |  t j |  |  j	  } | r t j
   t j k r t d t j     |  j d k r t j |  j  |  j	 t j |  d  } | j t |  k r t  | j Sd Sd S)z2Output the given byte string over the serial port.zWriteFile failed (%r)r   TN)r   r   r   r   rI   Z	WriteFilelenr/   r5   r   rQ   rR   r   r0   rC   rS   rU   r   )r   datarX   errr#   r#   r$   write&  s    	0'zSerial.writec             C   s!   x |  j  r t j d  q Wd S)zb        Flush of file like objects. In this case, wait until all data
        is written.
        g?N)out_waitingtimeZsleep)r   r#   r#   r$   flush>  s    zSerial.flushc             C   s0   |  j  s t  t j |  j  t j t j B d S)z9Clear input buffer, discarding all that is in the buffer.N)r   r   r   r7   r:   r;   )r   r#   r#   r$   reset_input_bufferI  s    	zSerial.reset_input_bufferc             C   s0   |  j  s t  t j |  j  t j t j B d S)zs        Clear output buffer, aborting the current output and discarding all
        that is in the buffer.
        N)r   r   r   r7   r8   r9   )r   r#   r#   r$   reset_output_bufferO  s    	zSerial.reset_output_bufferc             C   s?   |  j  s t  |  j r+ t j |  j   n t j |  j   d S)zBSet break: Controls TXD. When active, to transmitting is possible.N)r   r   Z_break_stater   ZSetCommBreakZClearCommBreak)r   r#   r#   r$   _update_break_stateX  s
    		zSerial._update_break_statec             C   s<   |  j  r" t j |  j t j  n t j |  j t j  d S)z)Set terminal status line: Request To SendN)rF   r   EscapeCommFunctionr   ZSETRTSZCLRRTS)r   r#   r#   r$   _update_rts_statea  s    	zSerial._update_rts_statec             C   s<   |  j  r" t j |  j t j  n t j |  j t j  d S)z-Set terminal status line: Data Terminal ReadyN)rG   r   re   r   ZSETDTRZCLRDTR)r   r#   r#   r$   _update_dtr_stateh  s    	zSerial._update_dtr_statec             C   s>   |  j  s t  t j   } t j |  j  t j |   | j S)N)r   r   r   rI   ZGetCommModemStatusr/   r5   rU   )r   statr#   r#   r$   _GetCommModemStatuso  s
    	zSerial._GetCommModemStatusc             C   s   t  j |  j   @d k S)z(Read terminal status line: Clear To Sendr   )r   Z	MS_CTS_ONri   )r   r#   r#   r$   ctsv  s    z
Serial.ctsc             C   s   t  j |  j   @d k S)z)Read terminal status line: Data Set Readyr   )r   Z	MS_DSR_ONri   )r   r#   r#   r$   dsr{  s    z
Serial.dsrc             C   s   t  j |  j   @d k S)z)Read terminal status line: Ring Indicatorr   )r   Z
MS_RING_ONri   )r   r#   r#   r$   ri  s    z	Serial.ric             C   s   t  j |  j   @d k S)z)Read terminal status line: Carrier Detectr   )r   Z
MS_RLSD_ONri   )r   r#   r#   r$   cd  s    z	Serial.cdi   Nc             C   s,   | d k r | } t  j |  j | |  d S)z        Recommend a buffer size to the driver (device driver can ignore this
        value). Must be called before the port is opended.
        N)r   r2   r   )r   Zrx_sizeZtx_sizer#   r#   r$   set_buffer_size  s    zSerial.set_buffer_sizeTc             C   sH   |  j  s t  | r. t j |  j  t j  n t j |  j  t j  d S)a*          Manually control flow - when software flow control is enabled.
        This will do the same as if XON (true) or XOFF (false) are received
        from the other device and control the transmission accordingly.
        WARNING: this function is not portable to different platforms!
        N)r   r   r   re   ZSETXONZSETXOFF)r   enabler#   r#   r$   set_output_flow_control  s
    	zSerial.set_output_flow_controlc             C   sU   t  j   } t  j   } t  j |  j t j |  t j |   sN t d   | j S)z0Return how many bytes the in the outgoing bufferzcall to ClearCommError failed)	r   rI   rJ   rK   r   r/   r5   r   ZcbOutQue)r   rM   rN   r#   r#   r$   r_     s
    *zSerial.out_waiting)r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname____doc__Z	BAUDRATESr   r>   r6   r<   rH   propertyrO   rZ   r^   ra   rb   rc   rd   rf   rg   ri   rj   rk   rl   rm   rn   rp   r_   r#   r#   )r"   r$   r      s2    A	%			r   __main__z%s
i K  rA   )r/   r`   rE   r   Zserial.serialutilr   r   r   r   r   r   rq   syssstdoutr^   ZbaudrateZdatabitsrH   r=   r>   r#   r#   r#   r$   <module>   s$   ( 			
	
