@@ -386,7 +386,7 @@ def _make_send_checksum(self, crc_mode, data):
386386 _bytes .append (crc )
387387 return bytearray (_bytes )
388388
389- def recv (self , stream , crc_mode = 1 , retry = 16 , timeout = 60 , delay = 1 , quiet = 0 ):
389+ def recv (self , stream , crc_mode = 1 , retry = 16 , timeout = 60 , delay = 1 , quiet = 0 , callback = None ):
390390 '''
391391 Receive a stream via the XMODEM protocol.
392392
@@ -411,6 +411,15 @@ def recv(self, stream, crc_mode=1, retry=16, timeout=60, delay=1, quiet=0):
411411 :type delay: int
412412 :param quiet: If ``True``, write transfer information to stderr.
413413 :type quiet: bool
414+ :param callback: Reference to a callback function that has the
415+ following signature. This is useful for
416+ getting status updates while a xmodem
417+ transfer is underway. Packet size can only be
418+ determined once the transfer started, so it also
419+ is delivered in the callback as the fourth parameter.
420+ Expected callback signature:
421+ def callback(total_packets, success_count, error_count, packet_size)
422+ :type callback: callable
414423
415424 '''
416425
@@ -467,6 +476,8 @@ def recv(self, stream, crc_mode=1, retry=16, timeout=60, delay=1, quiet=0):
467476 packet_size = 128
468477 sequence = 1
469478 cancel = 0
479+ total_packets = 0
480+ success_count = 0
470481 while True :
471482 while True :
472483 if char == SOH :
@@ -485,6 +496,8 @@ def recv(self, stream, crc_mode=1, retry=16, timeout=60, delay=1, quiet=0):
485496 self .putc (ACK )
486497 self .log .info ("Transmission complete, %d bytes" ,
487498 income_size )
499+ if callable (callback ):
500+ callback (total_packets , success_count , error_count , packet_size )
488501 return income_size
489502 elif char == CAN :
490503 # cancel at two consecutive cancels
@@ -543,6 +556,10 @@ def recv(self, stream, crc_mode=1, retry=16, timeout=60, delay=1, quiet=0):
543556
544557 # valid data, append chunk
545558 if valid :
559+ total_packets += 1
560+ success_count += 1
561+ if callable (callback ):
562+ callback (total_packets , success_count , error_count , packet_size )
546563 income_size += len (data )
547564 stream .write (data )
548565 self .putc (ACK )
@@ -565,6 +582,7 @@ def recv(self, stream, crc_mode=1, retry=16, timeout=60, delay=1, quiet=0):
565582 data = self .getc (1 , timeout = 1 )
566583 if data is None :
567584 break
585+ error_count += 1
568586 self .putc (NAK )
569587 # get next start-of-header byte
570588 char = self .getc (1 , timeout )
0 commit comments