a U Y^èã@snddlZddlZddlZddlZddlZz ddlZWneyRddlmZYn0z ddl Z Wneyzddl Z Yn0ddl Z ddl m Z mZmZmZmZmZejejejejdœZdZdZdZdZdZd Zd Zd Zd Z d Z!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5d Z6d!Z7d"Z8d#Z9d$Z:d%Z;d&Zd)Z?d*Z@d+ZAd,ZBd-ZCd.ZDe-e9e.e:e/e;e0ee3e?e4e@e5eAe6eBe7eCe8eDi ZEdZFdZGdZHdZIdZJdZKdZLdZMdZNdZOd ZPd!ZQd"ZRd/ZSd0ZTd1ZUd2ZVd3ZWd4ZXd5ZYd6ZZd7Z[d8Z\d9Z]d:Z^d;Z_de jpd;e jqd?iZresd@dA„er t¡DƒƒZue jvd=e jwd>e jxdÖórNccs|]\}}||fVqdSrGrHrIrHrHrMrNÝrOÚ REQUESTEDÚACTIVEÚINACTIVEÚREALLY_INACTIVEc@s*eZdZdZd dd„Zdd„Zdd„ZdS) Ú TelnetOptionz@Manage a single telnet option, keeps track of DO/DONT WILL/WONT.Nc Cs@||_||_||_||_||_||_||_||_d|_| |_ dS)a; Initialize 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. FN) Ú connectionÚnameÚoptionÚsend_yesÚsend_noÚack_yesÚack_noÚstateÚactiveÚactivation_callback) ÚselfrUrVrWrXrYrZr[Z initial_stater^rHrHrMÚ__init__îs zTelnetOption.__init__cCs dj|dS)zString for debug outputsz{o.name}:{o.active}({o.state}))Úo©Úformat©r_rHrHrMÚ__repr__szTelnetOption.__repr__cCs&||jkrª|jtur4t|_d|_|jdur¨| ¡nt|jtur@nh|jtur|t|_|j |j |j ¡d|_|jdur¨| ¡n,|jt urš|j |j |j ¡nt d |¡ƒ‚nx||jkr"|jturÎt|_d|_nT|jturøt|_|j |j |j ¡d|_n*|jturn|jt urnt d |¡ƒ‚dS)zo A DO/DONT/WILL/WONT was received for this option, update state and answer when needed. TNzoption in illegal state {!r}F)rZr\rPrQr]r^rRrUÚtelnet_send_optionrXrWrSrYÚ ValueErrorrcr[©r_ÚcommandrHrHrMÚprocess_incoming s<              zTelnetOption.process_incoming)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__r`rerjrHrHrHrMrTës ÿ rTc@sLeZdZdZddd„Zdd„Zdd„Zd d „ZeeƒZ dd d „Z dd„Z dS)ÚTelnetSubnegotiationz” 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. NcCs4|dur |}||_||_||_d|_||_t|_dSrG)rUrVrWÚvalueÚ ack_optionrRr\)r_rUrVrWrqrHrHrMr`7szTelnetSubnegotiation.__init__cCs dj|dS)zString for debug outputs.z{sn.name}:{sn.state})ZsnrbrdrHrHrMreAszTelnetSubnegotiation.__repr__cCsD||_t|_|j |j|j¡|jjr@|jj d |j |j¡¡dS)zÁ 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. zSB Requesting {} -> {!r}N) rprPr\rUÚrfc2217_send_subnegotiationrWÚloggerrrcrV)r_rprHrHrMÚsetEs zTelnetSubnegotiation.setcCs$|jtkrtd |j¡ƒ‚|jtkS)z{ Check if answer from server has been received. when server rejects the change, raise a ValueError. z%remote rejected value for option {!r})r\rSrgrcrVrQrdrHrHrMÚis_readyQs zTelnetSubnegotiation.is_readyrEcCs:t|ƒ}| ¡s&t d¡| ¡rq6qtd |j¡ƒ‚dS)z¿ 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. çš™™™™™©?z%timeout while waiting for option {!r}N)rÚexpiredÚtimeÚsleeprurrcrV)r_ÚtimeoutZ timeout_timerrHrHrMÚwait\s  zTelnetSubnegotiation.waitcCsN|j|dt|jƒ…kr t|_nt|_|jjrJ|jj d |j ||j¡¡dS)zŸ Check an incoming subnegotiation block. The parameter already has cut off the header like sub option number and com port option value. NzSB Answer {} -> {!r} -> {}) rpÚlenrQr\rSrUrsrrcrV)r_Ú suboptionrHrHrMÚ check_answerjs z!TelnetSubnegotiation.check_answer)N)rE) rkrlrmrnr`rertruÚpropertyr]r{r~rHrHrHrMro1s    rocseZdZdZdZ‡fdd„Zdd„Zdd„Zd d „Zd d „Z e d d„ƒZ d=dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Ze dd„ƒZe d d!„ƒZe d"d#„ƒZe d$d%„ƒZd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd>d3d4„Zd5d6„Zd7d8„Zd9d:„Z d;d<„Z!‡Z"S)?ÚSerialz|j?|j@¡qt4|jƒ}| A¡sŽtB Cd¡tDdd „|DƒƒtDd!d „|DƒƒkrLqœqLtd" |¡ƒ‚|jr¸|j Ed# |j!¡¡| F¡|jGsÐ| H¡|jIsà| J¡| K¡| L¡Wn| M¡‚Yn0dS)$zx Open port with current settings. This may throw a SerialException if the port cannot be opened. NFrEz.Port must be configured before it can be used.zPort is already open.rF)rzrDzCould not open port {}: {}ú we-BINARYú we-RFC2217ÚECHOúwe-SGAúthey-SGAú they-BINARYú they-RFC2217ÚbaudrateÚdatasizeÚparityÚstopsize)r£r¤r¥r¦ÚpurgeÚcontrol)r§r¨rrˆT)Útargetz&pySerial RFC 2217 reader thread for {}rvcss|] }|jVqdSrG©r]©rJrarHrHrMrNÜrOzSerial.open..css|]}|jtkVqdSrG)r\rRr«rHrHrMrNÜrOz;Remote does not seem to support RFC2217 or BINARY mode {!r}zNegotiated options: {})Nrsrr‘r’Z_portrÚis_openÚsocketZcreate_connectionÚfrom_urlZportstrrŠZ setsockoptZ IPPROTO_TCPZ TCP_NODELAYÚ ExceptionrcÚQueuer–Ú threadingÚLockrrTÚBINARYÚWILLÚWONTÚDOÚDONTrRÚCOM_PORT_OPTIONrPržÚSGAr“roÚ SET_BAUDRATEÚSERVER_SET_BAUDRATEÚ SET_DATASIZEÚSERVER_SET_DATASIZEÚ SET_PARITYÚSERVER_SET_PARITYÚ SET_STOPSIZEÚSERVER_SET_STOPSIZEr”Ú PURGE_DATAÚSERVER_PURGE_DATAÚ SET_CONTROLÚSERVER_SET_CONTROLr•Úupdater‹rŒrrrŽÚThreadÚ_telnet_read_loopr‰Ú setDaemonÚsetNameÚstartr\rfrXrWrwrxryÚsumr Ú_reconfigure_portZ_dsrdtrÚ_update_dtr_stateÚ_rtsctsÚ_update_rts_stateÚreset_input_bufferÚreset_output_bufferÚclose)r_ÚmsgZmandadory_optionsrWrzrHrHrMÚopensŠ (  þûú    ü  þ        &ÿ z Serial.opencCs”|jdurtdƒ‚|jdur$tdƒ‚d|jkr:dksLntd |j¡ƒ‚|jd t   d|j¡¡|jd  t   d |j ¡¡|jd  t   d t |j ¡¡|jd  t   d t|j¡¡|j ¡}|jrÞ|j d  |¡¡t|jƒ}| ¡st d¡tdd„|Dƒƒt|ƒkrèq*qètd |¡ƒ‚|jrD|j d |¡¡|jr^|jr^tdƒ‚n2|jrr| t¡n|jr†| t¡n | t ¡dS)z,Set communication parameters on opened port.NzCan only operate on open portsz(write_timeout is currently not supportedrlzinvalid baudrate: {!r}r£ó!Ir¤ó!Br¥r¦zNegotiating settings: {}rvcss|] }|jVqdSrGrªr«rHrHrMrN rOz+Serial._reconfigure_port..z7Remote does not accept parameter change (RFC2217): {!r}zNegotiated settings: {}z-xonxoff and rtscts together are not supported)!rŠrZ_write_timeoutÚNotImplementedErrorZ _baudratergrcr”rtÚstructÚpackZ _bytesizeÚRFC2217_PARITY_MAPZ_parityÚRFC2217_STOPBIT_MAPZ _stopbitsÚvaluesrsrrr’rwrxryrÌr|r rÏZ_xonxoffÚrfc2217_set_controlÚSET_CONTROL_USE_HW_FLOW_CONTROLÚSET_CONTROL_USE_SW_FLOW_CONTROLÚSET_CONTROL_USE_NO_FLOW_CONTROL)r_ÚitemsrzrHrHrMrÍñs8         zSerial._reconfigure_portcCsbd|_|jr6z|j tj¡|j ¡Wn Yn0|jrX|j d¡d|_t  d¡d|_dS)z Close portFéNç333333Ó?) r¬rŠZshutdownr­Z SHUT_RDWRrÓr‰ÚjoinrxryrdrHrHrMrÓs  z Serial.closec Cs*t |¡}|jdkr$td |j¡ƒ‚zÄt |jd¡ ¡D]Œ\}}|dkr~t  ¡t  d¡|_ |j   t |d¡|j  d¡q8|dkrŽd|_q8|d kržd|_q8|d kr¶t|dƒ|_q8td  |¡ƒ‚q8d|jkrÜd ksæntd ƒ‚Wn4ty}ztd |¡ƒ‚WYd}~n d}~00|j|jfS)zu extract host and port from an URL string, other settings are extracted an stored in instance Zrfc2217zqexpected a string in the form "rfc2217://:[?option[&option...]]": not starting with rfc2217:// ({!r})TÚloggingzpySerial.rfc2217rzenabled loggingZign_set_controlZ poll_modemrzzunknown option: {!r}izport not in range 0...65535zPexpected a string in the form "rfc2217://:[?option[&option...]]": {}N)ÚurlparseÚurlsplitÚschemerrcÚparse_qsÚqueryrâræZ basicConfigZ getLoggerrsZsetLevelÚ LOGGER_LEVELSrrr‘Úfloatr’rgÚportÚhostname)r_ÚurlÚpartsrWrÝÚerHrHrMr®.s<  þÿ  ÿÿzSerial.from_urlcCs|js t‚|j ¡S)z9Return the number of bytes currently in the input buffer.)r¬rr–ÚqsizerdrHrHrMÚ in_waitingSszSerial.in_waitingrDcCs||js t‚tƒ}zNt|jƒ}t|ƒ|kr\|jdur:tdƒ‚||j  d|  ¡¡7}|  ¡rq\qWnt j yrYn0t|ƒ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. Nz&connection failed (reader thread died)T)r¬rÚ bytearrayrÚ_timeoutr|r‰rr–ÚgetZ time_leftrwr°ZEmptyÚbytes)r_ÚsizeÚdatarzrHrHrMÚreadZs   z Serial.readc CsŠ|js t‚|jbz|j t|ƒ tt¡¡Wn4t j yb}zt d  |¡ƒ‚WYd}~n d}~00Wdƒn1sx0Yt |ƒS)z² Output the given byte string over the serial port. Can block if the connection is blocked. May raise SerialException if the connection is closed. z$connection failed (socket error): {}N)r¬rrrŠÚsendallrÚreplaceÚIACÚ IAC_DOUBLEDr­r rrcr|)r_rúròrHrHrMÚwriteosBz Serial.writecCs0|js t‚| t¡|j ¡r,|j d¡qdS)z9Clear input buffer, discarding all that is in the buffer.FN)r¬rÚrfc2217_send_purgeÚPURGE_RECEIVE_BUFFERr–rór÷rdrHrHrMrÑs   zSerial.reset_input_buffercCs|js t‚| t¡dS)zs Clear output buffer, aborting the current output and discarding all that is in the buffer. N)r¬rrÚPURGE_TRANSMIT_BUFFERrdrHrHrMrÒˆszSerial.reset_output_buffercCsL|js t‚|jr,|j d |jr$dnd¡¡|jr>| t¡n | t¡dS)z[ Set break: Controls TXD. When active, to transmitting is possible. zset BREAK to {}r]ÚinactiveN) r¬rrsr rcZ _break_staterÞÚSET_CONTROL_BREAK_ONÚSET_CONTROL_BREAK_OFFrdrHrHrMÚ_update_break_state‘s zSerial._update_break_statecCsL|js t‚|jr,|j d |jr$dnd¡¡|jr>| t¡n | t¡dS)z*Set terminal status line: Request To Send.z set RTS to {}r]rN) r¬rrsr rcZ _rts_staterÞÚSET_CONTROL_RTS_ONÚSET_CONTROL_RTS_OFFrdrHrHrMrПs zSerial._update_rts_statecCsL|js t‚|jr,|j d |jr$dnd¡¡|jr>| t¡n | t¡dS)z.Set terminal status line: Data Terminal Ready.z set DTR to {}r]rN) r¬rrsr rcZ _dtr_staterÞÚSET_CONTROL_DTR_ONÚSET_CONTROL_DTR_OFFrdrHrHrMrΪs zSerial._update_dtr_statecCs|js t‚t| ¡t@ƒS)z)Read terminal status line: Clear To Send.)r¬rÚboolÚget_modem_stateÚMODEMSTATE_MASK_CTSrdrHrHrMÚctsµsz Serial.ctscCs|js t‚t| ¡t@ƒS)z*Read terminal status line: Data Set Ready.)r¬rr r ÚMODEMSTATE_MASK_DSRrdrHrHrMÚdsr¼sz Serial.dsrcCs|js t‚t| ¡t@ƒS)z*Read terminal status line: Ring Indicator.)r¬rr r ÚMODEMSTATE_MASK_RIrdrHrHrMÚriÃsz Serial.ricCs|js t‚t| ¡t@ƒS)z*Read terminal status line: Carrier Detect.)r¬rr r ÚMODEMSTATE_MASK_CDrdrHrHrMÚcdÊsz Serial.cdc CsÈt}d}zœ|jrŠz|j d¡}Wnbtjy<Yq YnLtjy†}z2|jrd|j d  |¡¡WYd}~qŠWYd}~n d}~00|sqŠt |ƒD]î}|tkrÒ|t kr²t }n|durÄ||7}n |j  |¡q˜|t krn|t kr |durø|t 7}n |j  t ¡t}nb|tkr tƒ}t}nL|tkrB| t|ƒ¡d}t}n*|ttttfvr^|}t}n| |¡t}q˜|tkr˜| ||¡t}q˜q Wd|_|jrÄ|j d¡nd|_|jrÂ|j d¡0dS)zRead loop for the socket.Niz!socket error in reader thread: {}zread thread terminated)ÚM_NORMALr¬rŠZrecvr­rzr rsrrcrrþÚ M_IAC_SEENr–ZputÚSBrõÚSEÚ_telnet_process_subnegotiationrør¶r·r´rµÚ M_NEGOTIATEÚ_telnet_process_commandÚ_telnet_negotiate_optionr‰)r_Úmoder}rúròÚbyteÚtelnet_commandrHrHrMrÈÖs`$           þzSerial._telnet_read_loopcCs|jr|j d |¡¡dS©z1Process commands other than DO, DONT, WILL, WONT.zignoring Telnet command: {!r}N©rsr rcrhrHrHrMrszSerial._telnet_process_commandcCspd}|jD]}|j|kr | |¡d}q |sl|tks<|tkrl| |tkrLtnt|¡|jrl|j  d  |¡¡dS©z&Process incoming DO, DONT, WILL, WONT.FTzrejected Telnet option: {!r}N© r“rWrjr´r¶rfr·rµrsr rc©r_rirWZknownÚitemrHrHrMrs   zSerial._telnet_negotiate_optioncCsZ|dd…tkr<|dd…tkr\t|ƒdkr\t|dd…ƒ|_|jrZ|j d |j¡¡nÞ|dd…tkr²t|ƒdkr²t|dd…ƒ|_ |jr¤|j d |j ¡¡|j   d¡nˆ|dd…t krÊd|_ np|dd…tkrâd |_ nX|j ¡D]2}|j|dd…krì| t|dd …ƒ¡qVqì|jrV|j d  |¡¡n|jrV|j d  |¡¡d S) ú;Process subnegotiation, the data between IAC SB and IAC SE.rrDrCrEzNOTIFY_LINESTATE: {}úNOTIFY_MODEMSTATE: {}räTFNzignoring COM_PORT_OPTION: {!r}zignoring subnegotiation: {!r})r¸ÚSERVER_NOTIFY_LINESTATEr|Úordr‹rsr rcÚSERVER_NOTIFY_MODEMSTATErŒrZrestartÚFLOWCONTROL_SUSPENDrŽÚFLOWCONTROL_RESUMEr•rÝrqr~rør )r_r}r&rHrHrMr2s,z%Serial._telnet_process_subnegotiationcCs6|j|j |¡Wdƒn1s(0YdS)zGinternal socket write with no data escaping. used to send telnet stuff.N)rrŠrü)r_rúrHrHrMÚ_internal_raw_writeRszSerial._internal_raw_writecCs| t||¡dS©zSend DO, DONT, WILL, WONT.N)r.rþ©r_ÚactionrWrHrHrMrfWszSerial.telnet_send_optionrOcCs2| tt¡}| ttt||tt¡dS)z%Subnegotiation of RFC2217 parameters.N)rýrþrÿr.rr¸r©r_rWrprHrHrMrr[s z"Serial.rfc2217_send_subnegotiationcCs$|jd}| |¡| |j¡dS)z~ Send purge request to the remote. (PURGE_RECEIVE_BUFFER / PURGE_TRANSMIT_BUFFER / PURGE_BOTH_BUFFERS) r§N)r•rtr{r’©r_rpr&rHrHrMr`s  zSerial.rfc2217_send_purgecCs6|jd}| |¡|jr&t d¡n | |j¡dS)z)transmit change of control line to remoter¨gš™™™™™¹?N)r•rtrrxryr{r’r3rHrHrMrÞis    zSerial.rfc2217_set_controlcCsdS)z` check if server is ready to receive data. block for some time when not. NrHrdrHrHrMÚrfc2217_flow_server_readyusz Serial.rfc2217_flow_server_readycCs–|jrh|j ¡rh|jr"|j d¡| t¡t|jƒ}| ¡sVt   d¡|j ¡s6qhq6|jrh|j  d¡|j durŠ|jr„|j d¡|j St dƒ‚dS)zÿ 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 the user (CTS, DSR etc.) zpolling modem statervzpoll for modem state failedNzusing cached modem statez!remote sends no NOTIFY_MODEMSTATE)r‘rrwrsrrrÚNOTIFY_MODEMSTATErr’rxryr rŒr)r_rzrHrHrMr }s         zSerial.get_modem_state)rD)rO)#rkrlrmrnZ BAUDRATESr`rÕrÍrÓr®rrôrûrrÑrÒrrÐrÎrrrrrÈrrrr.rfrrrrÞr4r Ú __classcell__rHrHršrMr€xsF a,%          C    r€c@sfeZdZdZddd„Zdd„Zdd„Zdd d „Zdd d„Zdd„Z dd„Z dd„Z dd„Z dd„Z dS)Ú PortManagerzê 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. NcCs||_||_||_d|_t|_d|_d|_d|_d|_ d|_ t |dt t ttttƒt |dtt ttttƒt |dtttt ttƒt |dtt ttttƒt |dtttt ttƒt |d tt tttt|jƒ t |d tttt tt|jƒ g|_|jrè|j d ¡|jD]}|jturî| |j|j¡qîdS) NFéÿrržrŸr rœr¡rr¢z*requesting initial Telnet/RFC 2217 options)ÚserialrUrsÚ_client_is_rfc2217rrr}r Úmodemstate_maskÚlast_modemstateÚ linstate_maskrTržr´rµr¶r·rPr¹rRr³r¸Ú _client_okr“rr\rfrXrW)r_Z serial_portrUrsrWrHrHrMr`«s.ù    zPortManager.__init__cCs(d|_|jr|j d¡|jdddS)a 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. Tzclient accepts RFC 2217©Úforce_notificationN)r:rsr Úcheck_modem_linesrdrHrHrMr>Îs  zPortManager._client_okcCs|j t||¡dSr/)rUrrþr0rHrHrMrfâszPortManager.telnet_send_optionrOcCs4| tt¡}|j ttt||tt¡dS)z&Subnegotiation of RFC 2217 parameters.N)rýrþrÿrUrrr¸rr2rHrHrMrræs z'PortManager.rfc2217_send_subnegotiationFcCsÞ|jjo t|jjotB|jjo tB|jjo,tB}||j p:dA}|t@rN|t O}|t@r^|t O}|t@rn|t O}|t@r~|t O}||j ksŒ|rÚ|jrœ||j@s |rÐ| tt||j@gƒ¡|jrÐ|j d |¡¡|d@|_ dS)z€ read control lines from serial port and compare the last value sent to remote. send updates on changes. rr(éðN)r9rrrrrrrrr<ÚMODEMSTATE_MASK_CTS_CHANGEÚMODEMSTATE_MASK_DSR_CHANGEÚMODEMSTATE_MASK_RI_CHANGEÚMODEMSTATE_MASK_CD_CHANGEr:r;rrr+rrsr rc)r_r@Z modemstateZdeltasrHrHrMrAîs4  ÿ þ ýÿþzPortManager.check_modem_linesccs.t|ƒD] }|tkr"tVtVq|VqdS)zû This generator 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)rrþ©r_rúrrHrHrMÚescapes  zPortManager.escapeccst|ƒD]}|jtkrJ|tkr(t|_n |jdurB|j|7_n|Vq|jtkrò|tkr„|jdurv|j|7_n|Vt|_nl|tkrœtƒ|_t|_nT|tkrÂ|  t |jƒ¡d|_t|_n.|t t t tfvrà||_t|_n| |¡t|_q|jtkr| |j|¡t|_qdS)aò 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)rrrrþrr}rrõrrrør¶r·r´rµr rrrrGrHrHrMÚfilter#s8      zPortManager.filtercCs|jr|j d |¡¡dSr!r"rhrHrHrMr^sz#PortManager._telnet_process_commandcCspd}|jD]}|j|kr | |¡d}q |sl|tks<|tkrl| |tkrLtnt|¡|jrl|j  d  |¡¡dSr#r$r%rHrHrMrds   z$PortManager._telnet_negotiate_optionc Cs$ |dd…tk r|jr*|j d |¡¡|dd…tkrô|jj}z*t d|dd…¡\}|dkrj||j_WnDt y°}z,|jr”|j  d |¡¡||j_WYd}~n0d}~00|jrØ|j  d  |rÊd nd |jj¡¡|  t t d|jj¡¡ q |dd…tkrÊ|jj}z,t d |dd …¡\}|dkr8||j_WnHt y‚}z.|jrf|j  d |¡¡||j_WYd}~n4d}~00|jr®|j  d |r d nd |jj¡¡|  tt d |jj¡¡ q |dd…tkrª|jj}z2t d |dd …¡d}|dkrt||j_WnHt y^}z.|jrB|j  d |¡¡||j_WYd}~n4d}~00|jrŠ|j  d |r|d nd |jj¡¡|  tt d t|jj¡¡ q |dd…tkrŠ|jj}z2t d |dd …¡d}|dkrôt||j_WnHt y>}z.|jr"|j  d |¡¡||j_WYd}~n4d}~00|jrj|j  d |r\d nd |jj¡¡|  tt d t|jj¡¡ q |dd…tkrš|dd …tkrî|jjrÆ|  tt ¡n$|jj!rÞ|  tt"¡n |  tt#¡ q|dd …t#kr4d|j_d|j_!|jr$|j  d¡|  tt#¡ q|dd …t krrd|j_|jrb|j  d¡|  tt ¡ q|dd …t"kr°d|j_!|jr |j  d¡|  tt"¡ q|dd …t$krÚ|jr–|j %d¡ q|dd …t&krd|j_'|jr|j  d¡|  tt&¡ q|dd …t(krVd|j_'|jrF|j  d¡|  tt(¡ q|dd …t)kr€|jr–|j %d¡ q|dd …t*kr¼d|j_+|jr®|j  d¡|  tt*¡nÚ|dd …t,krød|j_+|jrê|j  d¡|  tt,¡nž|dd …t-kr |jr–|j %d¡nv|dd …t.kr\d|j_/|jrN|j  d ¡|  tt.¡n:|dd …t0k rd|j_/|jrŠ|j  d!¡|  tt0¡ q |dd…t1krÂ|  t2t3dgƒ¡ q |dd…t4krø|jrè|j  d"¡|j5dd# q |dd…t6kr(|jr|j  d$¡d|_7 q |dd…t8krX|jrN|j  d%¡d|_7 q |dd…t9krœt:|dd …ƒ|_;|j r|j  d& |j;¡¡ q |dd…tkrÞ|dd …t?kr0|j @¡|jr"|j  d(¡|  tAt?¡n¬|dd …tBkrn|j C¡|jr`|j  d)¡|  tAtB¡nn|dd …tDkr¶|j @¡|j C¡|jr¨|j  d*¡|  tAtD¡n&|j r|j  d+ tE|dd…ƒ¡¡n&|j r |j  d, tE|dd…ƒ¡¡n|j r |j %d- |¡¡dS).r'rrDzreceived COM_PORT_OPTION: {!r}rCrÖézfailed to set baud rate: {}Nz{} baud rate: {}rtr÷r×rEzfailed to set data size: {}z{} data size: {}zfailed to set parity: {}z {} parity: {}zfailed to set stop bits: {}z{} stop bits: {}Fzchanged flow control to NoneTz changed flow control to XON/XOFFzchanged flow control to RTS/CTSz'requested break state - not implementedzchanged BREAK to activezchanged BREAK to inactivez%requested DTR state - not implementedzchanged DTR to activezchanged DTR to inactivez%requested RTS state - not implementedzchanged RTS to activezchanged RTS to inactivezrequest for modem stater?ZsuspendZresumezline state mask: 0x{:02x}zmodem state mask: 0x{:02x}zpurge inz purge outz purge bothzundefined PURGE_DATA: {!r}zundefined COM_PORT_OPTION: {!r}zunknown subnegotiation: {!r})Fr¸rsrrcrºr9r£rÙÚunpackrgr r rrr»rÚr¼Zbytesizer½r¾r¥ÚRFC2217_REVERSE_PARITY_MAPr¿rÛrÀÚstopbitsÚRFC2217_REVERSE_STOPBIT_MAPrÁrÜrÄÚSET_CONTROL_REQ_FLOW_SETTINGZxonxoffrÅràZrtsctsrßráÚSET_CONTROL_REQ_BREAK_STATEr rZbreak_conditionrÚSET_CONTROL_REQ_DTRr Zdtrr ÚSET_CONTROL_REQ_RTSrZrtsr ÚNOTIFY_LINESTATEr)rr5rAr,rŽr-ÚSET_LINESTATE_MASKr*r=ÚSET_MODEMSTATE_MASKr;rÂrrÑrÃrrÒÚPURGE_BOTH_BUFFERSÚlist)r_r}Zbackupr£ròr¤r¥rMrHrHrMrws\    " "þ "þ              þ              z*PortManager._telnet_process_subnegotiation)N)rO)F)rkrlrmrnr`r>rfrrrArHrIrrrrHrHrHrMr7¤s #  $;r7Ú__main__zrfc2217://localhost:7000r‡z{} z write... shello z read: {} )rær­rÙr±rxrçÚ ImportErrorÚ urllib.parseÚparser°Zqueuer9Zserial.serialutilrrrrrrÚDEBUGÚINFOZWARNINGZERRORrìrZNOPZDMZBRKZIPZAOZAYTZECZELZGArr´rµr¶r·rþrÿr³ržr¹r¸rºr¼r¾rÀrÄrSr5r,r-rTrUrÂr»r½r¿rÁrÅr)r+ZSERVER_FLOWCONTROL_SUSPENDZSERVER_FLOWCONTROL_RESUMEZSERVER_SET_LINESTATE_MASKZSERVER_SET_MODEMSTATE_MASKrÃZRFC2217_ANSWER_MAPrOráràrßrPrrrQr r rRrr ZSET_CONTROL_REQ_FLOW_SETTING_INZ"SET_CONTROL_USE_NO_FLOW_CONTROL_INZ!SET_CONTROL_USE_SW_FLOW_CONTOL_INZ!SET_CONTROL_USE_HW_FLOW_CONTOL_INZ SET_CONTROL_USE_DCD_FLOW_CONTROLZ SET_CONTROL_USE_DTR_FLOW_CONTROLZ SET_CONTROL_USE_DSR_FLOW_CONTROLZLINESTATE_MASK_TIMEOUTZLINESTATE_MASK_SHIFTREG_EMPTYZLINESTATE_MASK_TRANSREG_EMPTYZLINESTATE_MASK_BREAK_DETECTZLINESTATE_MASK_FRAMING_ERRORZLINESTATE_MASK_PARTIY_ERRORZLINESTATE_MASK_OVERRUN_ERRORZLINESTATE_MASK_DATA_READYrrrrrFrErDrCrrrVZ PARITY_NONEZ PARITY_ODDZ PARITY_EVENZ PARITY_MARKZ PARITY_SPACErÛÚdictrârLZ STOPBITS_ONEZSTOPBITS_ONE_POINT_FIVEZ STOPBITS_TWOrÜrNrrrrPrQrRrSÚobjectrTror€r7rkÚsysÚsÚstdoutrrcÚflushrûrÓrHrHrHrMÚ=s6     ü ôûýFG0