2424DEFAULT_PROGRAM_NUMBER = 1
2525
2626# Program download buffer size in bytes
27- PROGRAM_DOWNLOAD_BUFFER_SIZE = 1024
28-
29- # Program download chunk size in bytes
30- PROGRAM_DOWNLOAD_CHUNK_SIZE = PROGRAM_DOWNLOAD_BUFFER_SIZE // 2
27+ DEFAULT_PROGRAM_DOWNLOAD_BUFFER_SIZE = 1024
3128
3229# Default timeouts and retries
3330DEFAULT_TIMEOUT = 10.0 # seconds
@@ -58,7 +55,7 @@ def __init__(self, cfg, dev_id, can_context=DEFAULT_CAN_CONTEXT,
5855 program_number = DEFAULT_PROGRAM_NUMBER , confirm = True ,
5956 confirm_only = True , timeout = DEFAULT_TIMEOUT ,
6057 sdo_retries = DEFAULT_SDO_RETRIES , sdo_timeout = DEFAULT_SDO_TIMEOUT ,
61- block_transfer = False ):
58+ download_buffer_size = DEFAULT_PROGRAM_DOWNLOAD_BUFFER_SIZE , block_transfer = False ):
6259 if MISSING_REQUIREMENTS :
6360 raise RuntimeError ('one or more Python dependencies were missing; '
6461 "see the getting started guide for details on "
@@ -76,7 +73,9 @@ def __init__(self, cfg, dev_id, can_context=DEFAULT_CAN_CONTEXT,
7673 program_number = program_number ,
7774 sdo_retries = sdo_retries ,
7875 sdo_timeout = sdo_timeout ,
79- block_transfer = block_transfer )
76+ download_buffer_size = download_buffer_size ,
77+ block_transfer = block_transfer ,
78+ )
8079
8180 @classmethod
8281 def name (cls ):
@@ -113,6 +112,8 @@ def do_add_parser(cls, parser):
113112 parser .add_argument ('--sdo-timeout' , type = float , default = DEFAULT_SDO_TIMEOUT ,
114113 help = f'''CANopen SDO response timeout in seconds
115114 (default: { DEFAULT_SDO_TIMEOUT } )''' )
115+ parser .add_argument ('--download-buffer-size' , type = int , default = DEFAULT_PROGRAM_DOWNLOAD_BUFFER_SIZE ,
116+ help = f'Program download buffer size in bytes (default: { DEFAULT_PROGRAM_DOWNLOAD_BUFFER_SIZE } )' )
116117 parser .add_argument ('--block-transfer' , default = False , action = 'store_true' ,
117118 help = 'Use SDO block transfers (experimental, default: no)' )
118119
@@ -128,6 +129,7 @@ def do_create(cls, cfg, args):
128129 timeout = args .timeout ,
129130 sdo_retries = args .sdo_retries ,
130131 sdo_timeout = args .sdo_timeout ,
132+ download_buffer_size = args .download_buffer_size ,
131133 block_transfer = args .block_transfer )
132134
133135 def do_run (self , command , ** kwargs ):
@@ -188,7 +190,7 @@ class CANopenProgramDownloader(object):
188190 def __init__ (self , logger , node_id , can_context = DEFAULT_CAN_CONTEXT ,
189191 program_number = DEFAULT_PROGRAM_NUMBER ,
190192 sdo_retries = DEFAULT_SDO_RETRIES , sdo_timeout = DEFAULT_SDO_TIMEOUT ,
191- block_transfer = False ):
193+ download_buffer_size = DEFAULT_PROGRAM_DOWNLOAD_BUFFER_SIZE , block_transfer = False ):
192194 super (CANopenProgramDownloader , self ).__init__ ()
193195 self .logger = logger
194196 self .node_id = node_id
@@ -201,6 +203,7 @@ def __init__(self, logger, node_id, can_context=DEFAULT_CAN_CONTEXT,
201203 self .ctrl_sdo = self .node .sdo [H1F51_PROGRAM_CTRL ][self .program_number ]
202204 self .swid_sdo = self .node .sdo [H1F56_PROGRAM_SWID ][self .program_number ]
203205 self .flash_sdo = self .node .sdo [H1F57_FLASH_STATUS ][self .program_number ]
206+ self .download_buffer_size = download_buffer_size
204207
205208 self .node .sdo .MAX_RETRIES = sdo_retries
206209 self .node .sdo .RESPONSE_TIMEOUT = sdo_timeout
@@ -276,12 +279,12 @@ def download(self, bin_file):
276279 try :
277280 size = os .path .getsize (bin_file )
278281 infile = open (bin_file , 'rb' )
279- outfile = self .data_sdo .open ('wb' , buffering = PROGRAM_DOWNLOAD_BUFFER_SIZE ,
282+ outfile = self .data_sdo .open ('wb' , buffering = self . download_buffer_size ,
280283 size = size , block_transfer = self .block_transfer )
281284
282285 progress = Bar ('%(percent)d%%' , max = size , suffix = '%(index)d/%(max)dB' )
283286 while True :
284- chunk = infile .read (PROGRAM_DOWNLOAD_CHUNK_SIZE )
287+ chunk = infile .read (self . download_buffer_size // 2 )
285288 if not chunk :
286289 break
287290 outfile .write (chunk )
0 commit comments