
4Kc           @   s   d  d l  Td  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z i e j d 6e j d 6e j	 d 6e j
 d 6Z e d g  Z e d g  Z e d	 g  Z e d
 g  Z e d g  Z e e e g  Z e d g  Z e d g  Z e d g  Z e d g  Z e d g  Z e d g  Z e d g  Z e d g  Z e d g  Z e d g  Z e d g  Z e d g  Z e d g  Z e d g  Z  e d g  Z! e d g  Z" e d g  Z# e d g  Z$ e d g  Z% e d g  Z& e d g  Z' e d g  Z( e d  g  Z) e d! g  Z* e d" g  Z+ e d# g  Z, e d$ g  Z- e d% g  Z. e d& g  Z/ e d' g  Z0 e d( g  Z1 e d) g  Z2 e d* g  Z3 e d+ g  Z4 e d, g  Z5 e d- g  Z6 e d. g  Z7 e d/ g  Z8 e d0 g  Z9 i e. e" 6e/ e# 6e0 e$ 6e1 e% 6e2 e& 6e3 e' 6e4 e( 6e5 e) 6e6 e* 6e7 e+ 6e8 e, 6e9 e- 6Z: e d g  Z; e d g  Z< e d g  Z= e d g  Z> e d g  Z? e d g  Z@ e d g  ZA e d g  ZB e d  g  ZC e d! g  ZD e d" g  ZE e d# g  ZF e d$ g  ZG e d1 g  ZH e d2 g  ZI e d3 g  ZJ e d4 g  ZK e d5 g  ZL e d6 g  ZM e d7 g  ZN d8 ZO d9 ZP d: ZQ d4 ZR d  ZS d ZT d ZU d ZV d8 ZW d9 ZX d: ZY d4 ZZ d  Z[ d Z\ d Z] d Z^ e d g  Z_ e d g  Z` e d g  Za i d eb 6d ec 6d ed 6d ee 6d ef 6Zg eh d;   eg ji   D  Zj i d ek 6d el 6d em 6Zn eh d<   en ji   D  Zo d Zp d Zq d Zr d= Zs d> Zt d? Zu d@ Zv dA ew f dB     YZx dC ew f dD     YZy dE ez f dF     YZ{ y d  d l| Z| Wn* e} k
 r]dG e{ e~ f dH     YZ n XdG e{ e| j f dI     YZ dJ ew f dK     YZ e dL k rd  d l Z e dM dN  Z e j j dO e  e j j dP  e j dQ  e j   e j j dR e j d   e j   n  d S(S   i(   t   *Nt   debugt   infot   warningt   errori   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i   i    i   i   i,   i   i   i   i   i   i   i	   i
   i   i   ie   if   ig   ih   ii   ij   ik   il   im   in   io   ip   i   i   i   i   i   i   i   i   i@   i    c         c   s!   |  ] \ } } | | f Vq d  S(   N(    (   t   .0t   kt   v(    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pys	   <genexpr>   s    c         c   s!   |  ] \ } } | | f Vq d  S(   N(    (   R   R   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pys	   <genexpr>   s    t	   REQUESTEDt   ACTIVEt   INACTIVEt   REALLY_INACTIVEt   TelnetOptionc           B   s,   e  Z d  Z d d  Z d   Z d   Z RS(   s@   Manage a single telnet option, keeps track of DO/DONT WILL/WONT.c
   
      C   s^   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ t |  _	 |	 |  _
 d S(   s-  Init option.
        :param connection: connection used to transmit answers
        :param name: a readable name for debug outputs
        :param send_yes: what to send when option is to be enabled.
        :param send_no: what to send when option is to be disabled.
        :param ack_yes: what to expect when remote agrees on option.
        :param ack_no: what to expect when remote disagrees on option.
        :param initial_state: options initialized with REQUESTED are tried to
            be enabled on startup. use INACTIVE for all others.
        N(   t
   connectiont   namet   optiont   send_yest   send_not   ack_yest   ack_not   statet   Falset   activet   activation_callback(
   t   selfR   R   R   R   R   R   R   t   initial_stateR   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   __init__   s    									c         C   s   d |  j  |  j |  j f S(   s   String for debug outputss	   %s:%s(%s)(   R   R   R   (   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   __repr__   s    c         C   s  | |  j  k r |  j t k rO t |  _ t |  _ |  j d k	 r |  j   q q|  j t k ra q|  j t k r t |  _ |  j	 j
 |  j |  j  t |  _ |  j d k	 r |  j   q q|  j t k r |  j	 j
 |  j |  j  qt d |    n | |  j k r|  j t k r+t |  _ t |  _ q|  j t k rht |  _ |  j	 j
 |  j |  j  t |  _ q|  j t k rzq|  j t k rqt d |    n  d S(   s^   A DO/DONT/WILL/WONT was received for this option, update state and
        answer when needed.s   option in illegal state %rN(   R   R   R   R	   t   TrueR   R   t   NoneR
   R   t   telnetSendOptionR   R   R   R   t
   ValueErrorR   R   (   R   t   command(    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   process_incoming   s<    						N(   t   __name__t
   __module__t   __doc__R   R   R   R!   (    (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR      s   	t   TelnetSubnegotiationc           B   sV   e  Z d  Z d d  Z d   Z d   Z d   Z e e  Z	 d d  Z
 d   Z RS(	   s   A object to handle subnegotiation of options. In this case actually
    sub-sub options for RFC 2217. It is used to track com port options.c         C   sO   | d  k r | } n  | |  _ | |  _ | |  _ d  |  _ | |  _ t |  _ d  S(   N(   R   R   R   R   t   valuet
   ack_optionR
   R   (   R   R   R   R   R'   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR   '  s     						c         C   s   d |  j  |  j f S(   s   String for debug outputs.s   %s:%s(   R   R   (   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR   0  s    c         C   sa   | |  _  t |  _ |  j j |  j |  j   |  j j r] |  j j j d |  j |  j  f  n  d S(   s   request a change of the value. a request is sent to the server. if
        the client needs to know if the change is performed he has to check the
        state of this object.s   SB Requesting %s -> %rN(	   R&   R   R   R   t   rfc2217SendSubnegotiationR   t   loggerR   R   (   R   R&   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   set4  s
    		c         C   s2   |  j  t k r% t d |  j   n  |  j  t k S(   sj   check if answer from server has been received. when server rejects
        the change, raise a ValueError.s#   remote rejected value for option %r(   R   R   R   R   R	   (   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   isReady>  s    i   c         C   s]   t  j    | } xF t  j    | k  rE t  j d  |  j   r Pq q Wt d |  j   d S(   s   wait until the subnegotiation has been acknowledged or timeout. It
        can also throw a value error when the answer from the server does not
        match the value sent.g?s#   timeout while waiting for option %rN(   t   timet   sleepR+   t   SerialExceptionR   (   R   t   timeoutt   timeout_time(    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   waitG  s    c         C   sj   |  j  | t |  j    k r( t |  _ n	 t |  _ |  j j rf |  j j j d |  j | |  j f  n  d S(   s   check an incoming subnegotiation block. the parameter already has
        cut off the header like sub option number and com port option value.s   SB Answer %s -> %r -> %sN(	   R&   t   lenR	   R   R   R   R)   R   R   (   R   t	   suboption(    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   checkAnswerS  s
    	N(   R"   R#   R$   R   R   R   R*   R+   t   propertyR   R1   R4   (    (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR%   #  s   			
	t   RFC2217Serialc           B   s+  e  Z d  Z d2 Z d   Z d   Z d   Z d   Z d   Z d   Z	 d d  Z
 d   Z d   Z d   Z d d  Z e d  Z e d   Z e d!  Z d"   Z d#   Z d$   Z d%   Z d&   Z d'   Z d(   Z d)   Z d*   Z d+   Z d, d-  Z d.   Z d/   Z d0   Z  d1   Z! RS(3   s<   Serial port implementation for RFC 2217 remote serial ports.i2   iK   in   i   i   i   i,  iX  i  i  i`	  i  i%  i K  i   i   i  c         C   s  d |  _ t |  _ t |  _ d |  _ |  j d k rB t d   n  yW t j t j	 t j
  |  _ |  j j |  j |  j   |  j j t j t j d  Wn5 t k
 r } d |  _ t d |  j | f   n X|  j j d  t j   |  _ t j   |  _ t |  d t t t t t t  t |  d t  t t t t t!  g } t |  d t" t t t t t!  t |  d	 t# t t t t t!  t |  d
 t# t t t t t!  t |  d t t t t t t  t |  d t  t t t t t!  g | |  _$ i t% |  d t& t'  d 6t% |  d t( t)  d 6t% |  d t* t+  d 6t% |  d t, t-  d 6|  _. i t% |  d t/ t0  d 6t% |  d t1 t2  d 6|  _3 |  j3 j4 |  j.  d |  _5 d |  _6 d |  _7 t |  _8 t j9 d |  j:  |  _; |  j; j< t=  |  j; j> d |  j f  |  j; j?   x9 |  j$ D]. } | j@ t! k r
|  jA | jB | jC  q
q
WtD jD   |  j } xY tD jD   | k  rtD jE d  tF d   | D  tG |  k rRPqRqRWt d |   |  j r|  j jH d |  j$  n  |  jI   t= |  _J |  jK s|  jL t=  |  jM t=  n  |  jN   |  jO   d S(   sj   Open port with current settings. This may throw a SerialException
           if the port cannot be opened.i   s.   Port must be configured before it can be used.i   s   Could not open port %s: %si   s	   we-BINARYs
   we-RFC2217t   ECHOs   we-SGAs   they-SGAs   they-BINARYs   they-RFC2217t   baudratet   datasizet   parityt   stopsizet   purget   controli    t   targets&   pySerial RFC 2217 reader thread for %sg?c         s   s   |  ] } | j  Vq d  S(   N(   R   (   R   t   o(    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pys	   <genexpr>  s    s9   Remote does not seem to support RFC2217 or BINARY mode %rs   Negotiated options: %sN(P   R   R)   R   t   _ignore_set_control_answert   _poll_modem_statet   _network_timeoutt   _portR.   t   sockett   AF_INETt   SOCK_STREAMt   _sockett   connectt   fromURLt   portstrt
   setsockoptt   IPPROTO_TCPt   TCP_NODELAYt	   Exceptiont
   settimeoutt   Queuet   _read_buffert	   threadingt   Lockt   _write_lockR   t   BINARYt   WILLt   WONTt   DOt   DONTR
   t   COM_PORT_OPTIONR   R7   t   SGAt   _telnet_optionsR%   t   SET_BAUDRATEt   SERVER_SET_BAUDRATEt   SET_DATASIZEt   SERVER_SET_DATASIZEt
   SET_PARITYt   SERVER_SET_PARITYt   SET_STOPSIZEt   SERVER_SET_STOPSIZEt   _rfc2217_port_settingst
   PURGE_DATAt   SERVER_PURGE_DATAt   SET_CONTROLt   SERVER_SET_CONTROLt   _rfc2217_optionst   updatet
   _linestatet   _modemstatet   _modemstate_expirest   _remote_suspend_flowt   Threadt   _telnetReadLoopt   _threadt	   setDaemonR   t   setNamet   startR   R   R   R   R,   R-   t   sumR2   R   t   _reconfigurePortt   _isOpent   _rtsctst   setRTSt   setDTRt
   flushInputt   flushOutput(   R   t   msgt   mandadory_optionsR   R0   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   opene  sv    				 	$!
				"	
		
c         C   sG  |  j  d k r t d   n  |  j d k	 r< t d   n  t |  j t t f  su d |  j k  oo d k  n r t	 d |  j   n  |  j
 d j t j d |  j   |  j
 d	 j t j d
 |  j   |  j
 d j t j d
 t |  j   |  j
 d j t j d
 t |  j   |  j
 j   } |  j rQ|  j j d | f  n  t j   |  j } xY t j   | k  rt j d  t d   | D  t |  k rgPqgqgWt d |   |  j r|  j j d | f  n  |  j r|  j rt	 d   n? |  j r|  j t  n& |  j r6|  j t   n |  j t!  d S(   s,   Set communication parameters on opened port.s   Can only operate on open portss'   writeTimeout is currently not supportedi    i   i    s   invalid baudrate: %rR8   s   !IR9   s   !BR:   R;   s   Negotiating settings: %sg?c         s   s   |  ] } | j  Vq d  S(   N(   R   (   R   R?   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pys	   <genexpr>  s    s5   Remote does not accept parameter change (RFC2217): %rs   Negotiated settings: %ss-   xonxoff and rtscts together are not supportedNl        ("   RG   R   R.   t   _writeTimeoutt   NotImplementedErrort
   isinstancet	   _baudratet   intt   longR   Re   R*   t   structt   packt	   _bytesizet   RFC2217_PARITY_MAPt   _parityt   RFC2217_STOPBIT_MAPt	   _stopbitst   valuesR)   R   R,   RB   R-   Rv   R2   R   Ry   t   _xonxofft   rfc2217SetControlt   SET_CONTROL_USE_HW_FLOW_CONTROLt   SET_CONTROL_USE_SW_FLOW_CONTROLt   SET_CONTROL_USE_NO_FLOW_CONTROL(   R   t   itemsR0   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyRw     s8    9##''	"			c         C   s   |  j  r~ |  j rL y$ |  j j t j  |  j j   Wn n Xd |  _ n  |  j re |  j j   n  t	 |  _  t
 j d  n  d S(   s
   Close portg333333?N(   Rx   RG   t   shutdownRD   t	   SHUT_RDWRt   closeR   Rr   t   joinR   R,   R-   (   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR     s    				c         C   s   t  d   d  S(   Ns2   there is no sensible way to turn numbers into URLs(   R.   (   R   t   port(    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   makeDeviceName  s    c         C   s  | j    j d  r" | d } n  yqd | k rC| j d d  \ } } x | j d  D] } d | k r | j d d  \ } } n d } | d k r t j   t j d  |  _ |  j j t	 |  |  j j
 d  qY | d	 k r t |  _ qY | d
 k rt |  _ qY | d k r)t |  |  _ qY t d | f   qY Wn  | j d d  \ } } t |  } d | k o~d k  n st d   n  Wn# t k
 r} t d |   n X| | f S(   s(   extract host and port from an URL strings
   rfc2217://i
   t   /i   t   =t   loggings   pySerial.rfc2217s   enabled loggingt   ign_set_controlt
   poll_modemR/   s   unknown option: %rt   :i    i   s   port not in range 0...65535sR   expected a string in the form "[rfc2217://]<host>:<port>[/option[/option...]]": %sN(   t   lowert
   startswitht   splitR   R   t   basicConfigt	   getLoggerR)   t   setLevelt   LOGGER_LEVELSR   R   R@   RA   t   floatRB   R   R   R.   (   R   t   urlt   optionsR   R&   t   hostR   t   e(    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyRI     s8     
 c         C   s   |  j  s t  n  |  j j   S(   s>   Return the number of characters currently in the input buffer.(   Rx   t   portNotOpenErrorRQ   t   qsize(   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt	   inWaiting$  s    	 	i   c         C   s   |  j  s t  n  t   } yZ xS t |  | k  rs |  j d k rQ t d   n  | j |  j j	 t
 |  j   q! WWn t j k
 r n Xt |  S(   s   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.s&   connection failed (reader thread died)N(   Rx   R   t	   bytearrayR2   Rr   R   R.   t   appendRQ   t   getR   t   _timeoutRP   t   Emptyt   bytes(   R   t   sizet   data(    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   read)  s    	 		'c         C   s   |  j  s t  n  |  j j   zM y  |  j j | j t t   Wn& t	 j
 k
 rj } t d |   n XWd |  j j   Xt |  S(   s   Output the given string over the serial port. Can block if the
        connection is blocked. May raise SerialException if the connection is
        closed.s   socket connection failed: %sN(   Rx   R   RT   t   acquireRG   t   sendallt   replacet   IACt   IAC_DOUBLEDRD   R   R.   t   releaseR2   (   R   R   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   write8  s    	 	 c         C   sI   |  j  s t  n  |  j t  x# |  j j   rD |  j j t  q" Wd S(   s9   Clear input buffer, discarding all that is in the buffer.N(   Rx   R   t   rfc2217SendPurget   PURGE_RECEIVE_BUFFERRQ   R   R   R   (   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR|   G  s
    	 	c         C   s#   |  j  s t  n  |  j t  d S(   sb   Clear output buffer, aborting the current output and
        discarding all that is in the buffer.N(   Rx   R   R   t   PURGE_TRANSMIT_BUFFER(   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR}   O  s    	 	g      ?c         C   s=   |  j  s t  n  |  j t  t j |  |  j t  d S(   sP   Send break condition. Timed, returns to idle state after given
        duration.N(   Rx   R   t   setBreakR   R,   R-   R   (   R   t   duration(    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt	   sendBreakU  s
    	 	c         C   sc   |  j  s t  n  |  j r< |  j j d d t |   n  | rR |  j t  n |  j t  d S(   sJ   Set break: Controls TXD. When active, to transmitting is
        possible.s   set BREAK to %st   inactiveR   N(   R   s   active(   Rx   R   R)   R   t   boolR   t   SET_CONTROL_BREAK_ONt   SET_CONTROL_BREAK_OFF(   R   t   level(    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR   ]  s    	 		!c         C   sc   |  j  s t  n  |  j r< |  j j d d t |   n  | rR |  j t  n |  j t  d S(   s*   Set terminal status line: Request To Send.s   set RTS to %sR   R   N(   s   inactives   active(   Rx   R   R)   R   R   R   t   SET_CONTROL_RTS_ONt   SET_CONTROL_RTS_OFF(   R   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyRz   h  s    	 		!c         C   sc   |  j  s t  n  |  j r< |  j j d d t |   n  | rR |  j t  n |  j t  d S(   s.   Set terminal status line: Data Terminal Ready.s   set DTR to %sR   R   N(   s   inactives   active(   Rx   R   R)   R   R   R   t   SET_CONTROL_DTR_ONt   SET_CONTROL_DTR_OFF(   R   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR{   r  s    	 		!c         C   s&   |  j  s t  n  t |  j   t @ S(   s)   Read terminal status line: Clear To Send.(   Rx   R   R   t   getModemStatet   MODEMSTATE_MASK_CTS(   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   getCTS|  s    	 	c         C   s&   |  j  s t  n  t |  j   t @ S(   s*   Read terminal status line: Data Set Ready.(   Rx   R   R   R   t   MODEMSTATE_MASK_DSR(   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   getDSR  s    	 	c         C   s&   |  j  s t  n  t |  j   t @ S(   s*   Read terminal status line: Ring Indicator.(   Rx   R   R   R   t   MODEMSTATE_MASK_RI(   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   getRI  s    	 	c         C   s&   |  j  s t  n  t |  j   t @ S(   s*   Read terminal status line: Carrier Detect.(   Rx   R   R   R   t   MODEMSTATE_MASK_CD(   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   getCD  s    	 	c         C   s  t  } d } zx|  j d k	 ry |  j j d  } Wn+ t j k
 rP q n t j k
 rd Pn XxY| D]Q} | t  k r | t k r t } q| d k	 r | j	 |  q|  j
 j |  ql | t k r| t k r| d k	 r | j	 t  n |  j
 j t  t  } q| t k r-t   } t  } q| t k r[|  j t |   d } t  } q| t t t t f k r| } t } q|  j |  t  } ql | t k rl |  j | |  t  } ql ql Wq WWd d |  _ |  j r|  j j d  n  Xd S(   s   read loop for the socket.i   Ns   read thread terminated(   t   M_NORMALR   RG   t   recvRD   R/   R   R   t
   M_IAC_SEENR   RQ   t   putt   SBR   t   SEt   _telnetProcessSubnegotiationR   RX   RY   RV   RW   t   M_NEGOTIATEt   _telnetProcessCommandt   _telnetNegotiateOptionRr   R)   R   (   R   t   modeR3   R   t   bytet   telnet_command(    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyRq     sR    									c         C   s'   |  j  r# |  j  j d | f  n  d S(   s1   Process commands other than DO, DONT, WILL, WONT.s   ignoring Telnet command: %rN(   R)   R   (   R   R    (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR     s    	c         C   s   t  } x6 |  j D]+ } | j | k r | j |  t } q q W| s | t k s] | t k r |  j | t k ru t px t	 |  |  j
 r |  j
 j d | f  q q n  d S(   s&   Process incoming DO, DONT, WILL, WONT.s   rejected Telnet option: %rN(   R   R\   R   R!   R   RV   RX   R   RY   RW   R)   R   (   R   R    R   t   knownt   item(    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR     s    "	c         C   s  | d d !t  k r| d d !t k rt t |  d k rt t | d d ! |  _ |  j r|  j j d |  j  qq| d d !t k r t |  d k r t | d d ! |  _ |  j r |  j j d |  j  n  t	 j	   d |  _
 q| d d !t k rt |  _ q| d d !t k r&t |  _ qx |  j j   D]7 } | j | d d !k r6| j t | d   Pq6q6W|  j r|  j j d | f  qn# |  j r|  j j d	 | f  n  d
 S(   s;   Process subnegotiation, the data between IAC SB and IAC SE.i    i   i   i   s   NOTIFY_LINESTATE: %ss   NOTIFY_MODEMSTATE: %sg333333?s   ignoring COM_PORT_OPTION: %rs   ignoring subnegotiation: %rN(   RZ   t   SERVER_NOTIFY_LINESTATER2   t   ordRl   R)   R   t   SERVER_NOTIFY_MODEMSTATERm   R,   Rn   t   FLOWCONTROL_SUSPENDR   Ro   t   FLOWCONTROL_RESUMER   Rj   R   R'   R4   R   R   (   R   R3   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR     s,    %	%			c         C   s6   |  j  j   z |  j j |  Wd |  j  j   Xd S(   sG   internal socket write with no data escaping. used to send telnet stuff.N(   RT   R   RG   R   R   (   R   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   _internal_raw_write  s    c         C   s    |  j  t t | | g   d S(   s   Send DO, DONT, WILL, WONT.N(   R   t   to_bytesR   (   R   t   actionR   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR     s    t    c         C   sI   | j  t t  } |  j t t t t | g t |  t t g   d S(   s%   Subnegotiation of RFC2217 parameters.N(	   R   R   R   R   R   R   RZ   t   listR   (   R   R   R&   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR(     s    c         C   s.   |  j  d } | j |  | j |  j  d  S(   NR<   (   Rj   R*   R1   RB   (   R   R&   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR     s    c         C   sG   |  j  d } | j |  |  j r3 t j d  n | j |  j  d  S(   NR=   g?(   Rj   R*   R@   R,   R-   R1   RB   (   R   R&   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR   $  s
    	c         C   s   d S(   sO   check if server is ready to receive data. block for some time when
        not.N(    (   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   rfc2217FlowServerReady/  s    c         C   s   |  j  r |  j t j   k  r |  j r: |  j j d  n  |  j t  t j   |  j } x[ t j   | k  r t j d  |  j t j   k r] |  j r |  j j	 d  n  Pq] q] Wn  |  j
 d k	 r |  j r |  j j d  n  |  j
 St d   d S(   s   get last modem state (cached value. if value is "old", request a new
        one. this cache helps that we don't issue to many requests when e.g. all
        status lines, one after the other is queried by te user (getCTS, getDSR
        etc.)s   polling modem stateg?s   poll for modem state faileds   using cached modem states!   remote sends no NOTIFY_MODEMSTATEN(   RA   Rn   R,   R)   R   R(   t   NOTIFY_MODEMSTATERB   R-   R   Rm   R   R.   (   R   R0   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR   5  s     			(   i2   iK   in   i   i   i   i,  iX  i  i  i`	  i  i%  i K  i   i   i  ("   R"   R#   R$   t	   BAUDRATESR   Rw   R   R   RI   R   R   R   R|   R}   R   R   R   Rz   R{   R   R   R   R   Rq   R   R   R   R   R   R(   R   R   R   R   (    (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR6   _  s@    	Z	,			%				

				
	?			 					t   Serialc           B   s   e  Z RS(    (   R"   R#   (    (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR   ]  s   c           B   s   e  Z RS(    (   R"   R#   (    (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR   a  s   t   PortManagerc           B   sq   e  Z d  Z d d  Z d   Z d   Z d d  Z e d  Z	 d   Z
 d   Z d	   Z d
   Z d   Z RS(   s   This class manages the state of Telnet and RFC 2217. It needs a serial
    instance and a connection to work with. connection is expected to implement
    a (thread safe) write function, that writes the string to the network.c         C   s  | |  _  | |  _ | |  _ t |  _ t |  _ d  |  _ d  |  _	 d |  _
 d  |  _ d |  _ t |  d t t t t t t  t |  d t t t t t t  t |  d t t t t t t  t |  d t t t t t t  t |  d t t t t t t  t |  d t t t t t t |  j 	 t |  d	 t t t t t t |  j 	 g |  _ |  j r]|  j j d
  n  x9 |  j D]. } | j t k rg|  j | j | j  qgqgWd  S(   Ni   i    R7   s   we-SGAs   they-SGAs	   we-BINARYs   they-BINARYs
   we-RFC2217s   they-RFC2217s*   requesting initial Telnet/RFC 2217 options(   t   serialR   R)   R   t   _client_is_rfc2217R   R   R   R3   R   t   modemstate_maskt   last_modemstatet   linstate_maskR   R7   RV   RW   RX   RY   R   R[   R
   RU   RZ   t
   _client_okR\   R   R   R   R   R   (   R   t   serial_portR   R)   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR   m  s,    										$-	c         C   s9   t  |  _ |  j r% |  j j d  n  |  j d t   d S(   s   callback of telnet option. it gets called when option is activated.
        this one here is used to detect when the client agrees on RFC 2217. a
        flag is set so that other functions like check_modem_lines know if the
        client is ok.s   client accepts RFC 2217t   force_notificationN(   R   R   R)   R   t   check_modem_lines(   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR     s    			c         C   s#   |  j  j t t | | g   d S(   s   Send DO, DONT, WILL, WONT.N(   R   R   R   R   (   R   R   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR     s    R   c         C   sL   | j  t t  } |  j j t t t t | g t |  t t	 g   d S(   s&   Subnegotiation of RFC 2217 parameters.N(
   R   R   R   R   R   R   R   RZ   R   R   (   R   R   R&   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR(     s    c         C   sH  |  j  j   o t |  j  j   o$ t B|  j  j   o7 t B|  j  j   oJ t B} | |  j	 p] d A} | t @rx | t
 O} n  | t @r | t O} n  | t @r | t O} n  | t @r | t O} n  | |  j	 k s | rD|  j r | |  j @s | r4|  j t t | |  j @g   |  j r4|  j j d | f  q4n  | d @|  _	 n  d  S(   Ni    s   NOTIFY_MODEMSTATE: %si   (   R   R   R   R   R   R   R   R   R   R   t   MODEMSTATE_MASK_CTS_CHANGEt   MODEMSTATE_MASK_DSR_CHANGEt   MODEMSTATE_MASK_RI_CHANGEt   MODEMSTATE_MASK_CD_CHANGER   R   R(   R   R   R)   R   (   R   R   t
   modemstatet   deltas(    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR     s&    8



	c         c   s3   x, | D]$ } | t  k r& t  Vt  Vq | Vq Wd S(   s   this function is for the user. all outgoing data has to be properly
        escaped, so that no IAC character in the data stream messes up the
        Telnet state machine in the server.

        socket.sendall(escape(data))
        N(   R   (   R   R   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   escape  s
    c         c   s  x|| D]t} |  j  t k r^ | t k r4 t |  _  q{|  j d k	 rV |  j j |  q{| Vq |  j  t k rM| t k r |  j d k	 r |  j j |  n | Vt |  _  q{| t k r t   |  _ t |  _  q{| t	 k r|  j
 t |  j   d |  _ t |  _  q{| t t t t f k r4| |  _ t |  _  q{|  j |  t |  _  q |  j  t k r |  j |  j |  t |  _  q q Wd S(   s  handle a bunch of incoming bytes. this is a generator. it will yield
        all characters not of interest for Telnet/RFC 2217.

        The idea is that the reader thread pushes data from the socket through
        this filter:

        for byte in filter(socket.recv(1024)):
            # do things like CR/LF conversion/whatever
            # and write data to the serial port
            serial.write(byte)

        (socket error handling code left as exercise for the reader)
        N(   R   R   R   R   R3   R   R   R   R   R   R   R   RX   RY   RV   RW   R   R   R   R   (   R   R   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   filter  s8    		c         C   s'   |  j  r# |  j  j d | f  n  d S(   s1   Process commands other than DO, DONT, WILL, WONT.s   ignoring Telnet command: %rN(   R)   R   (   R   R    (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR     s    	c         C   s   t  } x6 |  j D]+ } | j | k r | j |  t } q q W| s | t k s] | t k r |  j | t k ru t px t	 |  |  j
 r |  j
 j d | f  q q n  d S(   s&   Process incoming DO, DONT, WILL, WONT.s   rejected Telnet option: %rN(   R   R\   R   R!   R   RV   RX   R   RY   RW   R)   R   (   R   R    R   R   R   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR      s    "	c         C   s
  | d d !t  k r
|  j r6 |  j j d | f  n  | d d !t k r|  j j } y& t j d | d d ! \ |  j _ WnB t k
 r } |  j r |  j j	 d | f  n  | |  j _ n* X|  j r |  j j
 d |  j j f  n  |  j t t j d |  j j   q
| d d !t k r|  j j } y& t j d	 | d d
 ! \ |  j _ WnB t k
 r} |  j r|  j j	 d | f  n  | |  j _ n* X|  j r|  j j
 d |  j j f  n  |  j t t j d	 |  j j   q
| d d !t k r|  j j } y+ t t j d	 | d d
 ! d |  j _ WnB t k
 rt} |  j re|  j j	 d | f  n  | |  j _ n* X|  j r|  j j
 d |  j j f  n  |  j t t j d	 t |  j j   q
| d d !t k r|  j j } y+ t t j d	 | d d
 ! d |  j _ WnB t k
 rU} |  j rF|  j j	 d | f  n  | |  j _ n* X|  j r|  j j
 d |  j j f  n  |  j t t j d	 t |  j j   q
| d d !t k r| d d
 !t k r|  j j r|  j t t  q|  j j  r|  j t t!  q|  j t t"  q
| d d
 !t" k ryt# |  j _ t# |  j _  |  j rf|  j j
 d  n  |  j t t"  q
| d d
 !t k rt$ |  j _ |  j r|  j j
 d  n  |  j t t  q
| d d
 !t! k rt$ |  j _  |  j r|  j j
 d  n  |  j t t!  q
| d d
 !t% k rG|  j r|  j j& d  qq
| d d
 !t' k r|  j j( t$  |  j r|  j j
 d  n  |  j t t'  q
| d d
 !t) k r|  j j( t#  |  j r|  j j
 d  n  |  j t t)  q
| d d
 !t* k r|  j r|  j j& d  qq
| d d
 !t+ k ro|  j j, t$  |  j r\|  j j
 d  n  |  j t t+  q
| d d
 !t- k r|  j j, t#  |  j r|  j j
 d  n  |  j t t-  q
| d d
 !t. k r|  j r|  j j& d  qq
| d d
 !t/ k rE|  j j0 t$  |  j r2|  j j
 d  n  |  j t t/  q
| d d
 !t1 k r
|  j j0 t#  |  j r|  j j
 d  n  |  j t t1  q
q
| d d !t2 k r|  j t3 t4 d g   q
| d d !t5 k r|  j r|  j j
 d  n  |  j6 d t$  q
| d d !t7 k rF|  j r:|  j j
 d  n  t$ |  _8 q
| d d !t9 k r|  j ru|  j j
 d   n  t# |  _8 q
| d d !t: k rt; | d d
 ! |  _< |  j r
|  j j
 d! |  j< f  q
q
| d d !t= k r%	t; | d d
 ! |  _> |  j r
|  j j
 d" |  j> f  q
q
| d d !t? k r_
| d d
 !t@ k r	|  j jA   |  j rt	|  j j
 d#  n  |  j tB t@  q
| d d
 !tC k r	|  j jD   |  j r	|  j j
 d$  n  |  j tB tC  q
| d d
 !tE k r2
|  j jA   |  j jD   |  j r
|  j j
 d%  n  |  j tB tE  q
|  j r
|  j j	 d& tF | d   q
q
|  j r
|  j j	 d' tF | d   q
n# |  j r
|  j j& d( | f  n  d) S(*   s;   Process subnegotiation, the data between IAC SB and IAC SE.i    i   s   received COM_PORT_OPTION: %ri   s   !Ii   s   failed to set baud rate: %ss   changed baud rate: %ss   !Bi   s   failed to set data size: %ss   changed data size: %ss   failed to set parity: %ss   changed parity: %ss   failed to set stop bits: %ss   changed stop bits: %ss   changed flow control to Nones    changed flow control to XON/XOFFs   changed flow control to RTS/CTSs'   requested break state - not implementeds   changed BREAK to actives   changed BREAK to inactives%   requested DTR state - not implementeds   changed DTR to actives   changed DTR to inactives%   requested RTS state - not implementeds   changed RTS to actives   changed RTS to inactives   request for modem stateR   t   suspendt   resumes   line state mask: 0x%02xs   modem state mask: 0x%02xs   purge ins	   purge outs
   purge boths   undefined PURGE_DATA: %rs   undefined COM_PORT_OPTION: %rs   unknown subnegotiation: %rN(G   RZ   R)   R   R]   R   R8   R   t   unpackR   R   R   R(   R^   R   R_   t   bytesizeR`   Ra   R:   t   RFC2217_REVERSE_PARITY_MAPRb   R   Rc   t   stopbitst   RFC2217_REVERSE_STOPBIT_MAPRd   R   Rh   t   SET_CONTROL_REQ_FLOW_SETTINGt   xonxoffRi   R   t   rtsctsR   R   R   R   t   SET_CONTROL_REQ_BREAK_STATER   R   R   R   t   SET_CONTROL_REQ_DTRR   R{   R   t   SET_CONTROL_REQ_RTSR   Rz   R   t   NOTIFY_LINESTATER   R   R   R   R   Ro   R   t   SET_LINESTATE_MASKR   R   t   SET_MODEMSTATE_MASKR   Rf   R   R|   Rg   R   R}   t   PURGE_BOTH_BUFFERSR   (   R   R3   t   backupR   (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR   4  sF   	&		 %&		 %+		  +		  																 	 				$	$	N(   R"   R#   R$   R   R   R   R   R(   R   R   R  R  R   R   R   (    (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyR   h  s   #		"		:		t   __main__s   rfc2217://localhost:7000i  s   %s
s	   write...
s   hello
s	   read: %s
(   t
   serialutilR,   R   RD   RR   RP   R   t   DEBUGt   INFOt   WARNINGt   ERRORR   R   R   RY   RX   RW   RV   R   R   t   NOPt   DMt   BRKt   IPt   AOt   AYTt   ECt   ELt   GAR   RU   R7   R[   RZ   R]   R_   Ra   Rc   Rh   R  R   R   R   R  R  Rf   R^   R`   Rb   Rd   Ri   R   R   t   SERVER_FLOWCONTROL_SUSPENDt   SERVER_FLOWCONTROL_RESUMEt   SERVER_SET_LINESTATE_MASKt   SERVER_SET_MODEMSTATE_MASKRg   t   RFC2217_ANSWER_MAPR  R   R   R   R  R   R   R  R   R   R  R   R   t   SET_CONTROL_REQ_FLOW_SETTING_INt"   SET_CONTROL_USE_NO_FLOW_CONTROL_INt!   SET_CONTROL_USE_SW_FLOW_CONTOL_INt!   SET_CONTROL_USE_HW_FLOW_CONTOL_INt    SET_CONTROL_USE_DCD_FLOW_CONTROLt    SET_CONTROL_USE_DTR_FLOW_CONTROLt    SET_CONTROL_USE_DSR_FLOW_CONTROLt   LINESTATE_MASK_TIMEOUTt   LINESTATE_MASK_SHIFTREG_EMPTYt   LINESTATE_MASK_TRANSREG_EMPTYt   LINESTATE_MASK_BREAK_DETECTt   LINESTATE_MASK_FRAMING_ERRORt   LINESTATE_MASK_PARTIY_ERRORt   LINESTATE_MASK_OVERRUN_ERRORt   LINESTATE_MASK_DATA_READYR   R   R   R   R  R  R   R   R   R   R  t   PARITY_NONEt
   PARITY_ODDt   PARITY_EVENt   PARITY_MARKt   PARITY_SPACER   t   dictR   R  t   STOPBITS_ONEt   STOPBITS_ONE_POINT_FIVEt   STOPBITS_TWOR   R  R   R   R   R   R	   R
   R   t   objectR   R%   t
   SerialBaseR6   t   iot   ImportErrort   FileLikeR   t	   RawIOBaseR   R"   t   syst   st   stdoutR   t   flushR   R   (    (    (    s2   /usr/lib/python2.7/dist-packages/serial/rfc2217.pyt   <module>>   s&  






B<  
