o
    l@xdГ                     @   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	   =D:\rfid_django\env\Lib\site-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.   r1   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)r3   r4   r5   r6   r   r'   r&   r	   r	   r	   r
   r9   ]   s
    r9   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kernel32ZGetConsoleOutputCP
_saved_ocpZGetConsoleCP
_saved_icpSetConsoleOutputCPSetConsoleCPplatformreleaseintversionsplitZctypes.wintypeswintypeshasattrPOINTERDWORDrV   SetConsoleModeGetConsoleModeGetStdHandlebyrefvalue	_saved_cmcodecs	getwriterr9   r   r   filenor   stderrencoding)r   "ENABLE_VIRTUAL_TERMINAL_PROCESSINGrg   rk   rl   rm   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 )NrW   )r[   r\   r]   r`   r^   ra   r_   rk   rm   rp   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]   ZGetConsoleWindowZuser32ZPostMessageA)r   Zhwndr	   r	   r
   r,      s   Console.cancel)
r3   r4   r5   r   r   r   r|   r#   r,   __classcell__r	   r	   rx   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   )rZ   r>   r   r   stdinrs   r:   termios	tcgetattroldatexitregisterr"   r   rq   	getreaderru   	enc_stdinr   rx   r	   r
   r      s   
rz   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:   ZICANON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    )fcntlioctlr:   r   Z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)	r3   r4   r5   r   r    r#   r,   r"   r   r	   r	   rx   r
   r>      s    
z9Sorry no implementation for your platform ({}) available.c                   @   r8   )		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)r3   r4   r5   r6   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

rY   r*   r	   r	   r
   r      r2   zCRLF.txN)r3   r4   r5   r6   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      r2   zCR.rxc                 C   r   )Nr   r   r   r*   r	   r	   r
   r     r2   zCR.txNr3   r4   r5   r6   r   r   r	   r	   r	   r
   r      s    r   c                   @   s   e Zd ZdZdS )LFzENTER sends LFN)r3   r4   r5   r6   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     r2   zNoTerminal.rxN)
r3   r4   r5   r6   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)r3   r4   r5   r6   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)r3   r4   r5   r6   r   r   r	   r	   r	   r
   r   '  s    r   c                   @   r8   )	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)r3   r4   r5   r6   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   rt   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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 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   rt   r&   	enumeratesortedr   r   r   	raw_inputrd   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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 )NFrX         )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   rh   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   rh   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_transformationsrY   c                 C      || _ t||| _dS )zset encoding for received dataN)r   rq   getincrementaldecoderr   r   ru   errorsr	   r	   r
   set_rx_encoding     zMiniterm.set_rx_encodingc                 C   r  )z!set encoding for transmitted dataN)r   rq   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   rt   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  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3xXXZrRrN   ZqQz!--- unknown menu character {} --
N).r   r   r   r&   r  r-  r   r   upload_filer   rt   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   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   rS   Nz
--- File {} sent ---
z"--- ERROR opening file {}: {} ---
)r   rt   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   rt   r&   r   r   r  itemsr   r   r   r   rI  lowerrf   r   )r   Znew_filtersr  r	   r	   r
   rA    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   rt   r&   r   r   r   r   rI  striprq   lookupLookupErrorr  r  r   )r   Znew_encodingr	   r	   r
   rB    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   rt   r&   r'   r   r   baudraterd   r   rI  rX  r   r   r&  )r   backuprO  r	   r	   r
   rE    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  rK  r  	Exceptionr   rt   r&   r   r  r   )r   r   settingsZ
new_serialrO  r	   r	   r
   rC    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 ---
)exitr7  Tz--- ERROR opening port: {} ---
Nz--- Port opened: {} ---
)r   r   r  r   rt   r&   r   r   Zis_openr   r   r   r#   r  rK  r_  rC  r   )r   Zdo_change_portrS  rO  r	   r	   r
   rD    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 versionr/  r0  r1  r2  r6  r.  r5  r3  r4  )re   ra  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   )r3   r4   r5   r6   r   r   r   r   r  r   r  r   r  r  r&  r   r   r,  r?  rA  rB  rE  rC  rD  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   rC   z(serial port name ("-" to show port list))nargshelpr   r[  z#set baud rate, default: %(default)s)rh  typeri  r   zport settingsz--parity)NErM   rO   rK   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: Nrk  )choicesrj  ri  r   z--rtscts
store_truez)enable RTS/CTS flow control (default off)F)actionri  r   z	--xonxoffz*enable software flow control (default off)z--rtsz2set initial RTS line state (possible values: 0, 1))rj  ri  r   z--dtrz2set initial DTR line state (possible values: 0, 1)z--non-exclusive	exclusivestore_falsez disable locking for native portsT)destrr  ri  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)srX   )ru  metavarri  r   z-fz--filterr   NAMEzadd text transformation)rr  rw  ri  r   z--eol)r   r   r   c                 S   rm  r-   rn  r   r	   r	   r
   r     ro  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   )rj  rw  ri  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-charri  zAvailable filters:
r   c                 s   rP  )z{:<10} = {.__doc__}NrQ  rR  r	   r	   r
   r     rU  zmain.<locals>.<genexpr>r   r   -z"user aborted and port is not givenzport is not given)rF  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_argumentrd   add_argument_group
parse_argsZ	menu_charZ	exit_charerrorrd  r   rt   r&   r   r   r  rV  ra  r   r   r+  r   r^  r[  rF  r$  r#  rh   timeoutr  quietr   r  
isinstanceZSerialrs  rK  r"  developaskr   r   r   rW  r   r   r   r   r  rv  r  r   r   r  )default_portZdefault_baudrateZdefault_rtsZdefault_dtrr{  parsergroupr/   r   r   rO  Zminitermr	   r	   r
   main-  s  








	0

r  __main__)Nrf  NN).
__future__r   rq   r<   r   r   r   Zserial.tools.list_portsr   Zserial.toolsr   r   r   	NameErrorinputchrr   r   objectr   r   r   r[   rb   r9   r>   r   r   r   NotImplementedErrorr   r   r   r   r   r   r   r   r   r   r  r  r   r   r  r3   r	   r	   r	   r
   <module>   sz   	

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