Skip to content

Commit 2c75274

Browse files
committed
Suppress connection errors when checking Crazyflie state in boot delay logic
Refactor boot delay logic to avoid errors when determining the Crazyflie’s state. Since we do not explicitly check whether the Crazyflie is connected, disconnected, or already in bootloader mode before attempting a connection, we now simply try cf.link first and fall back to SyncCrazyflie if needed. Failures in these attempts are handled silently, preventing misleading error messages when the Crazyflie is already in bootloader mode. If both attempts fail, we assume bootloader mode and apply a 5-second delay.
1 parent 0160110 commit 2c75274

File tree

1 file changed

+32
-37
lines changed

1 file changed

+32
-37
lines changed

cflib/bootloader/__init__.py

+32-37
Original file line numberDiff line numberDiff line change
@@ -178,45 +178,40 @@ def _get_provided_nrf51_bl_version(self, flash_artifacts: List[FlashArtifact]):
178178

179179
return provided_nrf_bl_version
180180

181-
def _get_boot_delay(self, cf: Optional[Crazyflie] = None) -> float:
182-
"""
183-
Determines the boot delay for the Crazyflie.
184-
This method calculates the boot delay based on the presence of specific decks.
185-
If the AI deck is attached, a longer boot delay is used.
186-
@return: The boot delay in seconds. Returns -1 if no deck memory is found.
187-
@rtype: float
188-
@raises RuntimeError: If there is a failure in reading the decks.
189-
"""
190-
191-
if cf is not None and cf.link:
192-
cf.close_link()
181+
def _get_boot_delay(self, cf: Optional[Crazyflie] = None):
182+
"""Determines the boot delay based on AI-deck presence or failure to connect."""
183+
try:
184+
# First try using an existing link
185+
if cf.link:
186+
return 5.0 if self._has_ai_deck(cf) else 0.0
187+
except Exception:
188+
# Failed to connect using existing link, try opening a new link
189+
pass
193190

194191
try:
195-
with SyncCrazyflie(self.clink, cf=Crazyflie()) as scf:
196-
deck_mems = scf.cf.mem.get_mems(MemoryElement.TYPE_DECK_MEMORY)
197-
deck_mems_count = len(deck_mems)
198-
if deck_mems_count == 0:
199-
return -1
200-
201-
mgr = deck_memory.SyncDeckMemoryManager(deck_mems[0])
202-
try:
203-
decks = mgr.query_decks()
204-
except RuntimeError as e:
205-
if self.progress_cb:
206-
message = f'Failed to read decks: {str(e)}'
207-
self.progress_cb(message, 0)
208-
logger.error(message)
209-
time.sleep(2)
210-
raise RuntimeError(message)
211-
212-
if any(deck.name in ['bcAI:gap8', 'bcAI:esp'] for deck in decks.values()):
213-
return 5.0
214-
except Exception as e:
215-
# If we fail to connect to the Crazyflie in firmware mode, we assume the AI-deck is attached
216-
print(f'Failed to connect to Crazyflie in firmware mode: {str(e)}. Setting boot delay to 5.0 seconds')
217-
return 5.0 # AI-deck may be attached
218-
219-
return 0.0
192+
with SyncCrazyflie(cf.uri, cf=Crazyflie()) as scf:
193+
return 5.0 if self._has_ai_deck(scf.cf) else 0.0
194+
except Exception:
195+
# If we fail to connect using SyncCrazyflie, assume the Crazyflie may be in bootloader mode
196+
return 5.0
197+
198+
def _has_ai_deck(self, cf):
199+
deck_mems = cf.mem.get_mems(MemoryElement.TYPE_DECK_MEMORY)
200+
if not deck_mems:
201+
raise RuntimeError('Failed to read memory: No deck memory found')
202+
203+
mgr = deck_memory.SyncDeckMemoryManager(deck_mems[0])
204+
try:
205+
decks = mgr.query_decks()
206+
except RuntimeError as e:
207+
if self.progress_cb:
208+
message = f'Failed to read decks: {str(e)}'
209+
self.progress_cb(message, 0)
210+
print(message)
211+
time.sleep(2)
212+
raise RuntimeError(message)
213+
214+
return any(deck.name in ['bcAI:gap8', 'bcAI:esp'] for deck in decks.values())
220215

221216
def flash(self, filename: str, targets: List[Target], cf=None, enable_console_log: Optional[bool] = False,
222217
boot_delay: Optional[float] = 0.0):

0 commit comments

Comments
 (0)