1414
1515# -*- coding:utf-8 -*-
1616
17+
1718import uos
1819import ql_fs
1920import utime as time
20- from machine import UART
2121import osTimer
22+ from machine import UART
2223from queue import Queue
23-
24+ import gc
2425
2526SOH = b'\x01 '
2627STX = b'\x02 '
@@ -46,7 +47,6 @@ def __init__(self,
4647 parity = 0 ,
4748 stopbits = 1 ,
4849 flowctl = 0 ):
49-
5050 self ._uart = UART (uart , buadrate , databits , parity , stopbits , flowctl )
5151 self ._queue = Queue (maxsize = 1 )
5252 self ._timer = osTimer ()
@@ -117,7 +117,7 @@ class Modem(object):
117117 0x7c26 , 0x6c07 , 0x5c64 , 0x4c45 , 0x3ca2 , 0x2c83 , 0x1ce0 , 0x0cc1 ,
118118 0xef1f , 0xff3e , 0xcf5d , 0xdf7c , 0xaf9b , 0xbfba , 0x8fd9 , 0x9ff8 ,
119119 0x6e17 , 0x7e36 , 0x4e55 , 0x5e74 , 0x2e93 , 0x3eb2 , 0x0ed1 , 0x1ef0 ,
120- ]
120+ ] # TODO release mem
121121
122122 def __init__ (self , reader , writer , mode = 'ymodem1k' ):
123123 self .reader = reader
@@ -180,7 +180,7 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
180180 char = self .reader (1 , timeout )
181181 elif char == CAN :
182182 if cancel :
183- self ._delete_failed_file (self ._recv_file_name ) # delete transfer failed file
183+ self ._delete_failed_file (self ._recv_file_name )
184184 return None
185185 else :
186186 cancel = 1
@@ -204,14 +204,16 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
204204 if self ._remaining_data_length > 0 :
205205 valid_length = min (valid_length , self ._remaining_data_length )
206206 self ._remaining_data_length -= valid_length
207+ gc .collect ()
207208 write_packet += data [:valid_length ]
208209 income_size += len (data )
209- if len (write_packet ) not in (0 , 1024 , 2048 , 3072 , 4096 ): # 4k byte packet write
210- try :
211- stream .write (write_packet )
212- except Exception as e :
213- stream .close ()
210+ if len (write_packet ) not in (0 , 1024 , 2048 , 3072 ):
211+ stream .write (write_packet )
214212 write_packet = b""
213+ else :
214+ if self ._remaining_data_length == 0 :
215+ stream .write (write_packet )
216+ write_packet = b""
215217 self .writer (ACK )
216218 time .sleep_ms (5 )
217219 sequence = (sequence + 1 ) % 0x100
@@ -253,6 +255,8 @@ def _in_transfer_mode(self, crc_mode, retry, delay, timeout=1000, cancel=0, erro
253255 return char
254256 elif char == STX :
255257 return char
258+ elif char == EOT :
259+ return char
256260 elif char == CAN :
257261 if cancel :
258262 return None
@@ -261,7 +265,7 @@ def _in_transfer_mode(self, crc_mode, retry, delay, timeout=1000, cancel=0, erro
261265 else :
262266 error_count += 1
263267
264- def _get_file_header (self , char , crc_mode , timeout = 1000 , retry = 10 , packet_size = 128 ): # Ymodem header default packet size
268+ def _get_file_header (self , char , crc_mode , timeout = 1000 , retry = 10 , packet_size = 128 ):
265269 error_count = 0
266270 cancel = 0
267271 while True :
@@ -295,12 +299,12 @@ def _get_file_header(self, char, crc_mode, timeout=1000, retry=10, packet_size=1
295299 if not len (data ):
296300 self .writer (ACK )
297301 return None
302+ gc .collect ()
298303 self ._recv_file_name = bytes .decode (data .split (b"\x00 " )[0 ], "utf-8" )
299304 self ._check_path (self ._recv_file_name )
300305 try :
301306 stream = open (self ._recv_file_name , "wb+" )
302307 except IOError :
303- # stream.close()
304308 return None
305309 data = bytes .decode (data .split (b"\x00 " )[1 ], "utf-8" )
306310 if self .program_features & USE_LENGTH_FIELD :
@@ -354,9 +358,7 @@ def _verify_complement(self, timeout=1000, sequence=0):
354358 seq2 = self .reader (1 , timeout )
355359 if seq2 is not None :
356360 seq2 = 0xff - ord (seq2 )
357- # Packet received in wrong number
358361 if not (seq1 == seq2 == sequence ):
359- # skip this packet
360362 return False
361363 else :
362364 return True
@@ -385,7 +387,7 @@ def _calc_crc(self, data, crc=0):
385387 return crc & 0xffff
386388
387389 def send (self ):
388- pass
390+ pass # TODO
389391
390392
391393def enter_ymodem (callback = None ):
0 commit comments