@@ -386,7 +386,7 @@ def _make_send_checksum(self, crc_mode, data):
386
386
_bytes .append (crc )
387
387
return bytearray (_bytes )
388
388
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 ):
390
390
'''
391
391
Receive a stream via the XMODEM protocol.
392
392
@@ -411,6 +411,15 @@ def recv(self, stream, crc_mode=1, retry=16, timeout=60, delay=1, quiet=0):
411
411
:type delay: int
412
412
:param quiet: If ``True``, write transfer information to stderr.
413
413
: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
414
423
415
424
'''
416
425
@@ -467,6 +476,8 @@ def recv(self, stream, crc_mode=1, retry=16, timeout=60, delay=1, quiet=0):
467
476
packet_size = 128
468
477
sequence = 1
469
478
cancel = 0
479
+ total_packets = 0
480
+ success_count = 0
470
481
while True :
471
482
while True :
472
483
if char == SOH :
@@ -485,6 +496,8 @@ def recv(self, stream, crc_mode=1, retry=16, timeout=60, delay=1, quiet=0):
485
496
self .putc (ACK )
486
497
self .log .info ("Transmission complete, %d bytes" ,
487
498
income_size )
499
+ if callable (callback ):
500
+ callback (total_packets , success_count , error_count , packet_size )
488
501
return income_size
489
502
elif char == CAN :
490
503
# cancel at two consecutive cancels
@@ -543,6 +556,10 @@ def recv(self, stream, crc_mode=1, retry=16, timeout=60, delay=1, quiet=0):
543
556
544
557
# valid data, append chunk
545
558
if valid :
559
+ total_packets += 1
560
+ success_count += 1
561
+ if callable (callback ):
562
+ callback (total_packets , success_count , error_count , packet_size )
546
563
income_size += len (data )
547
564
stream .write (data )
548
565
self .putc (ACK )
@@ -565,6 +582,7 @@ def recv(self, stream, crc_mode=1, retry=16, timeout=60, delay=1, quiet=0):
565
582
data = self .getc (1 , timeout = 1 )
566
583
if data is None :
567
584
break
585
+ error_count += 1
568
586
self .putc (NAK )
569
587
# get next start-of-header byte
570
588
char = self .getc (1 , timeout )
0 commit comments