
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
MÊ]W@#  ã               @   s¨   d dl Z d dlZd dlZyd dlZW n ek
rB   d dljZY nX dd„ Zdd„ ZG dd„ de	ƒZ
G dd	„ d	e	ƒZG d
d„ dejƒZedkr¤edƒZde_eeƒ dS )é    Nc             c   s´   d}xrt j| ƒD ]d}djt|ƒƒd|  ko2dk n  rB|jdƒndfV  |d7 }|dkrbdV  q|dkrdV  d}qW |dkr°x(|dk r¨|d7 }|dkr dV  dV  q‚W dV  dS )z•    yield tuples of hex and ASCII display in multiples of 16. Includes a
    space after 8 bytes and (None, None) after 16 bytes and at the end.
    r   z{:02X} ó    ó   ÚasciiÚ.é   é   ú Ú é   Nú   )r   r	   )NN)r   r	   )r   r   )NN)ÚserialZ	iterbytesÚformatÚordÚdecode)ÚdataÚnÚb© r   ú"/usr/lib/python3.6/protocol_spy.pyÚsixteen"   s     6

r   c             c   s€   g }g }d}xnt | ƒD ]b\}}|dkrd|djdj|ƒdj|ƒgƒfV  |dd…= |dd…= |d7 }q|j|ƒ |j|ƒ qW dS )z yield lines with hexdump of datar   Nr   r	   r
   )r   ÚjoinÚappend)r   Úvaluesr   ÚoffsetÚhÚar   r   r   Úhexdump9   s     



r   c               @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú	FormatRawz&Forward only RX and TX data to output.c             C   s   || _ || _d| _d| _d S )Nz[32mz[31m)ÚoutputÚcolorÚrx_colorÚtx_color)Úselfr   r   r   r   r   Ú__init__L   s    zFormatRaw.__init__c             C   s.   | j r| jj| jƒ | jj|ƒ | jjƒ  dS )zshow received dataN)r   r   Úwriter    Úflush)r"   r   r   r   r   ÚrxR   s    zFormatRaw.rxc             C   s.   | j r| jj| jƒ | jj|ƒ | jjƒ  dS )zshow transmitted dataN)r   r   r$   r!   r%   )r"   r   r   r   r   ÚtxY   s    zFormatRaw.txc             C   s   dS )z(do not) show control callsNr   )r"   ÚnameÚvaluer   r   r   Úcontrol`   s    zFormatRaw.controlN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r&   r'   r*   r   r   r   r   r   I   s
   r   c               @   s:   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ ZdS )ÚFormatHexdumpax      Create a hex dump of RX ad TX data, show when control lines are read or
    written.

    output example::

        000000.000 Q-RX flushInput
        000002.469 RTS  inactive
        000002.773 RTS  active
        000003.001 TX   48 45 4C 4C 4F                                    HELLO
        000003.102 RX   48 45 4C 4C 4F                                    HELLO

    c             C   s,   t j ƒ | _|| _|| _d| _d| _d| _d S )Nz[32mz[31mz[37m)ÚtimeÚ
start_timer   r   r    r!   Úcontrol_color)r"   r   r   r   r   r   r#   t   s    
zFormatHexdump.__init__r	   c             C   s&   | j jdj||||ƒƒ | j jƒ  d S )Nz{:010.3f} {:4} {}{}
)r   r$   r   r%   )r"   Z	timestampZlabelr)   Zvalue2r   r   r   Ú
write_line|   s    zFormatHexdump.write_linec             C   sl   | j r| jj| jƒ |rPxNt|ƒD ](\}}| jtjƒ | j ddj|ƒ|ƒ q"W n| jtjƒ | j ddƒ dS )zshow received data as hex dumpZRXz{:04X}  z<empty>N)	r   r   r$   r    r   r3   r0   r1   r   )r"   r   r   Úrowr   r   r   r&   €   s    &zFormatHexdump.rxc             C   sN   | j r| jj| jƒ x4t|ƒD ](\}}| jtjƒ | j ddj|ƒ|ƒ qW dS )z!show transmitted data as hex dumpZTXz{:04X}  N)	r   r   r$   r!   r   r3   r0   r1   r   )r"   r   r   r4   r   r   r   r'   Š   s    zFormatHexdump.txc             C   s0   | j r| jj| jƒ | jtjƒ | j ||ƒ dS )zshow control callsN)r   r   r$   r2   r3   r0   r1   )r"   r(   r)   r   r   r   r*   ‘   s    zFormatHexdump.controlN)r	   )	r+   r,   r-   r.   r#   r3   r&   r'   r*   r   r   r   r   r/   e   s   

r/   c                   sT  e Zd ZdZ‡ fdd„Zejjjdd„ ƒZdd„ Z	‡ fdd	„Z
d,‡ fdd„	Zeejdƒrd‡ fdd„Zeejdƒr|‡ fdd„Ze‡ fdd„ƒZ‡ fdd„Z‡ fdd„Z‡ fdd„Zd-‡ fdd„	Zejjjdd„ ƒZejjjd d!„ ƒZejjjd"d#„ ƒZejjj‡ fd$d%„ƒZejjj‡ fd&d'„ƒZejjj‡ fd(d)„ƒZejjj‡ fd*d+„ƒZ‡  ZS ).ÚSerialzc    Inherit the native Serial port implementation and wrap all the methods and
    attributes.
    c                s"   t t| ƒj||Ž d | _d| _d S )NF)Úsuperr5   r#   Ú	formatterÚshow_all)r"   ÚargsÚkwargs)Ú	__class__r   r   r#   Ÿ   s    zSerial.__init__c             C   s"   |d k	rt jjj| | j|ƒƒ d S )N)r   r5   ÚportÚ__set__Úfrom_url)r"   r)   r   r   r   r<   ¤   s    zSerial.portc       	      C   sü   t j|ƒ}|jdkr&tjdj|jƒƒ‚t}d}tj}yvxpt j	|j
dƒjƒ D ]Z\}}|dkrjt|d dƒ}qJ|dkrxd}qJ|d	kr†t}qJ|d
kr–d| _qJtdj|ƒƒ‚qJW W n2 tk
rÜ } ztjdj|ƒƒ‚W Y dd}~X nX |||ƒ| _dj|j|jgƒS )z(extract host and port from an URL stringZspyzmexpected a string in the form "spy://port[?option[=value][&option[=value]]]": not starting with spy:// ({!r})FTÚfiler   Úwr   ÚrawÚallzunknown option: {!r}zPexpected a string in the form "spy://port[?option[=value][&option[=value]]]": {}Nr	   )ÚurlparseZurlsplitÚschemer   ZSerialExceptionr   r/   ÚsysÚstderrZparse_qsZqueryÚitemsÚopenr   r8   Ú
ValueErrorr7   r   ZnetlocÚpath)	r"   ZurlÚpartsr7   r   r   Zoptionr   Úer   r   r   r>   ©   s2    


zSerial.from_urlc                s   | j j|ƒ tt| ƒj|ƒS )N)r7   r'   r6   r5   r$   )r"   r'   )r;   r   r   r$   È   s    zSerial.writer   c                s*   t t| ƒj|ƒ}|s| jr&| jj|ƒ |S )N)r6   r5   Úreadr8   r7   r&   )r"   Úsizer&   )r;   r   r   rM   Ì   s    
zSerial.readÚcancel_readc                s    | j jddƒ tt| ƒjƒ  d S )NzQ-RXrO   )r7   r*   r6   r5   rO   )r"   )r;   r   r   rO   Ó   s    zSerial.cancel_readÚcancel_writec                s    | j jddƒ tt| ƒjƒ  d S )NzQ-TXrP   )r7   r*   r6   r5   rP   )r"   )r;   r   r   rP   Ø   s    zSerial.cancel_writec                s*   t t| ƒj}| jr&| jjddj|ƒƒ |S )NzQ-RXzin_waiting -> {})r6   r5   Ú
in_waitingr8   r7   r*   r   )r"   r   )r;   r   r   rQ   Ü   s    zSerial.in_waitingc                s    | j jddƒ tt| ƒjƒ  d S )NzQ-TXr%   )r7   r*   r6   r5   r%   )r"   )r;   r   r   r%   ã   s    zSerial.flushc                s    | j jddƒ tt| ƒjƒ  d S )NzQ-RXÚreset_input_buffer)r7   r*   r6   r5   rR   )r"   )r;   r   r   rR   ç   s    zSerial.reset_input_bufferc                s    | j jddƒ tt| ƒjƒ  d S )NzQ-TXÚreset_output_buffer)r7   r*   r6   r5   rS   )r"   )r;   r   r   rS   ë   s    zSerial.reset_output_bufferç      Ð?c                s(   | j jddj|ƒƒ tt| ƒj|ƒ d S )NÚBRKzsend_break {}s)r7   r*   r   r6   r5   Ú
send_break)r"   Zduration)r;   r   r   rV   ï   s    zSerial.send_breakc             C   s*   | j jd|rdndƒ tjjj| |ƒ d S )NrU   ÚactiveÚinactive)r7   r*   r   r5   Úbreak_conditionr=   )r"   Úlevelr   r   r   rY   ó   s    zSerial.break_conditionc             C   s*   | j jd|rdndƒ tjjj| |ƒ d S )NZRTSrW   rX   )r7   r*   r   r5   Úrtsr=   )r"   rZ   r   r   r   r[   ø   s    z
Serial.rtsc             C   s*   | j jd|rdndƒ tjjj| |ƒ d S )NZDTRrW   rX   )r7   r*   r   r5   Údtrr=   )r"   rZ   r   r   r   r\   ý   s    z
Serial.dtrc                s&   t t| ƒj}| jjd|rdndƒ |S )NZCTSrW   rX   )r6   r5   Úctsr7   r*   )r"   rZ   )r;   r   r   r]     s    z
Serial.ctsc                s&   t t| ƒj}| jjd|rdndƒ |S )NZDSRrW   rX   )r6   r5   Údsrr7   r*   )r"   rZ   )r;   r   r   r^     s    z
Serial.dsrc                s&   t t| ƒj}| jjd|rdndƒ |S )NZRIrW   rX   )r6   r5   Úrir7   r*   )r"   rZ   )r;   r   r   r_     s    z	Serial.ric                s&   t t| ƒj}| jjd|rdndƒ |S )NZCDrW   rX   )r6   r5   Úcdr7   r*   )r"   rZ   )r;   r   r   r`     s    z	Serial.cd)r   )rT   )r+   r,   r-   r.   r#   r   r5   r<   Úsetterr>   r$   rM   ÚhasattrrO   rP   ÚpropertyrQ   r%   rR   rS   rV   rY   r[   r\   r]   Úgetterr^   r_   r`   Ú__classcell__r   r   )r;   r   r5   ˜   s,   r5   Ú__main__zspy:///dev/ttyS0)rE   r0   r   rC   ÚImportErrorZurllib.parseÚparser   r   Úobjectr   r/   r5   r+   Zserr<   Úprintr   r   r   r   Ú<module>   s    3 