
    ,_Г                        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mZ d dl	m
Z
  ej                  d        	 e d Z G d de      Zej(                  d	k(  r#d dlZd dlZd dlZ G d
 de      Z G d de      ZnHej(                  dk(  rd dlZd dlZd dlZ G d de      Zn! edj=                  ej.                               G d de      Z G d de      Z  G d de      Z! G d de      Z" G d de      Z# G d de#      Z$ G d de      Z% G d d e      Z& G d! d"e      Z'e e!e"d#Z(ee#e$e%e&e'd$Z)d% Z* G d& d'e      Z+d*d(Z,e-d)k(  r e,        yy# e$ r eZeZY &w xY w)+    )absolute_importN)comports)hexlify_codecc                 8    | dk(  rt        j                         S d S )Nhexlify)r   getregentrycs    7/usr/lib/python3/dist-packages/serial/tools/miniterm.py<lambda>r      s    i-335 T     c                 r    t        |       }|dk  rdj                  t        d      |z         S t        |       S )z)generate a readable description for a key    z	Ctrl+{:c}@)ordformatrepr)	character
ascii_codes     r   key_descriptionr   !   s6    YJB!!#c(Z"788Ir   c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)ConsoleBasez8OS abstraction for console (input/output codec, no echo)c                     t         j                  dk\  r t         j                  j                  | _        nt         j                  | _        t         j                  | _        y N)   r   )sysversion_infostdoutbufferbyte_outputoutputselfs    r   __init__zConsoleBase.__init__.   s9    v%"zz00D"zzDjjr   c                      y)z.Set console to read single characters, no echoN r"   s    r   setupzConsoleBase.setup5       r   c                      y)z Restore default console settingsNr&   r"   s    r   cleanupzConsoleBase.cleanup8   r(   r   c                      y)z"Read a single key from the consoleNr&   r"   s    r   getkeyzConsoleBase.getkey;   s    r   c                 n    | j                   j                  |       | j                   j                          y)zWrite bytes (already encoded)N)r    writeflush)r#   byte_strings     r   write_byteszConsoleBase.write_bytes?   s(    {+ r   c                 n    | j                   j                  |       | j                   j                          y)zWrite stringN)r!   r.   r/   r#   texts     r   r.   zConsoleBase.writeD   s$    $r   c                      y)zCancel getkey operationNr&   r"   s    r   cancelzConsoleBase.cancelI   r(   r   c                 &    | j                          | S N)r*   r"   s    r   	__enter__zConsoleBase.__enter__P   s    r   c                 $    | j                          y r8   )r'   )r#   argskwargss      r   __exit__zConsoleBase.__exit__T   s    

r   N)__name__
__module____qualname____doc__r$   r'   r*   r,   r1   r.   r6   r9   r=   r&   r   r   r   r   +   s2    B!=/!

&r   r   ntc                   "    e Zd ZdZd Zd Zd Zy)Outz$file-like wrapper that uses os.writec                     || _         y r8   )fd)r#   rF   s     r   r$   zOut.__init__`   s	    DGr   c                      y r8   r&   r"   s    r   r/   z	Out.flushc   s    r   c                 D    t        j                  | j                  |       y r8   )osr.   rF   )r#   ss     r   r.   z	Out.writef   s    HHTWWa r   N)r>   r?   r@   rA   r$   r/   r.   r&   r   r   rD   rD   ]   s    2			!r   rD   c                   d     e Zd Zddddddddd	d
d
Zddddddddddd
Z fdZd Zd Zd Z xZ	S )ConsolezbOPzbOQzbORzbOSzb[15~zb[17~zb[18~zb[19~zb[20~zb[21~)
;<=>?r   ABCDz[Az[Bz[Dz[Cz[Hz[Fz[2~z[3~z[5~z[6~)
HPKMGORSIQc                    t         t        |           t        j                  j
                  j                         | _        t        j                  j
                  j                         | _	        t        j                  j
                  j                  d       t        j                  j
                  j                  d       t        j                         dk(  r>t        t        j                         j!                  d      d         dkD  rd}dd lm} t'        |d      s$t        j(                  |j*                        |_        t        j                  j
                  j.                  }t        j                  j
                  j0                  }t        j                  j
                  j2                  }|j+                         } | |d	      t        j4                  |             |j6                  |z  dk(  r# | |d	      |j6                  |z         || _         t;        j<                  d
      t?        t@        jB                  jE                               d      | _#         t;        j<                  d
      t?        t@        jH                  jE                               d      t@        _$        | jF                  t@        _!        d
| jF                  _%        y )Ni  10.   iZ)     r   LPDWORDUTF-8replace)&superrL   r$   ctypeswindllkernel32GetConsoleOutputCP
_saved_ocpGetConsoleCP
_saved_icpSetConsoleOutputCPSetConsoleCPplatformreleaseintversionsplitctypes.wintypeswintypeshasattrPOINTERDWORDre   SetConsoleModeGetConsoleModeGetStdHandlebyrefvalue	_saved_cmcodecs	getwriterrD   r   r   filenor!   stderrencoding)r#   "ENABLE_VIRTUAL_TERMINAL_PROCESSINGry   r}   r~   r   mode	__class__s          r   r$   zConsole.__init__   s   '4)+$mm44GGIDO$mm44AACDOMM""55e<MM""//6 !T)c(2B2B2D2J2J32OPQ2R.SV[.[5;22x3'-~~hnn'EH$!'!7!7!F!F!'!7!7!F!F%}}55BB~~'|C0&,,t2DEJJ!CCI"<#4djjCe6ef%)DN3&**73C

8I8I8K4LiXDK2))'23szz7H7H7J3KYWCJCJ#*DKK r   c                    t         j                  j                  j                  | j                         t         j                  j                  j                  | j                         	 t         j                  j                  j                  t         j                  j                  j                  d      | j                         y # t        $ r Y y w xY w)Nrf   )rj   rk   rl   rq   rn   rr   rp   r}   r   r   AttributeErrorr"   s    r   __del__zConsole.__del__   s    MM""55dooFMM""//@&&55fmm6L6L6Y6YZ]6^`d`n`no! s   (AC 	CCc                 6   	 t        j                         }|t        d      k(  rt        d      S |t        d      u s|t        d      u r@	 t        j                         }|t        d      u r| j                  |   S | j                  |   S |S # t
        $ r Y nw xY w)N   
   r      )msvcrtgetwchunichrfncodesnavcodesKeyError)r#   zcodes      r   r,   zConsole.getkey   s    MMOr
?!":%&)^qF4L'8%}}q	>#'<<#55#'==#66 H $  s   
/B :B 	BBc                     t         j                  j                  j                         }t         j                  j                  j                  |ddd       y )N   r   r   )rj   rk   rl   GetConsoleWindowuser32PostMessageA)r#   hwnds     r   r6   zConsole.cancel   s:     ==))::<DMM  --dE4Cr   )
r>   r?   r@   r   r   r$   r   r,   r6   __classcell__r   s   @r   rL   rL   i   sd    
 
	+6		"	Dr   rL   posixc                   6     e Zd Z fdZd Zd Zd Zd Z xZS )rL   c                    t         t        |           t        j                  j                         | _        t        j                  | j                        | _	        t        j                  | j                         t        j                  dk  rG t        j                  t        j                  j                         t        j                        | _        y t        j                  | _        y r   )ri   rL   r$   r   stdinr   rF   termios	tcgetattroldatexitregisterr*   r   r   	getreaderr   	enc_stdin)r#   r   s    r   r$   zConsole.__init__   s    '4)+ii&&(DG((1DHOODLL)&(!E!1!1#))2D2D!Ecii!P!$r   c                 t   t        j                  | j                        }|d   t         j                   z  t         j                   z  t         j
                   z  |d<   d|d   t         j                  <   d|d   t         j                  <   t        j                  | j                  t         j                  |       y )Nr         r   )
r   r   rF   ICANONECHOISIGVMINVTIME	tcsetattrTCSANOW)r#   news     r   r'   zConsole.setup   s    ##DGG,CVw~~o-=MCF#$CF7<< $%CF7==!dggw<r   c                 n    | j                   j                  d      }|t        d      k(  rt        d      }|S )Nr         )r   readr   )r#   r
   s     r   r,   zConsole.getkey   s0    ##A&AF4L 1IHr   c                 b    t        j                  | j                  t        j                  d       y )N    )fcntlioctlrF   r   TIOCSTIr"   s    r   r6   zConsole.cancel   s    KK%8r   c                 v    t        j                  | j                  t         j                  | j                         y r8   )r   r   rF   	TCSAFLUSHr   r"   s    r   r*   zConsole.cleanup   s"    dggw'8'8$((Cr   )	r>   r?   r@   r$   r'   r,   r6   r*   r   r   s   @r   rL   rL      s    	+	=		9	Dr   z9Sorry no implementation for your platform ({}) available.c                   "    e Zd ZdZd Zd Zd Zy)	Transformz&do-nothing: forward all data unchangedc                     |S )ztext received from serial portr&   r3   s     r   rxzTransform.rx       r   c                     |S )ztext to be sent to serial portr&   r3   s     r   txzTransform.tx   r   r   c                     |S )z(text to be sent but displayed on consoler&   r3   s     r   echozTransform.echo   r   r   N)r>   r?   r@   rA   r   r   r   r&   r   r   r   r      s    0r   r   c                       e Zd ZdZd Zy)CRLFzENTER sends CR+LFc                 &    |j                  dd      S )N

rh   r3   s     r   r   zCRLF.tx   s    ||D&))r   N)r>   r?   r@   rA   r   r&   r   r   r   r      s
    *r   r   c                       e Zd ZdZd Zd Zy)CRzENTER sends CRc                 &    |j                  dd      S )Nr   r   r3   s     r   r   zCR.rx       ||D$''r   c                 &    |j                  dd      S )Nr   r   r   r3   s     r   r   zCR.tx  r   r   Nr>   r?   r@   rA   r   r   r&   r   r   r   r      s    ((r   r   c                       e Zd ZdZy)LFzENTER sends LFN)r>   r?   r@   rA   r&   r   r   r   r     s    r   r   c                   l    e Zd ZdZ ed  ed      D              Zej                  ddd       d ZeZ	y)	
NoTerminalz0remove typical terminal control codes from inputc              #   F   K   | ]  }t        |      d vs|d|z   f  yw)
	 $  N)r   .0xs     r   	<genexpr>zNoTerminal.<genexpr>  s$     ]qR\A\Avz?]s   !!r   !$  %$  )r      c                 8    |j                  | j                        S r8   )	translateREPLACEMENT_MAPr3   s     r   r   zNoTerminal.rx  s    ~~d2233r   N)
r>   r?   r@   rA   dictranger   updater   r   r&   r   r   r   r     s>    :]E"I]]O	
4 Dr   r   c                   d    e Zd ZdZ ed  ed      D              Zej                  dddd       y)	
NoControlsz%Remove all control codes, incl. CR+LFc              #   *   K   | ]  }|d |z   f  yw)r   Nr&   r   s     r   r   zNoControls.<genexpr>  s     >qAvz?>s   r   i#$  r   r   )r   r   r   N)r>   r?   r@   rA   r   r   r   r   r&   r   r   r   r     s5    />E"I>>O	
r   r   c                       e Zd ZdZd ZeZy)	PrintablezMShow decimal code for all non-ASCII characters and replace most control codesc           	      V   g }|D ]  }d|cxk  rdk  sn |dv r|j                  |       &|dk  r'|j                  t        dt        |      z                R|j                  d dj	                  t        |            D               |j                  d        dj                  |      S )N r   r   c              3   P   K   | ]  }t        d t        |      z   dz
           yw)i   0   N)r   r   )r   ds     r   r   zPrintable.rx.<locals>.<genexpr>2  s"     U!Q" 45Us   $&z{:d} )appendr   r   extendr   join)r#   r4   rr
   s       r   r   zPrintable.rx*  s     	Aa & AOSQ01Uv}}SQRV?TUU	 wwqzr   N)r>   r?   r@   rA   r   r   r&   r   r   r   r   '  s    W
 Dr   r   c                   "    e Zd ZdZd Zd Zd Zy)Colorizez,Apply different colors for received and echoc                      d| _         d| _        y )Nz[37mz[31m)input_color
echo_colorr"   s    r   r$   zColorize.__init__<  s    %$r   c                      | j                   |z   S r8   )r   r3   s     r   r   zColorize.rxA  s    $&&r   c                      | j                   |z   S r8   )r  r3   s     r   r   zColorize.echoD  s    %%r   N)r>   r?   r@   rA   r$   r   r   r&   r   r   r   r   9  s    6%
'&r   r   c                       e Zd ZdZd Zd Zy)DebugIOzPrint what is sent and receivedc                     t         j                  j                  dj                  |             t         j                  j	                          |S )Nz [RX:{!r}] r   r   r.   r   r/   r3   s     r   r   z
DebugIO.rxK  4    

--d34

r   c                     t         j                  j                  dj                  |             t         j                  j	                          |S )Nz [TX:{!r}] r  r3   s     r   r   z
DebugIO.txP  r  r   Nr   r&   r   r   r  r  H  s    )
r   r  )crlfcrlf)directdefault	nocontrol	printablecolorizedebugc                     t         j                  j                  d       g } t        t	        t                     d      D ]J  \  }\  }}}t         j                  j                  dj                  |||             | j                  |       L 	 t        d      }	 t        |      dz
  }d|cxk  rt        |       k  s"n t         j                  j                  d       Q	 | |   }|S # t        $ r Y |S w xY w)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:
r   z--- {:2}: {:20} {!r}
z#--- Enter port index or full name: r   z--- Invalid index!
)r   r   r.   	enumeratesortedr   r   r   	raw_inputru   len
ValueError)portsnportdeschwidindexs         r   ask_for_portr  k  s     JJ/0E!*6(*+=q!A D$

188D$GHT >?	 IME*E
*

  !78 + <D	  	 		s   AC% %	C21C2c                       e Zd ZdZddZd Zd Zd Zd ZddZ	d Z
d	 Zdd
ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)Minitermz    Terminal application. Copy data from serial port to console and vice versa.
    Handle special keys from the console to show menu etc.
    c                 *   t               | _        || _        || _        d| _        d| _        d| _        || _        || _        | j                          t        d      | _        t        d      | _        d | _        d | _        d | _        d | _        d | _        y )NFrg         )rL   consoleserialr   rawinput_encodingoutput_encodingeolfiltersupdate_transformationsr   exit_charactermenu_characteralive_reader_alivereceiver_thread
rx_decoder
tx_decoder)r#   serial_instancer   r*  r+  s        r   r$   zMiniterm.__init__  s    y%	%&##%$Tl$Tl
!#r   c                     d| _         t        j                  | j                  d      | _        d| j                  _        | j                  j                          y)zStart reader threadTr   targetnameN)r0  	threadingThreadreaderr1  daemonstartr"   s    r   _start_readerzMiniterm._start_reader  sC    !(//t{{N&*#""$r   c                     d| _         t        | j                  d      r| j                  j                          | j                  j                          y)z6Stop reader thread only, wait for clean exit of threadFcancel_readN)r0  rz   r&  r@  r1  r   r"   s    r   _stop_readerzMiniterm._stop_reader  s:    "4;;.KK##%!!#r   c                    d| _         | j                          t        j                  | j                  d      | _        d| j
                  _        | j
                  j                          | j                  j                          y)zstart worker threadsTr   r6  N)
r/  r>  r9  r:  writertransmitter_threadr<  r=  r%  r'   r"   s    r   r=  zMiniterm.start  s^    
"+"2"2$++D"Q)-&%%'r   c                     d| _         y)zset flag to stop worker threadsFN)r/  r"   s    r   stopzMiniterm.stop  s	    
r   c                     | j                   j                          |sKt        | j                  d      r| j                  j	                          | j
                  j                          yy)z$wait for worker threads to terminater@  N)rD  r   rz   r&  r@  r1  )r#   transmit_onlys     r   r   zMiniterm.join  sL    $$&t{{M2'')  %%' r   c                 8    | j                   j                          y r8   )r&  closer"   s    r   rJ  zMiniterm.close  s    r   c                     t         | j                     g| j                  D cg c]  }t        |    c}z   }|D cg c]	  } |        c}| _        t        t        | j                              | _        yc c}w c c}w )zFtake list of transformation classes and instantiate them for rx and txN)EOL_TRANSFORMATIONSr*  r+  TRANSFORMATIONStx_transformationslistreversedrx_transformations)r#   ftransformationsts       r   r,  zMiniterm.update_transformations  sq    .txx89FJll=TAB >MQ=O =T T0?"@113"@"&x0G0G'H"I=T"@s
   A5A:c                 R    || _          t        j                  |      |      | _        y)zset encoding for received dataN)r(  r   getincrementaldecoderr2  r#   r   errorss      r   set_rx_encodingzMiniterm.set_rx_encoding  s#    &@&66x@Hr   c                 R    || _          t        j                  |      |      | _        y)z!set encoding for transmitted dataN)r)  r   getincrementalencoder
tx_encoderrW  s      r   set_tx_encodingzMiniterm.set_tx_encoding  s#    '@&66x@Hr   c                    t         j                  j                  dj                  | j                               t         j                  j                  dj                  | j                  j
                  rdnd| j                  j                  rdnd| j                  j                  rdnd             	 t         j                  j                  dj                  | j                  j                  rdnd| j                  j                  rdnd| j                  j                  rdnd| j                  j                  rdnd             t         j                  j                  dj                  | j                  j                  rdnd             t         j                  j                  dj                  | j                  j                  rdnd             t         j                  j                  d	j                  | j                               t         j                  j                  d
j                  | j                                t         j                  j                  dj                  | j"                  j%                                      t         j                  j                  dj                  dj'                  | j(                                     y# t        j                  $ r Y w xY w)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}
activeinactivez---- 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: {}
r   N)r   r   r.   r   r&  rtsdtrbreak_conditionctsdsrricdSerialExceptionxonxoffrtsctsr(  r)  r*  upperr   r+  r"   s    r   dump_port_settingszMiniterm.dump_port_settings  s   

hookk p  	

BIIXjXj44X*G 	H		JJMTT![[__*![[__*![[^^![[^^	> ? 	

:AAdkkNaNa(gqrs

:AAdkkN`N`(fpqr

:AA$BUBUVW

;BB4CWCWXY

//0@AB

,33CHHT\\4JKL %% 	 	s   3BK K%$K%c                 J   	 | j                   r| j                  r| j                  j                  | j                  j                  xs d      }|r| j
                  r| j                  j                  |       nX| j                  j                  |      }| j                  D ]  }|j                  |      } | j                  j                  |       | j                   r| j                  ryyyy# t        j                  $ r# d| _         | j                  j                           w xY w)zloop and copy serial->consoler   FN)r/  r0  r&  r   
in_waitingr'  r%  r1   r2  decoderQ  r   r.   rm  r6   )r#   datar4   transformations       r   r;  zMiniterm.reader  s    	**!3!3{{''(>(>(C!Dxx006#55d;.2.E.E ;N#1#4#4T#:D;**40 **!3!3*!3* %% 	DJLL!	s   C%C, ,6D"c                    d}	 | j                   r"	 | j                  j                         }| j                   sy|r| j	                  |       d}n|| j
                  k(  rd}n|| j                  k(  r| j                          y|}| j                  D ]  }|j                  |      } | j                  j                  | j                  j                  |             | j                  r?|}| j                  D ]  }|j                  |      } | j                  j                  |       | j                   r!yy# t        $ r d}Y w xY w#  d| _          xY w)z        Loop and copy console->serial until self.exit_character character is
        found. When self.menu_character is found, interpret the next key
        locally.
        FTN)r/  r%  r,   KeyboardInterrupthandle_menu_keyr.  r-  rF  rN  r   r&  r.   r\  encoder   )r#   menu_activer
   r4   rv  	echo_texts         r   rC  zMiniterm.writer  s<    	**++-A zz((+"'K$---"&K$---IIK D*.*A*A 7-0067KK%%doo&<&<T&BCyy$%	.2.E.E GN(6(;(;I(FIG**953 ** ) A.	DJs:   E D4 E AE B/E 4E?E EE 
Ec                    || j                   k(  s|| j                  k(  r]| j                  j                  | j                  j                  |             | j                  r| j                  j                  |       y'y'|dk(  r| j                          y'|dv r.t        j                  j                  | j                                y'|dk(  rv| j                  j                   | j                  _        t        j                  j                  dj                  | j                  j                  rd             y'd             y'|dk(  rv| j                  j                   | j                  _        t        j                  j                  dj                  | j                  j                  rd             y'd             y'|d	k(  rv| j                  j                   | j                  _        t        j                  j                  d
j                  | j                  j                  rd             y'd             y'|dk(  rX| j                   | _        t        j                  j                  dj                  | j                  rd             y'd             y'|dk(  r| j!                          y'|dk(  rt#        t$              }|j'                  | j(                        dz   }|t+        |      k\  rd}||   | _        t        j                  j                  dj                  | j(                  j-                                      | j/                          y'|dk(  r| j1                          y'|dk(  r| j3                          y'|dv r| j5                          y'|dv r| j7                          y'|dv r| j9                          y'|dk(  r0t        j:                  | j                  _        | j3                          y'|dk(  r0t        j>                  | j                  _        | j3                          y'|dv r0t        j@                  | j                  _!        | j3                          y'|dv r0t        jD                  | j                  _!        | j3                          y'|dv r0t        jF                  | j                  _!        | j3                          y'|dv r0t        jH                  | j                  _!        | j3                          y'|dv r0t        jJ                  | j                  _!        | j3                          y'|dk(  r0t        jL                  | j                  _'        | j3                          y'|dk(  r0t        jP                  | j                  _'        | j3                          y'|d k(  r0t        jR                  | j                  _'        | j3                          y'|d!v r%|d"k(  | j                  _*        | j3                          y'|d#v r%|d$k(  | j                  _+        | j3                          y'|d%v r| jY                          y't        j                  j                  d&j                  t[        |                   y')(z"Implement a simple menu / settingszhH?z--- RTS {} ---
ra  rb  z--- DTR {} ---
z--- BREAK {} ---
z--- local echo {} ---
r   r   z--- EOL: {} ---
	pPzZbB87eEoOmMsSnN123xXXrRr\   qQz!--- unknown menu character {} --
N).r.  r-  r&  r.   r\  r{  r   r%  upload_filer   r   get_help_textrf  r   rg  rh  change_filterrO  rL  r  r*  r  rp  r,  change_encodingrq  change_portsuspend_portchange_baudrate	EIGHTBITSbytesize	SEVENBITSPARITY_EVENparity
PARITY_ODDPARITY_MARKPARITY_SPACEPARITY_NONESTOPBITS_ONEstopbitsSTOPBITS_TWOSTOPBITS_ONE_POINT_FIVErn  ro  rF  r   )r#   r
   modesr*  s       r   rz  zMiniterm.handle_menu_key'  s   ###qD,?,?'?KKdoo44Q78yy""1% &[)^JJT//12&["&++//1DKKOJJ/664;;??xcdXbcd&["&++//1DKKOJJ/664;;??xcdXbcd&[.2kk.I.I*IDKK'JJ188T[[E`E`qrfpqr&[ IIDIJJ6==$))hdeYcde&[ &[,-E++dhh'!+Cc%j SzDHJJ0778HIJ'')&[  "&[##% $Y$Y$Y  "#X#)#3#3DKK ##%#X#)#3#3DKK ##%$Y!'!3!3DKK##%$Y!'!2!2DKK##%$Y!'!3!3DKK##%$Y!'!4!4DKK##%$Y!'!3!3DKK##%#X#)#6#6DKK ##%#X#)#6#6DKK ##%#X#)#A#ADKK ##%$Y#$8DKK##%$Y"#s(DKK##%$YIIKJJAHHYZI[\]r   c                 z   t         j                  j                  d       t         j                  j                          | j                  5  t         j
                  j                         j                  d      }|r	 t        |d      5 }t         j                  j                  dj                  |             	 |j                  d      }|snU| j                  j                  |       | j                  j                          t         j                  j                  d       i	 ddd       t         j                  j                  dj                  |             ddd       y# 1 sw Y   @xY w# t        $ r9}t         j                  j                  d	j                  ||             Y d}~Rd}~ww xY w# 1 sw Y   yxY w)
z,Ask user for filenname and send its contentsz
--- File to upload: r   rbz--- Sending file {} ---
i   rb   Nz
--- File {} sent ---
z"--- ERROR opening file {}: {} ---
)r   r   r.   r/   r%  r   readlinerstripopenr   r   r&  IOError)r#   filenamerR  blockes        r   r  zMiniterm.upload_file}  s\   

12

\\ 	`yy))+226:H`h- 	2

(()D)K)KH)UV"$%FF4LE#( % KK--e4 KK--/JJ,,S1 # !&	2 JJ$$%?%F%Fx%PQ	` 	`	2 	2  `JJ$$%J%Q%QRZ\]%^__`	` 	`sI   
0F1;E,BE !6E, E)	%E,,	F.5/F)$F1)F..F11F:c           	      d   t         j                  j                  d       t         j                  j                  dj                  d t	        t
        j                               D                     t         j                  j                  dj                  dj                  | j                                     | j                  5  t         j                  j                         j                         j                         }ddd       rV|D ]:  }|t
        vst         j                  j                  dj                  |              n || _        | j                          t         j                  j                  dj                  dj                  | j                                     y# 1 sw Y   xY w)	zchange the i/o transformationsz
--- Available Filters:
r   c              3   F   K   | ]  \  }}d j                  ||        yw)z---   {:<10} = {.__doc__}Nr   r   kvs      r   r   z)Miniterm.change_filter.<locals>.<genexpr>  s)      #91 (..q!4#9   !z$
--- Enter new filter name(s) [{}]: r   Nz--- unknown filter: {!r}
re  )r   r   r.   r   r  rM  itemsr   r+  r%  r   r  lowerrw   r,  )r#   new_filtersrR  s      r   r  zMiniterm.change_filter  s8   

56

 #94467#9 9 	: 	

@GGQUQ]Q]H^_`\\ 	?)),,.446<<>K	?  .O+JJ$$%A%H%H%KL.
  +++-

,33CHHT\\4JKL	? 	?s   ;F&&F/c                    t         j                  j                  dj                  | j                               | j
                  5  t         j                  j                         j                         }ddd       r8	 t        j                  |       | j                  |       | j                  |       t         j                  j                  dj                  | j                               t         j                  j                  dj                  | j                               y# 1 sw Y   xY w# t        $ r1 t         j                  j                  dj                  |             Y w xY w)z"change encoding on the serial portz#
--- Enter new encoding name [{}]: Nz--- invalid encoding name: {}
rc  rd  )r   r   r.   r   r(  r%  r   r  stripr   lookuprY  r]  LookupErrorr)  )r#   new_encodings     r   r  zMiniterm.change_encoding  s   

?FFtGZGZ[\\\ 	899--/557L	83l+ $$\2$$\2

:AA$BUBUVW

;BB4CWCWXY	8 	8
  Y

  !B!I!I,!WXYs   -D%=D1 %D.17E+*E+c                 @   t         j                  j                  d       t         j                  j                          | j                  5  | j
                  j                  }	 t        t         j                  j                         j                               | j
                  _        | j                          ddd       y# t        $ rI}t         j                  j                  dj                  |             || j
                  _        Y d}~Vd}~ww xY w# 1 sw Y   yxY w)zchange the baudratez
--- Baudrate: z#--- ERROR setting baudrate: {} ---
N)r   r   r.   r/   r%  r&  baudrateru   r   r  r  rq  r  r   )r#   backupr  s      r   r  zMiniterm.change_baudrate  s    

+,

\\ 	*[[))F*'*399+=+=+?+E+E+G'H$
 '')	* 	*  .

  !G!N!Nq!QR'-$$.		* 	*s7   
D"AB?&D?	D?DDDDDc                    | j                   5  	 t               }ddd       rC|| j                  j                  k7  r(| j                          | j                  j                         }	 t        j                  |d      }|j                  |       | j                  j                  |_	        | j                  j                  |_
        |j                          | j                  j                  |_        | j                  j                          || _        t        j                  j!                  dj#                  | j                  j                               | j'                          yyy# t        $ r d}Y ]w xY w# 1 sw Y   cxY w# t$        $ rH}t        j                  j!                  dj#                  |             j                          Y d}~~d}~ww xY w)z;Have a conversation with the user to change the serial portNT)do_not_openz--- Port changed to: {} ---
z#--- ERROR opening new port: {} ---
)r%  r  ry  r&  r  rA  getSettingsDictserial_for_urlapplySettingsDictrf  rg  r  rh  rJ  r   r   r.   r   	Exceptionr>  )r#   r  settings
new_serialr  s        r   r  zMiniterm.change_port  sf   \\ 	#~	
 DDKK,,,{{224H[#224TJ
,,X6!%
!%
!-1[[-H-H
*
 !!#(

  !@!G!GHXHX!YZ + -4 % 	 	$  #

  !G!N!Nq!QR  ""#sA   E:
E()B	F (E73E:6E77E::F	G>GGc                    | j                          | j                  j                          t        j                  j                  dj                  | j                  j                               d}| j                  j                  st        j                  j                  dj                  t        | j                                     | j                  j                         }|| j                  k(  r| j                          n9|dv rd}n2	 | j                  j                          | j                  j                  s|r| j!                          y| j#                          t        j                  j                  d	j                  | j                  j                               y# t        $ r8}t        j                  j                  dj                  |             Y d}~d}~ww xY w)
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 ---
)exitr  Tz--- ERROR opening port: {} ---
Nz--- Port opened: {} ---
)rA  r&  rJ  r   r   r.   r   r  is_openr   r-  r%  r,   rF  r  r  r  r>  )r#   do_change_portr  r  s       r   r  zMiniterm.suspend_port  sj    	

6==dkk>N>NOP++%%JJcjj$T%8%89 k ; <##%AD'''		d!%O  " ++%%   JJ8??@P@PQR  O

  !C!J!J1!MNNOs   	F   	G!).GG!c                 H   dj                  t        t        dd      t        | j                        t        | j
                        t        d      t        d      t        d      t        d      t        d      t        d	      t        d
      t        d      t        d            S )zreturn 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
VERSIONzunknown versionr  r  r  r  r  r  r  r  r  )rv   r  menurf  rg  brkr   infouploadr   filterr*  )r   getattrr&  r   r-  r.  r"   s    r   r  zMiniterm.get_help_text  s    0 F769.?@ 3 34 3 34v&v&v&''!&)'!&)v&  (1#	(r   N)Fr
  r&   )Fr   )r>   r?   r@   rA   r$   r>  rA  r=  rF  r   rJ  r,  rY  r]  rq  r;  rC  rz  r  r  r  r  r  r  r  r&   r   r   r!  r!    s|    
$%$(JI
I
M2&$LT^l`,M&Z *!<S>&(r   r!  c           
         ddl }|j                  d      }|j                  ddd|        |j                  d	dt        d
|       |j	                  d      }|j                  dg dd dd       |j                  dddd       |j                  dddd       |j                  dt        d|       |j                  dt        d|       |j                  dd d!d"d#$       |j                  d%dd&d       |j	                  d'      }|j                  d(d)dd*d       |j                  d+d,d-d.d/0       |j                  d1d2d3d4d5g 6       |j                  d7g d8d9 d:d;       |j                  d<dd=d       |j	                  d>      }|j                  d?t        d@dAdBC       |j                  dDt        d@dEdFC       |j	                  dG      }|j                  dHdIddJd       |j                  dKddLd       |j                         }|j                  |j                  k(  r|j                  dM       |j                  rdN|j                  v rt        j                  j                  dO       t        j                  j                  dPj                  dQ t        t        j!                               D                     t        j                  j                  dP       t        j"                  dR       |j                  }ndSg}	 |j$                  |j$                  dTk(  r.	 t'               |_        |j$                  s|j                  dU       	 	 t+        j,                  |j$                  |j.                  |j0                  |j2                  |j4                  d#W      }	t7        |	dX      sdR|	_        |j:                  Y|j<                  s<t        j                  j                  dYj?                  |j:                  rdZnd[             |j:                  |	_        |j@                  Y|j<                  s<t        j                  j                  d\j?                  |j@                  rdZnd[             |j@                  |	_         tC        |	t*        jD                        r|jF                  |	_#        |	jI                          	 tQ        |	|jR                  |jT                  jW                         |^      }tY        |j                        |_-        tY        |j                        |_.        |j^                  |_/        |ja                  |jb                         |je                  |jb                         |j<                  st        j                  j                  d_j?                  |j*                  `             t        j                  j                  daj?                  tg        |jZ                        tg        |j\                        tg        |j\                        tg        db                   |ji                          	 |j                  d#       |j<                  st        j                  j                  dc       |j                          |jk                          y# t(        $ r4 t        j                  j                  dP       |j                  dV       Y uw xY w# t*        jJ                  $ ry}
t        j                  j                  d]j?                  |j$                  |
             |jL                  r |jN                  st        j"                  dR       ndT|_        Y d}
~
nd}
~
ww xY wS# t(        $ r Y )w xY w)dzCommand line tool, entry pointr   Nz9Miniterm - A simple terminal program for the serial port.)descriptionr  rQ   z(serial port name ("-" to show port list))nargshelpr  r  z#set baud rate, default: %(default)s)r  typer  r  zport settingsz--parity)NEr[   r]   rY   c                 "    | j                         S r8   rp  r	   s    r   r   zmain.<locals>.<lambda>G      qwwy r   z*set parity, one of {N E O S M}, default: Nr  )choicesr  r  r  z--rtscts
store_truez)enable RTS/CTS flow control (default off)F)actionr  r  z	--xonxoffz*enable software flow control (default off)z--rtsz2set initial RTS line state (possible values: 0, 1))r  r  r  z--dtrz2set initial DTR line state (possible values: 0, 1)z--non-exclusive	exclusivestore_falsez disable locking for native portsT)destr  r  r  z--askz"ask again for port when open failszdata handlingz-ez--echozenable local echo (default off)z
--encodingserial_port_encodingCODECzXset the encoding for the serial port (e.g. hexlify, Latin1, UTF-8), default: %(default)srg   )r  metavarr  r  z-fz--filterr   NAMEzadd text transformation)r  r  r  r  z--eol)r   r   r   c                 "    | j                         S r8   r  r	   s    r   r   zmain.<locals>.<lambda>  r  r   zend of line moder   z--rawz)Do no apply any encodings/transformationshotkeysz--exit-charNUMzWUnicode of special character that is used to exit the application, default: %(default)sr#  )r  r  r  r  z--menu-charz_Unicode code of special character that is used to control miniterm (menu), default: %(default)sr$  diagnosticsz-qz--quietzsuppress non-error messagesz	--developzshow Python traceback on errorz.--exit-char can not be the same as --menu-charr  zAvailable filters:
r   c              3   F   K   | ]  \  }}d j                  ||        yw)z{:<10} = {.__doc__}Nr  r  s      r   r   zmain.<locals>.<genexpr>  s)      '=Aq &,,Q2'=r  r   r  -zport is not givenz"user aborted and port is not given)r  ro  rn  r  r@  z--- forcing DTR {}
ra  rb  z--- forcing RTS {}
zcould not open port {!r}: {}
)r   r*  r+  zP--- Miniterm on {p.name}  {p.baudrate},{p.bytesize},{p.parity},{p.stopbits} ---
r_  z6--- Quit: {} | Menu: {} | Help: {} followed by {} ---
z
--- exit ---
)6argparseArgumentParseradd_argumentru   add_argument_group
parse_args	menu_char	exit_charerrorr  r   r   r.   r   r  rM  r  r  r  r  ry  r&  r  r  r  ro  rn  rz   timeoutrg  quietr   rf  
isinstanceSerialr  r  rm  developaskr!  r   r*  r  r   r-  r.  r'  rY  r  r]  r   r=  rJ  )default_portdefault_baudratedefault_rtsdefault_dtrr  parsergroupr;   r+  r4  r  miniterms               r   mainr  -  s    $$O % QF 7	   2   " %%o6E	) 9   
8	   
9	   
A	   
A	   
/   
1	   %%o6E	h.	   
#g   
j&   
$    
8	   %%i0E	f   
n   %%m4E	i*	   
-	   D~~'EF{{T[[ JJ34JJTYY '="?#8#8#:;'= = > JJT"HHQK+++
99		S 06(N	
 yyLL!45#	$33		{{{{ "O ?M:*+'xx#zzJJ$$%;%B%Btxx8]g%hi&*hh#xx#zzJJ$$%;%B%Btxx8]g%hi&*hh#/6==9,0NN)  " YYHHNN	H
 %T^^4H$T^^4H88HLT667T667::

lssoo t  	 

RYYH334H334H334F#	% 	& NNd ::

+,MMONNO % C

  &ABC@ %% 	 JJ=DDTYYPQRS||88		 K N  s>   Z E%[ '] 9[ []A/]]	]"!]"__main__)Ni%  NN).
__future__r   r   rI   r   r9  r&  serial.tools.list_portsr   serial.toolsr   r   r  	NameErrorinputchrr   r   objectr   r8  r   rj   rs   rD   rL   r   r   r   NotImplementedErrorr   r   r   r   r   r   r   r   r   r  rL  rM  r  r!  r  r>   r&   r   r   <module>r     s   '  	 
   , & Q R*& *Z 77d?
!f 
!RD+ RDh WWD+ D> CJJ3<<XZ Z *9 *( (   	 		 $&y &i & 

  2c(v c(RaH zF m  IFs   E 	E$#E$