Skip to content

Commit f39529c

Browse files
faxe1008tomchy
authored andcommitted
[nrf fromtree] west: commands: runners: canopen: add download-buffer-size option
Adds a --download-buffer-size option to the canopen runner to allow specifying the buffer size of the SDO download. Signed-off-by: Fabian Blatz <[email protected]> (cherry picked from commit 11c83c8) Signed-off-by: Tomasz Chyrowicz <[email protected]>
1 parent f4cb303 commit f39529c

File tree

2 files changed

+19
-11
lines changed

2 files changed

+19
-11
lines changed

scripts/west_commands/runners/canopen_program.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,7 @@
2424
DEFAULT_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
3330
DEFAULT_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)

scripts/west_commands/tests/test_canopen_program.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
# Test cases
2323
#
2424

25-
TEST_CASES = [(n, x, p, c, o, t, r, s, b)
25+
TEST_CASES = [(n, x, p, c, o, t, r, s, d, b)
2626
for n in range(1, 3)
2727
for x in (None, TEST_ALT_CONTEXT)
2828
for p in range(1, 3)
@@ -31,6 +31,7 @@
3131
for t in range(1, 3)
3232
for r in range(1, 3)
3333
for s in range(1, 3)
34+
for d in [256, 1024]
3435
for b in range(False, True)]
3536

3637
os_path_isfile = os.path.isfile
@@ -44,7 +45,7 @@ def os_path_isfile_patch(filename):
4445
@patch('runners.canopen_program.CANopenProgramDownloader')
4546
def test_canopen_program_create(cpd, test_case, runner_config):
4647
'''Test CANopen runner created from command line parameters.'''
47-
node_id, context, program_number, confirm, confirm_only, timeout, sdo_retries, sdo_timeout, block_transfer = test_case
48+
node_id, context, program_number, confirm, confirm_only, timeout, sdo_retries, sdo_timeout, download_buffer_size, block_transfer = test_case
4849

4950
args = ['--node-id', str(node_id)]
5051
if context is not None:
@@ -61,6 +62,8 @@ def test_canopen_program_create(cpd, test_case, runner_config):
6162
args.extend(['--sdo-retries', str(sdo_retries)])
6263
if sdo_timeout:
6364
args.extend(['--sdo-timeout', str(sdo_timeout)])
65+
if download_buffer_size:
66+
args.extend(['--download-buffer-size', str(download_buffer_size)])
6467
if block_transfer:
6568
args.append('--block_transfer')
6669

@@ -84,6 +87,7 @@ def test_canopen_program_create(cpd, test_case, runner_config):
8487
program_number=program_number,
8588
sdo_retries=sdo_retries,
8689
sdo_timeout=sdo_timeout,
90+
download_buffer_size=download_buffer_size,
8791
block_transfer=block_transfer)
8892
else:
8993
assert cpd.call_args == call(node_id=node_id,
@@ -92,6 +96,7 @@ def test_canopen_program_create(cpd, test_case, runner_config):
9296
program_number=program_number,
9397
sdo_retries=sdo_retries,
9498
sdo_timeout=sdo_timeout,
99+
download_buffer_size=download_buffer_size,
95100
block_transfer=block_transfer)
96101

97102
mock.connect.assert_called_once()

0 commit comments

Comments
 (0)