Skip to content

Commit 973adb4

Browse files
committed
Refactor device flashing logic to support parallel flashing for IP addresses and sequential flashing for serials
1 parent 09e413b commit 973adb4

File tree

1 file changed

+40
-37
lines changed

1 file changed

+40
-37
lines changed

src/bmlab_toolkit/flashing.py

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -148,46 +148,49 @@ def flash_devices(serial, ip_list, fw_file, mcu, programmer_type, log_level):
148148
else:
149149
devices = [{'serial': serial, 'ip': None}]
150150

151-
# Print header
152-
if len(devices) == 1:
153-
device_str = devices[0]['ip'] or (f"serial {devices[0]['serial']}" if devices[0]['serial'] is not None else "auto-detected")
154-
print(f"Flashing {device_str}")
155-
else:
156-
# Show all device identifiers (ip or serial)
157-
device_names = []
158-
for d in devices:
159-
if d['ip']:
160-
device_names.append(str(d['ip']))
161-
elif d['serial'] is not None:
162-
device_names.append(f"serial {d['serial']}")
163-
else:
164-
device_names.append("auto-detected")
165-
print(f"Flashing {len(devices)} device(s) in parallel: {', '.join(device_names)}")
151+
# Print device list
152+
device_names = []
153+
for d in devices:
154+
if d['ip']:
155+
device_names.append(str(d['ip']))
156+
elif d['serial'] is not None:
157+
device_names.append(f"serial {d['serial']}")
158+
else:
159+
device_names.append("auto-detected")
160+
print(f"Flashing {len(devices)} device(s): {', '.join(device_names)}")
166161
print(f"Firmware: {fw_file}\n")
167162

168163
results = []
169-
with ProcessPoolExecutor(max_workers=len(devices)) as executor:
170-
# Submit all flash tasks
171-
future_to_device = {
172-
executor.submit(flash_device_task, dev['serial'], dev['ip'], fw_file, mcu, programmer_type, log_level): dev
173-
for dev in devices
174-
}
175-
176-
# Process results as they complete
177-
for future in as_completed(future_to_device):
178-
dev = future_to_device[future]
179-
try:
180-
result = future.result(timeout=300) # 5 min timeout per device
181-
results.append(result)
182-
183-
if result['success']:
184-
print(f"✓ {result['device']}: Success")
185-
else:
186-
print(f"✗ {result['device']}: {result['error']}")
187-
except Exception as e:
188-
device_id = dev['ip'] or dev['serial']
189-
results.append({'device': device_id, 'success': False, 'error': str(e)})
190-
print(f"✗ {device_id}: {e}")
164+
if ip_list:
165+
# Parallel flashing for IPs
166+
from concurrent.futures import ProcessPoolExecutor, as_completed
167+
with ProcessPoolExecutor(max_workers=len(devices)) as executor:
168+
future_to_device = {
169+
executor.submit(flash_device_task, dev['serial'], dev['ip'], fw_file, mcu, programmer_type, log_level): dev
170+
for dev in devices
171+
}
172+
for future in as_completed(future_to_device):
173+
dev = future_to_device[future]
174+
try:
175+
result = future.result(timeout=300)
176+
results.append(result)
177+
if result['success']:
178+
print(f"✓ {result['device']}: Success")
179+
else:
180+
print(f"✗ {result['device']}: {result['error']}")
181+
except Exception as e:
182+
device_id = dev['ip'] or dev['serial']
183+
results.append({'device': device_id, 'success': False, 'error': str(e)})
184+
print(f"✗ {device_id}: {e}")
185+
else:
186+
# Sequential flashing for serials
187+
for dev in devices:
188+
result = flash_device_task(dev['serial'], dev['ip'], fw_file, mcu, programmer_type, log_level)
189+
results.append(result)
190+
if result['success']:
191+
print(f"✓ {result['device']}: Success")
192+
else:
193+
print(f"✗ {result['device']}: {result['error']}")
191194

192195
# Summary
193196
success_count = sum(1 for r in results if r['success'])

0 commit comments

Comments
 (0)