o
    ,_Г                     @   s  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dd  ze W n ey>   eZeZY nw dd ZG d	d
 d
eZejdkrmd dlZd dlZd dlZG dd deZG dd deZn"ejdkrd dlZd dlZd dlZG dd deZnedejG dd deZG dd deZ G dd deZ!G dd deZ"G dd deZ#G dd de#Z$G dd  d eZ%G d!d" d"eZ&G d#d$ d$eZ'e e!e"d%Z(ee#e$e%e&e'd&Z)d'd( Z*G d)d* d*eZ+d/d,d-Z,e-d.kre,  dS dS )0    )absolute_importN)comports)hexlify_codecc                 C   s   | dkrt  S d S )Nhexlify)r   getregentryc r	   7/usr/lib/python3/dist-packages/serial/tools/miniterm.py<lambda>   s    r   c                 C   s*   t | }|dk rdt d| S t| S )z)generate a readable description for a key    z	Ctrl+{:c}@)ordformatrepr)	character
ascii_coder	   r	   r
   key_description!   s   r   c                   @   sX   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd ZdS )ConsoleBasez8OS abstraction for console (input/output codec, no echo)c                 C   s*   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selfr	   r	   r
   __init__.   s   
zConsoleBase.__init__c                 C      dS )z.Set console to read single characters, no echoNr	   r   r	   r	   r
   setup5       zConsoleBase.setupc                 C   r    )z Restore default console settingsNr	   r   r	   r	   r
   cleanup8   r"   zConsoleBase.cleanupc                 C   r    )z"Read a single key from the consoleNr	   r   r	   r	   r
   getkey;      zConsoleBase.getkeyc                 C      | j | | j   dS )zWrite bytes (already encoded)N)r   writeflush)r   byte_stringr	   r	   r
   write_bytes?      zConsoleBase.write_bytesc                 C   r&   )zWrite stringN)r   r'   r(   r   textr	   r	   r
   r'   D   r+   zConsoleBase.writec                 C   r    )zCancel getkey operationNr	   r   r	   r	   r
   cancelI   r"   zConsoleBase.cancelc                 C   s   |    | S N)r#   r   r	   r	   r
   	__enter__P   s   zConsoleBase.__enter__c                 O   s   |    d S r/   )r!   )r   argskwargsr	   r	   r
   __exit__T      zConsoleBase.__exit__N)__name__
__module____qualname____doc__r   r!   r#   r$   r*   r'   r.   r0   r3   r	   r	   r	   r
   r   +   s    r   ntc                   @   (   e Zd ZdZdd Zdd Zdd ZdS )	Outz$file-like wrapper that uses os.writec                 C   s
   || _ d S r/   )fd)r   r<   r	   r	   r
   r   `      
zOut.__init__c                 C   s   d S r/   r	   r   r	   r	   r
   r(   c   s   z	Out.flushc                 C   s   t | j| d S r/   )osr'   r<   )r   sr	   r	   r
   r'   f   s   z	Out.writeN)r5   r6   r7   r8   r   r(   r'   r	   r	   r	   r
   r;   ]   s
    r;   c                       sh   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dZdd Zdd Zdd Z  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                    sB  t t|   tjj | _tjj | _	tjj
d tjjd t dkr{tt dd dkr{d}dd lm} t|dsJt|j|_tjjj}tjjj}tjjj}| }||d	t| |j|@ dkr{||d	|j|B  || _td
tt j!" d| _#td
tt j$" dt _$| j#t _!d
| j#_%d S )Ni  10.   iZ)     r   LPDWORDUTF-8replace)&superr@   r   ctypeswindllkernel32GetConsoleOutputCP
_saved_ocpGetConsoleCP
_saved_icpSetConsoleOutputCPSetConsoleCPplatformreleaseintversionsplitctypes.wintypeswintypeshasattrPOINTERDWORDrX   SetConsoleModeGetConsoleModeGetStdHandlebyrefvalue	_saved_cmcodecs	getwriterr;   r   r   filenor   stderrencoding)r   "ENABLE_VIRTUAL_TERMINAL_PROCESSINGrl   rp   rq   rr   mode	__class__r	   r
   r      s,   &



Console.__init__c                 C   sX   t jj| j t jj| j zt jjt jjd| j	 W d S  t
y+   Y d S w )NrY   )r]   r^   r_   rd   ra   re   rc   rp   rr   ru   AttributeErrorr   r	   r	   r
   __del__   s   "zConsole.__del__c                 C   s|   	 t  }|tdkrtdS |tdu s|tdu r;zt  }|tdu r,| j| W S | j| W S  ty:   Y nw |S q)NT   
   r      )msvcrtgetwchunichrfncodesnavcodesKeyError)r   zcoder	   r	   r
   r$      s   Console.getkeyc                 C   s$   t jj }t jj|ddd d S )N   r   r   )r]   r^   r_   GetConsoleWindowuser32PostMessageA)r   hwndr	   r	   r
   r.      s   Console.cancel)
r5   r6   r7   r   r   r   r   r$   r.   __classcell__r	   r	   r}   r
   r@   i   s6    r@   posixc                       s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )r@   c                    sd   t t|   tj | _t| j| _	t
| j tjdk r,ttjjtj| _d S tj| _d S r   )r\   r@   r   r   stdinrx   r<   termios	tcgetattroldatexitregisterr#   r   rv   	getreaderrz   	enc_stdinr   r}   r	   r
   r      s   
r   c                 C   sb   t | j}|d t j @ t j @ t j @ |d< d|d t j< d|d t j< t | jt j	| d S )Nr         r   )
r   r   r<   ICANONECHOISIGVMINVTIME	tcsetattrTCSANOW)r   newr	   r	   r
   r!      s
   $zConsole.setupc                 C   s$   | j d}|tdkrtd}|S )Nr         )r   readr   )r   r   r	   r	   r
   r$      s   r   c                 C   s   t | jtjd d S )N    )fcntlioctlr<   r   TIOCSTIr   r	   r	   r
   r.      s   r   c                 C   s   t | jt j| j d S r/   )r   r   r<   	TCSAFLUSHr   r   r	   r	   r
   r#      s   zConsole.cleanup)	r5   r6   r7   r   r!   r$   r.   r#   r   r	   r	   r}   r
   r@      s    
z9Sorry no implementation for your platform ({}) available.c                   @   r:   )		Transformz&do-nothing: forward all data unchangedc                 C      |S )ztext received from serial portr	   r,   r	   r	   r
   rx   r%   zTransform.rxc                 C   r   )ztext to be sent to serial portr	   r,   r	   r	   r
   tx   r%   zTransform.txc                 C   r   )z(text to be sent but displayed on consoler	   r,   r	   r	   r
   echo   r%   zTransform.echoN)r5   r6   r7   r8   r   r   r   r	   r	   r	   r
   r      s
    r   c                   @   s   e Zd ZdZdd ZdS )CRLFzENTER sends CR+LFc                 C      | ddS )N

r[   r,   r	   r	   r
   r      r4   zCRLF.txN)r5   r6   r7   r8   r   r	   r	   r	   r
   r      s    r   c                   @       e Zd ZdZdd Zdd ZdS )CRzENTER sends CRc                 C   r   )Nr   r   r,   r	   r	   r
   r      r4   zCR.rxc                 C   r   )Nr   r   r   r,   r	   r	   r
   r     r4   zCR.txNr5   r6   r7   r8   r   r   r	   r	   r	   r
   r      s    r   c                   @   s   e Zd ZdZdS )LFzENTER sends LFN)r5   r6   r7   r8   r	   r	   r	   r
   r     s    r   c                   @   sB   e Zd ZdZedd edD Zeddd dd	 ZeZ	d
S )
NoTerminalz0remove typical terminal control codes from inputc                 c   s(    | ]}t |d vr|d| fV  qdS )
	 $  N)r   .0xr	   r	   r
   	<genexpr>  s   & zNoTerminal.<genexpr>r   !$  %$  )r      c                 C   s   | | jS r/   )	translateREPLACEMENT_MAPr,   r	   r	   r
   r     r4   zNoTerminal.rxN)
r5   r6   r7   r8   dictranger   updater   r   r	   r	   r	   r
   r     s    r   c                   @   s8   e Zd ZdZedd edD Zedddd d	S )

NoControlsz%Remove all control codes, incl. CR+LFc                 c   s    | ]	}|d | fV  qdS )r   Nr	   r   r	   r	   r
   r     s    zNoControls.<genexpr>r   i#$  r   r   )r   r   r   N)r5   r6   r7   r8   r   r   r   r   r	   r	   r	   r
   r     s    r   c                   @   s   e Zd ZdZdd ZeZdS )	PrintablezMShow decimal code for all non-ASCII characters and replace most control codesc                 C   s   g }|D ];}d|  krdk sn |dv r| | q|dk r+| tdt|  q|dd dt|D  | d qd|S )	N r   r   c                 s   s$    | ]}t d t| d V  qdS )i   0   N)r   r   )r   dr	   r	   r
   r   2  s   " zPrintable.rx.<locals>.<genexpr>z{:d} )appendr   r   extendr   join)r   r-   rr   r	   r	   r
   r   *  s   
zPrintable.rxN)r5   r6   r7   r8   r   r   r	   r	   r	   r
   r   '  s    r   c                   @   r:   )	Colorizez,Apply different colors for received and echoc                 C   s   d| _ d| _d S )Nz[37mz[31m)input_color
echo_colorr   r	   r	   r
   r   <  s   
zColorize.__init__c                 C   
   | j | S r/   )r   r,   r	   r	   r
   r   A  r=   zColorize.rxc                 C   r   r/   )r   r,   r	   r	   r
   r   D  r=   zColorize.echoN)r5   r6   r7   r8   r   r   r   r	   r	   r	   r
   r   9  s
    r   c                   @   r   )DebugIOzPrint what is sent and receivedc                 C       t jd| t j  |S )Nz [RX:{!r}] r   ry   r'   r   r(   r,   r	   r	   r
   r   K     
z
DebugIO.rxc                 C   r   )Nz [TX:{!r}] r   r,   r	   r	   r
   r   P  r   z
DebugIO.txNr   r	   r	   r	   r
   r   H  s    r   )crlfcrlf)directdefault	nocontrol	printablecolorizedebugc                  C   s   t jd g } ttt dD ]\}\}}}t jd||| | | q	 td}zt	|d }d|  kr@t
| k sIn t jd W q(W n
 tyT   Y |S 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   ry   r'   	enumeratesortedr   r   r   	raw_inputrh   len
ValueError)portsnportdeschwidindexr	   r	   r
   ask_for_portk  s&   r   c                   @   s   e Zd ZdZd1ddZdd Zd	d
 Zdd Zdd Zd2ddZ	dd Z
dd Zd3ddZd3ddZdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0S )4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                 C   sp   t  | _|| _|| _d| _d| _d| _|| _|| _| 	  t
d| _t
d| _d | _d | _d | _d | _d | _d S )NFrZ         )r@   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   r	   r	   r
   r     s    


zMiniterm.__init__c                 C   s.   d| _ tj| jdd| _d| j_| j  dS )zStart reader threadTr   targetnameN)r  	threadingThreadreaderr  daemonstartr   r	   r	   r
   _start_reader  s   zMiniterm._start_readerc                 C   s*   d| _ t| jdr| j  | j  dS )z6Stop reader thread only, wait for clean exit of threadFcancel_readN)r  rm   r   r  r  r   r   r	   r	   r
   _stop_reader  s   
zMiniterm._stop_readerc                 C   s@   d| _ |   tj| jdd| _d| j_| j  | j	  dS )zstart worker threadsTr   r	  N)
r  r  r  r  writertransmitter_threadr  r  r   r!   r   r	   r	   r
   r    s   
zMiniterm.startc                 C   s
   d| _ dS )zset flag to stop worker threadsFN)r  r   r	   r	   r
   stop  s   
zMiniterm.stopc                 C   s6   | j   |st| jdr| j  | j  dS dS )z$wait for worker threads to terminater  N)r  r   rm   r   r  r  )r   transmit_onlyr	   r	   r
   r     s   

zMiniterm.joinc                 C   s   | j   d S r/   )r   closer   r	   r	   r
   r    s   zMiniterm.closec                 C   s@   t | j gdd | jD  }dd |D | _tt| j| _dS )zFtake list of transformation classes and instantiate them for rx and txc                 S   s   g | ]}t | qS r	   )TRANSFORMATIONS)r   fr	   r	   r
   
<listcomp>  s    z3Miniterm.update_transformations.<locals>.<listcomp>c                 S   s   g | ]}| qS r	   r	   )r   tr	   r	   r
   r    s    N)EOL_TRANSFORMATIONSr   r   tx_transformationslistreversedrx_transformations)r   transformationsr	   r	   r
   r     s
   zMiniterm.update_transformationsr[   c                 C      || _ t||| _dS )zset encoding for received dataN)r   rv   getincrementaldecoderr  r   rz   errorsr	   r	   r
   set_rx_encoding     zMiniterm.set_rx_encodingc                 C   r#  )z!set encoding for transmitted dataN)r   rv   getincrementalencoder
tx_encoderr%  r	   r	   r
   set_tx_encoding  r(  zMiniterm.set_tx_encodingc                 C   sL  t jdj| jd t jd| jjrdnd| jjrdnd| jjr$dnd z&t jd| jjr4dnd| jj	r;dnd| jj
rBdnd| jjrIdnd W n
 tjyX   Y nw t jd| jjrddnd t jd| jjrsd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   ry   r'   r   r   rtsdtrbreak_conditionctsdsrricdSerialExceptionxonxoffrtsctsr   r   r   upperr   r   r   r	   r	   r
   dump_port_settings  s0   



zMiniterm.dump_port_settingsc                 C   s   zE| j r=| jr@| j| jjpd}|r4| jr| j| n| j	|}| j
D ]}||}q&| j| | j rC| jsW dS W dS W dS W dS  tjyV   d| _ | j   w )zloop and copy serial->consoler   FN)r  r  r   r   
in_waitingr   r   r*   r  decoder!  r   r'   r:  r.   )r   datar-   transformationr	   r	   r
   r    s    
$
zMiniterm.readerc                 C   s   d}zp| j rpz| j }W n ty   d}Y nw | j sW dS |r)| | d}nA|| jkr1d}n9|| jkr=|   W dS |}| jD ]}|	|}qB| j
| j| | jrj|}| jD ]}||}q\| j| | j sW dS W dS    d| _  )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  r  r  r   r   r'   r*  encoder   )r   menu_activer   r-   rB  	echo_textr	   r	   r
   r    s>   




zMiniterm.writerc                 C   s  || j ks
|| jkr!| j| j| | jr| j| d'S d'S |dkr+|   d'S |dv r9t	j
|   d'S |dkrU| jj | j_t	j
d| jjrOdnd d'S |dkrq| jj | j_t	j
d| jjrkdnd d'S |d	kr| jj | j_t	j
d
| jjrdnd d'S |dkr| j | _t	j
d| jrdnd d'S |dkr|   d'S |dkrtt}|| jd }|t|krd}|| | _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r3tj| j_|   d'S |dv rCtj | j_!|   d'S |dv rStj"| j_!|   d'S |dv rctj#| j_!|   d'S |dv rstj$| j_!|   d'S |dv rtj%| j_!|   d'S |dkrtj&| j_'|   d'S |dkrtj(| j_'|   d'S |d krt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 {} ---
r.  r/  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rRrP   qQz!--- unknown menu character {} --
N).r  r  r   r'   r*  rF  r   r   upload_filer   ry   get_help_textr3  r   r4  r5  change_filterr  r  r   r   r   r=  r   change_encodingr>  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_FIVEr;  r<  r  r   )r   r   modesr   r	   r	   r
   rE  '  s   """
 

























zMiniterm.handle_menu_keyc                 C   s8  t jd t j  | j t j d}|rzzDt|d,}t jd	| 	 |
d}|s2n| j| | j  t jd q*W d   n1 sNw   Y  t jd		| W n$ tyy } zt jd
	|| W Y d}~nd}~ww W d   dS W d   dS W d   dS 1 sw   Y  dS )z,Ask user for filenname and send its contentsz
--- File to upload: r   rbz--- Sending file {} ---
Ti   rU   Nz
--- File {} sent ---
z"--- ERROR opening file {}: {} ---
)r   ry   r'   r(   r   r   readlinerstripopenr   r   r   IOError)r   filenamer  blocker	   r	   r
   rc  }  s:   



 "zMiniterm.upload_filec                 C   s   t jd t jddd tt D  t jdd| j | j	 t j
   }W d   n1 s<w   Y  |r^|D ]}|tvrVt jd|  nqE|| _|   t jd	d| j dS )
zchange the i/o transformationsz
--- Available Filters:
r   c                 s        | ]\}}d  ||V  qdS )z---   {:<10} = {.__doc__}Nr   r   kvr	   r	   r
   r     
    

z)Miniterm.change_filter.<locals>.<genexpr>z$
--- Enter new filter name(s) [{}]: r   Nz--- unknown filter: {!r}
r2  )r   ry   r'   r   r   r  itemsr   r   r   r   ry  lowerrj   r   )r   new_filtersr  r	   r	   r
   re    s"   

zMiniterm.change_filterc                 C   s   t jd| j | j t j  }W d   n1 sw   Y  |rJzt	
| W n ty?   t jd| Y n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: {}
r0  r1  )r   ry   r'   r   r   r   r   ry  striprv   lookupLookupErrorr'  r+  r   )r   new_encodingr	   r	   r
   rf    s   

zMiniterm.change_encodingc                 C   s   t jd t j  | jF | jj}ztt j	 
 | j_W n ty? } zt jd| || j_W Y d}~nd}~ww |   W d   dS W d   dS 1 sWw   Y  dS )zchange the baudratez
--- Baudrate: z#--- ERROR setting baudrate: {} ---
N)r   ry   r'   r(   r   r   baudraterh   r   ry  r  r   r   r>  )r   backupr  r	   r	   r
   ri    s   

"zMiniterm.change_baudratec              
   C   s&  | j  zt }W n ty   d}Y nw W d   n1 sw   Y  |r|| jjkr|   | j }z!tj|dd}|| | jj	|_	| jj
|_
|  | jj|_W n tyu } ztjd| |  W Y d}~nd}~ww | j  || _tjd| jj |   dS dS dS )z;Have a conversation with the user to change the serial portNT)do_not_openz#--- ERROR opening new port: {} ---
z--- Port changed to: {} ---
)r   r   rD  r   r   r  getSettingsDictserial_for_urlapplySettingsDictr3  r4  r{  r5  	Exceptionr   ry   r'   r   r  r  )r   r   settings
new_serialr  r	   r	   r
   rg    s8   





zMiniterm.change_portc              
   C   s   |    | j  tjd| jj d}| jjsdtjdjt	| j
d | j }|| j
kr6|   n.|dv r=d}n'z| j  W n ty_ } ztjd| W Y d}~nd}~ww | jjr|rl|   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 ---
)exitrR  Tz--- ERROR opening port: {} ---
Nz--- Port opened: {} ---
)r  r   r  r   ry   r'   r   r   is_openr   r  r   r$   r  r{  r  rg  r  )r   do_change_portr  r  r	   r	   r
   rh    s4   



zMiniterm.suspend_portc                 C   sZ   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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 versionrJ  rK  rL  rM  rQ  rI  rP  rN  rO  )ri   r  menur3  r4  brkr   infouploadr   filterr   )r   getattrr   r   r  r  r   r	   r	   r
   rd    s   zMiniterm.get_help_textN)Fr   r	   )Fr   )r5   r6   r7   r8   r   r  r  r  r  r   r  r   r'  r+  r>  r  r  rE  rc  re  rf  ri  rg  rh  rd  r	   r	   r	   r
   r     s.    




&Vr   %  c              
   C   s  ddl }|jdd}|jddd| d |jd	dtd
|d |d}|jdg ddd ddd |jddddd |jddddd |jdtd|d |jdtd|d |jd d!d"d#d$d% |jd&dd'dd |d(}|jd)d*dd+dd |jd,d-d.d/d0d1 |jd2d3d4d5d6g d7 |jd8g d9d:d d;d<d |jd=dd>dd |d?}|jd@tdAdBdCdD |jdEtdAdFdGdD |dH}|jdIdJddKdd |jdLddMdd | }|j|jkr|dN |j	rdO|j	v rt
jdP t
jdQdRdS tt D  t
jdQ t
dT |j	}ndUg}	 |jdu s#|jdVkrHzt |_W n ty>   t
jdQ |dW Y n
w |jsH|dX zdtj|j|j|j|j|jd$dY}	t|	dZsbdT|	_|jdur|js{t
jd[|jrwd\nd] |j|	_|j dur|jst
jd^|j rd\nd] |j |	_ t!|	tj"r|j#|	_#|	$  W n1 tj%y }
 z#t
jd_|j|
 |j&rƂ |j'st
dT ndV|_W Y d}
~
nd}
~
ww nqt(|	|j)|j*+ |d`}t,|j|_-t,|j|_.|j/|_/|0|j1 |2|j1 |js/t
jdaj|jdb t
jdct3|j-t3|j.t3|j.t3dd |4  z|d$ W n
 tyD   Y nw |jsOt
jde |  |5  dS )fzCommand line tool, entry pointr   Nz9Miniterm - A simple terminal program for the serial port.)descriptionr   rE   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ErO   rQ   rM   c                 S      |   S r/   r=  r   r	   r	   r
   r   G      zmain.<locals>.<lambda>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)srZ   )r  metavarr  r   z-fz--filterr   NAMEzadd text transformation)r  r  r  r   z--eol)r   r   r   c                 S   r  r/   r  r   r	   r	   r
   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                 s   r  )z{:<10} = {.__doc__}Nr  r  r	   r	   r
   r     r  zmain.<locals>.<genexpr>r   r   -z"user aborted and port is not givenzport is not given)rn  r<  r;  r  r  z--- forcing DTR {}
r.  r/  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_argumentrh   add_argument_group
parse_args	menu_char	exit_charerrorr  r   ry   r'   r   r   r  r  r  r   r   rD  r   r  r  rn  r<  r;  rm   timeoutr4  quietr   r3  
isinstanceSerialr  r{  r:  developaskr   r   r   r  r   r  r  r   r'  r  r+  r   r  r  )default_portdefault_baudratedefault_rtsdefault_dtrr  parsergroupr1   r   r  r  minitermr	   r	   r
   main-  s  








	0

r  __main__)Nr  NN).
__future__r   rv   r>   r   r  r   serial.tools.list_portsr   serial.toolsr   r   r   	NameErrorinputchrr   r   objectr   r  r   r]   rf   r;   r@   r   r   r   NotImplementedErrorr   r   r   r   r   r   r   r   r   r   r  r  r   r   r  r5   r	   r	   r	   r
   <module>   sz   	

-
T

   
, 
e
