Skip to content

Commit e84886e

Browse files
authored
Merge pull request #53 from nekromant/recv_cb
Implement callback mechanism for receiving data
2 parents 6f81c09 + b7f8885 commit e84886e

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

xmodem/__init__.py

+19-1
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)