Skip to content

Commit 7e8ca17

Browse files
author
zhen.guo
committed
add FCM360W, FCM362K, BG95
1 parent d1a6742 commit 7e8ca17

1 file changed

Lines changed: 51 additions & 4 deletions

File tree

ymodem.py

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
from queue import Queue
2525
from machine import UART
2626

27+
name, platform = uos.uname()[1].split("=",1)
28+
platform=platform.split("_",1)[0]
29+
2730
SOH = b"\x01"
2831
STX = b"\x02"
2932
EOT = b"\x04"
@@ -216,6 +219,7 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
216219
if cancel:
217220
self.writer(ACK)
218221
stream.close()
222+
stream = None
219223
if callable(callback):
220224
callback(self._recv_file_name, income_size)
221225
self.recv()
@@ -241,6 +245,18 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
241245
pass
242246
else:
243247
data = self.reader(packet_size + 1 + crc_mode)
248+
if platform == "FCM360W" or platform == "FCM362K":
249+
retry_times = 10
250+
while len(data) < (packet_size + 1 + crc_mode):
251+
lost_data_len = packet_size + 1 + crc_mode - len(data)
252+
buf = self.reader(lost_data_len, timeout)
253+
data += buf
254+
if buf == b'':
255+
retry_times -= 1
256+
else:
257+
retry_times = 10
258+
if retry_times <= 0:
259+
break
244260
if data and len(data) == (packet_size + 1 + crc_mode):
245261
valid, data = self._verify_recv_checksum(crc_mode, data)
246262
# Write the original data to the target file
@@ -264,10 +280,13 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
264280
time.sleep_ms(5)
265281
sequence = (sequence + 1) % 0x100
266282
char = self.reader(1, timeout)
283+
del(data)
267284
continue
268285
else:
286+
del(data)
269287
pass
270288
else:
289+
del(data)
271290
pass
272291
while True:
273292
data = self.reader(1, timeout)
@@ -277,6 +296,8 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
277296
char = self.reader(1, timeout)
278297
continue
279298
except Exception as e:
299+
if stream:
300+
stream.close()
280301
sys.print_exception(e)
281302
return False
282303

@@ -339,6 +360,21 @@ def _get_file_header(self, char, crc_mode, timeout=1000, retry=10, packet_size=1
339360
pass
340361
else:
341362
data = self.reader(packet_size + 1 + crc_mode)
363+
if platform == "FCM360W" or platform == "FCM362K":
364+
retry_times = 5
365+
while len(data) < (packet_size + 1 + crc_mode):
366+
lost_data_len = packet_size + 1 + crc_mode - len(data)
367+
while self._uart.any() < lost_data_len:
368+
time.sleep_ms(10)
369+
retry_times -= 1
370+
if retry_times <= 0:
371+
break
372+
buf = self.reader(lost_data_len, timeout)
373+
data += buf
374+
if buf == b'':
375+
break
376+
else:
377+
retry_times = 5
342378
if data and len(data) == (packet_size + 1 + crc_mode):
343379
valid, data = self._verify_recv_checksum(crc_mode, data)
344380
if valid:
@@ -379,6 +415,9 @@ def _get_file_header(self, char, crc_mode, timeout=1000, retry=10, packet_size=1
379415
data = self.reader(1, timeout)
380416
if data is None:
381417
break
418+
if platform == "FCM360W" or platform == "FCM362K":
419+
if data == b'':
420+
return None
382421
self.writer(NAK)
383422
char = self.reader(1, timeout)
384423
continue
@@ -436,6 +475,8 @@ def send(self, trans_file, retry=10, timeout=1000, callback=None):
436475
# Not all but most programs support 1k length
437476
ymodem1k=(128, 1024)[(self.program_features & ALLOW_1K_BLOCK) != 0],
438477
)[self.mode]
478+
if "BG95" in platform:
479+
packet_size = 128
439480
self.total_size = sum([i["length"] for i in trans_file])
440481
success_count = 0
441482
for i in trans_file:
@@ -588,7 +629,7 @@ def serial_trans(self, info, timeout=1000, retry=10, success_count=1, sequence=N
588629
_print("[Sender]: reader resp char {}".format(char))
589630
if char == ACK:
590631
return True
591-
elif char == NAK: # 接收端写文件异常直接中断
632+
elif char == NAK: # 鎺ユ敹绔啓鏂囦欢寮傚父鐩存帴涓柇
592633
return False
593634
else:
594635
_print("[Sender]: error, expected ACK but got {} for block {}".format(char, str(sequence)))
@@ -634,14 +675,20 @@ def _send_end_packet(self, packet_size, crc_mode=1):
634675

635676

636677
def enter_ymodem(callback=None):
637-
serial_io = Serial(UART.REPL_UART if hasattr(UART, "REPL_UART") else UART.UART3)
678+
if platform == "FCM360W" or platform == "FCM362K":
679+
serial_io = Serial(UART.REPL_UART, buadrate=115200)
680+
else:
681+
serial_io = Serial(UART.REPL_UART if hasattr(UART, "REPL_UART") else UART.UART3)
638682
receiver = Modem(serial_io.read, serial_io.write)
639683
receiver.recv(callback=callback)
640684
serial_io.close()
641685

642686

643687
def send_file(trans_file):
644-
serial_io = Serial(UART.REPL_UART if hasattr(UART, "REPL_UART") else UART.UART3)
688+
if platform == "FCM360W" or platform == "FCM362K":
689+
serial_io = Serial(UART.REPL_UART, buadrate=115200)
690+
else:
691+
serial_io = Serial(UART.REPL_UART if hasattr(UART, "REPL_UART") else UART.UART3)
645692
sender = Modem(serial_io.read, serial_io.write)
646693
try:
647694
sender.send(trans_file)
@@ -651,4 +698,4 @@ def send_file(trans_file):
651698

652699

653700
if __name__ == "__main__":
654-
enter_ymodem()
701+
enter_ymodem()

0 commit comments

Comments
 (0)