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 )NZ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)	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   )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   Z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+   r-   r0   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   r9   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%   r9   )r   sr   r   r	   r%   f   s   z	Out.writeN)r2   r3   r4   r5   r   r&   r%   r   r   r   r	   r8   ]   s
    r8   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  Z10.   iZ)     r   LPDWORDUTF-8replace)&superr=   r   ctypeswindllkernel32ZGetConsoleOutputCP
_saved_ocpZGetConsoleCP
_saved_icpSetConsoleOutputCPSetConsoleCPplatformreleaseintversionsplitZctypes.wintypeswintypeshasattrZPOINTERZDWORDrT   SetConsoleModeGetConsoleModeGetStdHandleZbyrefvalue	_saved_cmcodecs	getwriterr8   r   r   filenor   stderrencoding)r   Z"ENABLE_VIRTUAL_TERMINAL_PROCESSINGre   rg   rh   ri   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 )NrU   )rY   rZ   r[   r^   r\   r_   r]   rg   ri   rk   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      )msvcrtZ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   rw   r   )rY   rZ   r[   ZGetConsoleWindowZuser32ZPostMessageA)r   Zhwndr   r   r	   r+      s   Console.cancel)
r2   r3   r4   r|   r}   r   rv   r"   r+   __classcell__r   r   rr   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   )rX   r=   r   r   stdinrn   r9   termios	tcgetattroldatexitregisterr!   r   rl   	getreaderrp   	enc_stdinr   rr   r   r	   r      s   
rt   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   r9   ZICANONZECHOZISIGZVMINZVTIME	tcsetattrZ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    )fcntlZioctlr9   r   ZTIOCSTIr   r   r   r	   r+      s   r   c                 C   s   t | jt j| j d S r,   )r   r   r9   Z	TCSAFLUSHr   r   r   r   r	   r!      s   zConsole.cleanup)	r2   r3   r4   r   r   r"   r+   r!   r   r   r   rr   r	   r=      s    
z9Sorry no implementation for your platform ({}) available.c                   @   r7   )		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)r2   r3   r4   r5   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

rW   r)   r   r   r	   r      r1   zCRLF.txN)r2   r3   r4   r5   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      r1   zCR.rxc                 C   r   )Nr   r   r   r)   r   r   r	   r     r1   zCR.txNr2   r3   r4   r5   r   r   r   r   r   r	   r      s    r   c                   @   s   e Zd ZdZdS )LFzENTER sends LFN)r2   r3   r4   r5   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     r1   zNoTerminal.rxN)
r2   r3   r4   r5   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)r2   r3   r4   r5   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)r2   r3   r4   r5   r   r   r   r   r   r	   r   '  s    r   c                   @   r7   )	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)r2   r3   r4   r5   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   ro   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   )crlfZcrZlf)ZdirectdefaultZ	nocontrolZ	printableZ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   ro   r%   	enumeratesortedr   r   r   	raw_inputrb   len
ValueError)ZportsnportZdescZ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 )NFrV         )r=   consoleserialr   rawinput_encodingoutput_encodingeolfiltersupdate_transformationsr{   exit_charactermenu_characteralive_reader_alivereceiver_thread
rx_decoderZ
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   rf   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   rf   r   r   r   )r   Z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   Ztransformationsr   r   r	   r     s
   zMiniterm.update_transformationsrW   c                 C      || _ t||| _dS )zset encoding for received dataN)r   rl   getincrementaldecoderr   r   rp   errorsr   r   r	   set_rx_encoding     zMiniterm.set_rx_encodingc                 C   r   )z!set encoding for transmitted dataN)r   rl   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   ro   r%   r   r   rtsdtrbreak_conditionZctsZdsrZriZ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   Z
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   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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: {} ---
	pPZzZZbB87ZeEZoOZmMZsSZnN123ZxXXZrRrM   ZqQz!--- unknown menu character {} --
N).r   r   r   r%   r  r  r   r   upload_filer   ro   get_help_textr  r   r  r  change_filterr   r   r   r   r   r  r   change_encodingr  change_portsuspend_portchange_baudrateZ	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   r   Zmodesr   r   r   r	   r  '  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   rQ   Nz
--- File {} sent ---
z"--- ERROR opening file {}: {} ---
)r   ro   r%   r&   r   r   readlinerstripopenr   r   r   IOError)r   filenamer   blocker   r   r	   r-  }  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}
r  )r   ro   r%   r   r   r   itemsr   r   r   r   r6  lowerrd   r   )r   Znew_filtersr   r   r   r	   r/    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: {}
r  r  )r   ro   r%   r   r   r   r   r6  striprl   lookupLookupErrorr  r  r   )r   Znew_encodingr   r   r	   r0    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   ro   r%   r&   r   r   baudraterb   r   r6  rE  r   r   r  )r   Zbackupr<  r   r   r	   r3    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   r  r   r   r   ZgetSettingsDictserial_for_urlZapplySettingsDictr  r  r8  r  	Exceptionr   ro   r%   r   r   r   )r   r   ZsettingsZ
new_serialr<  r   r   r	   r1    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 ---
)exitr&  Tz--- ERROR opening port: {} ---
Nz--- Port opened: {} ---
)r   r   r   r   ro   r%   r   r   Zis_openr   r   r   r"   r   r8  rK  r1  r   )r   Zdo_change_portr@  r<  r   r   r	   r2    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
ZVERSIONzunknown versionr  r  r   r!  r%  r  r$  r"  r#  )rc   rL  Zmenur  r  Zbrkr   infoZuploadr   filterr   )r   getattrr   r   r   r   r   r   r   r	   r.    s   zMiniterm.get_help_textN)Fr   r   )Fr   )r2   r3   r4   r5   r   r   r   r   r   r   r   r   r  r  r  r   r   r  r-  r/  r0  r3  r1  r2  r.  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   rB   z(serial port name ("-" to show port list))nargshelpr   rH  z#set baud rate, default: %(default)s)rR  typerS  r   zport settingsz--parity)NErL   rN   rJ   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: NrU  )choicesrT  rS  r   z--rtscts
store_truez)enable RTS/CTS flow control (default off)F)actionrS  r   z	--xonxoffz*enable software flow control (default off)z--rtsz2set initial RTS line state (possible values: 0, 1))rT  rS  r   z--dtrz2set initial DTR line state (possible values: 0, 1)z--non-exclusive	exclusivestore_falsez disable locking for native portsT)destr\  rS  r   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)srV   )r_  metavarrS  r   z-fz--filterr   NAMEzadd text transformation)r\  ra  rS  r   z--eol)r   r   r   c                 S   rW  r,   rX  r   r   r   r	   r
     rY  zend of line moder   z--rawz)Do no apply any encodings/transformationsZhotkeysz--exit-charZNUMzWUnicode of special character that is used to exit the application, default: %(default)sr   )rT  ra  rS  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-charrS  zAvailable filters:
r   c                 s   r=  )z{:<10} = {.__doc__}Nr>  r?  r   r   r	   r     rB  zmain.<locals>.<genexpr>r   r   -z"user aborted and port is not givenzport is not given)r4  r  r  rI  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_argumentrb   add_argument_group
parse_argsZ	menu_charZ	exit_charerrorrN  r   ro   r%   r   r   r   rC  rL  r   r   r  r   rJ  rH  r4  r  r  rf   Ztimeoutr  quietr   r  
isinstanceZSerialr]  r8  r  ZdevelopZaskr   r   r   rD  r{   r   r   r   r  r`  r  r   r   r   )Zdefault_portZdefault_baudrateZdefault_rtsZdefault_dtrre  parsergroupr.   r   r   r<  Zminitermr   r   r	   main-  s  








	0

ro  __main__)NrP  NN).Z
__future__r   rl   r;   r   r   r   Zserial.tools.list_portsr   Zserial.toolsr   r   r   	NameErrorinputchrr{   r   objectr   r   rz   rY   r`   r8   r=   r   r   r   NotImplementedErrorr   r   r   r   r   r   r   r   r   r   r   r   r   r   ro  r2   r   r   r   r	   <module>   sz   	

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