
    #)diГ                        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 n# e$ r eZeZY nw xY w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nIej        dk    rd dlZd dlZd dlZ G d de          Zn# ed                    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,             dS dS ),    )absolute_importN)comports)hexlify_codecc                 8    | dk    rt          j                    nd S )Nhexlify)r   getregentrycs    \/var/www/menimich/repos/protonApp/venv/lib/python3.11/site-packages/serial/tools/miniterm.py<lambda>r      s    i-3555T     c                     t          |           }|dk     r%d                    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   !   sA    YJB!!#c((Z"7888Ir   c                   H    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )ConsoleBasez8OS abstraction for console (input/output codec, no echo)c                     t           j        dk    rt           j        j        | _        nt           j        | _        t           j        | _        d S N)   r   )sysversion_infostdoutbufferbyte_outputoutputselfs    r   __init__zConsoleBase.__init__.   s7    v%%"z0D"zDjr   c                     dS )z.Set console to read single characters, no echoN r"   s    r   setupzConsoleBase.setup5         r   c                     dS )z Restore default console settingsNr&   r"   s    r   cleanupzConsoleBase.cleanup8   r(   r   c                     dS )z"Read a single key from the consoleNr&   r"   s    r   getkeyzConsoleBase.getkey;   s    tr   c                 l    | j                             |           | j                                          dS )zWrite bytes (already encoded)N)r    writeflush)r#   byte_strings     r   write_byteszConsoleBase.write_bytes?   s4    {+++     r   c                 l    | j                             |           | j                                          dS )zWrite stringN)r!   r.   r/   r#   texts     r   r.   zConsoleBase.writeD   s2    $r   c                     dS )zCancel getkey operationNr&   r"   s    r   cancelzConsoleBase.cancelI   r(   r   c                 .    |                                   | S N)r*   r"   s    r   	__enter__zConsoleBase.__enter__P   s    r   c                 .    |                                   d S 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   +   s        BB! ! != = =/ / /  ! ! !
  
& & &      r   r   ntc                   $    e Zd ZdZd Zd Zd ZdS )Outz$file-like wrapper that uses os.writec                     || _         d S r8   )fd)r#   rF   s     r   r$   zOut.__init__`   s    DGGGr   c                     d S r8   r&   r"   s    r   r/   z	Out.flushc   s    Dr   c                 :    t          j        | j        |           d S r8   )osr.   rF   )r#   ss     r   r.   z	Out.writef   s    HTWa     r   N)r>   r?   r@   rA   r$   r/   r.   r&   r   r   rD   rD   ]   sG        2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                 n   t          t          |                                            t          j        j                                        | _        t          j        j                                        | _	        t          j        j        
                    d           t          j        j                            d           t          j                    dk    r"t          t          j                                        d          d                   dk    rd}dd lm} t'          |d          st          j        |j                  |_        t          j        j        j        }t          j        j        j        }t          j        j        j        }|                                } | |d	          t          j        |                     |j        |z  dk    r$ | |d	          |j        |z             || _         t;          j        d
          t?          t@          j!        "                                          d          | _#         t;          j        d
          t?          t@          j$        "                                          d          t@          _$        | j#        t@          _!        d
| j#        _%        d S )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  ))+++$m4GGIIDO$m4AACCDOM"55e<<<M"//666 !!T))c(2B2D2D2J2J32O2OPQ2R.S.SV[.[.[5;2222222x33 F'-~hn'E'EH$!'!7!F!'!7!F%}5B~~''||C00&,t2D2DEEEJ!CCII"N<<#4#4djCe6efff%)DN3&*733C
8I8I8K8K4L4LiXXDK2)'223sz7H7H7J7J3K3KYWWCJCJ#*DK   r   c                 f   t           j        j                            | j                   t           j        j                            | j                   	 t           j        j                            t           j        j                            d          | j	                   d S # t          $ r Y d S w xY w)Nrf   )rj   rk   rl   rq   rn   rr   rp   r}   r   r   AttributeErrorr"   s    r   __del__zConsole.__del__   s    M"55doFFFM"//@@@&55fm6L6Y6YZ]6^6^`d`nooooo!   s   AB" "
B0/B0c                 V   	 t          j                    }|t          d          k    rt          d          S |t          d          u s|t          d          u rO	 t          j                    }|t          d          u r| j        |         S | j        |         S # t
          $ r Y nw xY w|S )NT   
   r      )msvcrtgetwchunichrfncodesnavcodesKeyError)r#   zcodes      r   r,   zConsole.getkey   s    MOOr

??!"::%&))^^qF4LL'8'8%}q		>>#'<#55#'=#66#    Hs   0B B 
B%$B%c                     t           j        j                                        }t           j        j                            |ddd           d S )N   r   r   )rj   rk   rl   GetConsoleWindowuser32PostMessageA)r#   hwnds     r   r6   zConsole.cancel   s?     =)::<<DM --dE4CCCCCr   )
r>   r?   r@   r   r   r$   r   r,   r6   __classcell__r   s   @r   rL   rL   i   s        
 
 
 
	+ 	+ 	+ 	+ 	+6	 	 		 	 	"	D 	D 	D 	D 	D 	D 	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                                        | _        t          j        | j                  | _	        t          j        | j                   t          j        dk     r= t          j        t          j        j                  t          j                  | _        d S t          j        | _        d S 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  ))+++i&&((DG(11DHODL)))&((!E!1#)2D!E!Eci!P!P!$r   c                 @   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	        |           d S )Nr         r   )
r   r   rF   ICANONECHOISIGVMINVTIME	tcsetattrTCSANOW)r#   news     r   r'   zConsole.setup   s{    #DG,,CVw~o-=MCF#$CF7< $%CF7=!dgw<<<<<r   c                 ~    | j                             d          }|t          d          k    rt          d          }|S )Nr         )r   readr   )r#   r
   s     r   r,   zConsole.getkey   s8    ##A&&AF4LL  1IIHr   c                 P    t          j        | j        t          j        d           d S )N    )fcntlioctlrF   r   TIOCSTIr"   s    r   r6   zConsole.cancel   s     K%88888r   c                 Z    t          j        | j        t           j        | j                   d S r8   )r   r   rF   	TCSAFLUSHr   r"   s    r   r*   zConsole.cleanup   s$    dgw'8$(CCCCCr   )	r>   r?   r@   r$   r'   r,   r6   r*   r   r   s   @r   rL   rL      s{        	+ 	+ 	+ 	+ 	+	= 	= 	=	 	 		9 	9 	9	D 	D 	D 	D 	D 	D 	Dr   z9Sorry no implementation for your platform ({}) available.c                   $    e Zd ZdZd Zd Zd ZdS )	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      sG        00        r   r   c                       e Zd ZdZd ZdS )CRLFzENTER sends CR+LFc                 .    |                     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dS )CRzENTER sends CRc                 .    |                     dd          S )Nr   r   r3   s     r   r   zCR.rx       ||D$'''r   c                 .    |                     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      s8        ( ( (( ( ( ( (r   r   c                       e Zd ZdZdS )LFzENTER sends LFN)r>   r?   r@   rA   r&   r   r   r   r     s        r   r   c                       e Zd ZdZ ed  ed          D                       Ze                    ddd           d ZeZ	dS )	
NoTerminalz0remove typical terminal control codes from inputc              #   F   K   | ]}t          |          d v|d|z   fV  dS )
	 $  N)r   .0xs     r   	<genexpr>zNoTerminal.<genexpr>  s;      ]]qR\A\A\Avz?A\A\A\A\]]r   r   !$  %$  )r      c                 6    |                     | j                  S r8   )	translateREPLACEMENT_MAPr3   s     r   r   zNoTerminal.rx  s    ~~d2333r   N)
r>   r?   r@   rA   dictranger   updater   r   r&   r   r   r   r     sx        ::d]]EE"II]]]]]O	
 	
  4 4 4 DDDr   r   c                       e Zd ZdZ ed  ed          D                       Ze                    dddd           dS )	
NoControlsz%Remove all control codes, incl. CR+LFc              #   $   K   | ]}|d |z   fV  dS )r   Nr&   r   s     r   r   zNoControls.<genexpr>  s*      >>qAvz?>>>>>>r   r   i#$  r   r   )r   r   r   N)r>   r?   r@   rA   r   r   r   r   r&   r   r   r   r     sk        //d>>EE"II>>>>>O	
 	
    r   r   c                       e Zd ZdZd ZeZdS )	PrintablezMShow decimal code for all non-ASCII characters and replace most control codesc           	         g }|D ]}d|cxk    rdk     sn |dv r|                     |           +|dk     r3|                     t          dt          |          z                        d|                    d d                    t          |                    D                        |                     d           d                    |          S )N r   r   c              3   Z   K   | ]&}t          d t          |          z   dz
            V  'dS )i   0   N)r   r   )r   ds     r   r   zPrintable.rx.<locals>.<genexpr>2  s9      UU!Q" 455UUUUUUr   z{:d} )appendr   r   extendr   join)r#   r4   rr
   s       r   r   zPrintable.rx*  s     	 	Aa    &    AOOSQ001111UUv}}SQRVV?T?TUUUUUUwwqzzr   N)r>   r?   r@   rA   r   r   r&   r   r   r   r   '  s*        WW
 
 
 DDDr   r   c                   $    e Zd ZdZd Zd Zd ZdS )Colorizez,Apply different colors for received and echoc                 "    d| _         d| _        d S )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  sG        66% % %
' ' '& & & & &r   r   c                       e Zd ZdZd Zd ZdS )DebugIOzPrint what is sent and receivedc                     t           j                            d                    |                     t           j                                         |S )Nz [RX:{!r}] r   r   r.   r   r/   r3   s     r   r   z
DebugIO.rxK  ?    
--d33444
r   c                     t           j                            d                    |                     t           j                                         |S )Nz [TX:{!r}] r  r3   s     r   r   z
DebugIO.txP  r  r   Nr   r&   r   r   r  r  H  s8        ))  
    r   r  )crlfcrlf)directdefault	nocontrol	printablecolorizedebugc                  2   t           j                            d           g } t          t	          t                                d          D ]R\  }\  }}}t           j                            d                    |||                     |                     |           S	 t          d          }	 t          |          dz
  }d|cxk    rt          |           k     s"n t           j                            d           _	 | |         }n# t          $ r Y nw xY w|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:
r   z--- {:2}: {:20} {!r}
Tz#--- 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  s0    J/000E!*6(**+=+=q!A!A  D$
188D$GGHHHT>??	 IIME****E

****
  !7888 + <DD  	 	 	D	 s   /AD 
DD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dS )Minitermz    Terminal application. Copy data from serial port to console and vice versa.
    Handle special keys from the console to show menu etc.
    Fr
  r&   c                 L   t                      | _        || _        || _        d| _        d| _        d| _        || _        || _        | 	                                 t          d          | _        t          d          | _        d | _        d | _        d | _        d | _        d | _        d S )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    yy%	%&##%%%$Tll$Tll
!#r   c                     d| _         t          j        | j        d          | _        d| j        _        | j                                         dS )zStart reader threadTr   targetnameN)r0  	threadingThreadreaderr1  daemonstartr"   s    r   _start_readerzMiniterm._start_reader  sJ    !(/t{NNN&*#""$$$$$r   c                     d| _         t          | j        d          r| j                                         | j                                         dS )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  sM    "4;.. 	&K##%%%!!#####r   c                     d| _         |                                  t          j        | j        d          | _        d| j        _        | j                                         | j        	                                 dS )zstart worker threadsTr   r6  N)
r/  r>  r9  r:  writertransmitter_threadr<  r=  r%  r'   r"   s    r   r=  zMiniterm.start  so    
"+"2$+D"Q"Q"Q)-&%%'''r   c                     d| _         dS )zset flag to stop worker threadsFN)r/  r"   s    r   stopzMiniterm.stop  s    


r   c                     | j                                          |sIt          | j        d          r| j                                         | j                                         dS dS )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2 *''))) %%'''''	( 	(r   c                 8    | j                                          d S r8   )r&  closer"   s    r   rJ  zMiniterm.close  s    r   c                     t           | j                 gd | j        D             z   }d |D             | _        t	          t          | j                            | _        dS )zFtake list of transformation classes and instantiate them for rx and txc                 (    g | ]}t           |         S r&   )TRANSFORMATIONS)r   fs     r   
<listcomp>z3Miniterm.update_transformations.<locals>.<listcomp>  s4     =T =T =TAB >MQ=O =T =T =Tr   c                 "    g | ]} |            S r&   r&   )r   ts     r   rO  z3Miniterm.update_transformations.<locals>.<listcomp>  s    "@"@"@11133"@"@"@r   N)EOL_TRANSFORMATIONSr*  r+  tx_transformationslistreversedrx_transformations)r#   transformationss     r   r,  zMiniterm.update_transformations  sq    .tx89 =T =TFJl=T =T =T T"@"@"@"@"@"&x0G'H'H"I"Ir   rh   c                 X    || _          t          j        |          |          | _        dS )zset encoding for received dataN)r(  r   getincrementaldecoderr2  r#   r   errorss      r   set_rx_encodingzMiniterm.set_rx_encoding  s*    &@&6x@@HHr   c                 X    || _          t          j        |          |          | _        dS )z!set encoding for transmitted dataN)r)  r   getincrementalencoder
tx_encoderrZ  s      r   set_tx_encodingzMiniterm.set_tx_encoding  s*    '@&6x@@HHr   c                 <   t           j                            d                    | j                             t           j                            d                    | j        j        rdnd| j        j        rdnd| j        j        rdnd                     	 t           j                            d                    | j        j        rdnd| j        j	        rdnd| j        j
        rdnd| j        j        rdnd                     n# t          j        $ r Y nw xY wt           j                            d                    | j        j        rdnd                     t           j                            d                    | j        j        rdnd                     t           j                            d	                    | j                             t           j                            d
                    | j                             t           j                            d                    | j                                                             t           j                            d                    d                    | j                                       dS )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k p   	 	 	
BII8XXj8XXj4DXX*G G 	H 	H 	H		JMTT![_<*![_<*![^;![^;	> > ? ? ? ?
 % 	 	 	 D	 	
:AAdkNaBq((gqrrsss
:AAdkN`Bp((fpqqrrr
:AA$BUVVWWW
;BB4CWXXYYY
//0@0@AABBB
,33CHHT\4J4JKKLLLLLs   A-D DDc                    	 | j         r| j        r| j                            | j        j        pd          }|ru| j        r| j                            |           nS| j        	                    |          }| j
        D ]}|                    |          }| j                            |           | j         r| j        dS dS dS dS # t          j        $ r" d| _         | j                                          w xY w)zloop and copy serial->consoler   FN)r/  r0  r&  r   
in_waitingr'  r%  r1   r2  decoderV  r   r.   rp  r6   )r#   datar4   transformations       r   r;  zMiniterm.reader  s3   	* 
1!3 
1{''(>(C!DD 1x 1006666#55d;;.2.E ; ;N#1#4#4T#:#:DD**4000 * 
1!3 
1 
1 
1 
1 
1 
1 
1 
1 
1 % 	 	 	DJL!!!	s   B9C 1C4c                 r   d}	 | j         r	 | j                                        }n# t          $ r d}Y nw xY w| j         sdS |r|                     |           d}n|| j        k    rd}n|| j        k    r|                                  dS |}| j        D ]}|	                    |          }| j
                            | j                            |                     | j        r;|}| j        D ]}|                    |          }| j                            |           | j         dS dS #  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  rS  r   r&  r.   r_  encoder   )r#   menu_activer
   r4   ry  	echo_texts         r   rC  zMiniterm.writer  s    	* 6++--AA(   AAAz E 6((+++"'KK$---"&KK$---IIKKKE D*.*A 7 7-0066K%%do&<&<T&B&BCCCy 6$%	.2.E G GN(6(;(;I(F(FII**95553 * 6 6 6 6 64	DJs4   D, ' D, 6D, 6
D, AD, BD, ,
D6c                 B   || j         k    s|| j        k    rW| j                            | j                            |                     | j        r| j                            |           d'S d'S |dk    r|                                  d'S |dv r3t          j
                            |                                            d'S |dk    rY| j        j         | j        _        t          j
                            d                    | j        j        rdnd                     d'S |dk    rY| j        j         | j        _        t          j
                            d                    | j        j        rdnd                     d'S |d	k    rY| j        j         | j        _        t          j
                            d
                    | j        j        rdnd                     d'S |dk    rJ| j         | _        t          j
                            d                    | j        rdnd                     d'S |dk    r|                                  d'S |dk    rt#          t$                    }|                    | j                  dz   }|t+          |          k    rd}||         | _        t          j
                            d                    | j                                                             |                                  d'S |dk    r|                                  d'S |dk    r|                                  d'S |dv r|                                  d'S |dv r|                                  d'S |dv r|                                  d'S |dk    r,t          j        | j        _        |                                  d'S |dk    r,t          j        | j        _        |                                  d'S |dv r,t          j         | j        _!        |                                  d'S |dv r,t          j"        | j        _!        |                                  d'S |dv r,t          j#        | j        _!        |                                  d'S |dv r,t          j$        | j        _!        |                                  d'S |dv r,t          j%        | j        _!        |                                  d'S |dk    r,t          j&        | j        _'        |                                  d'S |dk    r,t          j(        | j        _'        |                                  d'S |d k    r,t          j)        | j        _'        |                                  d'S |d!v r&|d"k    | j        _*        |                                  d'S |d#v r&|d$k    | j        _+        |                                  d'S |d%v r| ,                                 d'S t          j
                            d&                    t[          |                               d'S )(z"Implement a simple menu / settingszhH?z--- RTS {} ---
rd  re  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_textri  r   rj  rk  change_filterrT  rR  r  r*  r  rs  r,  change_encodingrt  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_FIVErq  rr  rF  r   )r#   r
   modesr*  s       r   r}  zMiniterm.handle_menu_key'  s   ###qD,?'?'?Kdo44Q77888y &""1%%%%%& &&[[)^^JT//1122222&[["&+/1DKOJ/664;?7bxxXbccddddd&[["&+/1DKOJ/664;?7bxxXbccddddd&[[.2k.I*IDK'J188T[E`9pfpqqrrrrr&[[ IDIJ6==$)>chhYcddeeeee&[[     &[[,--E++dh''!+Cc%jj  SzDHJ0778H8HIIJJJ'')))))&[[  """""&[[##%%%%% $YY$YY$YY  """""#XX#)#3DK ##%%%%%#XX#)#3DK ##%%%%%$YY!'!3DK##%%%%%$YY!'!2DK##%%%%%$YY!'!3DK##%%%%%$YY!'!4DK##%%%%%$YY!'!3DK##%%%%%#XX#)#6DK ##%%%%%#XX#)#6DK ##%%%%%#XX#)#ADK ##%%%%%$YY#$8DK##%%%%%$YY"#s(DK##%%%%%$YYIIKKKKKJAHHYZI[I[\\]]]]]r   c                    t           j                            d           t           j                                         | j        5  t           j                                                            d          }|rE	 t          |d          5 }t           j                            d	                    |                     	 |
                    d          }|snS| j                            |           | j                                         t           j                            d           k	 ddd           n# 1 swxY w Y   t           j                            d		                    |                     nJ# t          $ r=}t           j                            d
	                    ||                     Y d}~nd}~ww xY wddd           dS # 1 swxY w Y   dS )z,Ask user for filenname and send its contentsz
--- File to upload: r   rbz--- Sending file {} ---
Ti   rb   Nz
--- File {} sent ---
z"--- ERROR opening file {}: {} ---
)r   r   r.   r/   r%  r   readlinerstripopenr   r   r&  IOError)r#   filenamerN  blockes        r   r  zMiniterm.upload_file}  sR   
1222
\ 	` 	`y))++226::H ``h-- 	2
(()D)K)KH)U)UVVV2$%FF4LLE#( & % K--e444 K--///J,,S1112 !&	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 J$$%?%F%Fx%P%PQQQQ ` ` `J$$%J%Q%QRZ\]%^%^________`	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	` 	`sa   5G;E5BD7+E57D;	;E5>D;	?5E54G5
F<?3F72G7F<<GGGc           	         t           j                            d           t           j                            d                    d t	          t
                                                    D                                  t           j                            d                    d                    | j                                       | j	        5  t           j
                                                                                                        }ddd           n# 1 swxY w Y   |r]|D ]?}|t
          vr4t           j                            d                    |                      n@|| _        |                                  t           j                            d                    d                    | j                                       dS )	zchange the i/o transformationsz
--- Available Filters:
r   c              3   H   K   | ]\  }}d                      ||          V  dS )z---   {:<10} = {.__doc__}Nr   r   kvs      r   r   z)Miniterm.change_filter.<locals>.<genexpr>  sJ       #9 #91 (..q!44#9 #9 #9 #9 #9 #9r   z$
--- Enter new filter name(s) [{}]: r   Nz--- unknown filter: {!r}
rh  )r   r   r.   r   r  rM  itemsr   r+  r%  r   r  lowerrw   r,  )r#   new_filtersrN  s      r   r  zMiniterm.change_filter  s   
5666
 #9 #9446677#9 #9 #9 9 9 	: 	: 	: 	
@GGQUQ]H^H^__```\ 	? 	?),,..4466<<>>K	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	.  . .O++J$$%A%H%H%K%KLLLE ,  +++---
,33CHHT\4J4JKKLLLLLs   AD  D$'D$c                    t           j                            d                    | j                             | j        5  t           j                                                                        }ddd           n# 1 swxY w Y   |r	 t          j
        |           |                     |           |                     |           nB# t          $ r5 t           j                            d                    |                     Y nw xY wt           j                            d                    | j                             t           j                            d                    | j                             dS )z"change encoding on the serial portz#
--- Enter new encoding name [{}]: Nz--- invalid encoding name: {}
rf  rg  )r   r   r.   r   r(  r%  r   r  stripr   lookupr\  r`  LookupErrorr)  )r#   new_encodings     r   r  zMiniterm.change_encoding  s   
?FFtGZ[[\\\\ 	8 	89--//5577L	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	33l+++ $$\222$$\2222	  Y Y Y
  !B!I!I,!W!WXXXXXY
 	
:AA$BUVVWWW
;BB4CWXXYYYYYs#   1A<<B B 
C	 	<DDc                 <   t           j                            d           t           j                                         | j        5  | j        j        }	 t          t           j        	                                
                                          | j        _        |                                  nU# t          $ rH}t           j                            d                    |                     || j        _        Y d}~nd}~ww xY wddd           dS # 1 swxY w Y   dS )zchange the baudratez
--- Baudrate: z#--- ERROR setting baudrate: {} ---
N)r   r   r.   r/   r%  r&  baudrateru   r   r  r  rt  r  r   )r#   backupr  s      r   r  zMiniterm.change_baudrate  sJ   
+,,,
\ 	* 	*[)F*'*39+=+=+?+?+E+E+G+G'H'H$
 ''))))	  . . .
  !G!N!Nq!Q!QRRR'-$$$$$$.		* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s=   DAB/D/
D9>C<7D<DDDDc                    | j         5  	 t                      }n# t          $ r d}Y nw xY wddd           n# 1 swxY w Y   |r|| j        j        k    rr|                                  | j                                        }	 t          j        |d          }|                    |           | j        j	        |_	        | j        j
        |_
        |                                 | j        j        |_        | j                                         || _        t          j                            d                    | j        j                             n]# t$          $ rP}t          j                            d                    |                     |                                 Y d}~nd}~ww xY w|                                  dS dS dS )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  r|  r&  r  rA  getSettingsDictserial_for_urlapplySettingsDictri  rj  r  rk  rJ  r   r   r.   r   	Exceptionr>  )r#   r  settings
new_serialr  s        r   r  zMiniterm.change_port  s   \ 	 	#~~$   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
  	!DDK,,,{2244H[#24TJJJ
,,X666!%
!%
!!!-1[-H
*
 !!###(
  !@!G!GHX!Y!YZZZZ  # # #
  !G!N!Nq!Q!QRRR  """"""""#      +	! 	!,,s>   77(7(7;;A2E 
F-AF((F-c                    |                                   | j                                         t          j                            d                    | j        j                             d}| j        j        st          j                            d                    t          | j
                                       | j                                        }|| j
        k    r|                                  nw|dv rd}np	 | j                                         nI# t          $ r<}t          j                            d                    |                     Y d}~nd}~ww xY w| j        j        |r|                                  dS |                                  t          j                            d	                    | j        j                             dS )
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  s    	
6==dk>NOOPPP+% 	OJcjj$T%899 k ; ; < < <##%%AD'''		d!%O  """" O O O
  !C!J!J1!M!MNNNNNNNNO +% 	O  	S    J8??@PQQRRRRRs   >D 
E"2EEc                    d                     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  menuri  rj  brkr   infouploadr   filterr*  )r   getattrr&  r   r-  r.  r"   s    r   r  zMiniterm.get_help_text  s    0 F769.?@@ 344 344v&&v&&v&&''''!&))''!&))v&&  ( (1#	(r   N)Fr
  r&   )Fr   )r>   r?   r@   rA   r$   r>  rA  r=  rF  r   rJ  r,  r\  r`  rt  r;  rC  r}  r  r  r  r  r  r  r  r&   r   r   r!  r!    s        
   $% % %$ $ $    ( ( ( (  J J JI I I I
I I I I
M M M2  &$ $ $LT^ T^ T^l` ` `,M M M&Z Z Z * * *! ! !<S S S>&( &( &( &( &(r   r!  %  c           
         ddl }|                    d          }|                    ddd|            |                    d	dt          d
|           |                    d          }|                    dg dd dd           |                    dddd           |                    dddd           |                    dt          d|           |                    dt          d|           |                    dd d!d"d#$           |                    d%dd&d           |                    d'          }|                    d(d)dd*d           |                    d+d,d-d.d/0           |                    d1d2d3d4d5g 6           |                    d7g d8d9 d:d;           |                    d<dd=d           |                    d>          }|                    d?t          d@dAdBC           |                    dDt          d@dEdFC           |                    dG          }|                    dHdIddJd           |                    dKddLd           |                                }|j        |j        k    r|                    dM           |j	        rdN|j	        v rt          j                            dO           t          j                            dP                    dQ t          t                                                    D                                  t          j                            dP           t          j        dR           |j	        }ndSg}	 |j        |j        dTk    ru	 t'                      |_        |j        s|                    dU           nD# t(          $ r7 t          j                            dP           |                    dV           Y nw xY w	 t+          j        |j        |j        |j        |j        |j        d#W          }	t7          |	dX          sdR|	_        |j        N|j        s;t          j                            dY                    |j        rdZnd[                     |j        |	_        |j         N|j        s;t          j                            d\                    |j         rdZnd[                     |j         |	_         tC          |	t*          j"                  r|j#        |	_#        |	$                                 n# t*          j%        $ rm}
t          j                            d]                    |j        |
                     |j&        r |j'        st          j        dR           ndT|_        Y d}
~
nd}
~
ww xY w8tQ          |	|j)        |j*        +                                |^          }tY          |j                  |_-        tY          |j                  |_.        |j/        |_/        |0                    |j1                   |2                    |j1                   |j        st          j                            d_                    |j        `                     t          j                            da                    tg          |j-                  tg          |j.                  tg          |j.                  tg          db                               |4                                 	 |                    d#           n# t(          $ r Y nw xY w|j        st          j                            dc           |                                 |5                                 dS )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                 *    |                                  S r8   rs  r	   s    r   r   zmain.<locals>.<lambda>G      qwwyy 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                 *    |                                  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   H   K   | ]\  }}d                      ||          V  dS )z{:<10} = {.__doc__}Nr  r  s      r   r   zmain.<locals>.<genexpr>  sJ       '= '=Aq &,,Q22'= '= '= '= '= '=r   r   r  -zport is not givenz"user aborted and port is not given)r  rr  rq  r  r@  z--- forcing DTR {}
rd  re  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} ---
rb  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  r|  r&  r  r  r  rr  rq  rz   timeoutrj  quietr   ri  
isinstanceSerialr  r  rp  developaskr!  r   r*  r  r   r-  r.  r'  r\  r  r`  r   r=  rJ  )default_portdefault_baudratedefault_rtsdefault_dtrr  parsergroupr;   r+  r4  r  miniterms               r   mainr  -  s    OOO$$O % Q QF 7	     2   " " " %%o66E	)))  9     
8	     
9	     
A	     
A	     
/     
1	     %%o66E	h.	     
#g     
j&     
$$$       
8	     %%i00E	f     
n     %%m44E	i*	     
-	     D~''EFFF{ 
T[  J3444JTYY '= '="?#8#8#:#:;;'= '= '= = = > > > JT"""HQKKK++.9	S 0 06(NN	
 y 6LL!4555 % C C C
  &&&ABBBBBC#	$3	{{ " " "O ?M:: ,*+'x#z jJ$$%;%B%BtxCg88]g%h%hiii&*h#x#z jJ$$%;%B%BtxCg88]g%h%hiii&*h#/6=99 ;,0N)  """  % 	  	  	 J=DDTYPQRRSSS| 8  		 K.` YHNN	  H
 %T^44H$T^44H8HLT6777T6777: &
lsso t   	  	  	 
RYYH344H344H344F##	% % 	& 	& 	& NNd   : -
+,,,MMOOONNs>   5N% %>O&%O&*D.T V(A#VV\ 
\*)\*__main__)Nr  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  rR  rM  r  r!  r  r>   r&   r   r   <module>r     sH   ' & & & & &  				 



      , , , , , , & & & & & & QQ R R RII   IFFF  * * * * *& * * *Z 7d??MMMMMMOOO
! 
! 
! 
! 
!f 
! 
! 
!RD RD RD RD RD+ RD RD RD RDh WMMMNNNLLLD D D D D+ D D D D> 
CJJ3<XXZ Z Z       * * * * *9 * * *( ( ( ( ( ( ( (               	 	 	 	 	 	 	 	    	   $& & & & &y & & &    i   & 

      2c( c( c( c( c(v c( c( c(Ra a a aH zDFFFFF s   < 	AA