o ^_4@s~ddlmZddlZddlZddlZddlZddlZzddlZWney/ddl m ZYnwzddl Z Wn eyCddl Z Ynwddl Z ddlmZmZmZmZmZmZejejejejdZdZdZdZdZd Zd Zd Z d Z!d Z"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6d Z7d!Z8d"Z9d#Z:d$Z;d%Zd(Z?d)Z@d*ZAd+ZBd,ZCd-ZDd.ZEd/ZFe/e;e0ee3e?e4e@e5eAe6eBe7eCe8eDe9eEe:eFi ZGdZHdZIdZJdZKdZLdZMdZNdZOdZPd ZQd!ZRd"ZSd#ZTd0ZUd1ZVd2ZWd3ZXd4ZYd5ZZd6Z[d7Z\d8Z]d9Z^d:Z_d;Z`dZcd7Zdd8Zed9Zfd:Zgd;ZhdZkdZldZmdZne jod>e jpd=e jqd?e jrde jyd?e jzd=iZ{eudCdBe{vDZ|dZ}d>Z~d=ZdDZdEZdFZdGZGdHdIdIeZGdJdKdKeZGdLdMdMeZGdNdOdOeZedPkrddlZedQdRZejdSeejdTedUeejdVed@edSdS)W)absolute_importN) SerialBaseSerialExceptionto_bytes iterbytesPortNotOpenErrorTimeout)debuginfowarningerrors,    efghijklmnop @ cc|] \}}||fVqdSN.0kvrJrJ0/usr/lib/python3/dist-packages/serial/rfc2217.py rPccrHrIrJrKrJrJrOrPrQ REQUESTEDACTIVEINACTIVEREALLY_INACTIVEc@s,eZdZdZ d ddZddZddZdS) 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) connectionnameoptionsend_yessend_noack_yesack_nostateactiveactivation_callback) selfrWrXrYrZr[r\r] initial_stater`rJrJrO__init__s  zTelnetOption.__init__cC dj|dS)zString for debug outputsz{o.name}:{o.active}({o.state}))oformatrarJrJrO__repr__ zTelnetOption.__repr__cCs6||jkr\|jturt|_d|_|jdur|dSdS|jtur$dS|jturEt|_|j|j |j d|_|jdurC|dSdS|jt urU|j|j |j dSt d|||jkr|jturnt|_d|_dS|jturt|_|j|j |j d|_dS|jturdS|jt urdSt 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)r\r^rRrSr_r`rTrWtelnet_send_optionrZrYrUr[ ValueErrorrgr]racommandrJrJrOprocess_incoming sB                zTelnetOption.process_incomingrI)__name__ __module__ __qualname____doc__rcrirorJrJrJrOrVs   rVc@sLeZdZdZdddZddZddZd d ZeeZ dd d Z ddZ 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|_dSrI)rWrXrYvalue ack_optionrTr^)rarWrXrYrvrJrJrOrc9s zTelnetSubnegotiation.__init__cCrd)zString for debug outputs.z{sn.name}:{sn.state})snrfrhrJrJrOriCrjzTelnetSubnegotiation.__repr__cCsH||_t|_|j|j|j|jjr"|jjd|j |jdSdS)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) rurRr^rWrfc2217_send_subnegotiationrYloggerr rgrX)rarurJrJrOsetGs zTelnetSubnegotiation.setcCs$|jtkr td|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^rUrlrgrXrSrhrJrJrOis_readySs  zTelnetSubnegotiation.is_readyrFcCs>t|}|std|rdS|rtd|j)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)rexpiredtimesleepr{rrgrX)ratimeout timeout_timerrJrJrOwait^s zTelnetSubnegotiation.waitcCsR|j|dt|jkrt|_nt|_|jjr'|jjd|j ||jdSdS)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} -> {}) rulenrSr^rUrWryr rgrX)ra suboptionrJrJrO check_answerls  z!TelnetSubnegotiation.check_answerrI)rF) rprqrrrsrcrirzr{propertyr_rrrJrJrJrOrt3s     rtcseZdZdZdZfddZddZddZd d Zd d Z e d dZ d=ddZ ddZ ddZddZddZddZddZe ddZe d d!Ze d"d#Ze d$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd>d3d4Zd5d6Zd7d8Zd9d:Z d;d<Z!Z"S)?Serialz|j?|j@q t4|j}|AsCtBCdtDdd |DtDd!d |Dkr>n |Ar%td"||jrX|jEd#|j!|F|jGsd|H|jIsl|J|K|LWdS|M)$zx Open port with current settings. This may throw a SerialException if the port cannot be opened. NFrFz.Port must be configured before it can be used.zPort is already open.rG)rrEzCould not open port {}: {} we-BINARY we-RFC2217ECHOwe-SGAthey-SGA they-BINARY they-RFC2217baudratedatasizeparitystopsize)rrrrpurgecontrol)rrrrT)targetz&pySerial RFC 2217 reader thread for {}r|cs|]}|jVqdSrIr_rLrerJrJrOrPzSerial.open..css|]}|jtkVqdSrI)r^rTrrJrJrOrPsz;Remote does not seem to support RFC2217 or BINARY mode {!r}zNegotiated options: {})Nryrrr_portris_opensocketcreate_connectionfrom_urlportstrr setsockopt IPPROTO_TCP TCP_NODELAY ExceptionrgQueuer threadingLockrrVBINARYWILLWONTDODONTrTCOM_PORT_OPTIONrRrSGArrt SET_BAUDRATESERVER_SET_BAUDRATE SET_DATASIZESERVER_SET_DATASIZE SET_PARITYSERVER_SET_PARITY SET_STOPSIZESERVER_SET_STOPSIZEr PURGE_DATASERVER_PURGE_DATA SET_CONTROLSERVER_SET_CONTROLrupdaterrrrrThread_telnet_read_loopr setDaemonsetNamestartr^rkrZrYr}r~rsumr _reconfigure_port_dsrdtr_update_dtr_state_rtscts_update_rts_statereset_input_bufferreset_output_bufferclose)ramsgmandadory_optionsrYrrJrJrOopens               & z Serial.opencCs|jdur td|jdurtdd|jkrdks&ntd|j|jdt d|j|jd t d |j |jd t d t |j |jd t d t|j|j}|jro|jd |t|j}|stdtdd|Dt|krn |rxtd||jr|jd||jr|jrtd|jr|tdS|jr|tdS|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!BrrzNegotiating settings: {}r|csrrIrrrJrJrOrPrz+Serial._reconfigure_port..z7Remote does not accept parameter change (RFC2217): {!r}zNegotiated settings: {}z-xonxoff and rtscts together are not supported)!rr_write_timeoutNotImplementedError _baudraterlrgrrzstructpack _bytesizeRFC2217_PARITY_MAP_parityRFC2217_STOPBIT_MAP _stopbitsvaluesryr rrr}r~rrrr r_xonxoffrfc2217_set_controlSET_CONTROL_USE_HW_FLOW_CONTROLSET_CONTROL_USE_SW_FLOW_CONTROLSET_CONTROL_USE_NO_FLOW_CONTROL)raitemsrrJrJrOrs:      zSerial._reconfigure_portcCs^d|_|jrz|jtj|jWnY|jr*|jdd|_t dd|_dS)z Close portFN333333?) rrshutdownr SHUT_RDWRrrjoinr~rrhrJrJrOrs   z Serial.closec Cs t|}|jdkrtd|jzdt|jdD]E\}}|dkr?t t d|_ |j t |d|j dq|dkrGd|_q|d krOd|_q|d kr[t|d|_qtd |d|jkrpd ksutd td Wnty}ztd|d}~ww|j|jfS)zu extract host and port from an URL string, other settings are extracted an stored in instance rfc2217zqexpected a string in the form "rfc2217://:[?option[&option...]]": not starting with rfc2217:// ({!r})TloggingzpySerial.rfc2217rzenabled loggingign_set_control poll_modemrzunknown option: {!r}izport not in range 0...65535zPexpected a string in the form "rfc2217://:[?option[&option...]]": {}N)urlparseurlsplitschemerrgparse_qsqueryrr basicConfig getLoggerrysetLevel LOGGER_LEVELSr rrfloatrrlporthostname)raurlpartsrYrerJrJrOr0sB    zSerial.from_urlcCs|jst|jS)z9Return the number of bytes currently in the input buffer.)rrrqsizerhrJrJrO in_waitingUs zSerial.in_waitingrEcCs|jstt}zIt|j}t||krI|jdus|js#td|j d| }|dur5t |WS||7}| r>nt||ksWt |SWt |SWt |Stjy_Yt |Sw)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)rr bytearrayr_timeoutrris_aliverrget time_leftbytesr}rEmpty)rasizedatarbufrJrJrOread\s0     z Serial.readc Cs|jst|j.z|jt|ttWnt j y,}zt d |d}~wwWdt |S1s:wYt |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)rrrrsendallrreplaceIAC IAC_DOUBLEDrr rrgr)rarrrJrJrOwritets z Serial.writecCs>|jst|t|jr|jd|jsdSdS)z9Clear input buffer, discarding all that is in the buffer.FN)rrrfc2217_send_purgePURGE_RECEIVE_BUFFERrrrrhrJrJrOrs    zSerial.reset_input_buffercCs|jst|tdS)zs Clear output buffer, aborting the current output and discarding all that is in the buffer. N)rrr$PURGE_TRANSMIT_BUFFERrhrJrJrOrszSerial.reset_output_buffercCP|jst|jr|jd|jrdnd|jr!|tdS|tdS)z[ Set break: Controls TXD. When active, to transmitting is possible. zset BREAK to {}r_inactiveN) rrryr rg _break_staterSET_CONTROL_BREAK_ONSET_CONTROL_BREAK_OFFrhrJrJrO_update_break_stateszSerial._update_break_statecCr')z*Set terminal status line: Request To Send.z set RTS to {}r_r(N) rrryr rg _rts_staterSET_CONTROL_RTS_ONSET_CONTROL_RTS_OFFrhrJrJrOrzSerial._update_rts_statecCr')z.Set terminal status line: Data Terminal Ready.z set DTR to {}r_r(N) rrryr rg _dtr_staterSET_CONTROL_DTR_ONSET_CONTROL_DTR_OFFrhrJrJrOrr0zSerial._update_dtr_statecC|jstt|t@S)z)Read terminal status line: Clear To Send.)rrboolget_modem_stateMODEMSTATE_MASK_CTSrhrJrJrOctsz Serial.ctscCr4)z*Read terminal status line: Data Set Ready.)rrr5r6MODEMSTATE_MASK_DSRrhrJrJrOdsrr9z Serial.dsrcCr4)z*Read terminal status line: Ring Indicator.)rrr5r6MODEMSTATE_MASK_RIrhrJrJrOrir9z Serial.ricCr4)z*Read terminal status line: Carrier Detect.)rrr5r6MODEMSTATE_MASK_CDrhrJrJrOcdr9z Serial.cdc Cst}d}z|jrz|jd}Wn.tjyYqtjy>}z|jr.|jd ||j dWYd}~nd}~ww|sH|j dnzt |D]r}|tkri|t krYt}qL|durb||7}qL|j |qL|tkr|t kr|durz|t 7}n|j t t}qL|tkrt}t}qL|tkr|t|d}t}qL|ttttfvr|}t}qL||t}qL|tkr|||t}qL|jsW|jr|jddSdS|jr|jdww)zRead loop for the socket.Niz!socket error in reader thread: {}zread thread terminated)M_NORMALrrrecvrrr ryr rgrputrr! M_IAC_SEENSBrSE_telnet_process_subnegotiationrrrrr M_NEGOTIATE_telnet_process_command_telnet_negotiate_option)ramoderrrbytetelnet_commandrJrJrOrsl         : zSerial._telnet_read_loopcC |jr|jd|dSdSz1Process commands other than DO, DONT, WILL, WONT.zignoring Telnet command: {!r}Nryr rgrmrJrJrOrHzSerial._telnet_process_commandcC|d}|jD]}|j|kr||d}q|s8|tks|tkr:||tkr&tnt||jr<|j d |dSdSdSdSz&Process incoming DO, DONT, WILL, WONT.FTzrejected Telnet option: {!r}N rrYrorrrkrrryr rgrarnrYknownitemrJrJrOrI$   zSerial._telnet_negotiate_optioncCsj|ddtkr|ddtkr0t|dkr0t|dd|_|jr.|jd|jd Sd S|ddtkr\t|dkr\t|dd|_ |jrT|jd|j |j dd S|ddt krid|_ d S|ddtkrvd |_ d S|jD]}|j|ddkr|t|dd d Sq{|jr|jd |d Sd S|jr|jd |d Sd S) ;Process subnegotiation, the data between IAC SB and IAC SE.rrErDrFzNOTIFY_LINESTATE: {}NOTIFY_MODEMSTATE: {}rTFNzignoring COM_PORT_OPTION: {!r}zignoring subnegotiation: {!r})rSERVER_NOTIFY_LINESTATErordrryr rgSERVER_NOTIFY_MODEMSTATErrrestartFLOWCONTROL_SUSPENDrFLOWCONTROL_RESUMErrrvrrr )rarrVrJrJrOrF7s4  z%Serial._telnet_process_subnegotiationcCs8|j|j|WddS1swYdS)zGinternal socket write with no data escaping. used to send telnet stuff.N)rrr)rarrJrJrO_internal_raw_writeWs"zSerial._internal_raw_writecCs|t||dSzSend DO, DONT, WILL, WONT.N)r`r!raactionrYrJrJrOrk\szSerial.telnet_send_optioncCs2|tt}|ttt||ttdS)z%Subnegotiation of RFC2217 parameters.N)r r!r"r`rDrrErarYrurJrJrOrx`s &z"Serial.rfc2217_send_subnegotiationcCs$|jd}||||jdS)z~ Send purge request to the remote. (PURGE_RECEIVE_BUFFER / PURGE_TRANSMIT_BUFFER / PURGE_BOTH_BUFFERS) rN)rrzrrrarurVrJrJrOr$es  zSerial.rfc2217_send_purgecCs8|jd}|||jrtddS||jdS)z)transmit change of control line to remoterg?N)rrzrr~rrrrfrJrJrOrns  zSerial.rfc2217_set_controlcCsdS)z` check if server is ready to receive data. block for some time when not. NrJrhrJrJrOrfc2217_flow_server_readyzsz Serial.rfc2217_flow_server_readycCs|jr7|jr7|jr|jd|tt|j}|s.t d|js*n |r|jr7|j d|j durH|jrE|jd|j St d)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 stater|zpoll for modem state failedNzusing cached modem statez!remote sends no NOTIFY_MODEMSTATE)rrr}ryr rxNOTIFY_MODEMSTATErrr~rr rr)rarrJrJrOr6s"        zSerial.get_modem_state)rErd)#rprqrrrs BAUDRATESrcrrrrrrrr#rrr,rrr8r;r=r?rrHrIrFr`rkrxr$rrgr6 __classcell__rJrJrrOrzsH a,%          D    rc@sfeZdZdZdddZddZddZdd d Zdd dZddZ ddZ ddZ ddZ ddZ 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 ttttt |dtt ttttt |dtttt ttt |dtt ttttt |dtttt ttt |d tt tttt|j t |d tttt tt|j g|_|jrt|jd |jD]}|jtur||j|jqwdS) NFrrrrrrrrz*requesting initial Telnet/RFC 2217 options)serialrWry_client_is_rfc2217r@rJrrLmodemstate_masklast_modemstate linstate_maskrVrrrrrrRrrTrr _client_okrr r^rkrZrY)ra serial_portrWryrYrJrJrOrcs2   zPortManager.__init__cCs(d|_|jr |jd|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 2217force_notificationN)roryr check_modem_linesrhrJrJrOrss  zPortManager._client_okcCs|jt||dSra)rWr#r!rbrJrJrOrkszPortManager.telnet_send_optionrdcCs4|tt}|jttt||ttdS)z&Subnegotiation of RFC 2217 parameters.N)r r!r"rWr#rDrrErerJrJrOrxs (z'PortManager.rfc2217_send_subnegotiationFcCs|jjot|jjo tB|jjotB|jjotB}||j pdA}|t@r'|t O}|t@r/|t O}|t@r7|t O}|t@r?|t O}||j ksF|ro|jrN||j@sP|rh|tt||j@g|jrh|jd||d@|_ dSdS)z read control lines from serial port and compare the last value sent to remote. send updates on changes. rrYN)rnr8r7r;r:r=r<r?r>rqMODEMSTATE_MASK_CTS_CHANGEMODEMSTATE_MASK_DSR_CHANGEMODEMSTATE_MASK_RI_CHANGEMODEMSTATE_MASK_CD_CHANGErorprxr\rryr rg)rarv modemstatedeltasrJrJrOrws6    zPortManager.check_modem_linesccs0t|D]}|tkrtVtVq|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!rarrKrJrJrOescapes zPortManager.escapeccst|D]}|jtkr%|tkrt|_q|jdur!|j|7_q|Vq|jtkry|tkrB|jdur;|j|7_n|Vt|_q|tkrNt|_t|_q|tkra| t |jd|_t|_q|t t t tfvrp||_t|_q||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)rrJr@r!rCrrDrrErFrrrrrrLrGrHrIrrJrJrOfilter(s>       zPortManager.filtercCrMrNrOrmrJrJrOrHcrPz#PortManager._telnet_process_commandcCrQrRrSrTrJrJrOrIirWz$PortManager._telnet_negotiate_optionc CsF |ddtkr|jr|jd||ddtkrz|jj}ztd|dd\}|dkr5||j_Wn"t yX}z|jrJ|j d|||j_WYd}~nd}~ww|jrl|j d |red nd |jj| t td|jjdS|ddtkr|jj}ztd |dd \}|dkr||j_Wn"t y}z|jr|j d|||j_WYd}~nd}~ww|jr|j d|rd nd |jj| ttd |jjdS|ddtkrO|jj}ztd |dd d}|dkrt||j_Wn$t y)}z|jr|j d|||j_WYd}~nd}~ww|jr?|j d|r8d nd |jj| ttd t|jjdS|ddtkr|jj}ztd |dd d}|dkrtt||j_Wn$t y}z|jr|j d|||j_WYd}~nd}~ww|jr|j d|rd nd |jj| ttd t|jjdS|ddtkrO|dd tkr|jjr| tt dS|jj!r| tt"dS| tt#dS|dd t#krd|j_d|j_!|jr|j d| tt#dS|dd t kr5d|j_|jr-|j d| tt dS|dd t"krTd|j_!|jrL|j d| tt"dS|dd t$kri|jrg|j%ddS|dd t&krd|j_'|jr|j d| tt&dS|dd t(krd|j_'|jr|j d| tt(dS|dd t)kr|jr|j%ddS|dd t*krd|j_+|jr|j d| tt*dS|dd t,krd|j_+|jr|j d| tt,dS|dd t-kr|jr |j%ddS|dd t.kr.d|j_/|jr&|j d | tt.dS|dd t0krMd|j_/|jrE|j d!| tt0dSdS|ddt1krc| t2t3dgdS|ddt4kr~|jrv|j d"|j5dd#dS|ddt6kr|jr|j d$d|_7dS|ddt8kr|jr|j d%d|_7dS|ddt9krt:|dd |_;|jr|j d&|j;dSdS|ddtkr{|dd t?kr|j@|jr|j d(| tAt?dS|dd tBkr?|jC|jr7|j d)| tAtBdS|dd tDkrd|j@|jC|jr\|j d*| tAtDdS|jry|j d+tE|dddSdS|jr|j d,tE|dddSdS|jr|j%d-|dSdS).rXrrEzreceived COM_PORT_OPTION: {!r}rDrzfailed to set baud rate: {}Nz{} baud rate: {}rzrrrFzfailed 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 staterususpendresumezline 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})Frryr rgrrnrrunpackrlr r rxrrrbytesizerrrRFC2217_REVERSE_PARITY_MAPrrrstopbitsRFC2217_REVERSE_STOPBIT_MAPrrrSET_CONTROL_REQ_FLOW_SETTINGxonxoffrrrtsctsrrSET_CONTROL_REQ_BREAK_STATEr r*break_conditionr+SET_CONTROL_REQ_DTRr2dtrr3SET_CONTROL_REQ_RTSr.rtsr/NOTIFY_LINESTATErZrrhrwr^rr_SET_LINESTATE_MASKr[rrSET_MODEMSTATE_MASKrprr%rrr&rPURGE_BOTH_BUFFERSlist)rarbackuprrrrrrJrJrOrF|s    "  "                           ""z*PortManager._telnet_process_subnegotiationrIri)F)rprqrrrsrcrsrkrxrwrrrHrIrFrJrJrJrOrls #  $; rl__main__zrfc2217://localhost:7000rz{} z write... shello z read: {} ) __future__rrrrrr~r ImportError urllib.parseparserqueuernserial.serialutilrrrrrrDEBUGINFOWARNINGERRORr rENOPDMBRKIPAOAYTECELGArDrrrrr!r"rrrrrrrrrrrhr^r_rrrrrrrrrZr\SERVER_FLOWCONTROL_SUSPENDSERVER_FLOWCONTROL_RESUMESERVER_SET_LINESTATE_MASKSERVER_SET_MODEMSTATE_MASKrRFC2217_ANSWER_MAPrrrrrr*r+rr2r3rr.r/SET_CONTROL_REQ_FLOW_SETTING_IN"SET_CONTROL_USE_NO_FLOW_CONTROL_IN!SET_CONTROL_USE_SW_FLOW_CONTOL_IN!SET_CONTROL_USE_HW_FLOW_CONTOL_IN SET_CONTROL_USE_DCD_FLOW_CONTROL SET_CONTROL_USE_DTR_FLOW_CONTROL SET_CONTROL_USE_DSR_FLOW_CONTROLLINESTATE_MASK_TIMEOUTLINESTATE_MASK_SHIFTREG_EMPTYLINESTATE_MASK_TRANSREG_EMPTYLINESTATE_MASK_BREAK_DETECTLINESTATE_MASK_FRAMING_ERRORLINESTATE_MASK_PARTIY_ERRORLINESTATE_MASK_OVERRUN_ERRORLINESTATE_MASK_DATA_READYr>r<r:r7r|r{rzryr%r&r PARITY_NONE PARITY_ODD PARITY_EVEN PARITY_MARK PARITY_SPACErdictrr STOPBITS_ONESTOPBITS_ONE_POINT_FIVE STOPBITS_TWOrrr@rCrGrRrSrTrUobjectrVrtrrlrpsyssstdoutr#rgflushrrrJrJrJrOs@ <        FG3