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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 dS )0é    )Úabsolute_importN)Úcomports)Úhexlify_codecc                 C   s   | dkrt  ¡ S d S )NÚhexlify)r   Úgetregentry©Úc© r	   ú7/usr/lib/python3/dist-packages/serial/tools/miniterm.pyÚ<lambda>   s    r   c                 C   s*   t | ƒ}|dk rd t dƒ| ¡S t| ƒS )z)generate a readable description for a keyé    z	Ctrl+{:c}ú@)ÚordÚformatÚrepr)Ú	characterÚ
ascii_coder	   r	   r
   Úkey_description!   s   r   c                   @   sX   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚConsoleBasez8OS abstraction for console (input/output codec, no echo)c                 C   s*   t jdkrt jj| _nt j| _t j| _d S ©N)é   r   )ÚsysÚversion_infoÚstdoutÚbufferÚbyte_outputÚoutput©Úselfr	   r	   r
   Ú__init__.   s   
zConsoleBase.__init__c                 C   ó   dS )z.Set console to read single characters, no echoNr	   r   r	   r	   r
   Úsetup5   ó    zConsoleBase.setupc                 C   r    )z Restore default console settingsNr	   r   r	   r	   r
   Úcleanup8   r"   zConsoleBase.cleanupc                 C   r    )z"Read a single key from the consoleNr	   r   r	   r	   r
   Úgetkey;   ó   zConsoleBase.getkeyc                 C   ó   | j  |¡ | j  ¡  dS )zWrite bytes (already encoded)N)r   ÚwriteÚflush)r   Úbyte_stringr	   r	   r
   Úwrite_bytes?   ó   zConsoleBase.write_bytesc                 C   r&   )zWrite stringN)r   r'   r(   ©r   Útextr	   r	   r
   r'   D   r+   zConsoleBase.writec                 C   r    )zCancel getkey operationNr	   r   r	   r	   r
   ÚcancelI   r"   zConsoleBase.cancelc                 C   s   |   ¡  | S ©N)r#   r   r	   r	   r
   Ú	__enter__P   s   zConsoleBase.__enter__c                 O   s   |   ¡  d S r/   )r!   )r   ÚargsÚkwargsr	   r	   r
   Ú__exit__T   ó   zConsoleBase.__exit__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   r#   r$   r*   r'   r.   r0   r3   r	   r	   r	   r
   r   +   s    r   Úntc                   @   ó(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚOutz$file-like wrapper that uses os.writec                 C   s
   || _ d S r/   )Úfd)r   r<   r	   r	   r
   r   `   ó   
zOut.__init__c                 C   s   d S r/   r	   r   r	   r	   r
   r(   c   s   z	Out.flushc                 C   s   t  | j|¡ d S r/   )Úosr'   r<   )r   Úsr	   r	   r
   r'   f   s   z	Out.writeN)r5   r6   r7   r8   r   r(   r'   r	   r	   r	   r
   r;   ]   s
    r;   c                       sh   e Zd Zddddddddd	d
dœ
Zdddddddddddœ
Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  Z	S )ÚConsolezbOPzbOQzbORzbOSzb[15~zb[17~zb[18~zb[19~zb[20~zb[21~)
ú;ú<ú=ú>ú?r   ÚAÚBÚCÚDz[Az[Bz[Dz[Cz[Hz[Fz[2~z[3~z[5~z[6~)
ÚHÚPÚKÚMÚGÚOÚRÚSÚIÚQc                    sB  t t| ƒ ¡  tjj ¡ | _tjj ¡ | _	tjj 
d¡ tjj d¡ t ¡ dkr{tt ¡  d¡d ƒdkr{d}dd lm} t|dƒsJt |j¡|_tjjj}tjjj}tjjj}| ¡ }||d	ƒt |¡ƒ |j|@ dkr{||d	ƒ|j|B ƒ || _t d
¡tt j! "¡ ƒdƒ| _#t d
¡tt j$ "¡ ƒdƒt _$| j#t _!d
| j#_%d S )Niéý  Ú10Ú.é   iZ)  é   r   ÚLPDWORDéõÿÿÿúUTF-8Úreplace)&Úsuperr@   r   ÚctypesÚwindllÚkernel32ÚGetConsoleOutputCPÚ
_saved_ocpÚGetConsoleCPÚ
_saved_icpÚSetConsoleOutputCPÚSetConsoleCPÚplatformÚreleaseÚintÚversionÚsplitÚctypes.wintypesÚwintypesÚhasattrÚPOINTERÚDWORDrX   ÚSetConsoleModeÚGetConsoleModeÚGetStdHandleÚbyrefÚvalueÚ	_saved_cmÚcodecsÚ	getwriterr;   r   r   Úfilenor   ÚstderrÚencoding)r   Ú"ENABLE_VIRTUAL_TERMINAL_PROCESSINGrl   rp   rq   rr   Úmode©Ú	__class__r	   r
   r   ƒ   s,   &



úConsole.__init__c                 C   sX   t jj | j¡ t jj | j¡ zt jj t jj d¡| j	¡ W d S  t
y+   Y d S w )NrY   )r]   r^   r_   rd   ra   re   rc   rp   rr   ru   ÚAttributeErrorr   r	   r	   r
   Ú__del__ž   s   "ÿzConsole.__del__c                 C   s|   	 t  ¡ }|tdƒkrtdƒS |tdƒu s|tdƒu r;zt  ¡ }|tdƒu r,| j| W S | j| W S  ty:   Y nw |S q)NTé   é
   r   éà   )ÚmsvcrtÚgetwchÚunichrÚfncodesÚnavcodesÚKeyError)r   ÚzÚcoder	   r	   r
   r$   ¦   s   ÿòúConsole.getkeyc                 C   s$   t jj ¡ }t jj |ddd¡ d S )Né   r‚   r   )r]   r^   r_   ÚGetConsoleWindowÚuser32ÚPostMessageA)r   Úhwndr	   r	   r
   r.   ·   s   úConsole.cancel)
r5   r6   r7   rˆ   r‰   r   r�   r$   r.   Ú__classcell__r	   r	   r}   r
   r@   i   s6    öör@   Úposixc                       s<   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Z‡  ZS )r@   c                    sd   t t| ƒ ¡  tj ¡ | _t | j¡| _	t
 | j¡ tjdk r,t tjj¡tjƒ| _d S tj| _d S r   )r\   r@   r   r   Ústdinrx   r<   ÚtermiosÚ	tcgetattrÚoldÚatexitÚregisterr#   r   rv   Ú	getreaderrz   Ú	enc_stdinr   r}   r	   r
   r   Ã   s   
r   c                 C   sb   t  | j¡}|d t j @ t j @ t j @ |d< d|d t j< d|d t j< t  | jt j	|¡ d S )Nr   é   é   r   )
r—   r˜   r<   ÚICANONÚECHOÚISIGÚVMINÚVTIMEÚ	tcsetattrÚTCSANOW)r   Únewr	   r	   r
   r!   Í   s
   $zConsole.setupc                 C   s$   | j  d¡}|tdƒkrtdƒ}|S )Nrž   é   é   )r�   Úreadr‡   )r   r   r	   r	   r
   r$   Ô   s   r�   c                 C   s   t  | jtjd¡ d S )Nó    )ÚfcntlÚioctlr<   r—   ÚTIOCSTIr   r	   r	   r
   r.   Ú   s   r“   c                 C   s   t  | jt j| j¡ d S r/   )r—   r¥   r<   Ú	TCSAFLUSHr™   r   r	   r	   r
   r#   Ý   s   zConsole.cleanup)	r5   r6   r7   r   r!   r$   r.   r#   r”   r	   r	   r}   r
   r@   Â   s    
z9Sorry no implementation for your platform ({}) available.c                   @   r:   )	Ú	Transformz&do-nothing: forward all data unchangedc                 C   ó   |S )ztext received from serial portr	   r,   r	   r	   r
   Úrxé   r%   zTransform.rxc                 C   r±   )ztext to be sent to serial portr	   r,   r	   r	   r
   Útxí   r%   zTransform.txc                 C   r±   )z(text to be sent but displayed on consoler	   r,   r	   r	   r
   Úechoñ   r%   zTransform.echoN)r5   r6   r7   r8   r²   r³   r´   r	   r	   r	   r
   r°   ç   s
    r°   c                   @   s   e Zd ZdZdd„ ZdS )ÚCRLFzENTER sends CR+LFc                 C   ó   |  dd¡S )NÚ
ú
©r[   r,   r	   r	   r
   r³   ù   r4   zCRLF.txN)r5   r6   r7   r8   r³   r	   r	   r	   r
   rµ   ö   s    rµ   c                   @   ó    e Zd ZdZdd„ Zdd„ ZdS )ÚCRzENTER sends CRc                 C   r¶   )Núr·   r¹   r,   r	   r	   r
   r²      r4   zCR.rxc                 C   r¶   )Nr·   r¼   r¹   r,   r	   r	   r
   r³     r4   zCR.txN©r5   r6   r7   r8   r²   r³   r	   r	   r	   r
   r»   ý   s    r»   c                   @   s   e Zd ZdZdS )ÚLFzENTER sends LFN)r5   r6   r7   r8   r	   r	   r	   r
   r¾     s    r¾   c                   @   sB   e Zd ZdZedd„ edƒD ƒƒZe dddœ¡ dd	„ ZeZ	d
S )Ú
NoTerminalz0remove typical terminal control codes from inputc                 c   s(   � | ]}t |ƒd vr|d| fV  qdS )ú
	é $  N)r‡   ©Ú.0Úxr	   r	   r
   Ú	<genexpr>  s   €& zNoTerminal.<genexpr>r   é!$  é%$  )r¨   é›   c                 C   s   |  | j¡S r/   )Ú	translateÚREPLACEMENT_MAPr,   r	   r	   r
   r²     r4   zNoTerminal.rxN)
r5   r6   r7   r8   ÚdictÚrangerÊ   Úupdater²   r´   r	   r	   r	   r
   r¿     s    þÿr¿   c                   @   s8   e Zd ZdZedd„ edƒD ƒƒZe ddddœ¡ d	S )
Ú
NoControlsz%Remove all control codes, incl. CR+LFc                 c   s   � | ]	}|d | fV  qdS )rÁ   Nr	   rÂ   r	   r	   r
   rÅ     s   € zNoControls.<genexpr>r   i#$  rÆ   rÇ   )r   r¨   rÈ   N)r5   r6   r7   r8   rË   rÌ   rÊ   rÍ   r	   r	   r	   r
   rÎ     s    ýÿrÎ   c                   @   s   e Zd ZdZdd„ ZeZdS )Ú	PrintablezMShow decimal code for all non-ASCII characters and replace most control codesc                 C   sŠ   g }|D ];}d|  krdk sn |dv r|  |¡ q|dk r+|  tdt|ƒ ƒ¡ q| dd„ d t|ƒ¡D ƒ¡ |  d¡ qd |¡S )	Nú úrÀ   rÁ   c                 s   s$   � | ]}t d t|ƒ d ƒV  qdS )i€   é0   N)r‡   r   )rÃ   Údr	   r	   r
   rÅ   2  s   €" zPrintable.rx.<locals>.<genexpr>z{:d}Ú )Úappendr‡   r   Úextendr   Újoin)r   r-   Úrr   r	   r	   r
   r²   *  s   
zPrintable.rxN)r5   r6   r7   r8   r²   r´   r	   r	   r	   r
   rÏ   '  s    rÏ   c                   @   r:   )	ÚColorizez,Apply different colors for received and echoc                 C   s   d| _ d| _d S )Nz[37mz[31m)Úinput_colorÚ
echo_colorr   r	   r	   r
   r   <  s   
zColorize.__init__c                 C   ó
   | j | S r/   )rÚ   r,   r	   r	   r
   r²   A  r=   zColorize.rxc                 C   rÜ   r/   )rÛ   r,   r	   r	   r
   r´   D  r=   zColorize.echoN)r5   r6   r7   r8   r   r²   r´   r	   r	   r	   r
   rÙ   9  s
    rÙ   c                   @   rº   )ÚDebugIOzPrint what is sent and receivedc                 C   ó    t j d |¡¡ t j ¡  |S )Nz [RX:{!r}] ©r   ry   r'   r   r(   r,   r	   r	   r
   r²   K  ó   
z
DebugIO.rxc                 C   rÞ   )Nz [TX:{!r}] rß   r,   r	   r	   r
   r³   P  rà   z
DebugIO.txNr½   r	   r	   r	   r
   rÝ   H  s    rÝ   )ÚcrlfÚcrÚlf)ÚdirectÚdefaultÚ	nocontrolÚ	printableÚcolorizeÚdebugc                  C   s¶   t j d¡ g } tttƒ ƒdƒD ]\}\}}}t j d |||¡¡ |  |¡ q	 tdƒ}zt	|ƒd }d|  kr@t
| ƒk sIn t j d¡ W q(W n
 tyT   Y |S w | | }|S )z¢    Show a list of ports and ask the user for a choice. To make selection
    easier on systems with long device names, also allow the input of an
    index.
    z
--- Available ports:
rž   z--- {:2}: {:20} {!r}
Tz#--- Enter port index or full name: r   z--- Invalid index!
)r   ry   r'   Ú	enumerateÚsortedr   r   rÕ   Ú	raw_inputrh   ÚlenÚ
ValueError)ÚportsÚnÚportÚdescÚhwidÚindexr	   r	   r
   Úask_for_portk  s&   þürõ   c                   @   sÀ   e Zd ZdZd1dd„Zdd„ Zd	d
„ Zdd„ Zdd„ Zd2dd„Z	dd„ Z
dd„ Zd3dd„Zd3dd„Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0S )4ÚMinitermz�    Terminal application. Copy data from serial port to console and vice versa.
    Handle special keys from the console to show menu etc.
    Frá   r	   c                 C   sp   t ƒ | _|| _|| _d| _d| _d| _|| _|| _|  	¡  t
dƒ| _t
dƒ| _d | _d | _d | _d | _d | _d S )NFrZ   é   é   )r@   ÚconsoleÚserialr´   ÚrawÚinput_encodingÚoutput_encodingÚeolÚfiltersÚupdate_transformationsr‡   Úexit_characterÚmenu_characterÚaliveÚ_reader_aliveÚreceiver_threadÚ
rx_decoderÚ
tx_decoder)r   Úserial_instancer´   rþ   rÿ   r	   r	   r
   r   Š  s    


zMiniterm.__init__c                 C   s.   d| _ tj| jdd�| _d| j_| j ¡  dS )zStart reader threadTr²   ©ÚtargetÚnameN)r  Ú	threadingÚThreadÚreaderr  ÚdaemonÚstartr   r	   r	   r
   Ú_start_readerœ  s   zMiniterm._start_readerc                 C   s*   d| _ t| jdƒr| j ¡  | j ¡  dS )z6Stop reader thread only, wait for clean exit of threadFÚcancel_readN)r  rm   rú   r  r  r×   r   r	   r	   r
   Ú_stop_reader¤  s   
zMiniterm._stop_readerc                 C   s@   d| _ |  ¡  tj| jdd�| _d| j_| j ¡  | j 	¡  dS )zstart worker threadsTr³   r	  N)
r  r  r  r  ÚwriterÚtransmitter_threadr  r  rù   r!   r   r	   r	   r
   r  «  s   
zMiniterm.startc                 C   s
   d| _ dS )zset flag to stop worker threadsFN)r  r   r	   r	   r
   Ústopµ  s   
zMiniterm.stopc                 C   s6   | j  ¡  |st| jdƒr| j ¡  | j ¡  dS dS )z$wait for worker threads to terminater  N)r  r×   rm   rú   r  r  )r   Útransmit_onlyr	   r	   r
   r×   ¹  s   

ýzMiniterm.joinc                 C   s   | j  ¡  d S r/   )rú   Úcloser   r	   r	   r
   r  Á  s   zMiniterm.closec                 C   s@   t | j gdd„ | jD ƒ }dd„ |D ƒ| _tt| jƒƒ| _dS )zFtake list of transformation classes and instantiate them for rx and txc                 S   s   g | ]}t | ‘qS r	   )ÚTRANSFORMATIONS)rÃ   Úfr	   r	   r
   Ú
<listcomp>Æ  s    ÿz3Miniterm.update_transformations.<locals>.<listcomp>c                 S   s   g | ]}|ƒ ‘qS r	   r	   )rÃ   Útr	   r	   r
   r  È  s    N)ÚEOL_TRANSFORMATIONSrþ   rÿ   Útx_transformationsÚlistÚreversedÚrx_transformations)r   Útransformationsr	   r	   r
   r   Ä  s
   ÿzMiniterm.update_transformationsr[   c                 C   ó   || _ t |¡|ƒ| _dS )zset encoding for received dataN)rü   rv   Úgetincrementaldecoderr  ©r   rz   Úerrorsr	   r	   r
   Úset_rx_encodingË  ó   zMiniterm.set_rx_encodingc                 C   r#  )z!set encoding for transmitted dataN)rý   rv   ÚgetincrementalencoderÚ
tx_encoderr%  r	   r	   r
   Úset_tx_encodingÐ  r(  zMiniterm.set_tx_encodingc                 C   sL  t j dj| jd�¡ t j d | jjrdnd| jjrdnd| jjr$dnd¡¡ z&t j d | jjr4dnd| jj	r;dnd| jj
rBdnd| jjrIdnd¡¡ W n
 tjyX   Y nw t j d | jjrddnd¡¡ t j d | jjrsdnd¡¡ t j d	 | j¡¡ t j d
 | j¡¡ t j d | j ¡ ¡¡ t j d d | j¡¡¡ dS )z$Write current settings to sys.stderrzK
--- Settings: {p.name}  {p.baudrate},{p.bytesize},{p.parity},{p.stopbits}
©Úpz&--- RTS: {:8}  DTR: {:8}  BREAK: {:8}
ÚactiveÚinactivez---- CTS: {:8}  DSR: {:8}  RI: {:8}  CD: {:8}
z--- software flow control: {}
z--- hardware flow control: {}
ú--- serial input encoding: {}
ú--- serial output encoding: {}
z--- EOL: {}
ú--- filters: {}
rÐ   N)r   ry   r'   r   rú   ÚrtsÚdtrÚbreak_conditionÚctsÚdsrÚriÚcdÚSerialExceptionÚxonxoffÚrtsctsrü   rý   rþ   Úupperr×   rÿ   r   r	   r	   r
   Údump_port_settingsÕ  s0   
ÿ
ý

üýzMiniterm.dump_port_settingsc                 C   s®   zE| j r=| jr@| j | jjpd¡}|r4| jr| j |¡ n| j 	|¡}| j
D ]}| |¡}q&| j |¡ | j rC| jsW dS W dS W dS W dS  tjyV   d| _ | j ¡  ‚ w )zloop and copy serial->consolerž   FN)r  r  rú   rª   Ú
in_waitingrû   rù   r*   r  Údecoder!  r²   r'   r:  r.   )r   Údatar-   Útransformationr	   r	   r
   r  î  s    
$ö
ýzMiniterm.readerc                 C   sô   d}zp| j rpz| j ¡ }W n ty   d}Y nw | j sW dS |r)|  |¡ d}nA|| jkr1d}n9|| jkr=|  ¡  W dS |}| jD ]}| 	|¡}qB| j
 | j |¡¡ | jrj|}| jD ]}| |¡}q\| j |¡ | j sW dS W dS    d| _ ‚ )z¯        Loop and copy console->serial until self.exit_character character is
        found. When self.menu_character is found, interpret the next key
        locally.
        FúTN)r  rù   r$   ÚKeyboardInterruptÚhandle_menu_keyr  r  r  r  r³   rú   r'   r*  Úencoder´   )r   Úmenu_activer   r-   rB  Ú	echo_textr	   r	   r
   r    s>   ÿ




çzMiniterm.writerc                 C   sÚ  || j ks
|| jkr!| j | j |¡¡ | jr| j |¡ d'S d'S |dkr+|  ¡  d'S |dv r9t	j
 |  ¡ ¡ d'S |dkrU| jj | j_t	j
 d | jjrOdnd¡¡ d'S |dkrq| jj | j_t	j
 d | jjrkdnd¡¡ d'S |d	kr�| jj | j_t	j
 d
 | jjr‡dnd¡¡ d'S |dkr¦| j | _t	j
 d | jr dnd¡¡ d'S |dkr°|  ¡  d'S |dkrßttƒ}| | j¡d }|t|ƒkrÈd}|| | _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 �rƒtj%| j_!|  ¡  d'S |dk�r“tj&| j_'|  ¡  d'S |dk�r£tj(| j_'|  ¡  d'S |d k�r³tj)| j_'|  ¡  d'S |d!v �rÄ|d"k| j_*|  ¡  d'S |d#v �rÕ|d$k| j_+|  ¡  d'S |d%v �rà|  ,¡  d'S t	j
 d& t-|ƒ¡¡ d'S )(z"Implement a simple menu / settingsúzhH?úz--- RTS {} ---
r.  r/  úz--- DTR {} ---
úz--- BREAK {} ---
úz--- local echo {} ---
úúrž   r   z--- EOL: {} ---
úú	ÚpPÚzZÚbBÚ8Ú7ÚeEÚoOÚmMÚsSÚnNÚ1Ú2Ú3ÚxXÚXÚrRrP   ÚqQz!--- unknown menu character {} --
N).r  r  rú   r'   r*  rF  r´   rù   Úupload_filer   ry   Úget_help_textr3  r   r4  r5  Úchange_filterr  r  rô   rþ   rí   r=  r   Úchange_encodingr>  Úchange_portÚsuspend_portÚchange_baudrateÚ	EIGHTBITSÚbytesizeÚ	SEVENBITSÚPARITY_EVENÚparityÚ
PARITY_ODDÚPARITY_MARKÚPARITY_SPACEÚPARITY_NONEÚSTOPBITS_ONEÚstopbitsÚSTOPBITS_TWOÚSTOPBITS_ONE_POINT_FIVEr;  r<  r  r   )r   r   Úmodesrþ   r	   r	   r
   rE  '  s    ÿ"""
 

























zMiniterm.handle_menu_keyc                 C   s8  t j d¡ t j ¡  | j�„ t j ¡  d¡}|rzzDt|dƒ�,}t j d 	|¡¡ 	 | 
d¡}|s2n| j |¡ | j ¡  t j d¡ q*W d  ƒ n1 sNw   Y  t j d	 	|¡¡ W n$ tyy } zt j d
 	||¡¡ W Y d}~nd}~ww W d  ƒ dS W d  ƒ dS W d  ƒ dS 1 s•w   Y  dS )z,Ask user for filenname and send its contentsz
--- File to upload: r¸   Úrbz--- Sending file {} ---
Ti   rU   Nz
--- File {} sent ---
z"--- ERROR opening file {}: {} ---
)r   ry   r'   r(   rù   r–   ÚreadlineÚrstripÚopenr   rª   rú   ÚIOError)r   Úfilenamer  ÚblockÚer	   r	   r
   rc  }  s:   


ùû
 €ÿóþò"ðzMiniterm.upload_filec                 C   sÚ   t j d¡ t j d dd„ tt ¡ ƒD ƒ¡¡ t j d d | j¡¡¡ | j	� t j
 ¡  ¡  ¡ }W d  ƒ n1 s<w   Y  |r^|D ]}|tvrVt j d |¡¡  nqE|| _|  ¡  t j d	 d | j¡¡¡ dS )
zchange the i/o transformationsz
--- Available Filters:
r·   c                 s   ó    � | ]\}}d   ||¡V  qdS )z---   {:<10} = {.__doc__}N©r   ©rÃ   ÚkÚvr	   r	   r
   rÅ   –  ó
   € 
ÿ
ÿz)Miniterm.change_filter.<locals>.<genexpr>z$
--- Enter new filter name(s) [{}]: rÐ   Nz--- unknown filter: {!r}
r2  )r   ry   r'   r×   rë   r  Úitemsr   rÿ   rù   r–   ry  Úlowerrj   r   )r   Únew_filtersr  r	   r	   r
   re  “  s"   

þÿþzMiniterm.change_filterc                 C   sÀ   t j d | j¡¡ | j� t j ¡  ¡ }W d  ƒ n1 sw   Y  |rJzt	 
|¡ W n ty?   t j d |¡¡ Y nw |  |¡ |  |¡ t j d | j¡¡ t j d | j¡¡ dS )z"change encoding on the serial portz#
--- Enter new encoding name [{}]: Nz--- invalid encoding name: {}
r0  r1  )r   ry   r'   r   rü   rù   r–   ry  Ústriprv   ÚlookupÚLookupErrorr'  r+  rý   )r   Únew_encodingr	   r	   r
   rf  ¦  s   ÿÿ

zMiniterm.change_encodingc                 C   s¼   t j d¡ t j ¡  | j�F | jj}ztt j 	¡  
¡ ƒ| j_W n ty? } zt j d |¡¡ || j_W Y d}~nd}~ww |  ¡  W d  ƒ dS W d  ƒ dS 1 sWw   Y  dS )zchange the baudratez
--- Baudrate: z#--- ERROR setting baudrate: {} ---
N)r   ry   r'   r(   rù   rú   Úbaudraterh   r–   ry  r‰  rî   r   r>  )r   Úbackupr  r	   r	   r
   ri  ¶  s   
€þ
ø"úzMiniterm.change_baudratec              
   C   s&  | j � ztƒ }W n ty   d}Y nw W d  ƒ n1 sw   Y  |r�|| jjkr‘|  ¡  | j ¡ }z!tj|dd�}| |¡ | jj	|_	| jj
|_
| ¡  | jj|_W n tyu } ztj d |¡¡ | ¡  W Y d}~nd}~ww | j ¡  || _tj d | jj¡¡ |  ¡  dS dS dS )z;Have a conversation with the user to change the serial portNT)Údo_not_openz#--- ERROR opening new port: {} ---
z--- Port changed to: {} ---
)rù   rõ   rD  rú   rñ   r  ÚgetSettingsDictÚserial_for_urlÚapplySettingsDictr3  r4  r{  r5  Ú	Exceptionr   ry   r'   r   r  r  )r   rñ   ÚsettingsÚ
new_serialr  r	   r	   r
   rg  Ä  s8   
ÿ€ý



€þ
ëzMiniterm.change_portc              
   C   sú   |   ¡  | j ¡  tj d | jj¡¡ d}| jjsdtj djt	| j
ƒd�¡ | j ¡ }|| j
kr6|  ¡  n.|dv r=d}n'z| j ¡  W n ty_ } ztj d |¡¡ W Y d}~nd}~ww | jjr|rl|  ¡  dS |  ¡  tj d	 | jj¡¡ dS )
zl        open port temporarily, allow reconnect, exit and port change to get
        out of the loop
        z
--- Port closed: {} ---
FzC--- Quit: {exit} | p: port change | any other key to reconnect ---
)ÚexitrR  Tz--- ERROR opening port: {} ---
Nz--- Port opened: {} ---
)r  rú   r  r   ry   r'   r   rñ   Úis_openr   r  rù   r$   r  r{  r“  rg  r  )r   Údo_change_portrƒ  r  r	   r	   r
   rh  â  s4   

ÿ

€ÿôzMiniterm.suspend_portc                 C   sZ   dj ttddƒt| jƒt| jƒtdƒtdƒtdƒtdƒtdƒtd	ƒtd
ƒtdƒtdƒd�S )zreturn the help textab  
--- pySerial ({version}) - miniterm - help
---
--- {exit:8} Exit program (alias {menu} Q)
--- {menu:8} Menu escape key, followed by:
--- Menu keys:
---    {menu:7} Send the menu character itself to remote
---    {exit:7} Send the exit character itself to remote
---    {info:7} Show info
---    {upload:7} Upload file (prompt will be shown)
---    {repr:7} encoding
---    {filter:7} edit filters
--- Toggles:
---    {rts:7} RTS   {dtr:7} DTR   {brk:7} BREAK
---    {echo:7} echo  {eol:7} EOL
---
--- Port settings ({menu} followed by the following):
---    p          change port
---    7 8        set data bits
---    N E O S M  change parity (None, Even, Odd, Space, Mark)
---    1 2 3      set stop bits (1, 2, 1.5)
---    b          change baud rate
---    x X        disable/enable software flow control
---    r R        disable/enable hardware flow control
ÚVERSIONzunknown versionrJ  rK  rL  rM  rQ  rI  rP  rN  rO  )ri   r–  Úmenur3  r4  Úbrkr´   ÚinfoÚuploadr   Úfilterrþ   )r   Úgetattrrú   r   r  r  r   r	   r	   r
   rd    s   ÝzMiniterm.get_help_textN)Frá   r	   )Fr¹   )r5   r6   r7   r8   r   r  r  r  r  r×   r  r   r'  r+  r>  r  r  rE  rc  re  rf  ri  rg  rh  rd  r	   r	   r	   r
   rö   „  s.    




&Vrö   é€%  c              
   C   s²  ddl }|jdd�}|jddd| d� |jd	dtd
|d� | d¡}|jdg d¢dd„ ddd� |jddddd� |jddddd� |jdtd|d� |jdtd|d� |jd d!d"d#d$d%� |jd&dd'dd� | d(¡}|jd)d*dd+dd� |jd,d-d.d/d0d1� |jd2d3d4d5d6g d7� |jd8g d9¢d:d„ d;d<d� |jd=dd>dd� | d?¡}|jd@tdAdBdCdD� |jdEtdAdFdGdD� | dH¡}|jdIdJddKdd� |jdLddMdd� | ¡ }|j|jkrâ| dN¡ |j	�rdO|j	v �rt
j dP¡ t
j dQ dRdS„ tt ¡ ƒD ƒ¡¡ t
j dQ¡ t
 dT¡ |j	}ndUg}	 |jdu �s#|jdVk�rHztƒ |_W n t�y>   t
j dQ¡ | dW¡ Y n
w |j�sH| dX¡ zdtj|j|j|j|j|jd$dY�}	t|	dZƒ�sbdT|	_|jdu�r|j�s{t
j d[ |j�rwd\nd]¡¡ |j|	_|j du�rœ|j�s˜t
j d^ |j �r”d\nd]¡¡ |j |	_ t!|	tj"ƒ�r§|j#|	_#|	 $¡  W n1 tj%�yÝ }
 z#t
j d_ |j|
¡¡ |j&�rÆ‚ |j'�sÐt
 dT¡ ndV|_W Y d}
~
nd}
~
ww n�qt(|	|j)|j* +¡ |d`�}t,|jƒ|_-t,|jƒ|_.|j/|_/| 0|j1¡ | 2|j1¡ |j�s/t
j daj|jdb�¡ t
j dc t3|j-ƒt3|j.ƒt3|j.ƒt3ddƒ¡¡ | 4¡  z| d$¡ W n
 t�yD   Y nw |j�sOt
j de¡ | ¡  | 5¡  dS )fzCommand line tool, entry pointr   Nz9Miniterm - A simple terminal program for the serial port.)Údescriptionrñ   rE   z(serial port name ("-" to show port list))ÚnargsÚhelprå   r�  z#set baud rate, default: %(default)s)r¢  Útyper£  rå   zport settingsz--parity)ÚNÚErO   rQ   rM   c                 S   ó   |   ¡ S r/   ©r=  r   r	   r	   r
   r   G  ó    zmain.<locals>.<lambda>z*set parity, one of {N E O S M}, default: Nr¥  )Úchoicesr¤  r£  rå   z--rtsctsÚ
store_truez)enable RTS/CTS flow control (default off)F)Úactionr£  rå   z	--xonxoffz*enable software flow control (default off)z--rtsz2set initial RTS line state (possible values: 0, 1))r¤  r£  rå   z--dtrz2set initial DTR line state (possible values: 0, 1)z--non-exclusiveÚ	exclusiveÚstore_falsez disable locking for native portsT)Údestr¬  r£  rå   z--askz"ask again for port when open failszdata handlingz-ez--echozenable local echo (default off)z
--encodingÚserial_port_encodingÚCODECzXset the encoding for the serial port (e.g. hexlify, Latin1, UTF-8), default: %(default)srZ   )r¯  Úmetavarr£  rå   z-fz--filterrÕ   ÚNAMEzadd text transformation)r¬  r²  r£  rå   z--eol)r»   r¾   rµ   c                 S   r§  r/   r¨  r   r	   r	   r
   r   ‰  r©  zend of line moderµ   z--rawz)Do no apply any encodings/transformationsÚhotkeysz--exit-charÚNUMzWUnicode of special character that is used to exit the application, default: %(default)sr÷   )r¤  r²  r£  rå   z--menu-charz_Unicode code of special character that is used to control miniterm (menu), default: %(default)srø   Údiagnosticsz-qz--quietzsuppress non-error messagesz	--developzshow Python traceback on errorz.--exit-char can not be the same as --menu-charr£  zAvailable filters:
r·   c                 s   r€  )z{:<10} = {.__doc__}Nr�  r‚  r	   r	   r
   rÅ   ¹  r…  zmain.<locals>.<genexpr>rž   rå   ú-z"user aborted and port is not givenzport is not given)rn  r<  r;  r�  r  z--- forcing DTR {}
r.  r/  z--- forcing RTS {}
zcould not open port {!r}: {}
)r´   rþ   rÿ   zP--- Miniterm on {p.name}  {p.baudrate},{p.bytesize},{p.parity},{p.stopbits} ---
r,  z6--- Quit: {} | Menu: {} | Help: {} followed by {} ---
úz
--- exit ---
)6ÚargparseÚArgumentParserÚadd_argumentrh   Úadd_argument_groupÚ
parse_argsÚ	menu_charÚ	exit_charÚerrorrž  r   ry   r'   r×   rë   r  r†  r–  rñ   rõ   rD  rú   r‘  r�  rn  r<  r;  rm   Útimeoutr4  Úquietr   r3  Ú
isinstanceÚSerialr­  r{  r:  ÚdevelopÚaskrö   r´   rþ   r‡  r‡   r  r  rû   r'  r°  r+  r   r  r  )Údefault_portÚdefault_baudrateÚdefault_rtsÚdefault_dtrr¹  ÚparserÚgroupr1   rÿ   r  r  Úminitermr	   r	   r
   Úmain-  s¦  ÿüû
ûüüüüûü
üûûûü
ûû
üü


þ
þ
ú€ù	Ò0ü
ÿ
üÿrÎ  Ú__main__)Nr   NN).Ú
__future__r   rv   r>   r   r  rú   Úserial.tools.list_portsr   Úserial.toolsr   r›   rì   Ú	NameErrorÚinputÚchrr‡   r   Úobjectr   r  r…   r]   rf   r;   r@   rš   r—   r¬   ÚNotImplementedErrorr   r°   rµ   r»   r¾   r¿   rÎ   rÏ   rÙ   rÝ   r  r  rõ   rö   rÎ  r5   r	   r	   r	   r
   Ú<module>   sz   	ý

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