
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
MÊ]WV„  ã               @   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 j	dd„ ƒ y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j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 jƒ S d S )NZhexlify)r   Úgetregentry)Úc© r   ú/usr/lib/python3.6/miniterm.pyÚ<lambda>   s    r   c             C   s.   t | ƒ}|dk r"dj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   )r   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|ƒ | 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|ƒ | 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   | j ƒ  | S )N)r   )r   r   r   r   Ú	__enter__N   s    zConsoleBase.__enter__c             O   s   | j ƒ  d S )N)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 )N)Úfd)r   r,   r   r   r   r   ]   s    zOut.__init__c             C   s   d S )Nr   )r   r   r   r   r   `   s    z	Out.flushc             C   s   t j| j|ƒ d S )N)Úosr   r,   )r   Úsr   r   r   r   c   s    z	Out.writeN)r&   r'   r(   r)   r   r   r   r   r   r   r   r+   Z   s   r+   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| ƒjƒ  tjjjƒ | _tjjjƒ | _	tjjj
dƒ tjjjdƒ tjdƒttjjƒ ƒdƒ| _tjdƒttjjƒ ƒdƒt_| jt_d| j_d S )Niéý  zUTF-8Úreplace)Úsuperr/   r   ÚctypesÚwindllÚkernel32ZGetConsoleOutputCPÚ
_saved_ocpZGetConsoleCPÚ
_saved_icpÚSetConsoleOutputCPÚSetConsoleCPÚcodecsÚ	getwriterr+   r   r   Úfilenor   ÚstderrÚencoding)r   )Ú	__class__r   r   r   g   s    zConsole.__init__c             C   s$   t jjj| jƒ t jjj| jƒ d S )N)r2   r3   r4   r7   r5   r8   r6   )r   r   r   r   Ú__del__s   s    zConsole.__del__c             C   sH   xBt jƒ }|tdƒkrtdƒS |tdƒtdƒfkr<t jƒ  q|S qW d S )Né   é
   r   é   )ÚmsvcrtZgetwchÚunichr)r   Úzr   r   r   r   w   s    
zConsole.getkeyc             C   s$   t jjjƒ }t jjj|dddƒ d S )Né   r@   r   )r2   r3   r4   ZGetConsoleWindowZuser32ZPostMessageA)r   Zhwndr   r   r   r!   �   s    zConsole.cancel)r&   r'   r(   r   r?   r   r!   Ú__classcell__r   r   )r>   r   r/   f   s   
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                sr   t t| ƒjƒ  tjjƒ | _tjƒ \| _	| _
tj| jƒ| _tj| jƒ tjdk rftjtjjƒtjƒ| _ntj| _d S )Nr   r   )r   r   )r1   r/   r   r   Ústdinr;   r,   r-   ÚpipeÚpipe_rÚpipe_wÚtermiosÚ	tcgetattrÚoldÚatexitÚregisterr   r   r9   Ú	getreaderr=   Ú	enc_stdin)r   )r>   r   r   r   �   s    
zConsole.__init__c             C   sb   t j| jƒ}|d t j @ t j @ t j @ |d< d|d t j< d|d t j< t j| jt j	|ƒ d S )Nr   é   é   r   )
rM   rN   r,   ZICANONZECHOZISIGZVMINZVTIMEÚ	tcsetattrZTCSANOW)r   Únewr   r   r   r   š   s
    $zConsole.setupc             C   s^   t j | j| jgg g d ƒ\}}}| j|kr:tj| jdƒ d S | jjdƒ}|tdƒkrZtdƒ}|S )NrT   é   é   )ÚselectrS   rK   r-   ÚreadrD   )r   ZreadyÚ_r   r   r   r   r   ¡   s    
zConsole.getkeyc             C   s   t j| jdƒ d S )NÚx)r-   r   rL   )r   r   r   r   r!   «   s    zConsole.cancelc             C   s   t j| jt j| jƒ d S )N)rM   rV   r,   Z	TCSAFLUSHrO   )r   r   r   r   r   ®   s    zConsole.cleanup)	r&   r'   r(   r   r   r   r!   r   rG   r   r   )r>   r   r/   Œ   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   r   Úrxº   s    zTransform.rxc             C   s   |S )ztext to be sent to serial portr   )r   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   r   ÚechoÂ   s    zTransform.echoN)r&   r'   r(   r)   r_   r`   ra   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   |j ddƒS )NÚ
z
)r0   )r   r    r   r   r   r`   Ê   s    zCRLF.txN)r&   r'   r(   r)   r`   r   r   r   r   rb   Ç   s   rb   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚCRzENTER sends CRc             C   s   |j ddƒS )Núrc   )r0   )r   r    r   r   r   r_   Ñ   s    zCR.rxc             C   s   |j ddƒS )Nrc   re   )r0   )r   r    r   r   r   r`   Ô   s    zCR.txN)r&   r'   r(   r)   r_   r`   r   r   r   r   rd   Î   s   rd   c               @   s   e Zd ZdZdS )ÚLFzENTER sends LFN)r&   r'   r(   r)   r   r   r   r   rf   Ø   s   rf   c               @   sB   e Zd ZdZedd„ edƒD ƒƒZej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 )z
	i $  N)rD   )Ú.0r]   r   r   r   ú	<genexpr>ß   s    zNoTerminal.<genexpr>r	   i!$  i%$  )rX   é›   c             C   s   |j | jƒS )N)Ú	translateÚREPLACEMENT_MAP)r   r    r   r   r   r_   æ   s    zNoTerminal.rxN)
r&   r'   r(   r)   ÚdictÚrangerl   Úupdater_   ra   r   r   r   r   rg   Ü   s   
rg   c               @   s8   e Zd ZdZedd„ edƒD ƒƒZejddddœƒ d	S )
Ú
NoControlsz%Remove all control codes, incl. CR+LFc             c   s   | ]}|d | fV  qdS )i $  Nr   )rh   r]   r   r   r   ri   ï   s    zNoControls.<genexpr>r	   i#$  i!$  i%$  )r	   rX   rj   N)r&   r'   r(   r)   rm   rn   rl   ro   r   r   r   r   rp   ì   s   rp   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 }x€|D ]x}d|  ko dk n  s.|dkr:|j |ƒ q
|dk rZ|j tdt|ƒ ƒƒ q
|jdd„ djt|ƒƒD ƒƒ |j dƒ q
W dj|ƒS )	Nú úz
	i $  c             s   s"   | ]}t d t|ƒ d ƒV  qdS )i€   é0   N)rD   r   )rh   Údr   r   r   ri     s    zPrintable.rx.<locals>.<genexpr>z{:d}Ú )ÚappendrD   r   Úextendr   Újoin)r   r    Úrr   r   r   r   r_   û   s    
 zPrintable.rxN)r&   r'   r(   r)   r_   ra   r   r   r   r   rq   ø   s   rq   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_color)r   r   r   r   r     s    zColorize.__init__c             C   s
   | j | S )N)r|   )r   r    r   r   r   r_     s    zColorize.rxc             C   s
   | j | S )N)r}   )r   r    r   r   r   ra     s    zColorize.echoN)r&   r'   r(   r)   r   r_   ra   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jdjt|ƒƒƒ t jjƒ  |S )Nz	 [RX:{}] )r   r<   r   r   r   r   )r   r    r   r   r   r_     s    
z
DebugIO.rxc             C   s$   t jjdjt|ƒƒƒ t jjƒ  |S )Nz	 [TX:{}] )r   r<   r   r   r   r   )r   r    r   r   r   r`   !  s    
z
DebugIO.txN)r&   r'   r(   r)   r_   r`   r   r   r   r   r~     s   r~   )ÚcrlfZcrZlf)ZdirectÚdefaultZ	nocontrolZ	printableZcolorizeÚdebugc              C   s¾   t jjdƒ g } xBtttƒ ƒdƒD ].\}\}}}t jjdj|||ƒƒ | j|ƒ q"W xdtdƒ}y:t	|ƒd }d|  ko‚t
| ƒk n  s–t jjdƒ wVW n tk
r¬   Y n
X | | }|S d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:
rT   z--- {:2}: {:20} {}
z#--- Enter port index or full name: r   z--- Invalid index!
N)r   r<   r   Ú	enumerateÚsortedr   r   rw   Ú	raw_inputÚintÚlenÚ
ValueError)ZportsÚnÚportZdescZhwidÚindexr   r   r   Úask_for_port<  s      r‹   c               @   s–   e Zd ZdZddf fdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zd$dd„Z	dd„ Z
dd„ Zd%dd„Zd&dd„Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#S )'ÚMinitermz�    Terminal application. Copy data from serial port to console and vice versa.
    Handle special keys from the console to show menu etc.
    Fr   c             C   sh   t ƒ | _|| _|| _d| _d| _d| _|| _|| _| j	ƒ  d| _
d| _d | _d | _d | _d | _d | _d S )NFzUTF-8é   é   )r/   ÚconsoleÚserialra   ÚrawÚinput_encodingÚoutput_encodingÚeolÚfiltersÚupdate_transformationsÚexit_characterÚmenu_characterÚaliveÚ_reader_aliveÚreceiver_threadÚ
rx_decoderZ
tx_decoder)r   Úserial_instancera   r”   r•   r   r   r   r   [  s     zMiniterm.__init__c             C   s.   d| _ tj| jdd�| _d| j_| jjƒ  dS )zStart reader threadTr_   )ÚtargetÚnameN)rš   Ú	threadingÚThreadÚreaderr›   ÚdaemonÚstart)r   r   r   r   Ú_start_readerm  s    zMiniterm._start_readerc             C   s*   d| _ t| jdƒr| jjƒ  | jjƒ  dS )z6Stop reader thread only, wait for clean exit of threadFÚcancel_readN)rš   Úhasattrr�   r¦   r›   ry   )r   r   r   r   Ú_stop_readeru  s    
zMiniterm._stop_readerc             C   s@   d| _ | jƒ  tj| jdd�| _d| j_| jjƒ  | jj	ƒ  dS )zstart worker threadsTr`   )rž   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 jƒ  |s.t| jdƒr$| jjƒ  | jjƒ  dS )z$wait for worker threads to terminater¦   N)rª   ry   r§   r�   r¦   r›   )r   Ztransmit_onlyr   r   r   ry   Š  s
    

zMiniterm.joinc             C   s   | j jƒ  d S )N)r�   Úclose)r   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)rh   Úfr   r   r   ú
<listcomp>—  s   z3Miniterm.update_transformations.<locals>.<listcomp>c             S   s   g | ]
}|ƒ ‘qS r   r   )rh   Ú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_transformationsr0   c             C   s   || _ tj|ƒ|ƒ| _dS )zset encoding for received dataN)r’   r9   Úgetincrementaldecoderrœ   )r   r=   Úerrorsr   r   r   Úset_rx_encodingœ  s    zMiniterm.set_rx_encodingc             C   s   || _ tj|ƒ|ƒ| _dS )z!set encoding for transmitted dataN)r“   r9   ÚgetincrementalencoderÚ
tx_encoder)r   r=   r·   r   r   r   Úset_tx_encoding¡  s    zMiniterm.set_tx_encodingc             C   sN  t jjdj| jd�ƒ t jjdj| jjr,dnd| jjr:dnd| jjrHdndƒƒ yLt jjdj| 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jdj| jjrÊdndƒƒ t jjdj| jjrèdndƒƒ t jjd	j| jƒƒ t jjd
j| jƒƒ t jjdj| jjƒ ƒƒ t jjdjdj| 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: {}
z--- serial input encoding: {}
z--- serial output encoding: {}
z--- EOL: {}
z--- filters: {}
rr   N)r   r<   r   r   r�   ÚrtsÚdtrÚbreak_conditionZctsZdsrZriZcdÚSerialExceptionÚxonxoffÚrtsctsr’   r“   r”   Úupperry   r•   )r   r   r   r   Údump_port_settings¦  s(    


zMiniterm.dump_port_settingsc             C   s¢   ytxn| j rp| jrp| jj| jjp dƒ}|r| jr<| jj|ƒ q| jj	|ƒ}x| j
D ]}|j|ƒ}qPW | jj|ƒ qW W n( tjk
rœ   d| _ | jjƒ  ‚ Y nX dS )zloop and copy serial->consolerT   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}yÜxÖ| j rÜy| jjƒ }W n tk
r4   d}Y nX | j s>P |rR| j|ƒ d}q|| jkrbd}q|| jkrx| jƒ  P q|}x| jD ]}|j	|ƒ}q„W | j
j| jj|ƒƒ | jr|}x| jD ]}|j|ƒ}q¼W | jj|ƒ qW 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º   Úencodera   )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j|ƒƒ | jr:| jj|ƒ �nZ|dk�r:tj	jdƒ tj	j
ƒ  | j�Ì tjjƒ jdƒ}|�r,yvt|dƒ�P}tj	jdj|ƒƒ x6|jdƒ}|s®P | jj|ƒ | jj
ƒ  tj	jdƒ qžW W dQ R X tj	jd	j|ƒƒ W n8 tk
�r* } ztj	jd
j||ƒƒ W Y dd}~X nX W dQ R X �n^|dk�rXtj	j| jƒ ƒ �n@|dk�r”| jj | j_tj	jdj| jj�rˆdndƒƒ �n|dk�rÐ| jj | j_tj	jdj| jj�rÄdndƒƒ �nÈ|dk�r| jj | j_tj	jdj| jj�r dndƒƒ �nŒ|dk�rB| j | _tj	jdj| j�r6dndƒƒ �nV|dk�rtj	jdƒ tj	jdjdd„ ttjƒ ƒD ƒƒƒ tj	jdjdj| jƒƒƒ | j� tjjƒ jƒ jƒ }W dQ R X |�r x>|D ](}|tk�rÆtj	jdjt|ƒƒƒ P �qÆW || _| jƒ  tj	jdjdj| jƒƒƒ �nz|dk�r€tt ƒ}|j!| j"ƒd  }|t#|ƒk�rRd!}|| | _"tj	jd"j| j"j$ƒ ƒƒ | jƒ  �n|d#k�r<tj	jd$j| j%ƒƒ | j� tjjƒ j&ƒ }	W dQ R X |	�ryt'j(|	ƒ W n( t)k
�rú   tj	jd%j|	ƒƒ Y nX | j*|	ƒ | j+|	ƒ tj	jd&j| j%ƒƒ tj	jd'j| j,ƒƒ �n\|d(k�rR| j-ƒ  �nF|d)k�rn| j�, y
t.ƒ }
W n t/k
�rˆ   d}
Y nX W dQ R X |
�r˜|
| jj0k�r˜| j1ƒ  | jj2ƒ }yBtj3|
d*d+�}|j4|ƒ | jj|_| jj|_|jƒ  | jj|_W n> t5k
�r: } z tj	jd,j|ƒƒ |j6ƒ  W Y dd}~X n(X | jj6ƒ  || _tj	jd-j| jj0ƒƒ | j7ƒ  �n*|d.k�rtj	jd/ƒ tj	j
ƒ  | j�p | jj8}yt9tjjƒ j&ƒ ƒ| j_8W n> t:k
�rö } z tj	jd0j|ƒƒ || j_8W Y dd}~X n
X | j-ƒ  W dQ R X �nŠ|d1k�r.tj;| j_<| j-ƒ  �nj|d2k�rNtj=| j_<| j-ƒ  �nJ|d3k�rntj>| j_?| j-ƒ  �n*|d4k�rŽtj@| j_?| j-ƒ  �n
|d5k�r¬tjA| j_?| j-ƒ  nì|d6k�rÊtjB| j_?| j-ƒ  nÎ|d7k�rètjC| j_?| j-ƒ  n°|d8k�rtjD| j_E| j-ƒ  n’|d9k�r$tjF| j_E| j-ƒ  nt|d:k�rBtjG| j_E| j-ƒ  nV|d;k�rb|d<k| j_H| j-ƒ  n6|d=k�r‚|d>k| j_I| j-ƒ  ntj	jd?jtJ|ƒƒƒ dS )@z"Implement a simple menu / settingsúz
--- File to upload: z
Úrbz--- Sending file {} ---
i   Ú.Nz
--- File {} sent ---
z"--- ERROR opening file {}: {} ---
zhH?úz--- RTS {} ---
r½   r¾   úz--- DTR {} ---
úz--- BREAK {} ---
úz--- local echo {} ---
úz
--- Available Filters:
rc   c             s   s   | ]\}}d j ||ƒV  qdS )z---   {:<10} = {.__doc__}N)r   )rh   ÚkÚvr   r   r   ri   $  s   z+Miniterm.handle_menu_key.<locals>.<genexpr>z$
--- Enter new filter name(s) [{}]: rr   z--- unknown filter: {}z--- filters: {}
úrT   r   z--- EOL: {} ---
úz#
--- Enter new encoding name [{}]: z--- invalid encoding name: {}
z--- serial input encoding: {}
z--- serial output encoding: {}
ú	ZpPT)Údo_not_openz#--- ERROR opening new port: {} ---
z--- Port changed to: {} ---
ZbBz
--- Baudrate: z#--- ERROR setting baudrate: {} ---
Ú8Ú7ZeEZoOZmMZsSZnNÚ1Ú2Ú3ZxXÚXZrRÚRz!--- unknown menu character {} --
)Kr˜   r—   r�   r   rº   rÍ   ra   r�   r   r<   r   rI   ÚreadlineÚrstripÚopenr   r[   ÚIOErrorÚget_help_textr¿   rÀ   rÁ   ry   rƒ   r­   Úitemsr•   ÚlowerÚsplitr   r–   r³   r±   rŠ   r”   r†   rÅ   r’   Ústripr9   ÚlookupÚLookupErrorr¸   r»   r“   rÆ   r‹   rË   r‰   r¨   ZgetSettingsDictÚserial_for_urlZapplySettingsDictÚ	Exceptionr¬   r¥   Úbaudrater…   r‡   Z	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   Úfilenamer®   ÚblockÚeZnew_filtersZmodesr”   Znew_encodingr‰   ZsettingsZ
new_serialZbackupr   r   r   rÌ   ø  s&   



4

$
$
$

"
















































zMiniterm.handle_menu_keyc             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
ÚVERSIONzunknown versionrÑ   rÒ   rÓ   rÔ   rÚ   rÎ   rÙ   rÕ   rØ   )ÚversionÚexitZmenur¿   rÀ   Zbrkra   ÚinfoZuploadr   Úfilterr”   )r   Úgetattrr�   r   r—   r˜   )r   r   r   r   rç   ›  s    zMiniterm.get_help_textN)F)r0   )r0   )r&   r'   r(   r)   r   r¥   r¨   r¤   r«   ry   r¬   r–   r¸   r»   rÆ   r¢   r©   rÌ   rç   r   r   r   r   rŒ   U  s"   



& $rŒ   é€%  c             C   sœ  ddl }|jdd�}|jddd| d� |jd	dtd
|d� |j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� |j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� |jd=ƒ}|jd>td?d@dAdB� |jdCtd?dDdEdB� |jdFƒ}|jdGdHddIdd� |jdJddKdd� |jƒ }|j|jk�rº|jdLƒ |j	�rdM|j	k�rt
jjdNƒ t
jjdOjdPdQ„ ttjƒ ƒD ƒƒƒ t
jjdOƒ t
jdRƒ |j	}ndSg}�x„|jdk�s>|jdTk�rŠytƒ |_W n, tk
�rv   t
jjdOƒ |jdUƒ Y nX |j�sŠ|jdVƒ y²tj|j|j|j|j|jdWdX�}	t|	dYƒ�s¾dR|	_|jdk	�rø|j�sðt
jjdZj|j�rèd[nd\ƒƒ |j|	_|j dk	�r2|j�s*t
jjd]j|j �r"d[nd\ƒƒ |j |	_ |	j!ƒ  W nd tj"k
�r  }
 zDt
jjd^jt#|jƒ|
ƒƒ |j$�rv‚ |j%�sŠt
jdRƒ ndT|_W Y dd}
~
X nX P �q&W t&|	|j'|j(j)ƒ |d_�}t*|jƒ|_+t*|jƒ|_,|j-|_-|j.|j/ƒ |j0|j/ƒ |j�sFt
jjd`j|jda�ƒ t
jjdbjt1|j+ƒt1|j,ƒt1|j,ƒt1dcƒƒƒ |j2ƒ  y|jdWƒ W n tk
�rr   Y nX |j�sˆt
jjddƒ |jƒ  |j3ƒ  dS )ezCommand line tool, entry pointr   Nz9Miniterm - A simple terminal program for the serial port.)Ú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   | j ƒ S )N)rÅ   )r   r   r   r   r   á  s    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)szUTF-8)ÚdestÚmetavarrÿ   r€   z-fz--filterrw   ÚNAMEzadd text transformation)r  r  rÿ   r€   z--eolrd   rf   rb   c             S   s   | j ƒ S )N)rÅ   )r   r   r   r   r     s    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:
rc   c             s   s   | ]\}}d j ||ƒV  qdS )z{:<10} = {.__doc__}N)r   )rh   rÖ   r×   r   r   r   ri   M  s   zmain.<locals>.<genexpr>rT   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 {}: {}
)ra   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   r<   r   ry   rƒ   r­   rè   r÷   r‰   r‹   rË   r�   rî   rð   rñ   rÄ   rÃ   r§   ZtimeoutrÀ   Úquietr   r¿   rå   rÂ   r   ZdevelopZaskrŒ   ra   r”   ré   rD   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^   









r  Ú__main__)Nrû   NN),r9   r-   r   r    r�   Zserial.tools.list_portsr   Zserial.toolsr   rQ   r„   Ú	NameErrorÚinputÚchrrD   r   Úobjectr   rŸ   rC   r2   r+   r/   rP   rM   rZ   ÚNotImplementedErrorr   Úplatformr^   rb   rd   rf   rg   rp   rq   r{   r~   r±   r­   r‹   rŒ   r  r&   r   r   r   r   Ú<module>
   sh   

-
!
&
  t
 [
