
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
M]WV                 @   s  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d  ye
 W n ek
rr   eZ
eZY nX dd ZG dd	 d	eZejd
krd dlZd dlZG dd deZG dd deZnDejdkrd dlZd dlZd dlZG dd deZnedj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re*  dS )/    N)comports)hexlify_codecc             C   s   | dkrt j S d S )NZhexlify)r   getregentry)c r   /usr/lib/python3.6/miniterm.py<lambda>   s    r   c             C   s.   t | }|dk r"djt d| S t| S dS )z)generate a readable description for a key    z	Ctrl+{:c}@N)ordformatrepr)	characterZ
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   )r   r   )sysversion_infostdoutbufferbyte_outputoutput)selfr   r   r   __init__,   s    
zConsoleBase.__init__c             C   s   dS )z.Set console to read single characters, no echoNr   )r   r   r   r   setup3   s    zConsoleBase.setupc             C   s   dS )z Restore default console settingsNr   )r   r   r   r   cleanup6   s    zConsoleBase.cleanupc             C   s   dS )z"Read a single key from the consoleNr   )r   r   r   r   getkey9   s    zConsoleBase.getkeyc             C   s   | j j| | j j  dS )zWrite bytes (already encoded)N)r   writeflush)r   Zbyte_stringr   r   r   write_bytes=   s    zConsoleBase.write_bytesc             C   s   | j j| | j j  dS )zWrite stringN)r   r   r   )r   textr   r   r   r   B   s    zConsoleBase.writec             C   s   dS )zCancel getkey operationNr   )r   r   r   r   cancelG   s    zConsoleBase.cancelc             C   s   | j   | S )N)r   )r   r   r   r   	__enter__N   s    zConsoleBase.__enter__c             O   s   | j   d S )N)r   )r   argskwargsr   r   r   __exit__R   s    zConsoleBase.__exit__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r!   r"   r%   r   r   r   r   r   )   s   r   ntc               @   s(   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 )N)fd)r   r,   r   r   r   r   ]   s    zOut.__init__c             C   s   d S )Nr   )r   r   r   r   r   `   s    z	Out.flushc             C   s   t j| j| d S )N)osr   r,   )r   sr   r   r   r   c   s    z	Out.writeN)r&   r'   r(   r)   r   r   r   r   r   r   r   r+   Z   s   r+   c                   s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	Consolec                s   t t| j  tjjj | _tjjj | _	tjjj
d tjjjd tjdttjj d| _tjdttjj dt_| jt_d| j_d S )Ni  zUTF-8replace)superr/   r   ctypeswindllkernel32ZGetConsoleOutputCP
_saved_ocpZGetConsoleCP
_saved_icpSetConsoleOutputCPSetConsoleCPcodecs	getwriterr+   r   r   filenor   stderrencoding)r   )	__class__r   r   r   g   s    zConsole.__init__c             C   s$   t jjj| j t jjj| j d S )N)r2   r3   r4   r7   r5   r8   r6   )r   r   r   r   __del__s   s    zConsole.__del__c             C   sH   xBt j }|tdkrtdS |tdtdfkr<t j  q|S qW d S )N   
   r      )msvcrtZgetwchunichr)r   zr   r   r   r   w   s    
zConsole.getkeyc             C   s$   t jjj }t jjj|ddd d S )N   r@   r   )r2   r3   r4   ZGetConsoleWindowZuser32ZPostMessageA)r   Zhwndr   r   r   r!      s    zConsole.cancel)r&   r'   r(   r   r?   r   r!   __classcell__r   r   )r>   r   r/   f   s   
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                sr   t t| j  tjj | _tj \| _	| _
tj| j| _tj| j tjdk rftjtjjtj| _ntj| _d S )Nr   r   )r   r   )r1   r/   r   r   stdinr;   r,   r-   pipepipe_rpipe_wtermios	tcgetattroldatexitregisterr   r   r9   	getreaderr=   	enc_stdin)r   )r>   r   r   r      s    
zConsole.__init__c             C   sb   t j| j}|d t j @ t j @ t j @ |d< d|d t j< d|d t j< t j| jt j	| d S )Nr         r   )
rM   rN   r,   ZICANONZECHOZISIGZVMINZVTIME	tcsetattrZTCSANOW)r   newr   r   r   r      s
    $zConsole.setupc             C   s^   t j | j| jgg g d \}}}| j|kr:tj| jd d S | jjd}|tdkrZtd}|S )NrT         )selectrS   rK   r-   readrD   )r   Zready_r   r   r   r   r      s    
zConsole.getkeyc             C   s   t j| jd d S )Nx)r-   r   rL   )r   r   r   r   r!      s    zConsole.cancelc             C   s   t j| jt j| j d S )N)rM   rV   r,   Z	TCSAFLUSHrO   )r   r   r   r   r      s    zConsole.cleanup)	r&   r'   r(   r   r   r   r!   r   rG   r   r   )r>   r   r/      s
   
z9Sorry no implementation for your platform ({}) available.c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )		Transformz&do-nothing: forward all data unchangedc             C   s   |S )ztext received from serial portr   )r   r    r   r   r   rx   s    zTransform.rxc             C   s   |S )ztext to be sent to serial portr   )r   r    r   r   r   tx   s    zTransform.txc             C   s   |S )z(text to be sent but displayed on consoler   )r   r    r   r   r   echo   s    zTransform.echoN)r&   r'   r(   r)   r_   r`   ra   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   s   |j ddS )N
z
)r0   )r   r    r   r   r   r`      s    zCRLF.txN)r&   r'   r(   r)   r`   r   r   r   r   rb      s   rb   c               @   s    e Zd ZdZdd Zdd ZdS )CRzENTER sends CRc             C   s   |j ddS )Nrc   )r0   )r   r    r   r   r   r_      s    zCR.rxc             C   s   |j ddS )Nrc   re   )r0   )r   r    r   r   r   r`      s    zCR.txN)r&   r'   r(   r)   r_   r`   r   r   r   r   rd      s   rd   c               @   s   e Zd ZdZdS )LFzENTER sends LFN)r&   r'   r(   r)   r   r   r   r   rf      s   rf   c               @   sB   e Zd ZdZedd edD Zejddd dd	 ZeZ	d
S )
NoTerminalz0remove typical terminal control codes from inputc             c   s&   | ]}t |d kr|d| fV  qdS )z
	i $  N)rD   ).0r]   r   r   r   	<genexpr>   s    zNoTerminal.<genexpr>r	   i!$  i%$  )rX      c             C   s   |j | jS )N)	translateREPLACEMENT_MAP)r   r    r   r   r   r_      s    zNoTerminal.rxN)
r&   r'   r(   r)   dictrangerl   updater_   ra   r   r   r   r   rg      s   
rg   c               @   s8   e Zd ZdZedd edD Zejdddd d	S )

NoControlsz%Remove all control codes, incl. CR+LFc             c   s   | ]}|d | fV  qdS )i $  Nr   )rh   r]   r   r   r   ri      s    zNoControls.<genexpr>r	   i#$  i!$  i%$  )r	   rX   rj   N)r&   r'   r(   r)   rm   rn   rl   ro   r   r   r   r   rp      s   rp   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 }x|D ]x}d|  ko dk n  s.|dkr:|j | q
|dk rZ|j tdt|  q
|jdd djt|D  |j d q
W dj|S )	N z
	i $  c             s   s"   | ]}t d t| d V  qdS )i   0   N)rD   r   )rh   dr   r   r   ri     s    zPrintable.rx.<locals>.<genexpr>z{:d} )appendrD   r   extendr   join)r   r    rr   r   r   r   r_      s    
 zPrintable.rxN)r&   r'   r(   r)   r_   ra   r   r   r   r   rq      s   rq   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Colorizez,Apply different colors for received and echoc             C   s   d| _ d| _d S )Nz[37mz[31m)input_color
echo_color)r   r   r   r   r     s    zColorize.__init__c             C   s
   | j | S )N)r|   )r   r    r   r   r   r_     s    zColorize.rxc             C   s
   | j | S )N)r}   )r   r    r   r   r   ra     s    zColorize.echoN)r&   r'   r(   r)   r   r_   ra   r   r   r   r   r{   
  s   r{   c               @   s    e Zd ZdZdd Zdd ZdS )DebugIOzPrint what is sent and receivedc             C   s$   t jjdjt| t jj  |S )Nz	 [RX:{}] )r   r<   r   r   r   r   )r   r    r   r   r   r_     s    
z
DebugIO.rxc             C   s$   t jjdjt| t jj  |S )Nz	 [TX:{}] )r   r<   r   r   r   r   )r   r    r   r   r   r`   !  s    
z
DebugIO.txN)r&   r'   r(   r)   r_   r`   r   r   r   r   r~     s   r~   )crlfZcrZlf)ZdirectdefaultZ	nocontrolZ	printableZcolorizedebugc              C   s   t jjd g } xBttt dD ].\}\}}}t jjdj||| | j| q"W xdtd}y:t	|d }d|  kot
| k n  st jjd wVW n tk
r   Y n
X | | }|S d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:
rT   z--- {:2}: {:20} {}
z#--- Enter port index or full name: r   z--- Invalid index!
N)r   r<   r   	enumeratesortedr   r   rw   	raw_inputintlen
ValueError)ZportsnportZdescZhwidindexr   r   r   ask_for_port<  s      r   c               @   s   e Zd ZdZddf fddZdd Zdd	 Zd
d Zdd Zd$ddZ	dd Z
dd Zd%ddZd&ddZdd Zdd Zdd Zdd  Zd!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   c             C   sh   t  | _|| _|| _d| _d| _d| _|| _|| _| j	  d| _
d| _d | _d | _d | _d | _d | _d S )NFzUTF-8      )r/   consoleserialra   rawinput_encodingoutput_encodingeolfiltersupdate_transformationsexit_charactermenu_characteralive_reader_alivereceiver_thread
rx_decoderZ
tx_decoder)r   serial_instancera   r   r   r   r   r   r   [  s     zMiniterm.__init__c             C   s.   d| _ tj| jdd| _d| j_| jj  dS )zStart reader threadTr_   )targetnameN)r   	threadingThreadreaderr   daemonstart)r   r   r   r   _start_readerm  s    zMiniterm._start_readerc             C   s*   d| _ t| jdr| jj  | jj  dS )z6Stop reader thread only, wait for clean exit of threadFcancel_readN)r   hasattrr   r   r   ry   )r   r   r   r   _stop_readeru  s    
zMiniterm._stop_readerc             C   s@   d| _ | j  tj| jdd| _d| j_| jj  | jj	  dS )zstart worker threadsTr`   )r   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   s2   | j j  |s.t| jdr$| jj  | jj  dS )z$wait for worker threads to terminater   N)r   ry   r   r   r   r   )r   Ztransmit_onlyr   r   r   ry     s
    

zMiniterm.joinc             C   s   | j j  d S )N)r   close)r   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)rh   fr   r   r   
<listcomp>  s   z3Miniterm.update_transformations.<locals>.<listcomp>c             S   s   g | ]
}| qS r   r   )rh   tr   r   r   r     s    N)EOL_TRANSFORMATIONSr   r   tx_transformationslistreversedrx_transformations)r   Ztransformationsr   r   r   r     s    zMiniterm.update_transformationsr0   c             C   s   || _ tj||| _dS )zset encoding for received dataN)r   r9   getincrementaldecoderr   )r   r=   errorsr   r   r   set_rx_encoding  s    zMiniterm.set_rx_encodingc             C   s   || _ tj||| _dS )z!set encoding for transmitted dataN)r   r9   getincrementalencoder
tx_encoder)r   r=   r   r   r   r   set_tx_encoding  s    zMiniterm.set_tx_encodingc             C   sN  t jjdj| jd t jjdj| jjr,dnd| jjr:dnd| jjrHdnd yLt jjdj| jjrhdnd| jj	rvdnd| jj
rdnd| jjrdnd W n tjk
r   Y nX t jjdj| jjrdnd t jjdj| jjrd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 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: {}
z--- serial input encoding: {}
z--- serial output encoding: {}
z--- EOL: {}
z--- filters: {}
rr   N)r   r<   r   r   r   rtsdtrbreak_conditionZctsZdsrZriZcdSerialExceptionxonxoffrtsctsr   r   r   upperry   r   )r   r   r   r   dump_port_settings  s(    


zMiniterm.dump_port_settingsc             C   s   ytxn| j rp| jrp| jj| jjp d}|r| jr<| jj| q| jj	|}x| j
D ]}|j|}qPW | jj| qW W n( tjk
r   d| _ | jj   Y nX dS )zloop and copy serial->consolerT   FN)r   r   r   r[   Z
in_waitingr   r   r   r   decoder   r_   r   r   r!   )r   datar    transformationr   r   r   r     s    
zMiniterm.readerc             C   s   d}yx| j ry| jj }W n tk
r4   d}Y nX | j s>P |rR| j| d}q|| jkrbd}q|| jkrx| j  P q|}x| jD ]}|j	|}qW | j
j| jj| | jr|}x| jD ]}|j|}qW | jj| qW W n   d| _  Y nX dS )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   encodera   )r   Zmenu_activer   r    r   Z	echo_textr   r   r   r     s:    



zMiniterm.writerc             C   s  || j ks|| jkr>| jj| jj| | jr:| jj| nZ|dkr:tj	jd tj	j
  | j tjj jd}|r,yvt|dP}tj	jdj| x6|jd}|sP | jj| | jj
  tj	jd qW W dQ R X tj	jd	j| W n8 tk
r* } ztj	jd
j|| W Y dd}~X nX W dQ R X n^|dkrXtj	j| j  n@|dkr| jj | j_tj	jdj| jjrdnd n|dkr| jj | j_tj	jdj| jjrdnd n|dkr| jj | j_tj	jdj| jjr dnd n|dkrB| j | _tj	jdj| jr6dnd nV|dkrtj	jd tj	jdjdd ttj D  tj	jdjdj| j | j tjj j j }W dQ R X |r x>|D ](}|tkrtj	jdjt| P qW || _| j  tj	jdjdj| j nz|dkrtt }|j!| j"d  }|t#|krRd!}|| | _"tj	jd"j| j"j$  | j  n|d#kr<tj	jd$j| j% | j tjj j& }	W dQ R X |	ryt'j(|	 W n( t)k
r   tj	jd%j|	 Y nX | j*|	 | j+|	 tj	jd&j| j% tj	jd'j| j, n\|d(krR| j-  nF|d)krn| j, y
t. }
W n t/k
r   d}
Y nX W dQ R X |
r|
| jj0kr| j1  | jj2 }yBtj3|
d*d+}|j4| | jj|_| jj|_|j  | jj|_W n> t5k
r: } z tj	jd,j| |j6  W Y dd}~X n(X | jj6  || _tj	jd-j| jj0 | j7  n*|d.krtj	jd/ tj	j
  | jp | jj8}yt9tjj j& | j_8W n> t:k
r } z tj	jd0j| || j_8W Y dd}~X n
X | j-  W dQ R X n|d1kr.tj;| j_<| j-  nj|d2krNtj=| j_<| j-  nJ|d3krntj>| j_?| j-  n*|d4krtj@| j_?| j-  n
|d5krtjA| j_?| j-  n|d6krtjB| j_?| j-  n|d7krtjC| j_?| j-  n|d8krtjD| j_E| j-  n|d9kr$tjF| j_E| j-  nt|d:krBtjG| j_E| j-  nV|d;krb|d<k| j_H| j-  n6|d=kr|d>k| j_I| j-  ntj	jd?jtJ| dS )@z"Implement a simple menu / settingsz
--- File to upload: z
rbz--- Sending file {} ---
i   .Nz
--- File {} sent ---
z"--- ERROR opening file {}: {} ---
zhH?z--- RTS {} ---
r   r   z--- DTR {} ---
z--- BREAK {} ---
z--- local echo {} ---
z
--- Available Filters:
rc   c             s   s   | ]\}}d j ||V  qdS )z---   {:<10} = {.__doc__}N)r   )rh   kvr   r   r   ri   $  s   z+Miniterm.handle_menu_key.<locals>.<genexpr>z$
--- Enter new filter name(s) [{}]: rr   z--- unknown filter: {}z--- filters: {}
rT   r   z--- EOL: {} ---
z#
--- Enter new encoding name [{}]: z--- invalid encoding name: {}
z--- serial input encoding: {}
z--- serial output encoding: {}
	ZpPT)do_not_openz#--- ERROR opening new port: {} ---
z--- Port changed to: {} ---
ZbBz
--- Baudrate: z#--- ERROR setting baudrate: {} ---
87ZeEZoOZmMZsSZnN123ZxXXZrRRz!--- unknown menu character {} --
)Kr   r   r   r   r   r   ra   r   r   r<   r   rI   readlinerstripopenr   r[   IOErrorget_help_textr   r   r   ry   r   r   itemsr   lowersplitr   r   r   r   r   r   r   r   r   stripr9   lookupLookupErrorr   r   r   r   r   r   r   r   ZgetSettingsDictserial_for_urlZapplySettingsDict	Exceptionr   r   baudrater   r   Z	EIGHTBITSZbytesizeZ	SEVENBITSZPARITY_EVENparityZ
PARITY_ODDZPARITY_MARKZPARITY_SPACEZPARITY_NONEZSTOPBITS_ONEZstopbitsZSTOPBITS_TWOZSTOPBITS_ONE_POINT_FIVEr   r   r   )r   r   filenamer   blockeZnew_filtersZmodesr   Znew_encodingr   ZsettingsZ
new_serialZbackupr   r   r   r     s&   



4

$
$
$

"
















































zMiniterm.handle_menu_keyc             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 textaQ  
--- pySerial ({version}) - miniterm - help
---
--- {exit:8} Exit program
--- {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   )versionexitZmenur   r   Zbrkra   infoZuploadr   filterr   )r   getattrr   r   r   r   )r   r   r   r   r     s    zMiniterm.get_help_textN)F)r0   )r0   )r&   r'   r(   r)   r   r   r   r   r   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   U  s"   



& $r   %  c             C   s  ddl }|jdd}|jddd| d |jd	dtd
|d |jd}|jddddddg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 |jd%}|jd&d'dd(dd |jd)d*d+d,d-d. |jd/d0d1d2d3g d4 |jd5d6d7d8gd9d d:d8d |jd;dd<dd |jd=}|jd>td?d@dAdB |jdCtd?dDdEdB |jdF}|jdGdHddIdd |jdJddKdd |j }|j|jkr|jdL |j	rdM|j	krt
jjdN t
jjdOjdPdQ ttj D  t
jjdO t
jdR |j	}ndSg}x|jdks>|jdTkryt |_W n, tk
rv   t
jjdO |jdU Y nX |js|jdV ytj|j|j|j|j|jdWdX}	t|	dYsdR|	_|jdk	r|jst
jjdZj|jrd[nd\ |j|	_|j dk	r2|js*t
jjd]j|j r"d[nd\ |j |	_ |	j!  W nd tj"k
r }
 zDt
jjd^jt#|j|
 |j$rv |j%st
jdR ndT|_W Y dd}
~
X nX P q&W t&|	|j'|j(j) |d_}t*|j|_+t*|j|_,|j-|_-|j.|j/ |j0|j/ |jsFt
jjd`j|jda t
jjdbjt1|j+t1|j,t1|j,t1dc |j2  y|jdW W n tk
rr   Y nX |jst
jjdd |j  |j3  dS )ezCommand line tool, entry pointr   Nz9Miniterm - A simple terminal program for the serial port.)descriptionr   ?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EOSMc             S   s   | j  S )N)r   )r   r   r   r   r     s    zmain.<locals>.<lambda>z*set parity, one of {N E O S M}, default: N)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--askz"ask again for port when open failszdata handlingz-ez--echozenable local echo (default off)z
--encodingserial_port_encodingZCODECzXset the encoding for the serial port (e.g. hexlify, Latin1, UTF-8), default: %(default)szUTF-8)destmetavarr   r   z-fz--filterrw   NAMEzadd text transformation)r  r  r   r   z--eolrd   rf   rb   c             S   s   | j  S )N)r   )r   r   r   r   r     s    zend of line modez--rawz)Do no apply any encodings/transformationsZhotkeysz--exit-charZ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   Z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:
rc   c             s   s   | ]\}}d j ||V  qdS )z{:<10} = {.__doc__}N)r   )rh   r   r   r   r   r   ri   M  s   zmain.<locals>.<genexpr>rT   r   -z"user aborted and port is not givenzport is not givenT)r   r   r   r   r   z--- forcing DTR {}
r   r   z--- forcing RTS {}
zcould not open port {}: {}
)ra   r   r   zP--- Miniterm on {p.name}  {p.baudrate},{p.bytesize},{p.parity},{p.stopbits} ---
)r   z6--- Quit: {} | Menu: {} | Help: {} followed by {} ---
z
--- exit ---
)4argparseArgumentParseradd_argumentr   Zadd_argument_group
parse_argsZ	menu_charZ	exit_charerrorr   r   r<   r   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ztimeoutr   quietr   r   r   r   r   ZdevelopZaskr   ra   r   r   rD   r   r   r   r   r	  r   r   r   r   )Zdefault_portZdefault_baudrateZdefault_rtsZdefault_dtrr  parsergroupr#   r   r   r   Zminitermr   r   r   main  s^   









r  __main__)Nr   NN),r9   r-   r   r   r   Zserial.tools.list_portsr   Zserial.toolsr   rQ   r   	NameErrorinputchrrD   r   objectr   r   rC   r2   r+   r/   rP   rM   rZ   NotImplementedErrorr   platformr^   rb   rd   rf   rg   rp   rq   r{   r~   r   r   r   r   r  r&   r   r   r   r   <module>
   sh   

-
!
&
  t
 [
