U
    ~dГ                     @   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k
r~   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d dlZG dd deZG dd deZnFejdkrd 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 )0    )absolute_importN)comports)hexlify_codecc                 C   s   | dkrt  S d S )Nhexlify)r   getregentryc r	   R/var/www/html/myproject/myenv/lib/python3.8/site-packages/serial/tools/miniterm.py<lambda>       r   c                 C   s.   t | }|dk r"d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   )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
   setup5   s    zConsoleBase.setupc                 C   s   dS )z Restore default console settingsNr	   r   r	   r	   r
   cleanup8   s    zConsoleBase.cleanupc                 C   s   dS )z"Read a single key from the consoleNr	   r   r	   r	   r
   getkey;   s    zConsoleBase.getkeyc                 C   s   | 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   dS )zWrite stringN)r   r#   r$   r   textr	   r	   r
   r#   D   s    zConsoleBase.writec                 C   s   dS )zCancel getkey operationNr	   r   r	   r	   r
   cancelI   s    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   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 r)   )fd)r   r4   r	   r	   r
   r   `   s    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#   r4   )r   sr	   r	   r
   r#   f   s    z	Out.writeN)r.   r/   r0   r1   r   r$   r#   r	   r	   r	   r
   r3   ]   s   r3   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rtt dd dkrd}dd lm} t|dst|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)&superr7   r   ctypeswindllkernel32ZGetConsoleOutputCP
_saved_ocpZGetConsoleCP
_saved_icpSetConsoleOutputCPSetConsoleCPplatformreleaseintversionsplitZctypes.wintypeswintypeshasattrZPOINTERZDWORDrO   SetConsoleModeGetConsoleModeGetStdHandleZbyrefvalue	_saved_cmcodecs	getwriterr3   r   r   filenor   stderrencoding)r   Z"ENABLE_VIRTUAL_TERMINAL_PROCESSINGr`   rb   rc   rd   mode	__class__r	   r
   r      s,    &



Console.__init__c                 C   sZ   t jj| j t jj| j z t jjt jjd| j	 W n t
k
rT   Y nX d S )NrP   )rT   rU   rV   rY   rW   rZ   rX   rb   rd   rf   AttributeErrorr   r	   r	   r
   __del__   s     zConsole.__del__c                 C   s   t  }|tdkrtdS |tdks4|tdkr|z0t  }|tdkrV| j| W S | j| W S W q tk
rx   Y qX q |S q d S )N   
   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   rr   r   )rT   rU   rV   ZGetConsoleWindowZuser32ZPostMessageA)r   Zhwndr	   r	   r
   r(      s    Console.cancel)
r.   r/   r0   rx   ry   r   rq   r"   r(   __classcell__r	   r	   rm   r
   r7   i   s4   r7   posixc                       s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )r7   c                    sb   t t|   tj | _t| j| _	t
| j tjdk rVttjjtj| _ntj| _d S r   )rS   r7   r   r   stdinri   r4   termios	tcgetattroldatexitregisterr!   r   rg   	getreaderrk   	enc_stdinr   rm   r	   r
   r      s    
ro   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   r4   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   readrw   )r   r   r	   r	   r
   r"      s    r}   c                 C   s   t | jtjd d S )N    )fcntlioctlr4   r   TIOCSTIr   r	   r	   r
   r(      s    r   c                 C   s   t | jt j| j d S r)   )r   r   r4   	TCSAFLUSHr   r   r	   r	   r
   r!      s    zConsole.cleanup)	r.   r/   r0   r   r    r"   r(   r!   r   r	   r	   rm   r
   r7      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
   rx   s    zTransform.rxc                 C   s   |S )ztext to be sent to serial portr	   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
   echo   s    zTransform.echoN)r.   r/   r0   r1   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   s   | ddS )N

rR   r&   r	   r	   r
   r      s    zCRLF.txN)r.   r/   r0   r1   r   r	   r	   r	   r
   r      s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )CRzENTER sends CRc                 C   s   | ddS )Nr   r   r&   r	   r	   r
   r      s    zCR.rxc                 C   s   | ddS )Nr   r   r   r&   r	   r	   r
   r     s    zCR.txNr.   r/   r0   r1   r   r   r	   r	   r	   r
   r      s   r   c                   @   s   e Zd ZdZdS )LFzENTER sends LFN)r.   r/   r0   r1   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 kr|d| fV  qdS )
	 $  N)rw   .0xr	   r	   r
   	<genexpr>  s      zNoTerminal.<genexpr>r   !$  %$  )r      c                 C   s   | | jS r)   )	translateREPLACEMENT_MAPr&   r	   r	   r
   r     s    zNoTerminal.rxN)
r.   r/   r0   r1   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)r.   r/   r0   r1   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 ]v}d|  kr dk s*n |dkr6| | q|dk rV| 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)rw   r   )r   dr	   r	   r
   r   2  s     zPrintable.rx.<locals>.<genexpr>z{:d} )appendrw   r   extendr   join)r   r'   rr   r	   r	   r
   r   *  s    zPrintable.rxN)r.   r/   r0   r1   r   r   r	   r	   r	   r
   r   '  s   r   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_colorr   r	   r	   r
   r   <  s    zColorize.__init__c                 C   s
   | j | S r)   )r   r&   r	   r	   r
   r   A  s    zColorize.rxc                 C   s
   | j | S r)   )r   r&   r	   r	   r
   r   D  s    zColorize.echoN)r.   r/   r0   r1   r   r   r   r	   r	   r	   r
   r   9  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d| t j  |S )Nz [RX:{!r}] r   rj   r#   r   r$   r&   r	   r	   r
   r   K  s    
z
DebugIO.rxc                 C   s    t jd| t j  |S )Nz [TX:{!r}] r   r&   r	   r	   r
   r   P  s    
z
DebugIO.txNr   r	   r	   r	   r
   r   H  s   r   )crlfcrlf)directdefaultZ	nocontrol	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 sn t jd W qPW n tk
r   Y n
X | | }|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}
z#--- Enter port index or full name: r   z--- Invalid index!
N)r   rj   r#   	enumeratesortedr   r   r   	raw_inputr]   len
ValueError)Zportsnport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d4d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 )5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 )NFrQ         )r7   consoleserialr   rawinput_encodingoutput_encodingeolfiltersupdate_transformationsrw   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   ra   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   s2   | j   |s.t| jdr$| j  | j  dS )z$wait for worker threads to terminater   N)r   r   ra   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_transformationsrR   c                 C   s   || _ t||| _dS )zset encoding for received dataN)r   rg   getincrementaldecoderr   r   rk   errorsr	   r	   r
   set_rx_encoding  s    zMiniterm.set_rx_encodingc                 C   s   || _ t||| _dS )z!set encoding for transmitted dataN)r   rg   getincrementalencoder
tx_encoderr  r	   r	   r
   set_tx_encoding  s    zMiniterm.set_tx_encodingc                 C   sN  t jdj| jd t jd| jjr,dnd| jjr:dnd| jjrHdnd zLt jd| 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d| jjrdnd t jd| jjrd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   rj   r#   r   r   rtsdtrbreak_conditionZctsZdsrricdSerialExceptionxonxoffrtsctsr   r   r   upperr   r   r   r	   r	   r
   dump_port_settings  s.    



zMiniterm.dump_port_settingsc                 C   s   zl| j rj| jrj| j| jjpd}|r| jr:| j| q| j	|}| j
D ]}||}qL| j| qW n( tjk
r   d| _ | j   Y nX dS )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}z| j rz| j }W n tk
r2   d}Y nX | j s<q|rP| | d}q|| jkr`d}q|| jkrv|   qq|}| jD ]}|	|}q| j
| j| | jr|}| jD ]}||}q| j| q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  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| n|dkrR|   n|dkrnt	j
|   nh|dkr| jj | j_t	j
d| jjrdnd n0|dkr| jj | j_t	j
d| jjrdnd n|d	kr| jj | j_t	j
d
| jjrdnd n|dkrP| j | _t	j
d| jrDdnd n|dkrf|   np|dkrtt}|| jd }|t|krd}|| | _t	j
d| j  |   n|dkr|   n|dkr|   n|dkr
|   n|dkr |   n|dkr6|   n|dkrVtj| j_|   n|dkrvtj| j_|   n`|dkrtj | j_!|   n@|dkrtj"| j_!|   n |dkrtj#| j_!|   n |dkrtj$| j_!|   n|dkrtj%| j_!|   n|dkr0tj&| j_'|   n|dkrNtj(| j_'|   n|d krltj)| j_'|   nj|d!kr|d"k| j_*|   nJ|d#kr|d$k| j_+|   n*|d%kr| ,  n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3xXXZrRrG   ZqQz!--- unknown menu character {} --
N).r   r   r   r#   r  r   r   r   upload_filer   rj   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   modesr   r	   r	   r
   r  '  s    ""
$

"






































zMiniterm.handle_menu_keyc                 C   s   t jd t j  | j t j d}|rzrt|dL}t jd	| |
d}|sbq| j| | j  t jd qRW 5 Q R X t jd	| W n6 tk
r } zt jd	|| W 5 d	}~X Y nX W 5 Q R X d	S )
z,Ask user for filenname and send its contentsz
--- File to upload: r   rbz--- Sending file {} ---
i   rL   z
--- File {} sent ---
z"--- ERROR opening file {}: {} ---
N)r   rj   r#   r$   r   r   readlinerstripopenr   r   r   IOError)r   filenamer   blocker	   r	   r
   r2  }  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 5 Q R X |r|D ]"}|tkrvt jd|  qqv|| _|   t jdd| j d	S )
zchange the i/o transformationsz
--- Available Filters:
r   c                 s   s   | ]\}}d  ||V  qdS )z---   {:<10} = {.__doc__}Nr   r   kvr	   r	   r
   r     s   z)Miniterm.change_filter.<locals>.<genexpr>z$
--- Enter new filter name(s) [{}]: r   z--- unknown filter: {!r}
r  N)r   rj   r#   r   r   r   itemsr   r   r   r   r<  lowerr_   r   )r   Znew_filtersr   r	   r	   r
   r4    s    

zMiniterm.change_filterc              	   C   s   t jd| j | j t j  }W 5 Q R X |rzt	
| W n& tk
rl   t jd| Y nX | | | | t jd| j t jd| j dS )z"change encoding on the serial portz#
--- Enter new encoding name [{}]: z--- invalid encoding name: {}
r  r  N)r   rj   r#   r   r   r   r   r<  striprg   lookupLookupErrorr  r  r   )r   Znew_encodingr	   r	   r
   r5    s    

zMiniterm.change_encodingc                 C   s   t jd t j  | jn | jj}ztt j	 
 | j_W n< tk
r| } zt jd| || j_W 5 d}~X Y n
X |   W 5 Q R X dS )zchange the baudratez
--- Baudrate: z#--- ERROR setting baudrate: {} ---
N)r   rj   r#   r$   r   r   baudrater]   r   r<  rI  r   r   r  )r   backuprB  r	   r	   r
   r8    s    
zMiniterm.change_baudratec              
   C   s  | j * z
t }W n tk
r*   d}Y nX W 5 Q R X |r
|| jjkr
|   | j }zBtj|dd}|| | jj	|_	| jj
|_
|  | jj|_W n< tk
r } ztjd| |  W 5 d}~X Y n(X | j  || _tjd| jj |   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  r>  r  	Exceptionr   rj   r#   r   r   r   )r   r   settingsZ
new_serialrB  r	   r	   r
   r6    s,    





zMiniterm.change_portc              
   C   s   |    | j  tjd| jj d}| jjstjdjt	| j
d | j }|| j
krn|   qn|dkr|d}qz| j  W q, tk
r } ztjd| W 5 d}~X Y q,X q,|r|   n|   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   rj   r#   r   r   Zis_openr   r   r   r"   r   r>  rP  r6  r   )r   Zdo_change_portrE  rB  r	   r	   r
   r7    s.    



&
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 versionr"  r#  r$  r%  r)  r!  r(  r&  r'  )r^   rR  Zmenur  r  Zbrkr   infouploadr   filterr   )r   getattrr   r   r   r   r   r	   r	   r
   r3    s    
zMiniterm.get_help_textN)Fr   r	   )F)rR   )rR   )r.   r/   r0   r1   r   r   r   r   r   r   r   r   r  r  r  r   r   r  r2  r4  r5  r8  r6  r7  r3  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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'd( |jd)dd*dd |d+}|jd,d-dd.dd |jd/d0d1d2d3d4 |jd5d6d7d8d9g d: |jd;d<d=d>gd?d d@d>d |jdAddBdd |dC}|jdDtdEdFdGdH |jdItdEdJdKdH |dL}|jdMdNddOdd |jdPddQdd | }|j|jkr|dR |j	r0dS|j	kr(t
jdT t
jdUdVdW tt D  t
jdU t
dX |j	}ndYg}|jdksN|jdZkrzt |_W n, tk
r   t
jdU |d[ Y nX |js|d\ ztj|j|j|j|j|jd'd]}	t|	d^sdX|	_|jdk	r|js t
jd_|jrd`nda |j|	_|j dk	rB|js:t
jdb|j r2d`nda |j |	_ t!|	tj"rX|j#|	_#|	$  W n` tj%k
r }
 z>t
jdc|j|
 |j&r |j'st
dX ndZ|_W 5 d}
~
X Y nX q̐q6t(|	|j)|j*+ |dd}t,|j|_-t,|j|_.|j/|_/|0|j1 |2|j1 |jsht
jdej|jdf t
jdgt3|j-t3|j.t3|j.t3dh |4  z|d' W n tk
r   Y nX |jst
jdi |  |5  dS )jzCommand line tool, entry pointr   Nz9Miniterm - A simple terminal program for the serial port.)descriptionr   r<   z(serial port name ("-" to show port list))nargshelpr   rL  z#set baud rate, default: %(default)s)rZ  typer[  r   zport settingsz--parityNErF   rH   rD   c                 S   s   |   S r)   r  r   r	   r	   r
   r   G  r   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--non-exclusive	exclusivestore_falsez disable locking for native portsT)destrb  r[  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)srQ   )re  metavarr[  r   z-fz--filterr   NAMEzadd text transformation)rb  rg  r[  r   z--eolr   r   r   c                 S   s   |   S r)   r_  r   r	   r	   r
   r     r   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\  rg  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:
r   c                 s   s   | ]\}}d  ||V  qdS )z{:<10} = {.__doc__}NrC  rD  r	   r	   r
   r     s   zmain.<locals>.<genexpr>r   r   -z"user aborted and port is not givenzport is not given)r9  r  r  rN  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_argumentr]   add_argument_group
parse_argsZ	menu_charZ	exit_charerrorrV  r   rj   r#   r   r   r   rG  rR  r   r   r  r   rO  rL  r9  r  r  ra   timeoutr  quietr   r  
isinstanceZSerialrc  r>  r  developaskr   r   r   rH  rw   r   r   r   r  rf  r  r   r   r   )default_portZdefault_baudrateZdefault_rtsZdefault_dtrrk  parsergroupr+   r   r   rB  Zminitermr	   r	   r
   main-  s   

  

 






ry  __main__)NrX  NN).
__future__r   rg   r5   r   r   r   Zserial.tools.list_portsr   Zserial.toolsr   r   r   	NameErrorinputchrrw   r   objectr   r   ru   rT   r[   r3   r7   r   r   r   NotImplementedErrorr   r   r   r   r   r   r   r   r   r   r   r   r   r   ry  r.   r	   r	   r	   r
   <module>
   st   

-
T

   ,
 e
