
    ve=                     v   d dl Z d dlZd dlZ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Z
n# e$ r dZ
Y nw xY wd Z G d de          Z G d d	e          Z G d
 de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          ZdS )    N)dequeTFc                  .    t          j                    dz  S )N  )timeperf_counter     AD:\Marlin-2.1.1.1\buildroot\share\scripts\MarlinBinaryProtocol.pymillisr      s    %%r	   c                        e Zd Zd Zd Zd ZdS )TimeOutc                 <    || _         |                                  d S N)durationreset)selfmillisecondss     r
   __init__zTimeOut.__init__   s    $

r	   c                 <    t                      | j        z   | _        d S r   )r   r   endtimer   s    r
   r   zTimeOut.reset   s    xx$-/r	   c                 0    t                      | j        k    S r   )r   r   r   s    r
   timedoutzTimeOut.timedout   s    xx$,&&r	   N)__name__
__module____qualname__r   r   r   r   r	   r
   r   r      sA          0 0 0' ' ' ' 'r	   r   c                       e Zd ZdS )ReadTimeoutNr   r   r   r   r	   r
   r   r   "           Dr	   r   c                       e Zd ZdS )
FatalErrorNr   r   r	   r
   r"   r"   $   r    r	   r"   c                       e Zd ZdS )SycronisationErrorNr   r   r	   r
   r$   r$   &   r    r	   r$   c                       e Zd ZdS )PayloadOverflowNr   r   r	   r
   r&   r&   (   r    r	   r&   c                       e Zd ZdS )ConnectionLostNr   r   r	   r
   r(   r(   *   r    r	   r(   c                       e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZg Z e            Zd Zd Zd Zd Zd	 Z e            fd
Zd ZddZd Zd Z d Z! e            fdZ"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.dS )ProtocolNr   Fr   c                    t          dt          j                   t          j        ||dd          | _        || _        || _        t          |          | _        t          t          |d          d          | _        d| _        || _        |                     g d| j                   t!          j        t$          j        | f	          | _        | j                                         d S )
NzpySerial Version:r      baudratewrite_timeouttimeout      ?g        Tokrsssfe)targetargs)printserialVERSIONSerialportdevicebaudint
block_sizemaxminsimulate_errors	connectedresponse_timeoutregisterprocess_input	threadingThreadr*   receive_workerworker_threadstart)r   r>   r?   bsizesimerrr0   s         r
   r   zProtocol.__init__E   s    !6>222M&T1XYZZZ		e**"3vs#3#3S99 '...0BCCC&-X5LTXSZ[[[  """""r	   c                      j         j        r% j                                           j         j        % fd} fd} j        r	  j                                                             d                                          }t          |          r ||           n># t          $ r  |             Y n(t          $ r  j                                          Y nw xY w j        d S d S )Nc           	          j         D ]K\  }}|D ]C}|| d t          |                   k    r& ||| t          |          d          f             d S DLd S r   )applicationslen)datatokenscallbacktokenr   s       r
   dispatchz)Protocol.receive_worker.<locals>.dispatchX   s    $($5   #  E[c%jj[ 111 %c%jjkk):!;<<< 2 r	   c                  P   t          d           j                                         t          d          D ]`} 	 j        r*t          j        j        j        dd          _         d S t          d            d S #  t          j
        d           Y ^xY wt                      )NzReconnecting..
   r   r,   r-   zConnection closed)r9   r=   closerangerE   r:   r<   r>   r?   r   sleepr(   )xr   s    r
   	reconnectz*Protocol.receive_worker.<locals>.reconnect_   s    "###IOO2YY 	" 	""~ $*M$+$)efrs$t$t$t	1222"JqMMMMM """s   .A?-A??Butf8)
r=   
in_waitingreset_input_bufferrE   readlinedecoderstriprS   OSErrorUnicodeDecodeError)r   rX   r_   rT   s   `   r
   rK   zProtocol.receive_workerT   s5   i" 	+I((*** i" 	+	 	 	 	 		# 	# 	# 	# 	# n 
	/	/y))++226::AACCt99 #HTNNN   	% / / /	,,...../ n 
	/ 
	/ 
	/ 
	/ 
	/s   AB C4"CCc                 x    d| _         | j                                         | j                                         d S )NF)rE   rL   joinr=   r[   r   s    r
   shutdownzProtocol.shutdownz   s6    !!!	r	   c                 :    | j                             |           d S r   	responsesappendr   rT   s     r
   rH   zProtocol.process_input       d#####r	   c                 >    | j                             ||f           d S r   )rR   rn   )r   rU   rV   s      r
   rG   zProtocol.register   s$      &(!344444r	   c                    |                      |||          | _        d| _        d| _        t	          | j        dz            }| j        dk    r}	 |                                rt                      |                     | j                   | 	                                 n # t          $ r | xj        dz  c_        Y nw xY w| j        dk    }d | _        d S )Nr      r,   )build_packetpacket_transitpacket_statustransmit_attemptr   rF   r   r(   transmit_packetawait_responser   errors)r   protocolpacket_typerT   r0   s        r
   sendzProtocol.send   s    "//+tLL !$/"455 A%%!##%% +(***$$T%8999##%%%% ! ! !q !  A%% #s   AB B<;B<c                    t          | j                  }t          | j                  sJt	          j        d           |                                rt                      t          | j                  Jt          | j                  r^| j                                        \  }}| j	        | j
        | j        | j        d} ||         |           t          | j                  \d S d S )Nh㈵>r2   )r   rF   rS   rm   r   r]   r   r   popleftresponse_okresponse_resendresponse_stream_syncresponse_fatal_error)r   r0   rW   rT   switchs        r
   ry   zProtocol.await_response   s    $/00dn%% 	$Jw!! $!mm# dn%% 	$
 $.!! 	 .0022KE4!-T5IRVRktx  uN  O  OFF5M$ $.!! 	  	  	  	  	 r	   c                    t          |d          dz   | _        d| _        d| _        t	          | j        dz            }| j        dk    r	 |                                rd S | j                            | j                   |rd| _        n| 	                                 n6# t          $ r | xj        dz  c_        Y nt          j        j        $ r Y d S w xY w| j        dk    d | _        d S )Nr`      
r   rs   r,   )	bytearrayru   rv   rw   r   rF   r   r=   writeawait_response_asciir   rz   r:   
serialutilSerialException)r   rT   send_and_forgetr0   s       r
   
send_asciizProtocol.send_ascii   s   'f55= !$/"455 A%%##%% F	 3444" 0)*D&&--/// ! ! !q $4     A%% #s   
B  =B C:CCc                 0   t          | j                  }t          | j                  sJt	          j        d           |                                rt                      t          | j                  J| j                                        \  }}d| _	        d S )Nr   r,   )
r   rF   rS   rm   r   r]   r   r   r   rv   )r   r0   rW   rT   s       r
   r   zProtocol.await_response_ascii   s    $/00dn%% 	$Jw!! $!mm# dn%% 	$ n,,..tr	   c                 p    t          j        dt          |          dz
            }||xx         dz  cc<   |S )Nr   r,      )randomrandintrS   )r   rT   rids      r
   corrupt_arrayzProtocol.corrupt_array   s8    nQD		A..S			T			r	   c                    t          |          }| j        dk    rt          j                    d| j        z
  k    r|t          j                    dk    rPt          j        dt	          |                    }|t          j        dd          z   }|d |         ||d          z   }n|                     |          }| j                            |           | xj        dz  c_        d S )Nr   r1   g?r,   rZ   )	r   rD   r   r   rS   r   r=   r   rw   )r   packetrM   ends       r
   rx   zProtocol.transmit_packet   s    6""!##3AU;U(V(V}$$q#f++66fnQ333&,6 ++F33	"r	   c                 ,   d}t          |          | j        k    rt                      t                      }||                     | j                  z  }||                     ||          z  }||                     t          |                    z  }||                     |                     |                    z  }t          |          r0||z  }||                     |                     |                    z  }|                     |          |z   }|S )Ni  )	rS   max_block_sizer&   r   	pack_int8syncpack_int4_2
pack_int16build_checksum)r   r{   r|   rT   PACKET_TOKENpacket_buffers         r
   rt   zProtocol.build_packet   s    t99t***!###!	222))(K@@@T333)<)<])K)KLLLt99 	QT!MT__T-@-@-O-OPPPM66Fr	   c                 :    |dz  |z   dz  }|dz	  |z   dz  dz  |z  S )N      r   )r   csvaluecs_lows       r
   checksumzProtocol.checksum   s3    I&#-7f$+1V;;r	   c                 @    d}|D ]}|                      ||          }|S )Nr   )r   )r   bufferr   bs       r
   r   zProtocol.build_checksum   s0     	& 	&Ar1%%BB	r	   c                 0    |                     dd          S )N   little	byteorderto_bytesr   r   s     r
   
pack_int32zProtocol.pack_int32       ~~a8~444r	   c                 0    |                     dd          S )N   r   r   r   r   s     r
   r   zProtocol.pack_int16   r   r	   c                 0    |                     dd          S )Nr,   r   r   r   r   s     r
   r   zProtocol.pack_int8   r   r	   c                 L    |dz  dz  |dz  z  }|                     dd          S )N   r   r,   r   r   r   )r   vhvlr   s       r
   r   zProtocol.pack_int4_2   s.    s(qR#X.~~a8~444r	   c                 z    t          d           |                     d           |                     dd           d S )Nz2Connecting: Switching Marlin to Binary Protocol...M28B1r   r,   )r9   r   r}   r   s    r
   connectzProtocol.connect  s8    BCCC   		!Qr	   c                 @    |                      dd           d| _        d S )Nr   r   F)r}   syncronisedr   s    r
   
disconnectzProtocol.disconnect  s!    		!Q r	   c                     	 t          |          }n# t          $ r Y d S w xY w|| j        k    rt                      | j        dz   dz  | _        d| _        d S )Nr,      )r@   
ValueErrorr   r$   rv   r   rT   	packet_ids      r
   r   zProtocol.response_ok  so    	D		II 	 	 	FF		!!$&&&Y]c)	s    
  c                     t          |          }| xj        dz  c_        | j        st          d           d S || j        k    rt                      d S )Nr,   zRetrying syncronisation)r@   rz   r   r9   r   r$   r   s      r
   r   zProtocol.response_resend  s^    II	q 	'+,,,,,$)##$&&& $#r	   c                 ^   |                     d          \  }}}t          |          | _        t          |          | _        | j        | j        k     r| j        n| j        | _        || _        d| _        d| _        t          d	                    | j        | j        | j                             d S )N,r,   TzMConnection synced [{0}], binary protocol version {1}, {2} byte payload buffer)
splitr@   r   r   rA   protocol_versionrv   r   r9   format)r   rT   r   r   r   s        r
   r   zProtocol.response_stream_sync  s    15C.n.II	!.11151Dt1V1V$--\`\k 0]ddeienpt  qF  HL  H[  \  \  	]  	]  	]  	]  	]r	   c                     t                      r   )r"   ro   s     r
   r   zProtocol.response_fatal_error(  s    llr	   )F)/r   r   r   r>   r?   r   r=   rA   ru   rv   packet_pingrz   r   rD   r   rE   r   rL   rF   rR   r   rm   r   rK   rj   rH   rG   r   r}   ry   r   r   r   rx   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r
   r*   r*   -   s       FDNDJNMKFMODIKMLI# # #$/ $/ $/L  
$ $ $5 5 5 2; # # # #"
  
  
 # # # #,    
# # #  :C    *= = =  5 5 55 5 55 5 55 5 5  
! ! !  ' ' '] ] ]    r	   r*   c                   |    e Zd ZdZ G d de          Z e            ZddZd Z	ddZ
d Zd	 Zd
 Zd Zd Zd ZdS )FileTransferProtocolr,   c                   "    e Zd ZdZdZdZdZdZdS )FileTransferProtocol.Packetr   r,   r      r   N)r   r   r   QUERYOPENCLOSEWRITEABORTr   r	   r
   Packetr   /  s'        r	   r   Nc                 j    |                     g d| j                   || _        |p|j        | _        d S )N)PFT:successPFT:version:PFT:failPFT:busyPFT:ioerrorzPTF:invalid)rG   rH   r{   rF   )r   r{   r0   s      r
   r   zFileTransferProtocol.__init__7  sM    oooqu  rD  	E  	E  	E  ' D8+Dr	   c                 :    | j                             |           d S r   rl   ro   s     r
   rH   z"FileTransferProtocol.process_input<  rp   r	   c                    t          |p| j                  }t          | j                  sJt	          j        d           |                                rt                      t          | j                  J| j                                        S )Ng-C6?)	r   rF   rS   rm   r   r]   r   r   r   )r   r0   s     r
   ry   z#FileTransferProtocol.await_response@  s    ':T%:;;dn%% 	$Jv!! $!mm# dn%% 	$
 ~%%'''r	   c                    | j                             t          j        t          j        j                   |                                 \  }}|dk    rdS |                    d          \  | _        }}|dk    r?|                    d          \  }}}|t          |          t          |          d| _
        n	ddi| _
        t          d                    | j        | j
        d                              d S )	Nr   F:noner   )	algorithmwindow	lookaheadr   z,File Transfer version: {0}, compression: {1})r{   r}   r   protocol_idr   r   ry   r   versionr@   compressionr9   r   )r   rW   rT   _r   r   r   r   s           r
   r   zFileTransferProtocol.connectI  s    /;=Q=X=^___))++tN""5'+zz#$a&  +6+<+<S+A+A(Ivy-6#f++\_`i\j\jkkD +V4D<CCDLRVRbcnRoppqqqqqr	   c                    |rdnd}||rdndz  }|t          |d          dz   z  }t          d          }d }| j                            t          j        t          j        j        |           |dk    r|                                s	 | 	                    d          \  }}|dk    rt          |d           d S |dk    rt          d	           |                                  t          j        d
           | j                            t          j        t          j        j        |           |                                 n|dk    rt          d          n# t           $ r Y nw xY w|dk    r|                                t!                      )N       r`   i  r   r   openedr   z!Broken transfer detected, purging皙?r   zCan not open file on client)r   r   r{   r}   r   r   r   r   r   ry   r9   abortr   r]   r   	Exceptionr   )r   filenamer   dummypayloadr0   rW   rT   s           r
   openzFileTransferProtocol.openY  s   !,55uK255U29Xv..66$--/;=Q=X=]_fggg}$$W-=-=-?-?$"11$77tM))(8,,,Fj((=>>>JJLLLJsOOOM&&';'GI]IdIikrsssMMOOOOj((#$ABBB    }$$W-=-=-?-?$  mms   .E 8BE 
E"!E"c                 p    | j                             t          j        t          j        j        |           d S r   )r{   r}   r   r   r   r   ro   s     r
   r   zFileTransferProtocol.writes  s.    /;=Q=X=^`deeeeer	   c                 (   | j                             t          j        t          j        j                   |                     d          \  }}|dk    rt          d           dS |dk    rt          d           dS |dk    rt          d	           dS d S )
Nr   r   zFile closedTr   zClient storage device IO errorFzPFT:invalidzNo open file)r{   r}   r   r   r   r   ry   r9   r   rW   rT   s      r
   r[   zFileTransferProtocol.closev  s    /;=Q=X=^___))$//tM!!-   4m##23335m##.!!!5 $#r	   c                     | j                             t          j        t          j        j                   |                                 \  }}|dk    rt          d           d S d S )Nr   zTransfer Aborted)r{   r}   r   r   r   r   ry   r9   r   s      r
   r   zFileTransferProtocol.abort  sb    /;=Q=X=^___))++tM!!$%%%%% "!r	   c                    |                                   t          o| j        d         dk    o|}|r't          r| j        d         dk    st          d           t	          |d                                          }t          |          }|                     |||           | j        j        }|r-t          j
        || j        d         | j        d                   }|t          |          z  }	t          j        t          |          |z   dz
  |z            }
d	}d	}t                      }t          |
          D ]B}||z  }||z   }|                     |||                    |dz   |z  d
z  t                      dz   |z
  z  dz  }||
z  |k    rVt          d                    ||
z  dz  ||rd                    ||	z            nd| j        j                  d           |dz  }| j        j        d	k    rt          d                    ||
z  dz  ||rd                    ||	z            nd| j        j                  d           t          d           |                                  t          d            dS Dt          d                    d||rd                    ||	z            nd| j        j                             |                                 st          d           dS t          d           dS )Nr   
heatshrinkz#Compression not supported by clientrbr   r   )
window_sz2lookahead_sz2r,   r   i   r   z({0:2.0f}% {1:4.2f}KiB/s {2} Errors: {3}d   z[{0:4.2f}KiB/s] )r   r   z6{0:2.0f}% {1:4.2f}KiB/s {2} Errors: {3} - Aborting...z'Transfer aborted due to protocol errorsFzTransfer failedzTransfer completeT)r   heatshrink_existsr   r9   r   readrS   r{   rA   r   encodemathfloorr   r\   r   r   rz   r[   )r   r   dest_filenamer   r   compression_supportrT   filesizerA   cratioblockskibs	dump_pctg
start_timeirM   r   s                    r
   copyzFileTransferProtocol.copy  s   /qD4D[4QUa4aqfq 	9 1 	99I+9VZf9f9f7888 Hd##((**t99		-!4e<<<]-
 	$Td6Fx6P`d`pq|`}~~~DCII%SYY3a7:EFF	XX
v 	 	ANE*$CJJtE#I'''sj(D0VXX\J5NORVVDF
y((AHH!f*X[I[]a  Ob  djctc{c{  }A  DJ  }J  dK  dK  dK  hj  lp  ly  l@  A  A  GI  J  J  J  JS 	}#a''OVVXY\bXbfiWiko  ]p  rx  rC  rJ  rJ  KO  RX  KX  rY  rY  rY  vx  z~  zG  zN  O  O  UW  X  X  X  Xb			

?@@@uu ( 	9@@d  xK  MSL]LdLdeilrerLsLsLs  QS  UY  Ub  Ui  j  j  	k  	k  	kzz|| 	#$$$5!"""tr	   r   )r   r   r   r   objectr   r   rm   r   rH   ry   r   r   r   r[   r   r  r   r	   r
   r   r   ,  s        K        IE E E E
$ $ $( ( ( (r r r   4g g g  & & &- - - - -r	   r   c                       e Zd Zd Zd ZdS )EchoProtocolc                 L    |                     dg| j                   || _        d S )Nzecho:)rG   rH   r{   )r   r{   s     r
   r   zEchoProtocol.__init__  s(    7)T%7888 r	   c                 $    t          |           d S r   )r9   ro   s     r
   rH   zEchoProtocol.process_input  s    dr	   N)r   r   r   r   rH   r   r	   r
   r  r    s2        ! ! !    r	   r  )r:   r  r   collectionsr   rI   sysdatetimer   r   r  ImportErrorr   r  r   r   r   r"   r$   r&   r(   r*   r   r  r   r	   r
   <module>r     sA  
              



     & & &	' 	' 	' 	' 	'f 	' 	' 	'	 	 	 	 	) 	 	 		 	 	 	 	 	 	 		 	 	 	 	 	 	 		 	 	 	 	i 	 	 		 	 	 	 	Y 	 	 	| | | | |v | | |~J J J J J6 J J JZ    6     s   + 55