U
    ­ÇoY‰  ã                   @   sð  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ e  	dd„ ¡ ze
 W n ek
rr   eZ
eZY nX dd„ ZG dd	„ d	eƒZejd
krÈd dlZd dlZG dd„ deƒZG dd„ deƒZnDe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 )/é    N)Ú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>   ó    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   Úsetup3   s    zConsoleBase.setupc                 C   s   dS )z Restore default console settingsNr   r   r   r   r   Úcleanup6   s    zConsoleBase.cleanupc                 C   s   dS )z"Read a single key from the consoleNr   r   r   r   r   Úgetkey9   s    zConsoleBase.getkeyc                 C   s   | j  |¡ | j  ¡  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!   B   s    zConsoleBase.writec                 C   s   dS )zCancel getkey operationNr   r   r   r   r   ÚcancelG   s    zConsoleBase.cancelc                 C   s   |   ¡  | S ©N)r   r   r   r   r   Ú	__enter__N   s    zConsoleBase.__enter__c                 O   s   |   ¡  d S r'   )r   )r   ÚargsÚkwargsr   r   r   Ú__exit__R   s    zConsoleBase.__exit__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r    r#   r!   r&   r(   r+   r   r   r   r   r   )   s   r   Úntc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚOutz$file-like wrapper that uses os.writec                 C   s
   || _ d S r'   )Úfd)r   r2   r   r   r   r   ]   s    zOut.__init__c                 C   s   d S r'   r   r   r   r   r   r"   `   s    z	Out.flushc                 C   s   t  | j|¡ d S r'   )Úosr!   r2   )r   Úsr   r   r   r!   c   s    z	Out.writeN)r,   r-   r.   r/   r   r"   r!   r   r   r   r   r1   Z   s   r1   c                       s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	ÚConsolec                    s’   t t| ƒ ¡  tjj ¡ | _tjj ¡ | _	tjj 
d¡ tjj d¡ t d¡ttj ¡ ƒdƒ| _t d¡ttj ¡ ƒdƒt_| jt_d| j_d S )Niéý  úUTF-8Úreplace)Úsuperr5   r   ÚctypesÚwindllÚkernel32ZGetConsoleOutputCPÚ
_saved_ocpZGetConsoleCPÚ
_saved_icpÚSetConsoleOutputCPÚSetConsoleCPÚcodecsÚ	getwriterr1   r   r   Úfilenor   ÚstderrÚencodingr   ©Ú	__class__r   r   r   g   s    úConsole.__init__c                 C   s$   t jj | j¡ t jj | j¡ d S r'   )r9   r:   r;   r>   r<   r?   r=   r   r   r   r   Ú__del__s   s    zConsole.__del__c                 C   sD   t  ¡ }|tdƒkrtdƒS |tdƒtdƒfkr:t  ¡  q |S q d S )Né   é
   r   é   )ÚmsvcrtZgetwchÚunichr)r   Úzr   r   r   r    w   s    
úConsole.getkeyc                 C   s$   t jj ¡ }t jj |ddd¡ d S )Né   rI   r   )r9   r:   r;   ZGetConsoleWindowZuser32ZPostMessageA)r   Zhwndr   r   r   r&      s    úConsole.cancel)r,   r-   r.   r   rH   r    r&   Ú__classcell__r   r   rE   r   r5   f   s   
r5   Úposixc                       s<   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Z‡  ZS )r5   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   )r8   r5   r   r   ÚstdinrB   r2   ÚtermiosÚ	tcgetattrÚoldÚatexitÚregisterr   r   r@   Ú	getreaderrD   Ú	enc_stdinr   rE   r   r   r      s    
rG   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   )
rU   rV   r2   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[   ÚreadrM   )r   r   r   r   r   r    ž   s    rO   c                 C   s   t  | jtjd¡ d S )Nó    )ÚfcntlZioctlr2   rU   ZTIOCSTIr   r   r   r   r&   ¤   s    rQ   c                 C   s   t  | jt j| j¡ d S r'   )rU   r^   r2   Z	TCSAFLUSHrW   r   r   r   r   r   §   s    zConsole.cleanup)	r,   r-   r.   r   r   r    r&   r   rR   r   r   rE   r   r5   Œ   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-   r.   r/   rf   rg   rh   r   r   r   r   re   ±   s   re   c                   @   s   e Zd ZdZdd„ ZdS )ÚCRLFzENTER sends CR+LFc                 C   s   |  dd¡S )NÚ
ú
©r7   r$   r   r   r   rg   Ã   s    zCRLF.txN)r,   r-   r.   r/   rg   r   r   r   r   ri   À   s   ri   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úrj   rl   r$   r   r   r   rf   Ê   s    zCR.rxc                 C   s   |  dd¡S )Nrj   rn   rl   r$   r   r   r   rg   Í   s    zCR.txN©r,   r-   r.   r/   rf   rg   r   r   r   r   rm   Ç   s   rm   c                   @   s   e Zd ZdZdS )ÚLFzENTER sends LFN)r,   r-   r.   r/   r   r   r   r   rp   Ñ   s   rp   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)rM   ©Ú.0Úxr   r   r   Ú	<genexpr>Ø   s      zNoTerminal.<genexpr>r   é!$  é%$  )r`   é›   c                 C   s   |  | j¡S r'   )Ú	translateÚREPLACEMENT_MAPr$   r   r   r   rf   ß   s    zNoTerminal.rxN)
r,   r-   r.   r/   ÚdictÚranger|   Úupdaterf   rh   r   r   r   r   rq   Õ   s   þÿrq   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 )rs   Nr   rt   r   r   r   rw   è   s     zNoControls.<genexpr>r   i#$  rx   ry   )r   r`   rz   N)r,   r-   r.   r/   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ú úrr   rs   c                 s   s"   | ]}t d t|ƒ d ƒV  qdS )i€   é0   N)rM   r   )ru   Údr   r   r   rw   ü   s     zPrintable.rx.<locals>.<genexpr>z{:d}Ú )ÚappendrM   r   Úextendr   Újoin)r   r%   Úrr   r   r   r   rf   ô   s    zPrintable.rxN)r,   r-   r.   r/   rf   rh   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   rf     s    zColorize.rxc                 C   s
   | j | S r'   )r   r$   r   r   r   rh     s    zColorize.echoN)r,   r-   r.   r/   r   rf   rh   r   r   r   r   r‹     s   r‹   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚDebugIOzPrint what is sent and receivedc                 C   s$   t j d t|ƒ¡¡ t j ¡  |S )Nz	 [RX:{}] ©r   rC   r!   r   r   r"   r$   r   r   r   rf     s    
z
DebugIO.rxc                 C   s$   t j d t|ƒ¡¡ t j ¡  |S )Nz	 [TX:{}] r   r$   r   r   r   rg     s    
z
DebugIO.txNro   r   r   r   r   rŽ     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 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   rC   r!   Ú	enumerateÚsortedr   r   r‡   Ú	raw_inputÚintÚlenÚ
ValueError)ZportsÚnÚportZdescZhwidÚindexr   r   r   Úask_for_port5  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   sh   t ƒ | _|| _|| _d| _d| _d| _|| _|| _|  	¡  d| _
d| _d | _d | _d | _d | _d | _d S )NFr6   é   é   )r5   ÚconsoleÚserialrh   ÚrawÚinput_encodingÚoutput_encodingÚeolÚfiltersÚupdate_transformationsÚexit_characterÚmenu_characterÚaliveÚ_reader_aliveÚreceiver_threadÚ
rx_decoderZ
tx_decoder)r   Úserial_instancerh   r¥   r¦   r   r   r   r   T  s     zMiniterm.__init__c                 C   s.   d| _ tj| jdd| _d| j_| j ¡  dS )zStart reader threadTrf   ©ÚtargetÚnameN)r«   Ú	threadingÚThreadÚreaderr¬   ÚdaemonÚstartr   r   r   r   Ú_start_readerf  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«   Úhasattrr¡   r¸   r¬   r‰   r   r   r   r   Ú_stop_readern  s    
zMiniterm._stop_readerc                 C   s@   d| _ |  ¡  tj| jdd| _d| j_| j ¡  | j 	¡  dS )zstart worker threadsTrg   r¯   N)
rª   r·   r²   r³   ÚwriterÚtransmitter_threadrµ   r¶   r    r   r   r   r   r   r¶   u  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‰   r¹   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)ru   Úfr   r   r   Ú
<listcomp>  s   ÿz3Miniterm.update_transformations.<locals>.<listcomp>c                 S   s   g | ]
}|ƒ ‘qS r   r   )ru   Ú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_transformationsr7   c                 C   s   || _ t |¡|ƒ| _dS )zset encoding for received dataN)r£   r@   Úgetincrementaldecoderr­   ©r   rD   Úerrorsr   r   r   Úset_rx_encoding•  s    zMiniterm.set_rx_encodingc                 C   s   || _ t |¡|ƒ| _dS )z!set encoding for transmitted dataN)r¤   r@   Ú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
r„dnd| jjr’dnd¡¡ W n tjk
r²   Y nX t j d | jjrÊdnd¡¡ t j d | jjrèd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   rC   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Ÿ  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¡   rb   Z
in_waitingr¢   r    r#   r­   ÚdecoderÇ   rf   r!   rÙ   r&   )r   Údatar%   Útransformationr   r   r   r´   ¸  s    

zMiniterm.readerc                 C   sî   d}zÐ| j rÒz| j ¡ }W n tk
r2   d}Y nX | j s<qÒ|rP|  |¡ d}q|| jkr`d}q|| jkrv|  ¡  qÒq|}| 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Ä   rg   r¡   r!   rÍ   Úencoderh   )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|  ¡  nn|dkrnt	j
 |  ¡ ¡ nR|dkr¦| jj | j_t	j
 d | jjršdnd¡¡ n|dkrÞ| jj | j_t	j
 d | jjrÒd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¡¡ np|dkrf|  ¡  nZ|dkrÈttƒ}| | j¡d }|t|ƒkršd}|| | _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_|  ¡  nj|dkrvtj| j_|  ¡  nJ|dkr–tj | j_!|  ¡  n*|dkr¶tj"| j_!|  ¡  n
|dkrÔtj#| j_!|  ¡  nì|dkròtj$| j_!|  ¡  nÎ|dkrtj%| j_!|  ¡  n°|dkr.tj&| j_'|  ¡  n’|dkrLtj(| j_'|  ¡  nt|dkrjtj)| j_'|  ¡  nV|d krŠ|d!k| j_*|  ¡  n6|d"krª|d#k| j_+|  ¡  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sSZbBÚ8Ú7ZeEZoOZmMZnNÚ1Ú2Ú3ZxXÚXZrRÚRz!--- unknown menu character {} --
N)-r©   r¨   r¡   r!   rÍ   rä   rh   r    Úupload_filer   rC   Ú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   Zmodesr¥   r   r   r   rã   ñ  sš    ""
$

"





































zMiniterm.handle_menu_keyc                 C   sê   t j d¡ t j ¡  | jÄ t j ¡  d¡}|rÜzrt|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: rk   Úrbz--- Sending file {} ---
i   Ú.z
--- File {} sent ---
z"--- ERROR opening file {}: {} ---
N)r   rC   r!   r"   r    rT   ÚreadlineÚrstripÚopenr   rb   r¡   ÚIOError)r   ÚfilenamerÀ   ÚblockÚer   r   r   rö   E  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 t|ƒ¡¡  q¬qv|| _|  ¡  t j d d | j¡¡¡ d	S )
zchange the i/o transformationsz
--- Available Filters:
rj   c                 s   s   | ]\}}d   ||¡V  qdS )z---   {:<10} = {.__doc__}N©r   ©ru   ÚkÚvr   r   r   rw   ^  s   ÿz)Miniterm.change_filter.<locals>.<genexpr>z$
--- Enter new filter name(s) [{}]: r‚   z--- unknown filter: {}
rÕ   N)r   rC   r!   r‰   r”   r¿   Úitemsr   r¦   r    rT   r   ÚlowerÚsplitr   r§   )r   Znew_filtersrÀ   r   r   r   rø   [  s    
þ
zMiniterm.change_filterc              	   C   s®   t j d | j¡¡ | j t j ¡  ¡ }W 5 Q R X |r‚z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   rC   r!   r   r£   r    rT   r   Ústripr@   ÚlookupÚLookupErrorrË   rÎ   r¤   )r   Znew_encodingr   r   r   rù   n  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   rC   r!   r"   r    r¡   Úbaudrater–   rT   r   r  r˜   r   rÝ   )r   Zbackupr  r   r   r   rü   ~  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   rC   r!   r   r¾   r·   )r   rš   ZsettingsZ
new_serialr  r   r   r   rú   Œ  s,    





zMiniterm.change_portc              
   C   sò   |   ¡  | j ¡  tj d | jj¡¡ d}| jjsÂtj djt	| j
ƒd¡ | j ¡ }|| j
krn|  ¡  qÂn|dkr|d}qÂz| 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   rC   r!   r   rš   Zis_openr   r¨   r    r    r½   r  r  rú   r·   )r   Zdo_change_portr	  r  r   r   r   rû   ª  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 textaQ  
--- pySerial ({version}) - miniterm - help
---
--- {exit:8} Exit program
--- {menu:8} Menu escape key, followed by:
--- Menu keys:
---    {menu:7} Send the menu character itself to remote
---    {exit:7} Send the exit character itself to remote
---    {info:7} Show info
---    {upload:7} Upload file (prompt will be shown)
---    {repr:7} encoding
---    {filter:7} edit filters
--- Toggles:
---    {rts:7} RTS   {dtr:7} DTR   {brk:7} BREAK
---    {echo:7} echo  {eol:7} EOL
---
--- Port settings ({menu} followed by the following):
---    p          change port
---    7 8        set data bits
---    N E O S M  change parity (None, Even, Odd, Space, Mark)
---    1 2 3      set stop bits (1, 2, 1.5)
---    b          change baud rate
---    x X        disable/enable software flow control
---    r R        disable/enable hardware flow control
ZVERSIONzunknown versionræ   rç   rè   ré   rí   rå   rì   rê   rë   )Úversionr  ZmenurÖ   r×   Zbrkrh   ÚinfoZuploadr   Úfilterr¥   )r   Úgetattrr¡   r   r¨   r©   r   r   r   r   r÷   É  s    
ÝzMiniterm.get_help_textN)Fr   r   )F)r7   )r7   )r,   r-   r.   r/   r   r·   rº   r¶   r½   r‰   r¾   r§   rË   rÎ   rÝ   r´   r»   rã   rö   rø   rù   rü   rú   rû   r÷   r   r   r   r   r   N  s,   




&T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/d0d1d2d3g d4 |jd5d6d7d8gd9d„ d:d8d |jd;dd<dd | d=¡}|jd>td?d@dAdB |jdCtd?dDdEdB | dF¡}|jdGdHddIdd |jdJddKdd | ¡ }|j|jkrº| dL¡ |j	rdM|j	krt
j dN¡ t
j dO dPdQ„ tt ¡ ƒD ƒ¡¡ t
j dO¡ t
 dR¡ |j	}ndSg}|jdks:|jdTkr†ztƒ |_W n, tk
rr   t
j dO¡ | dU¡ Y nX |js†| dV¡ z²tj|j|j|j|j|jdWdX}	t|	dYƒsºdR|	_|jdk	rô|jsìt
j dZ |jräd[nd\¡¡ |j|	_|j dk	r.|js&t
j d] |j rd[nd\¡¡ |j |	_ |	 !¡  W nd tj"k
rœ }
 zBt
j d^ t#|jƒ|
¡¡ |j$rr‚ |j%s†t
 dR¡ ndT|_W 5 d}
~
X Y nX q¦q"t&|	|j'|j( )¡ |d_}t*|jƒ|_+t*|jƒ|_,|j-|_-| .|j/¡ | 0|j/¡ |jsBt
j d`j|jda¡ t
j db t1|j+ƒt1|j,ƒt1|j,ƒt1dcƒ¡¡ | 2¡  z| dW¡ W n tk
rn   Y nX |js„t
j dd¡ | ¡  | 3¡  dS )ezCommand line tool, entry pointr   Nz9Miniterm - A simple terminal program for the serial port.)Zdescriptionrš   ú?z(serial port name ('-' to show port list))ÚnargsÚhelpr‘   r  z#set baud rate, default: %(default)s)r  Útyper  r‘   zport settingsz--parityÚNÚEÚOÚSÚMc                 S   s   |   ¡ S r'   ©rÜ   r   r   r   r   r	     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--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)sr6   )ÚdestÚmetavarr  r‘   z-fz--filterr‡   ÚNAMEzadd text transformation)r'  r*  r  r‘   z--eolrm   rp   ri   c                 S   s   |   ¡ S r'   r$  r   r   r   r   r	   J  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  r*  r  r‘   z--menu-charz_Unicode code of special character that is used to control miniterm (menu), default: %(default)srŸ   Zdiagnosticsz-qz--quietzsuppress non-error messagesz	--developzshow Python traceback on errorz.--exit-char can not be the same as --menu-charr  zAvailable filters:
rj   c                 s   s   | ]\}}d   ||¡V  qdS )z{:<10} = {.__doc__}Nr  r  r   r   r   rw   z  s   ÿzmain.<locals>.<genexpr>r\   r‘   ú-z"user aborted and port is not givenzport is not givenT)rý   rÛ   rÚ   r  r¸   z--- forcing DTR {}
rÑ   rÒ   z--- forcing RTS {}
zcould not open port {}: {}
)rh   r¥   r¦   zP--- Miniterm on {p.name}  {p.baudrate},{p.bytesize},{p.parity},{p.stopbits} ---
rÏ   z6--- Quit: {} | Menu: {} | Help: {} followed by {} ---
úz
--- exit ---
)4ÚargparseÚArgumentParserÚadd_argumentr–   Zadd_argument_groupÚ
parse_argsZ	menu_charZ	exit_charÚerrorr  r   rC   r!   r‰   r”   r¿   r  r  rš   rœ   râ   r¡   r  r  rý   rÛ   rÚ   r¹   Ztimeoutr×   Úquietr   rÖ   r  rÙ   r   ZdevelopZaskr   rh   r¥   r  rM   r¨   r©   r¢   rË   r(  rÎ   r   r¶   r¾   )Zdefault_portZdefault_baudrateZdefault_rtsZdefault_dtrr.  ÚparserÚgroupr)   r¦   r®   r  Zminitermr   r   r   Úmainõ  sŽ   ÿüû
ûüüüüü
 üû ûûü
ûû
 üü

þ


úü
ÿ
ür6  Ú__main__)Nr  NN),r@   r3   r   r²   r¡   Zserial.tools.list_portsr   Zserial.toolsr   rY   r•   Ú	NameErrorÚinputÚchrrM   r   Úobjectr   r±   rL   r9   r1   r5   rX   rU   rd   ÚNotImplementedErrorr   Úplatformre   ri   rm   rp   rq   r€   r   r‹   rŽ   rÃ   r¿   rœ   r   r6  r,   r   r   r   r   Ú<module>
   sp   

-
!

ÿ
ýú   *
 [
