
    1_7                        d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZmZmZmZmZmZ  G d de      Zd Zej(                  j+                         Zedd dk(  r$d dlZdZd	Zd
ZdZdZdZdZdZdZdZ  G d de      Z!nmedk(  r G d de      Z!n\edd dk(  rd dlZdZ" G d de      Z!nBedd dk(  sedd dk(  sedd dk(  sedd dk(  r G d  d!e      Z# G d" de      Z!n G d# de      Z! e$ed$d%      Z% e$ed&d'      Z& e$ed(d)      Z' e$ed*d+      Z( e$ed,d      Z) e$ed-d      Z* e$ed.d/      Z+ e$ed0d1      Z, e$ed2d3      Z- e$ed4d5      Z. e$ed6e,      Z/ e$ed7e-      Z0 e1ed8      rejd                  Z2n
 e$ed9d:      Z2 e$ed;d<      Z3 ejh                  d=d       Z5 ejh                  d=e*      Z6 ejh                  d=e)      Z7 e$ed>d?      Z8 e$ed@dA      Z9 G dB dCee!      Z: G dD dEe:      Z; G dF dGe:      Z<y)H    )absolute_importN)
SerialBaseSerialExceptionto_bytesPortNotOpenErrorSerialTimeoutExceptionTimeoutc                   (    e Zd Zi Zd Zd Zd Zd Zy)PlatformSpecificBasec                     t        d      )Nz9non-standard baudrates are not supported on this platformNotImplementedError)selfbaudrates     4/usr/lib/python3/dist-packages/serial/serialposix.py_set_special_baudratez*PlatformSpecificBase._set_special_baudrate0   s    !"]^^    c                     t        d      )Nz$RS485 not supported on this platformr   )r   rs485_settingss     r   _set_rs485_modez$PlatformSpecificBase._set_rs485_mode3   s    !"HIIr   c                     t        d      )Nz*Low latency not supported on this platformr   )r   low_latency_settingss     r   set_low_latency_modez)PlatformSpecificBase.set_low_latency_mode6   s    !"NOOr   c                     | j                   r%t        j                  | j                  t               yt        j                  | j                  t
               y)zS        Set break: Controls TXD. When active, no transmitting is possible.
        N)_break_statefcntlioctlfdTIOCSBRKTIOCCBRKr   s    r   _update_break_statez(PlatformSpecificBase._update_break_state9   s1     KK*KK*r   N)__name__
__module____qualname__BAUDRATE_CONSTANTSr   r   r   r"    r   r   r   r   -   s    _JP+r   r      linuxi   @l   *TX  i+T,@i   i.T  i/T              c                       e Zd Zi dddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0Zd1 Zd2 Zd3 Zy4)5PlatformSpecificr   2   r*   K   r+   n         r,      r(         i,     iX     i  	   i  
   i`	     i     i%     i K     i      i   i  i    i    i      	  
            )i  i  i        @B   ` 逄 %& - ig5 i 	= c                    t        j                   ddgdz        }	 t        j                  | j                  t        j
                  |       |r|dxx   dz  cc<   n|dxx   dz  cc<   t        j                  | j                  t        j                  |       y # t        $ r }t        dj                  ||            d }~ww xY w)Nir       r,   i    iz1Failed to update ASYNC_LOW_LATENCY flag to {}: {})
arrayr   r   r   termiosTIOCGSERIALTIOCSSERIALIOError
ValueErrorformat)r   r   bufes       r   r   z%PlatformSpecific.set_low_latency_mode   s    ++cA38,CvDGGW%8%8#> (Ff$FFg%F DGGW%8%8#> v !T![![\prs!tuuvs   A;B 	C!B<<Cc                    t        j                   ddgdz        }	 t        j                  | j                  t        |       |dxx   t
        j                   z  cc<   |dxx   t        z  cc<   |x|d<   |d<   t        j                  | j                  t        |       y # t        $ r }t        dj                  ||            d }~ww xY w)NrV   r   @   r+   r:   r;   z'Failed to set custom baud rate ({}): {})rX   r   r   r   TCGETS2rY   CBAUDBOTHERTCSETS2r\   r]   r^   )r   r   r_   r`   s       r   r   z&PlatformSpecific._set_special_baudrate   s    ++cA38,C`DGGWc2A7==.(A& #++AR DGGWc2 ` !J!Q!QRZ\]!^__`s   BB 	C'CCc                    t        j                   ddgdz        }	 t        j                  | j                  t        |       |dxx   t
        z  cc<   ||j                  r|dxx   t        z  cc<   n|dxx   t         z  cc<   |j                  r|dxx   t        z  cc<   n|dxx   t         z  cc<   |j                  r|dxx   t        z  cc<   n|dxx   t         z  cc<   |j                  t        |j                  dz        |d<   |j                  !t        |j                  dz        |d<   nd|d<   t        j                  | j                  t        |       y # t         $ r}t#        dj%                  |            d }~ww xY w)NrV   r   r9     r*   r+   zFailed to set RS485 mode: {})rX   r   r   r   
TIOCGRS485SER_RS485_ENABLEDloopbackSER_RS485_RX_DURING_TXrts_level_for_txSER_RS485_RTS_ON_SENDrts_level_for_rxSER_RS485_RTS_AFTER_SENDdelay_before_txintdelay_before_rx
TIOCSRS485r\   r]   r^   )r   r   r_   r`   s       r   r   z PlatformSpecific._set_rs485_mode   sU   ++cA37+CKDGGZ5A++!-%..A"88A#9"99%66A"77A#8"88%66A"::A#;";;%55A!$^%C%Cd%J!KA%55A!$^%C%Cd%J!KACFDGGZ5 K !?!F!Fq!IJJKs   EE 	F'FFN)r#   r$   r%   r&   r   r   r   r'   r   r   r/   r/   _   s    
X 
X 
 X 
 X	 

 X 
 X 
 X 
 X 
 X 
 X 
 X 
 X 
 X 
 X 
 X 
  X! 
" X# 
$ ? 
D	v$	` 	Kr   r/   cygwinc                   (    e Zd Zddddddddd	d
ddZy)r/   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   )i  i  rL   rM   rN   rO   rP   rQ   rR   rS   rT   N)r#   r$   r%   r&   r'   r   r   r/   r/      s+    
r   r7   darwinl   T  c                       e Zd Z ej                         d   j                  d      ZdZdZ e	ed         dk\  rd Z
d Zy	)
r/   r+   .{t  zt  r   r9   c                 ~    t        j                   d|g      }t        j                  | j                  t        |d       y )NrV   r*   )rX   r   r   r   IOSSIOSPEED)r   r   r_   s      r   r   z&PlatformSpecific._set_special_baudrate   s*    kk#z2DGG[#q9r   c                     | j                   r/t        j                  | j                  t        j
                         yt        j                  | j                  t        j                         yz[            Set break: Controls TXD. When active, no transmitting is possible.
            Nr   r   r   r   r/   r   r    r!   s    r   r"   z$PlatformSpecific._update_break_state   ?       DGG%5%>%>?DGG%5%>%>?r   N)r#   r$   r%   osunamesplitosx_versionr   r    rr   r   r"   r'   r   r   r/   r/      sF    bhhjm))#. {1~!#:
	@r   r3   bsdr8   freebsdnetbsdopenbsdc                       e Zd Zd Zy)ReturnBaudratec                     |S )Nr'   )r   keys     r   __getitem__zReturnBaudrate.__getitem__   s    Jr   N)r#   r$   r%   r   r'   r   r   r   r      s    	r   r   c                   (    e Zd Z e       ZdZdZd Zy)r/   rz   r{   c                     | j                   r/t        j                  | j                  t        j
                         yt        j                  | j                  t        j                         yr   r   r!   s    r   r"   z$PlatformSpecific._update_break_state   r   r   N)r#   r$   r%   r   r&   r   r    r"   r'   r   r   r/   r/      s     ,-	@r   c                       e Zd Zy)r/   N)r#   r$   r%   r'   r   r   r/   r/   	  s    r   TIOCMGETiT  TIOCMBISiT  TIOCMBICiT  TIOCMSETiT  	TIOCM_DTR	TIOCM_RTS	TIOCM_CTSrW   	TIOCM_CARrb   	TIOCM_RNG   	TIOCM_DSR   TIOCM_CDTIOCM_RITIOCINQFIONREADiT  TIOCOUTQiT  Ir   i'T  r    i(T  c                       e Zd ZdZd Zd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dZd Zd Zed        Zed        Zed        Zed        Zed        Zd ZddZddZd Zy)Serialz    Serial port class POSIX implementation. Serial port configuration is
    done with termios and fcntl. Runs on Linux and many other Un*x like
    systems.
    c                    | j                   t        d      | j                  rt        d      d| _        	 t	        j
                  | j                  t        j                  t        j                  z  t        j                  z        | _        d\  | _        | _        d\  | _        | _        	 | j#                  d       	 | j$                  s| j'                          | j(                  s| j+                          | j3                          t	        j4                         \  | _        | _        t	        j4                         \  | _        | _        t7        j6                  | j                  t6        j8                  t        j                         t7        j6                  | j                  t6        j8                  t        j                         d| _        y# t        $ r<}d| _        t        |j                  dj                  | j                   |            d}~ww xY w# t,        $ r8}|j                  t        j.                  t        j0                  fvr Y d}~Xd}~ww xY w# t:        $ r 	 t	        j<                  | j                         n# t>        $ r Y nw xY wd| _        | j                  &t	        j<                  | j                         d| _        | j                  &t	        j<                  | j                         d| _        | j                   &t	        j<                  | j                          d| _        | j                  &t	        j<                  | j                         d| _         w xY w)zo        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could not open port {}: {}NNT)force_update) _portr   is_openr   r   openportstrO_RDWRO_NOCTTY
O_NONBLOCKOSErrorerrnor^   pipe_abort_read_rpipe_abort_read_wpipe_abort_write_rpipe_abort_write_w_reconfigure_port_dsrdtr_update_dtr_state_rtscts_update_rts_stater\   EINVALENOTTY_reset_input_bufferpiper   F_SETFLBaseExceptionclose	Exception)r   msgr`   s      r   r   zSerial.open7  s    ::!"RSS<<!"9::	cggdllBII,Cbmm,STDG :D6 6;E8!8)	"""5||**,||**, $$&=?WWY:D"D$:?Awwy<D#T%<KK..r}}MKK//N2 g  	cDG!#))-I-P-PQUQ[Q[]`-abb	c   775<<">> ?  	!   DG%%1//0)-&%%1//0)-&&&2001*.'&&2001*.'-	st   AG
 +I >8H 6CI 
	H7H

H	I-II II 
M!!J M!	J
M!JCM!c                    | j                   t        d      | j                  {| j                  rA	 t        j                  | j                   t        j
                  t        j                  z         n.t        j                  | j                   t        j                         d}dx}}| j                  d}t        | j                  dz        }	 t        j                  | j                         }|\  }}}	}
}}}|	t        j"                  t        j$                  z  z  }	|
t        j&                  t        j(                  z  t        j*                  z  t        j,                  z  t        j.                  z  t        j0                  z  t        j2                  z   z  }
dD ]'  }t5        t        |      s|
t7        t        |       z  }
) |t        j8                  t        j:                  z  t        j<                  z   z  }|t        j>                  t        j@                  z  t        jB                  z  t        jD                  z   z  }t5        t        d	      r|t        jF                   z  }t5        t        d
      r|t        jH                   z  }	 t7        t        dj                  | jJ                              x}}|	t        jX                   z  }	| jZ                  dk(  r|	t        j\                  z  }	n| jZ                  dk(  r|	t        j^                  z  }	nj| jZ                  dk(  r|	t        j`                  z  }	nG| jZ                  dk(  r|	t        jb                  z  }	n$tW        dj                  | jZ                              | jd                  tf        jh                  k(  r|	t        jj                   z  }	n| jd                  tf        jl                  k(  r|	t        jj                  z  }	nU| jd                  tf        jn                  k(  r|	t        jj                  z  }	n$tW        dj                  | jd                              |t        jp                  t        jr                  z   z  }| jt                  tf        jv                  k(  r.|	t        jx                  t        jz                  z  t|        z   z  }	n^| jt                  tf        j~                  k(  r0|	t        jz                  t|        z   z  }	|	t        jx                  z  }	n| jt                  tf        j                  k(  r/|	t|         z  }	|	t        jx                  t        jz                  z  z  }	n| jt                  tf        j                  k(  r2t|        r,|	t        jx                  t|        z  t        jz                  z  z  }	nv| jt                  tf        j                  k(  r5t|        r/|	t        jx                  t|        z  z  }	|	t        jz                   z  }	n$tW        dj                  | jt                              t5        t        d      rh| j                  r%|t        j                  t        j                  z  z  }n|t        j                  t        j                  z  t        j                  z   z  }nV| j                  r%|t        j                  t        j                  z  z  }n%|t        j                  t        j                  z   z  }t5        t        d      r5| j                  r|	t        j                  z  }	nY|	t        j                   z  }	nDt5        t        d      r4| j                  r|	t        j                  z  }	n|	t        j                   z  }	|dk  s|dkD  rtW        dj                  |            ||t        j                  <   |dk  s|dkD  rtW        dj                  |            ||t        j                  <   |s|||	|
|||g|k7  r6t        j                  | j                   t        j                  |||	|
|||g       || j                  |       | j                  | j                  | j                         yy# t        $ r5}t        |j                  dj                  | j                  |            d}~ww xY w# t        j                   $ r}t        dj                  |            d}~ww xY w# tL        $ r 	 | jN                  | jJ                     x}}n# tP        $ r 	 tR        x}}n!# tT        $ r t7        t        d      x}}Y nw xY w	 t        | jJ                        }|dk  rUtW        dj                  | jJ                              # tV        $ r% tW        dj                  | jJ                              w xY wY nw xY wY w xY w),Set communication parameters on opened port.Nz+Can only operate on a valid file descriptorz&Could not exclusively lock port {}: {}r   r*   r;   Could not configure port: {})ECHOCTLECHOKEIUCLCPARMRKzB{}B38400zInvalid baud rate: {!r}r9   r8   r7   r(   zInvalid char len: {!r}z$Invalid stop bit specification: {!r}zInvalid parity: {!r}IXANYCRTSCTSCNEW_RTSCTS   zInvalid vmin: {!r}Invalid vtime: {!r})Qr   r   
_exclusiver   flockLOCK_EXLOCK_NBr\   r   r^   r   LOCK_UN_inter_byte_timeoutrr   rY   	tcgetattrerrorCLOCALCREADICANONECHOECHOEECHOKECHONLISIGIEXTENhasattrgetattrOPOSTONLCROCRNLINLCRIGNCRICRNLIGNBRKr   r   	_baudrateAttributeErrorr&   KeyErrorre   	NameErrorr]   CSIZE	_bytesizeCS8CS7CS6CS5	_stopbitsserialSTOPBITS_ONECSTOPBSTOPBITS_ONE_POINT_FIVESTOPBITS_TWOINPCKISTRIP_parityPARITY_NONEPARENBPARODDCMSPARPARITY_EVEN
PARITY_ODDPARITY_MARKPARITY_SPACE_xonxoffIXONIXOFFr   r   r   r   VMINVTIME	tcsetattrTCSANOWr   _rs485_moder   )r   r   r   custom_baudvminvtime	orig_attriflagoflagcflaglflagispeedospeedccflags                  r   r   zSerial._reconfigure_portx  sy   77?!"OPP ??&wKK)FG DGGU]]3u##/D00256E	N))$''2I=F:E5% 	'..7==017>>GLL07==@==!#*>>2<< ")..1 2 	2 * 	1Dw%''4000	1 	7==7==07==@AA7==7==07==@7>>QRR7G$gmm^#E7H%gnn_$E	[%gu||DNN/KLLFV0 	'-->>QW[[ E^^q W[[ E^^q W[[ E^^q W[[ E5<<T^^LMM>>V000w~~&&E^^v===gnn%E^^v222gnn%ECJJ4>>Z[[7==7>>122<<6---w~~6?@@E\\V///w~~.//Egnn%E\\V...fWEgnnw~~56E\\V///Fgnnv->?E\\V000Vgnnv-.Ew~~&&E3::4<<HII 7G$}}',,677<<'--7'--GHH}}',,677<<'--7887I&||'//*7??++Wm,||'--.7..//
 !8tcz188>??7<<19299%@AA!7==E5%KyXueVVR@B "&&{3'  !1!12 (Y  w)#))5]5d5deieoeoqt5uvvw }} 	N!"@"G"G"LMM	N*  	[["&"9"9$.."II [
A&,,FV  A&-gx&@@FVA["%dnn"5K #Q()B)I)I$..)YZZ	 " W$%>%E%Ednn%UVVW '![	[s   ?`? )b  +b5 ?	a=0a88a= b2b--b25	f	?cf		f%c.-f.d	fdfe%)f.e<<f?f	ff	f	c                    | j                   r| j                  t        j                  | j                         d| _        t        j                  | j                         t        j                  | j
                         t        j                  | j                         t        j                  | j                         d\  | _        | _        d\  | _        | _        d| _         yy)z
Close portNr   F)r   r   r   r   r   r   r   r   r!   s    r   r   zSerial.close  s    <<ww"!//0//0001001AK>&(>CM@')@ DL r   c                     t        j                  | j                  t        t              }t        j                  d|      d   S )z9Return the number of bytes currently in the input buffer.r   r   )r   r   r   r   TIOCM_zero_strstructunpackr   ss     r   
in_waitingzSerial.in_waiting!  s0     KK.9}}S!$Q''r   c                    | j                   s
t               t               }t        | j                        }t        |      |k  r	 t        j                  | j                  | j                  gg g |j                               \  }}}| j                  |v r,t        j                  | j                  d       	 t1        |      S |s	 t1        |      S t        j                  | j                  |t        |      z
        }|st        d      |j                  |       |j/                         r	 t1        |      S t        |      |k  rt1        |      S # t        $ r}}|j                  t        j                   t        j"                  t        j$                  t        j&                  t        j(                  fvrt        dj+                  |            Y d}~d}~wt        j,                  $ rw}|d   t        j                   t        j"                  t        j$                  t        j&                  t        j(                  fvrt        dj+                  |            Y d}~?d}~ww xY w)        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.
        rh   zgdevice reports readiness to read but returned no data (device disconnected or multiple access on port?)zread failed: {}Nr   )r   r   	bytearrayr	   _timeoutlenselectr   r   	time_leftr   readr   extendr   r   EAGAINEALREADYEWOULDBLOCKEINPROGRESSEINTRr^   r   expiredbytes)r   sizer)  timeoutready_r_   r`   s           r   r)  zSerial.read)  s    ||"$${$--($i$"!$mmTWWd6L6L,MrSUW^WhWhWjkq!))U2GGD22D9D T{; 8 T{7 ggdggtc$i'78   *LM M C  T{O $i$N T{5  G 775<<ARARTYTeTeglgrgr"ss)*;*B*B1*EFF t<< G Q4enne>O>OQVQbQbdidodopp)*;*B*B1*EFF q	Gs3   A.E ?E ,E 	IA3GI$A,IIc                 ^    | j                   r!t        j                  | j                  d       y y N   x)r   r   writer   r!   s    r   cancel_readzSerial.cancel_read\  s"    <<HHT++T2 r   c                 ^    | j                   r!t        j                  | j                  d       y y r7  )r   r   r9  r   r!   s    r   cancel_writezSerial.cancel_write`  s"    <<HHT,,d3 r   c                    | j                   s
t               t        |      }t        |      x}}t	        | j
                        }|dkD  rr	 t        j                  | j                  |      }|j                  r|S |j                  s|j                         rt        d      t        j                  | j                  g| j                  gg |j                               \  }}}	|r!t        j                   | j                  d       n|st        d      |j                         J t        j                  | j                  g| j                  gg d      \  }}}	|r!t        j                   | j                  d       nE|st#        d      ||d }||z  }|j                  s|j                         rt        d      |dkD  rr|t        |      z
  S # t"        $ r  t$        $ r}}
|
j&                  t&        j(                  t&        j*                  t&        j,                  t&        j.                  t&        j0                  fvrt#        dj3                  |
            Y d}
~
d}
~
wt        j4                  $ rw}
|
d   t&        j(                  t&        j*                  t&        j,                  t&        j.                  t&        j0                  fvrt#        dj3                  |
            Y d}
~
Nd}
~
ww xY w)z2Output the given byte string over the serial port.r   zWrite timeoutrh   Nr*   zwrite failed (select)zwrite failed: {})r   r   r   r&  r	   _write_timeoutr   r9  r   is_non_blockingis_infiniter0  r   r'  r   r(  r)  r   r   r   r+  r,  r-  r.  r/  r^   r   )r   datadtx_lenlengthr3  nabortr4  r5  r`   s              r   r9  zSerial.writed  st   ||"$$TNa& $--.qj)HHHTWWa(** H ,, (4_EE&,mmT5L5L4MPTPWPWyZ\^e^o^o^q&rOE5! 7 7> 4_EE",,.666&,mmT5L5L4MPTPWPWyZ\^b&cOE5! 7 7; -.EFFabE! **w/@,_==Y qjZ A! #  H 775<<ARARTYTeTeglgrgr"ss)*<*C*CA*FGG t<< H Q4enne>O>OQVQbQbdidodopp)*<*C*CA*FGG q	Hs:   -G
 9B	G
 A3G
 7G
 
K!A3IK!*A,KK!c                 n    | j                   s
t               t        j                  | j                         y)zb        Flush of file like objects. In this case, wait until all data
        is written.
        N)r   r   rY   tcdrainr   r!   s    r   flushzSerial.flush  s$    
 ||"$$ r   c                 `    t        j                  | j                  t         j                         yz9Clear input buffer, discarding all that is in the buffer.N)rY   tcflushr   TCIFLUSHr!   s    r   r   zSerial._reset_input_buffer  s    !1!12r   c                 P    | j                   s
t               | j                          yrK  )r   r   r   r!   s    r   reset_input_bufferzSerial.reset_input_buffer  s    ||"$$  "r   c                     | j                   s
t               t        j                  | j                  t        j
                         y)zs        Clear output buffer, aborting the current output and discarding all
        that is in the buffer.
        N)r   r   rY   rL  r   TCOFLUSHr!   s    r   reset_output_bufferzSerial.reset_output_buffer  s,    
 ||"$$!1!12r   c                     | j                   s
t               t        j                  | j                  t        |dz               y)za        Send break condition. Timed, returns to idle state after given
        duration.
              ?N)r   r   rY   tcsendbreakr   rr   )r   durations     r   
send_breakzSerial.send_break  s1    
 ||"$$DGGSD%9:r   c                     | j                   r*t        j                  | j                  t        t
               yt        j                  | j                  t        t
               y)z)Set terminal status line: Request To SendN)
_rts_stater   r   r   r   TIOCM_RTS_strr   r!   s    r   r   zSerial._update_rts_state  1    ??KK=9KK=9r   c                     | j                   r*t        j                  | j                  t        t
               yt        j                  | j                  t        t
               y)z-Set terminal status line: Data Terminal ReadyN)
_dtr_stater   r   r   r   TIOCM_DTR_strr   r!   s    r   r   zSerial._update_dtr_state  r[  r   c                     | j                   s
t               t        j                  | j                  t
        t              }t        j                  d|      d   t        z  dk7  S )z(Read terminal status line: Clear To Sendr   r   )
r   r   r   r   r   r   r  r  r  r   r  s     r   ctsz
Serial.cts  J     ||"$$KK>:}}S!$Q')3q88r   c                     | j                   s
t               t        j                  | j                  t
        t              }t        j                  d|      d   t        z  dk7  S )z)Read terminal status line: Data Set Readyr   r   )
r   r   r   r   r   r   r  r  r  r   r  s     r   dsrz
Serial.dsr  ra  r   c                     | j                   s
t               t        j                  | j                  t
        t              }t        j                  d|      d   t        z  dk7  S )z)Read terminal status line: Ring Indicatorr   r   )
r   r   r   r   r   r   r  r  r  r   r  s     r   riz	Serial.ri  J     ||"$$KK>:}}S!$Q'(2a77r   c                     | j                   s
t               t        j                  | j                  t
        t              }t        j                  d|      d   t        z  dk7  S )z)Read terminal status line: Carrier Detectr   r   )
r   r   r   r   r   r   r  r  r  r   r  s     r   cdz	Serial.cd  rf  r   c                     t        j                  | j                  t        t              }t        j                  d|      d   S )z:Return the number of bytes currently in the output buffer.r   r   )r   r   r   r   r  r  r  r  s     r   out_waitingzSerial.out_waiting  s0     KK>:}}S!$Q''r   c                 F    | j                   s
t               | j                  S )z        For easier use of the serial port instance with select.
        WARNING: this function is not portable to different platforms!
        )r   r   r   r!   s    r   filenozSerial.fileno  s    
 ||"$$wwr   c                     | j                   s
t               |r/t        j                  | j                  t        j
                         yt        j                  | j                  t        j                         y)z        Manually control flow - when software flow control is enabled.
        This will send XON (true) or XOFF (false) to the other device.
        WARNING: this function is not portable to different platforms!
        N)r   r   rY   tcflowr   TCIONTCIOFFr   enables     r   set_input_flow_controlzSerial.set_input_flow_control  C     ||"$$NN477GMM2NN477GNN3r   c                     | j                   s
t               |r/t        j                  | j                  t        j
                         yt        j                  | j                  t        j                         y)z        Manually control flow of outgoing data - when hardware or software flow
        control is enabled.
        WARNING: this function is not portable to different platforms!
        N)r   r   rY   rn  r   TCOONTCOOFFrq  s     r   set_output_flow_controlzSerial.set_output_flow_control  rt  r   c                 8    ddl }|j                  dt               y)zDEPRECATED - has no user   Nz0nonblocking() has no effect, already nonblocking)warningswarnDeprecationWarning)r   rz  s     r   nonblockingzSerial.nonblocking  s    HJ\]r   N)Fr*   )rT  T)r#   r$   r%   __doc__r   r   r   propertyr!  r)  r:  r<  r9  rI  r   rO  rR  rW  r   r   r`  rc  re  rh  rj  rl  rs  rx  r}  r'   r   r   r   r   0  s    ?BW3r!  ( (1f344l!3#3;:: 9 9 9 9 8 8 8 8 ( (44^r   r   c                       e Zd ZdZddZy)PosixPollSerialz    Poll based read implementation. Not all systems support poll properly.
    However this one has better handling of errors, such as a device
    disconnecting while it's in use (e.g. USB-serial unplugged).
    c                    | j                   s
t               t               }t        | j                        }t        j                         }|j                  | j                  t
        j                  t
        j                  z  t
        j                  z  t
        j                  z         |j                  | j                  t
        j                  t
        j                  z  t
        j                  z  t
        j                  z         |dkD  rYt        |      |k  rJ|j                  |j                  rdn|j!                         dz        D ]V  \  }}|| j                  k(  r nB|t
        j                  t
        j                  z  t
        j                  z  z  sMt#        d       | j                  k(  r,t%        j&                  | j                  d       	 t/        |      S t%        j&                  | j                  |t        |      z
        }|j)                  |       |j+                         s| j,                  | j,                  dkD  r|s	 t/        |      S t        |      |k  rJt/        |      S )r#  r   Nrh   zdevice reports error (poll))r   r   r$  r	   r%  r'  pollregisterr   POLLINPOLLERRPOLLHUPPOLLNVALr   r&  r@  r(  r   r   r)  r*  r0  r   r1  )r   r2  r)  r3  r  r   eventr_   s           r   r)  zPosixPollSerial.read&  s    ||"$${$--({{}dggv}}v~~=NQWQ`Q``ad,,fmmfnn.Lv~~.]`f`o`o.op!8d)d" "&73F3F4WM^M^M`cgMg!i MIBT333 ?&// QR-.KLL	M ///GGD22D9 T{ ggdggtc$i'78C ??$ 44@TE]E]`aEaknT{% d)d"$ T{r   Nr~  )r#   r$   r%   r  r)  r'   r   r   r  r    s     r   r  c                   :     e Zd ZdZd fd	ZddZ e       Z xZS )VTIMESerialab      Implement timeout using vtime of tty device instead of using select.
    This means that no inter character timeout can be specified and that
    the error handling is degraded.

    Overall timeout is disabled when inter-character timeout is used.

    Note that this implementation does NOT support cancel_read(), it will
    just ignore that.
    c                    t         t        |           t        j                  | j                  t        j
                  d       | j                  d}t        | j                  dz        }n+| j                  d}d}nd}t        | j                  dz        }	 t        j                  | j                        }|\  }}}}}	}
}|dk  s|dkD  rt        dj                  |            ||t        j                   <   ||t        j"                  <   t        j$                  | j                  t        j&                  |||||	|
|g       y# t        j                  $ r)}t        j                  dj                  |            d}~ww xY w)r   r   Nr*   r;   r   r   r   )superr  r   r   r   r   r   rr   r%  rY   r   r   r   r   r^   r]   r
  r	  r  r  )r   r   r  r  r  r  r  r  r  r  r  r  r   	__class__s                r   r   zVTIMESerial._reconfigure_portU  sN   k424DGGU]]A.##/D00256E]]"DED*+E	U))$''2I=F:E5% 19299%@AA!7==7<<ueVVR@	B }} 	U(()G)N)Ns)STT	Us   )E   E<$E77E<c                 (   | j                   s
t               t               }t        |      |k  rZt	        j
                  | j                  |t        |      z
        }|s	 t        |      S |j                  |       t        |      |k  rZt        |      S )r#  )	r   r   r$  r&  r   r)  r   r*  r1  )r   r2  r)  r_   s       r   r)  zVTIMESerial.reads  s|     ||"$${$i$''$''4#d)#34CT{ KK	 $i$
 T{r   r  r~  )	r#   r$   r%   r  r   r)  r  r:  __classcell__)r  s   @r   r  r  I  s    	B<" *Kr   r  )=
__future__r   r   r   r   r'  r  sysrY   r   serial.serialutilr   r   r   r   r   r	   objectr   r  platformlowerplatrX   rc   rf   re   ri   rt   rj   rn   rp   rl   r/   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   packr  rZ  r^  r   r    r   r  r  r'   r   r   <module>r     s  : '   	   
  6 6+6 +0 

 ||8w F GGF JJ"&)'_K/ _KD 
X
/ 
  
"1XK@/ @* 
"1X	"1X	"1X	"1X @/ @(/  7J/7J/7J/7J/ G[%0	G[%0	 G[%0	G[%0	G[%0	G[%0	7J	27J	2 7IooGgz62G7J/S!$C+C+7J/7J/l^Z) l^^'f 'T;& ;r   