o ,_Г@sddlmZddlZddlZddlZddlZddlZddlmZddl m Z e ddze Wn e y>eZ eZYnwddZGd d d eZejd krmddlZddlZddlZGd d d eZGdddeZn"ejdkrddlZddlZddlZGdddeZnedejGdddeZGdddeZ GdddeZ!GdddeZ"GdddeZ#Gddde#Z$Gdd d eZ%Gd!d"d"eZ&Gd#d$d$eZ'e e!e"d%Z(ee#e$e%e&e'd&Z)d'd(Z*Gd)d*d*eZ+d/d,d-Z,e-d.kre,dSdS)0)absolute_importN)comports) hexlify_codeccCs|dkrtSdS)Nhexlify)r getregentrycr 7/usr/lib/python3/dist-packages/serial/tools/miniterm.pysr cCs*t|}|dkrdtd|St|S)z)generate a readable description for a key z Ctrl+{:c}@)ordformatrepr) character ascii_coder r r key_description!src@sXeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ dS) ConsoleBasez8OS abstraction for console (input/output codec, no echo)cCs*tjdkr tjj|_ntj|_tj|_dSN)r)sys version_infostdoutbuffer byte_outputoutputselfr r r __init__.s   zConsoleBase.__init__cCdS)z.Set console to read single characters, no echoNr rr r r setup5zConsoleBase.setupcCr )z Restore default console settingsNr rr r r cleanup8r"zConsoleBase.cleanupcCr )z"Read a single key from the consoleNr rr r r getkey;zConsoleBase.getkeycC|j||jdS)zWrite bytes (already encoded)N)rwriteflush)r byte_stringr r r write_bytes? zConsoleBase.write_bytescCr&)z Write stringN)rr'r(rtextr r r r'Dr+zConsoleBase.writecCr )zCancel getkey operationNr rr r r cancelIr"zConsoleBase.cancelcCs ||SN)r#rr r r __enter__PszConsoleBase.__enter__cOs |dSr/)r!)rargskwargsr r r __exit__T zConsoleBase.__exit__N) __name__ __module__ __qualname____doc__rr!r#r$r*r'r.r0r3r r r r r+s rntc@(eZdZdZddZddZddZdS) Outz$file-like wrapper that uses os.writecCs ||_dSr/)fd)rr<r r r r` z Out.__init__cCsdSr/r rr r r r(csz Out.flushcCst|j|dSr/)osr'r<)rsr r r r'fsz Out.writeN)r5r6r7r8rr(r'r r r r r;]s  r;c sheZdZddddddddd d d Zd d ddddddddd ZfddZddZddZddZZ S)ConsolezbOPzbOQzbORzbOSzb[15~zb[17~zb[18~zb[19~zb[20~zb[21~) ;<=>?r ABCDzzzzzzz[2~z[3~z[5~z[6~) HPKMGORSIQcsBtt|tjj|_tjj|_ tjj dtjj dt dkr{tt dddkr{d}ddlm}t|dsJt|j|_tjjj}tjjj}tjjj}|}||d t||j|@dkr{||d |j|B||_td tt j!"d |_#td tt j$"d t _$|j#t _!d |j#_%dS) Ni10.iZ)rLPDWORDUTF-8replace)&superr@rctypeswindllkernel32GetConsoleOutputCP _saved_ocp GetConsoleCP _saved_icpSetConsoleOutputCP SetConsoleCPplatformreleaseintversionsplitctypes.wintypeswintypeshasattrPOINTERDWORDrXSetConsoleModeGetConsoleMode GetStdHandlebyrefvalue _saved_cmcodecs getwriterr;rrfilenorstderrencoding)r"ENABLE_VIRTUAL_TERMINAL_PROCESSINGrlrprqrrmode __class__r r rs,&      Console.__init__cCsXtjj|jtjj|jztjjtjjd|j WdSt y+YdSw)NrY) r]r^r_rdrarercrprrruAttributeErrorrr r r __del__s" zConsole.__del__cCs| t}|tdkrtdS|tdus|tdur;zt}|tdur,|j|WS|j|WSty:Ynw|Sq)NT r)msvcrtgetwchunichrfncodesnavcodesKeyError)rzcoder r r r$s     Console.getkeycCs$tjj}tjj|ddddS)Nrr)r]r^r_GetConsoleWindowuser32 PostMessageA)rhwndr r r r.s Console.cancel) r5r6r7rrrrr$r. __classcell__r r r}r r@is6  r@posixcs<eZdZfddZddZddZddZd d ZZS) r@csdtt|tj|_t|j|_ t |j tj dkr,ttjjtj|_dStj|_dSr)r\r@rrstdinrxr<termios tcgetattroldatexitregisterr#rrv getreaderrz enc_stdinrr}r r rs    rcCsbt|j}|dtj@tj@tj@|d<d|dtj<d|dtj<t|jtj |dS)Nrr) rrr<ICANONECHOISIGVMINVTIME tcsetattrTCSANOW)rnewr r r r!s $z Console.setupcCs$|jd}|tdkrtd}|S)Nr)rreadr)rrr r r r$s  rcCst|jtjddS)N)fcntlioctlr<rTIOCSTIrr r r r.srcCst|jtj|jdSr/)rrr< TCSAFLUSHrrr r r r#szConsole.cleanup) r5r6r7rr!r$r.r#rr r r}r r@s   z9Sorry no implementation for your platform ({}) available.c@r:) Transformz&do-nothing: forward all data unchangedcC|S)ztext received from serial portr r,r r r rxr%z Transform.rxcCr)ztext to be sent to serial portr r,r r r txr%z Transform.txcCr)z(text to be sent but displayed on consoler r,r r r echor%zTransform.echoN)r5r6r7r8rrrr r r r rs  rc@seZdZdZddZdS)CRLFzENTER sends CR+LFcC |ddS)N  r[r,r r r rr4zCRLF.txN)r5r6r7r8rr r r r rs rc@ eZdZdZddZddZdS)CRzENTER sends CRcCr)N rrr,r r r rr4zCR.rxcCr)Nrrrr,r r r rr4zCR.txNr5r6r7r8rrr r r r rs rc@seZdZdZdS)LFzENTER sends LFN)r5r6r7r8r r r r rsrc@sBeZdZdZeddedDZeddddd ZeZ d S) NoTerminalz0remove typical terminal control codes from inputccs(|]}t|dvr|d|fVqdS)  $N)r.0xr r r s&zNoTerminal.r !$%$)rcCs ||jSr/) translateREPLACEMENT_MAPr,r r r rr4z NoTerminal.rxN) r5r6r7r8dictrangerupdaterrr r r r r src@s8eZdZdZeddedDZeddddd S) NoControlsz%Remove all control codes, incl. CR+LFccs|] }|d|fVqdS)rNr rr r r rszNoControls.r i#$rr)r rrN)r5r6r7r8rrrrr r r r rsrc@seZdZdZddZeZdS) PrintablezMShow decimal code for all non-ASCII characters and replace most control codescCsg}|D];}d|krdksn|dvr||q|dkr+|tdt|q|dddt|D|dqd|S) N rrcss$|] }tdt|dVqdS)i 0N)rr)rdr r r r2s"zPrintable.rx..z{:d})appendrrextendrjoin)rr-rrr r r r*s   z Printable.rxN)r5r6r7r8rrr r r r r's rc@r:) Colorizez,Apply different colors for received and echocCsd|_d|_dS)Nzz) input_color echo_colorrr r r r<s zColorize.__init__cC |j|Sr/)rr,r r r rAr=z Colorize.rxcCrr/)rr,r r r rDr=z Colorize.echoN)r5r6r7r8rrrr r r r r9s  rc@r)DebugIOzPrint what is sent and receivedcC tjd|tj|S)Nz [RX:{!r}] rryr'rr(r,r r r rK z DebugIO.rxcCr)Nz [TX:{!r}] rr,r r r rPrz DebugIO.txNrr r r r rHs r)crlfcrlf)directdefault nocontrol printablecolorizedebugcCstjdg}tttdD]\}\}}}tjd|||||q td}zt |d}d|kr@t |ksIntjdWq(Wn t yTY|Sw||}|S)z Show a list of ports and ask the user for a choice. To make selection easier on systems with long device names, also allow the input of an index. z --- Available ports: rz--- {:2}: {:20} {!r} Tz#--- Enter port index or full name: rz--- Invalid index! ) rryr' enumeratesortedrrr raw_inputrhlen ValueError)portsnportdeschwidindexr r r ask_for_portks&     rc@seZdZdZd1ddZddZd d Zd d Zd dZd2ddZ ddZ ddZ d3ddZ d3ddZ ddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0S)4Minitermz Terminal application. Copy data from serial port to console and vice versa. Handle special keys from the console to show menu etc. Frr cCspt|_||_||_d|_d|_d|_||_||_| t d|_ t d|_ d|_ d|_d|_d|_d|_dS)NFrZ)r@consoleserialrrawinput_encodingoutput_encodingeolfiltersupdate_transformationsrexit_charactermenu_characteralive _reader_alivereceiver_thread rx_decoder tx_decoder)rserial_instancerrrr r r rs    zMiniterm.__init__cCs.d|_tj|jdd|_d|j_|jdS)zStart reader threadTrtargetnameN)r threadingThreadreaderrdaemonstartrr r r _start_readerszMiniterm._start_readercCs*d|_t|jdr|j|jdS)z6Stop reader thread only, wait for clean exit of threadF cancel_readN)rrmrrrrrr r r _stop_readers  zMiniterm._stop_readercCs@d|_|tj|jdd|_d|j_|j|j dS)zstart worker threadsTrr N) rrr r writertransmitter_threadrrrr!rr r r rs  zMiniterm.startcCs d|_dS)zset flag to stop worker threadsFN)rrr r r stops z Miniterm.stopcCs6|j|st|jdr|j|jdSdS)z$wait for worker threads to terminaterN)rrrmrrr)r transmit_onlyr r r rs   z Miniterm.joincCs|jdSr/)rcloserr r r rszMiniterm.closecCs@t|jgdd|jD}dd|D|_tt|j|_dS)zFtake list of transformation classes and instantiate them for rx and txcSsg|]}t|qSr )TRANSFORMATIONS)rfr r r s z3Miniterm.update_transformations..cSsg|]}|qSr r )rtr r r rsN)EOL_TRANSFORMATIONSrrtx_transformationslistreversedrx_transformations)rtransformationsr r r rs zMiniterm.update_transformationsr[cC||_t|||_dS)zset encoding for received dataN)rrvgetincrementaldecoderrrrzerrorsr r r set_rx_encodingzMiniterm.set_rx_encodingcCr#)z!set encoding for transmitted dataN)rrvgetincrementalencoder tx_encoderr%r r r set_tx_encodingr(zMiniterm.set_tx_encodingcCsLtjdj|jdtjd|jjrdnd|jjrdnd|jjr$dndz&tjd|jjr4dnd|jj r;dnd|jj rBdnd|jj rIdndWn tj yXYnwtjd|jj rddndtjd|jjrsdndtjd |jtjd |jtjd |jtjd d |jdS)z$Write current settings to sys.stderrzK --- Settings: {p.name} {p.baudrate},{p.bytesize},{p.parity},{p.stopbits} pz&--- RTS: {:8} DTR: {:8} BREAK: {:8} activeinactivez---- CTS: {:8} DSR: {:8} RI: {:8} CD: {:8} z--- software flow control: {} z--- hardware flow control: {} --- serial input encoding: {} --- serial output encoding: {} z --- EOL: {} --- filters: {} rN)rryr'rrrtsdtrbreak_conditionctsdsrricdSerialExceptionxonxoffrtsctsrrrupperrrrr r r dump_port_settingss0    zMiniterm.dump_port_settingscCszE|jr=|jr@|j|jjpd}|r4|jr|j|n|j |}|j D]}| |}q&|j ||jrC|jsWdSWdSWdSWdStj yVd|_|jw)zloop and copy serial->consolerFN)rrrr in_waitingrrr*rdecoder!rr'r:r.)rdatar-transformationr r r rs      $  zMiniterm.readercCsd}zp|jrpz|j}Wn tyd}Ynw|jsWdS|r)||d}nA||jkr1d}n9||jkr=|WdS|}|jD]}| |}qB|j |j ||jrj|}|jD]}||}q\|j ||jsWdSWdSd|_)z Loop and copy console->serial until self.exit_character character is found. When self.menu_character is found, interpret the next key locally. FTN)rrr$KeyboardInterrupthandle_menu_keyrrrrrrr'r*encoder)r menu_activerr-rB echo_textr r r rs>         zMiniterm.writercCs||jks ||jkr!|j|j||jr|j|d'Sd'S|dkr+|d'S|dvr9t j | d'S|dkrU|jj |j_ t j d |jj rOdndd'S|dkrq|jj |j_t j d |jjrkdndd'S|d kr|jj |j_t j d |jjrdndd'S|d kr|j |_t j d |jrdndd'S|d kr|d'S|dkrtt}||jd}|t|krd}|||_t j d |j|d'S|dkr|d'S|dkr|d'S|dvr|d'S|dvr|d'S|dvr|d'S|dkr#tj|j_|d'S|dkr3tj|j_|d'S|dvrCtj |j_!|d'S|dvrStj"|j_!|d'S|dvrctj#|j_!|d'S|dvrstj$|j_!|d'S|dvrtj%|j_!|d'S|dkrtj&|j_'|d'S|dkrtj(|j_'|d'S|d krtj)|j_'|d'S|d!vr|d"k|j_*|d'S|d#vr|d$k|j_+|d'S|d%vr|,d'St j d& t-|d'S)(z"Implement a simple menu / settingszhH?z--- RTS {} --- r.r/z--- DTR {} --- z--- BREAK {} --- z--- local echo {} ---  rrz--- EOL: {} ---  pPzZbB87eEoOmMsSnN123xXXrRrPqQz!--- unknown menu character {} -- N).rrrr'r*rFrr upload_filerry get_help_textr3rr4r5 change_filterrrrrrr=rchange_encodingr> change_port suspend_portchange_baudrate EIGHTBITSbytesize SEVENBITS PARITY_EVENparity PARITY_ODD PARITY_MARK PARITY_SPACE PARITY_NONE STOPBITS_ONEstopbits STOPBITS_TWOSTOPBITS_ONE_POINT_FIVEr;r<rr)rrmodesrr r r rE's """                                                   zMiniterm.handle_menu_keyc Cs8tjdtj|jtjd}|rzzDt|d,}tjd | | d}|s2n|j ||j tjdq*Wdn1sNwYtjd |Wn$t yy}ztjd ||WYd}~nd}~wwWddSWddSWddS1swYdS) z,Ask user for filenname and send its contentsz --- File to upload: rrbz--- Sending file {} --- TirUNz --- File {} sent --- z"--- ERROR opening file {}: {} --- ) rryr'r(rrreadlinerstripopenrrrIOError)rfilenamerblocker r r rc}s:         "zMiniterm.upload_filecCstjdtjdddttDtjdd|j|j tj }Wdn1s.z$ --- Enter new filter name(s) [{}]: rNz--- unknown filter: {!r} r2)rryr'rrritemsrrrrrylowerrjr)r new_filtersrr r r res"   zMiniterm.change_filtercCstjd|j|jtj}Wdn1swY|rJzt |Wnt y?tjd|Yn w| || |tjd|jtjd|jdS)z"change encoding on the serial portz# --- Enter new encoding name [{}]: Nz--- invalid encoding name: {} r0r1)rryr'rrrrrystriprvlookup LookupErrorr'r+r)r new_encodingr r r rfs   zMiniterm.change_encodingc Cstjdtj|jF|jj}z ttj |j_Wnt y?}ztjd |||j_WYd}~nd}~ww| WddSWddS1sWwYdS)zchange the baudratez --- Baudrate: z#--- ERROR setting baudrate: {} --- N)rryr'r(rrbaudraterhrryrrrr>)rbackuprr r r ris   "zMiniterm.change_baudratec Cs&|jzt}Wn tyd}YnwWdn1swY|r||jjkr||j}z!tj|dd}|||jj |_ |jj |_ | |jj |_ Wnt yu}ztjd||WYd}~nd}~ww|j||_tjd|jj|dSdSdS)z;Have a conversation with the user to change the serial portNT) do_not_openz#--- ERROR opening new port: {} --- z--- Port changed to: {} --- )rrrDrrrgetSettingsDictserial_for_urlapplySettingsDictr3r4r{r5 Exceptionrryr'rrr)rrsettings new_serialrr r r rgs8        zMiniterm.change_portc Cs||jtjd|jjd}|jjsdtjdjt |j d|j }||j kr6| n.|dvr=d}n'z|jWnty_}ztjd|WYd}~nd}~ww|jjr|rl|dS|tjd |jjdS) zl open port temporarily, allow reconnect, exit and port change to get out of the loop z --- Port closed: {} --- FzC--- Quit: {exit} | p: port change | any other key to reconnect --- )exitrRTz--- ERROR opening port: {} --- Nz--- Port opened: {} --- )rrrrryr'rris_openrrrr$rr{rrgr)rdo_change_portrrr r r rhs4     zMiniterm.suspend_portcCsZdjttddt|jt|jtdtdtdtdtdtd td td td d S)zreturn the help textab --- pySerial ({version}) - miniterm - help --- --- {exit:8} Exit program (alias {menu} Q) --- {menu:8} Menu escape key, followed by: --- Menu keys: --- {menu:7} Send the menu character itself to remote --- {exit:7} Send the exit character itself to remote --- {info:7} Show info --- {upload:7} Upload file (prompt will be shown) --- {repr:7} encoding --- {filter:7} edit filters --- Toggles: --- {rts:7} RTS {dtr:7} DTR {brk:7} BREAK --- {echo:7} echo {eol:7} EOL --- --- Port settings ({menu} followed by the following): --- p change port --- 7 8 set data bits --- N E O S M change parity (None, Even, Odd, Space, Mark) --- 1 2 3 set stop bits (1, 2, 1.5) --- b change baud rate --- x X disable/enable software flow control --- r R disable/enable hardware flow control VERSIONzunknown versionrJrKrLrMrQrIrPrNrO) rirmenur3r4brkrinfouploadrfilterr)rgetattrrrrrrr r r rds zMiniterm.get_help_textN)Frr )Fr)r5r6r7r8rrrrrrrrr'r+r>rrrErcrerfrirgrhrdr r r r rs.    &V r%c Csddl}|jdd}|jddd|d|jd dtd |d |d }|jd gdddddd|jddddd|jddddd|jdtd|d|jdtd|d|jd d!d"d#d$d%|jd&dd'dd|d(}|jd)d*dd+dd|jd,d-d.d/d0d1|jd2d3d4d5d6gd7|jd8gd9d:dd;ddd|d?}|jd@tdAdBdCdD|jdEtdAdFdGdD|dH}|jdIdJddKdd|jdLddMdd|}|j|jkr|dN|j rdO|j vrt j dPt j dQ dRdSttDt j dQt dT|j }ndUg} |jdus#|jdVkrHzt|_Wnty>t j dQ|dWYn w|jsH|dXzdtj|j|j|j|j|jd$dY} t| dZsbdT| _|jdur|js{t j d[|jrwd\nd]|j| _|j dur|jst j d^|j rd\nd]|j | _ t!| tj"r|j#| _#| $Wn1tj%y} z#t j d_|j| |j&rƂ|j'st dTndV|_WYd} ~ nd} ~ wwnqt(| |j)|j*+|d`} t,|j| _-t,|j| _.|j/| _/| 0|j1| 2|j1|js/t j daj| jdbt j dct3| j-t3| j.t3| j.t3dd| 4z| d$Wn tyDYnw|jsOt j de| | 5dS)fzCommand line tool, entry pointrNz9Miniterm - A simple terminal program for the serial port.) descriptionrrEz(serial port name ("-" to show port list))nargshelprrz#set baud rate, default: %(default)s)rtyperrz port settingsz--parity)NErOrQrMcS|Sr/r=rr r r r Gzmain..z*set parity, one of {N E O S M}, default: Nr)choicesrrrz--rtscts store_truez)enable RTS/CTS flow control (default off)F)actionrrz --xonxoffz*enable software flow control (default off)z--rtsz2set initial RTS line state (possible values: 0, 1))rrrz--dtrz2set initial DTR line state (possible values: 0, 1)z--non-exclusive exclusive store_falsez disable locking for native portsT)destrrrz--askz"ask again for port when open failsz data handlingz-ez--echozenable local echo (default off)z --encodingserial_port_encodingCODECzXset the encoding for the serial port (e.g. hexlify, Latin1, UTF-8), default: %(default)srZ)rmetavarrrz-fz--filterrNAMEzadd text transformation)rrrrz--eol)rrrcSrr/rrr r r r rzend of line moderz--rawz)Do no apply any encodings/transformationshotkeysz --exit-charNUMzWUnicode of special character that is used to exit the application, default: %(default)sr)rrrrz --menu-charz_Unicode code of special character that is used to control miniterm (menu), default: %(default)sr diagnosticsz-qz--quietzsuppress non-error messagesz --developzshow Python traceback on errorz.--exit-char can not be the same as --menu-charrzAvailable filters: rcsr)z{:<10} = {.__doc__}Nrrr r r rrzmain..rr-z"user aborted and port is not givenzport is not given)rnr<r;rrz--- forcing DTR {} r.r/z--- forcing RTS {} zcould not open port {!r}: {} )rrrzP--- Miniterm on {p.name} {p.baudrate},{p.bytesize},{p.parity},{p.stopbits} --- r,z6--- Quit: {} | Menu: {} | Help: {} followed by {} --- z --- exit --- )6argparseArgumentParser add_argumentrhadd_argument_group parse_args menu_char exit_charerrorrrryr'rrrrrrrrDrrrrnr<r;rmtimeoutr4quietrr3 isinstanceSerialrr{r:developaskrrrrrrrrr'rr+rrr) default_portdefault_baudrate default_rts default_dtrrparsergroupr1rrrminitermr r r main-s                    0        r__main__)NrNN). __future__rrvr>rr rserial.tools.list_portsr serial.toolsrrr NameErrorinputchrrrobjectrr rr]rfr;r@rrrNotImplementedErrorrrrrrrrrrrrrrrrr5r r r r sz     - T     , e