
    +a_<O                     f    d dl mZ 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  G d de      Zy)    )absolute_importN)win32)
SerialBaseSerialExceptionto_bytesPortNotOpenErrorSerialTimeoutExceptionc                   0    e Zd ZdZdZ fdZd Zd Zd Zd Z	e
d        Zdd	Zd
 Zd Zd Zd Zd Zd Zd Zd Ze
d        Ze
d        Ze
d        Ze
d        ZddZddZe
d        Zd Zd Zd Zej@                  jB                  d        Z  xZ"S ) Serialz5Serial port implementation for Win32 based on ctypes.)2   K   n            i,  iX  i  i  i`	  i  i%  i K  i   i   i  c                 V    d | _         d | _        d | _        t        t        |   |i | y N)_port_handle_overlapped_read_overlapped_writesuperr   __init__)selfargskwargs	__class__s      4/usr/lib/python3/dist-packages/serial/serialwin32.pyr   zSerial.__init__   s/      $!%fd$d5f5    c           	         | j                   t        d      | j                  rt        d      | j                  }	 |j	                         j                  d      rt        |dd       dkD  rd|z   }t        j                  |t        j                  t        j                  z  ddt        j                  t        j                  t        j                  z  d      | _        | j                  t        j                   k(  r>d| _        t        d	j#                  | j$                  t'        j(                                     	 t        j*                         | _        t        j.                  dd
dd      | j,                  _        t        j*                         | _        t        j.                  dddd      | j2                  _        t        j4                  | j                  dd       t        j6                         | _        t        j:                  | j                  t'        j<                  | j8                               | j?                          t        j@                  | j                  t        jB                  t        jD                  z  t        jF                  z  t        jH                  z         d| _        y# t        $ r Y Dw xY w#  	 | jK                          d| _         #  Y d| _         xY wxY w)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.COM      z\\.\r   zcould not open port {!r}: {!r}      T)&_portr   is_opennameupper
startswithint
ValueErrorr   
CreateFileGENERIC_READGENERIC_WRITEOPEN_EXISTINGFILE_ATTRIBUTE_NORMALFILE_FLAG_OVERLAPPEDr   INVALID_HANDLE_VALUEformatportstrctypesWinError
OVERLAPPEDr   CreateEventhEventr   	SetupCommCOMMTIMEOUTS_orgTimeoutsGetCommTimeoutsbyref_reconfigure_port	PurgeCommPURGE_TXCLEARPURGE_TXABORTPURGE_RXCLEARPURGE_RXABORT_close)r   ports     r   openzSerial.open#   sa   
 ::!"RSS<<!"9:: yy	zz|&&u-#d12h-!2C 4' ",,!4!44''%*D*DD  : :: $D!"B"I"I$,,X^XgXgXi"jkk 	 $)$4$4$6D!+0+<+<T1a+ND!!(%*%5%5%7D",1,=,=dAq$,OD"") OOD--tT: !& 2 2 4D!!$"3"3V\\$BSBS5TU""$ OO!!##e&9&99##$&+&9&9:;  DL_  		J	
 !%D  $Ds6   5J) 9E(J9 )	J65J69K"<KK"KK"c                 F   | j                   st        d      t        j                         }| j                  nL| j                  dk(  rt        j
                  |_        n't        t        | j                  dz        d      |_	        | j                  dk7  r3| j                  't        t        | j                  dz        d      |_        | j                  nL| j                  dk(  rt        j
                  |_        n't        t        | j                  dz        d      |_        t        j                  | j                   t        j                  |             t        j                   | j                   t        j"                         t        j$                         }t        j&                  | j                   t        j                  |             | j(                  |_        | j,                  t.        j0                  k(  rd|_        n| j,                  t.        j4                  k(  rd|_        nn| j,                  t.        j6                  k(  rd|_        nI| j,                  t.        j8                  k(  rd	|_        n$t;        d
j=                  | j,                              | j>                  t.        j@                  k(  rt        jB                  |_"        d|_#        n| j>                  t.        jH                  k(  rt        jJ                  |_"        d|_#        n| j>                  t.        jL                  k(  rt        jN                  |_"        d|_#        n| j>                  t.        jP                  k(  rt        jR                  |_"        d|_#        n^| j>                  t.        jT                  k(  rt        jV                  |_"        d|_#        n$t;        dj=                  | j>                              | jX                  t.        jZ                  k(  rt        j\                  |_/        n| jX                  t.        j`                  k(  rt        jb                  |_/        nW| jX                  t.        jd                  k(  rt        jf                  |_/        n$t;        dj=                  | jX                              d|_4        | jj                  f| jl                  rt        jn                  |_8        n1| jr                  rt        jt                  nt        jv                  |_8        | jl                  |_<        np| jj                  jz                  s.t;        dj=                  | jj                  jz                              | jj                  j|                  r.t;        dj=                  | jj                  j|                              | jj                  j~                  .t;        dj=                  | jj                  j~                              | jj                  j                  .t;        dj=                  | jj                  j                              | jj                  j                  r.t;        dj=                  | jj                  j                              t        j                  |_8        d|_<        | j                  rt        j                  |_E        n1| j                  rt        j                  nt        j                  |_E        | j                  |_I        | j                  |_K        | j                  |_L        d|_M        d|_N        d|_O        t.        j                  |_Q        t.        j                  |_S        t        j                  | j                   t        j                  |            s,t        dj=                  t        j                                     y)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: {!r}zUnsupported parity mode: {!r}z%Unsupported number of stop bits: {!r}zQUnsupported value for RS485Settings.rts_level_for_tx: {!r} (only True is allowed)zRUnsupported value for RS485Settings.rts_level_for_rx: {!r} (only False is allowed)zPUnsupported value for RS485Settings.delay_before_tx: {!r} (only None is allowed)zPUnsupported value for RS485Settings.delay_before_rx: {!r} (only None is allowed)zJUnsupported value for RS485Settings.loopback: {!r} (only False is allowed)zCCannot configure port, something went wrong. Original message: {!r})Vr   r   r   r;   _timeoutMAXDWORDReadIntervalTimeoutmaxr*   ReadTotalTimeoutConstant_inter_byte_timeout_write_timeoutWriteTotalTimeoutConstantSetCommTimeoutsr5   r>   SetCommMaskEV_ERRDCBGetCommState	_baudrateBaudRate	_bytesizeserialFIVEBITSByteSizeSIXBITS	SEVENBITS	EIGHTBITSr+   r3   _parityPARITY_NONENOPARITYParityfParityPARITY_EVEN
EVENPARITY
PARITY_ODD	ODDPARITYPARITY_MARK
MARKPARITYPARITY_SPACESPACEPARITY	_stopbitsSTOPBITS_ONE
ONESTOPBITStopBitsSTOPBITS_ONE_POINT_FIVEONE5STOPBITSSTOPBITS_TWOTWOSTOPBITSfBinary_rs485_mode_rtsctsRTS_CONTROL_HANDSHAKEfRtsControl
_rts_stateRTS_CONTROL_ENABLERTS_CONTROL_DISABLEfOutxCtsFlowrts_level_for_txrts_level_for_rxdelay_before_txdelay_before_rxloopbackRTS_CONTROL_TOGGLE_dsrdtrDTR_CONTROL_HANDSHAKEfDtrControl
_dtr_stateDTR_CONTROL_ENABLEDTR_CONTROL_DISABLEfOutxDsrFlow_xonxofffOutXfInXfNull
fErrorCharfAbortOnErrorXONXonCharXOFFXoffCharSetCommStater6   )r   timeoutscomDCBs      r   r?   zSerial._reconfigure_portd   s     !"KLL %%'== ]]a+0>>H(03C8L4Mq0QH-==A$":":"F+.s43K3Kd3R/SUV+WH(&  A%16H.14S9L9Lt9S5TVW1XH.d//h1GH$++U\\: 4,,fll6.BC..>>V__,FO^^v~~-FO^^v///FO^^v///FODKKDNN[\\<<6---!NNFMFN\\V///!,,FMFN\\V...!OOFMFN\\V///!,,FMFN\\V000!--FMFN<CCDLLQRR>>V000#..FO^^v===#00FO^^v222#//FODKKDNN[\\#||%*%@%@"AEU%=%=V[VoVo""&,,F ##44 gnn((99<= = 00 hoo((99<= = //; fmm((88;< < //; fmm((88;< < (( `gg((1145 5 "'!9!9F"#F<<!&!<!<F=A__!9!9RWRkRkF"ll}}mm  ++!!$"3"3V\\&5IJ!))/0A)BD D Kr   c                    | j                   t        j                  | j                   | j                         | j                  @| j                          t        j                  | j                  j                         d| _        | j                  @| j                          t        j                  | j                  j                         d| _        t        j                  | j                          d| _         yy)zinternal close port helperN)
r   r   rT   r<   r   cancel_readCloseHandler9   r   cancel_writer   s    r   rE   zSerial._close   s    (!!$"3"3T5F5FG$$0  "!!$"7"7">">?(,%%%1!!#!!$"8"8"?"?@)-&d//0 $D )r   c                 L    | j                   r| j                          d| _         yy)z
Close portFN)r&   rE   r   s    r   closezSerial.close   s    <<KKM DL r   c                 P   t        j                         }t        j                         }t        j                  | j                  t        j                  |      t        j                  |            s,t        dj                  t        j                                     |j                  S )z9Return the number of bytes currently in the input buffer.ClearCommError failed ({!r}))r   DWORDCOMSTATClearCommErrorr   r5   r>   r   r3   r6   cbInQuer   flagscomstats      r   
in_waitingzSerial.in_waiting   sm     --/##D$5$5v||E7JFLLY`Lab!"@"G"GHY"Z[[r   c           	         | j                   s
t               |dkD  rt        j                  | j                  j
                         t        j                         }t        j                         }t        j                  | j                  t        j                  |      t        j                  |            s,t        dj                  t        j                                     | j                  dk(  rt!        |j"                  |      n|}|dkD  rt        j$                  |      }t        j                         }t        j&                  | j                  ||t        j                  |      t        j                  | j                              }|s`t        j(                         t        j*                  t        j,                  fvr,t        dj                  t        j                                     t        j.                  | j                  t        j                  | j                        t        j                  |      d      }|sQt        j(                         t        j0                  k7  r,t        dj                  t        j                                     |j2                  d|j4                   }	t7        |	      S t7               }	t7        |	      S t7               }	t7        |	      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   r   zReadFile failed ({!r})Tz!GetOverlappedResult failed ({!r})N)r&   r   r   
ResetEventr   r9   r   r   r   r   r5   r>   r   r3   r6   timeoutminr   create_string_bufferReadFileGetLastErrorERROR_SUCCESSERROR_IO_PENDINGGetOverlappedResultERROR_OPERATION_ABORTEDrawvaluebytes)
r   sizer   r   nbufrcread_ok	result_okreads
             r   r   zSerial.read  s    ||"$$!8T2299:KKMEmmoG''(9(96<<;NPVP\P\]dPef%&D&K&KFOOL]&^__.2lla.?GOOT*TA1u11!4[[]..%%LL$LL!6!679 5#5#5#7@S@SUZUkUk?l#l)*B*I*I&//J[*\]]!55%%LL!6!67LL$		
 !))+u/L/LL-.Q.X.XY_YhYhYj.kllwwy)
 T{ w T{ 7DT{r   c                    | j                   s
t               t        |      }|rt        j                         }t        j
                  | j                  |t        |      t        j                  |      | j                        }| j                  dk7  r|s`t        j                         t        j                  t        j                  fvr,t        dj!                  t        j"                                     t        j$                  | j                  | j                  t        j                  |      d       t        j                         t        j&                  k(  r|j(                  S |j(                  t        |      k7  rt+        d      |j(                  S |rt        j                  nt        j                         }|t        j,                  t        j.                  t        j&                  fv ry|t        j                  t        j                  fv rt        |      S t        dj!                  t        j"                                     y)z2Output the given byte string over the serial port.r   zWriteFile failed ({!r})TzWrite timeout)r&   r   r   r   r   	WriteFiler   lenr5   r>   r   rR   r   r   r   r   r3   r6   r   r   r   r	   ERROR_INVALID_USER_BUFFERERROR_NOT_ENOUGH_MEMORY)r   datar   success	errorcodes        r   writezSerial.write/  s   ||"$$ ~Aood&7&7s4y&,,WX/[_[q[qrG""a'5#5#5#7@S@SUZUkUk?l#l)*C*J*J6??K\*]^^ ))$*;*;T=S=SU[UaUabcUdfjk%%'5+H+HH77N77c$i'0AAww3:E//@R@R@T	!@!@%B_B_!&!>!>!@ @5#6#68N8N"OOt9$)*C*J*J6??K\*]^^r   c                 b    | j                   r#t        j                  d       | j                   r"yy)zb        Flush of file like objects. In this case, wait until all data
        is written.
        g?N)out_waitingtimesleepr   s    r   flushzSerial.flushT  s$    
 JJt r   c                     | j                   s
t               t        j                  | j                  t        j
                  t        j                  z         y)z9Clear input buffer, discarding all that is in the buffer.N)r&   r   r   r@   r   rC   rD   r   s    r   reset_input_bufferzSerial.reset_input_buffer_  s7    ||"$$))5+>+>ATAT+TUr   c                     | j                   s
t               t        j                  | j                  t        j
                  t        j                  z         y)zs        Clear output buffer, aborting the current output and discarding all
        that is in the buffer.
        N)r&   r   r   r@   r   rA   rB   r   s    r   reset_output_bufferzSerial.reset_output_buffere  s9    
 ||"$$))5+>+>ATAT+TUr   c                     | j                   s
t               | j                  r t        j                  | j
                         yt        j                  | j
                         y)zBSet break: Controls TXD. When active, to transmitting is possible.N)r&   r   _break_stater   SetCommBreakr   ClearCommBreakr   s    r   _update_break_statezSerial._update_break_staten  sC    ||"$$t001  !2!23r   c                     | j                   r/t        j                  | j                  t        j                         yt        j                  | j                  t        j
                         y)z)Set terminal status line: Request To SendN)r|   r   EscapeCommFunctionr   SETRTSCLRRTSr   s    r   _update_rts_statezSerial._update_rts_statew  =    ??$$T%6%6E$$T%6%6Er   c                     | j                   r/t        j                  | j                  t        j                         yt        j                  | j                  t        j
                         y)z-Set terminal status line: Data Terminal ReadyN)r   r   r   r   SETDTRCLRDTRr   s    r   _update_dtr_statezSerial._update_dtr_state~  r   r   c                     | j                   s
t               t        j                         }t        j                  | j
                  t        j                  |             |j                  S r   )	r&   r   r   r   GetCommModemStatusr   r5   r>   r   )r   stats     r   _GetCommModemStatuszSerial._GetCommModemStatus  sF    ||"$${{}  !2!2FLL4FGzzr   c                 J    t         j                  | j                         z  dk7  S )z(Read terminal status line: Clear To Sendr   )r   	MS_CTS_ONr   r   s    r   ctsz
Serial.cts  !     !9!9!;;q@@r   c                 J    t         j                  | j                         z  dk7  S )z)Read terminal status line: Data Set Readyr   )r   	MS_DSR_ONr   r   s    r   dsrz
Serial.dsr  r   r   c                 J    t         j                  | j                         z  dk7  S )z)Read terminal status line: Ring Indicatorr   )r   
MS_RING_ONr   r   s    r   riz	Serial.ri  #     $":":"<<AAr   c                 J    t         j                  | j                         z  dk7  S )z)Read terminal status line: Carrier Detectr   )r   
MS_RLSD_ONr   r   s    r   cdz	Serial.cd  r   r   c                 N    ||}t        j                  | j                  ||       y)z        Recommend a buffer size to the driver (device driver can ignore this
        value). Must be called after the port is opened.
        N)r   r:   r   )r   rx_sizetx_sizes      r   set_buffer_sizezSerial.set_buffer_size  s$    
 ?G))7G<r   c                     | j                   s
t               |r/t        j                  | j                  t        j
                         yt        j                  | j                  t        j                         y)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   r   r   SETXONSETXOFF)r   enables     r   set_output_flow_controlzSerial.set_output_flow_control  sK     ||"$$$$T%6%6E$$T%6%6Fr   c                 P   t        j                         }t        j                         }t        j                  | j                  t        j                  |      t        j                  |            s,t        dj                  t        j                                     |j                  S )z0Return how many bytes the in the outgoing bufferr   )r   r   r   r   r   r5   r>   r   r3   r6   cbOutQuer   s      r   r   zSerial.out_waiting  so     --/##D$5$5v||E7JFLLY`Lab!"@"G"GHY"Z[[r   c                 l   t        j                         }t        j                  | j                  t	        j
                  |      t	        j
                  |      d      }|sVt        j                         t         j                  t         j                  fv r!t        j                  | j                  |       yyy)ACancel a blocking read operation, may be called from other threadFN)
r   r   r   r   r5   r>   r   r   ERROR_IO_INCOMPLETE
CancelIoEx)r   
overlappedr   errs       r   _cancel_overlapped_iozSerial._cancel_overlapped_io  s     [[]''LL$LL	
 u))+0F0FHaHa/bbT..
; csr   c                 :    | j                  | j                         y)r   N)r  r   r   s    r   r   zSerial.cancel_read  s    ""4#8#89r   c                 :    | j                  | j                         y)zBCancel a blocking write operation, may be called from other threadN)r  r   r   s    r   r   zSerial.cancel_write  s    ""4#9#9:r   c                     ||st        dj                  |            t        j                  j                  j                  | |       y)z$Change the exclusive access setting.Nz.win32 only supports exclusive access (not: {}))r+   r3   r\   r   	exclusive__set__)r   r  s     r   r  zSerial.exclusive  s@      MTTU^_``''//i@r   )r#   )r$   N)T)#__name__
__module____qualname____doc__	BAUDRATESr   rG   r?   rE   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r  setter__classcell__)r   s   @r   r   r      s   ?4I6? B|DB% !  'R#JVV4FF A A A A B B B B=G    <:;   A !Ar   r   )
__future__r   r5   r   r\   r   serial.serialutilr   r   r   r   r	   r    r   r   <module>r     s.    '     m mFAZ FAr   