@@ -196,33 +196,39 @@ def extract_firmware_version_and_vehicle_type(logfile: str) -> tuple[str, int, i
196196 msg = f"Error opening the { logfile } logfile: { e !s} "
197197 raise SystemExit (msg ) from e
198198
199- msg_fallback_result : Union [tuple [str , int , int , int ], None ] = None
200- while True :
201- m = mlog .recv_match (type = ["VER" , "MSG" ])
202- if m is None :
203- break
204- if m .get_type () == "VER" :
205- fws = str (m .FWS ) # e.g. "ArduCopter V4.6.3 (3fc7011a)"
206- vehicle_type = fws .split (maxsplit = 1 )[0 ] if fws else ""
207- maj , min_ , pat = m .Maj , m .Min , m .Pat
208- if maj is None or min_ is None or pat is None :
209- continue
210- return vehicle_type , int (maj ), int (min_ ), int (pat )
211- # Parse each MSG; store the first parseable Vx.y one as fallback and keep scanning for VER
212- if msg_fallback_result is None :
213- parts = str (m .Message ).split ()
214- if len (parts ) >= 2 and parts [1 ].startswith ("V" ):
215- version_parts = parts [1 ][1 :].split ("." ) # Remove "V" prefix, split by "."
216- if len (version_parts ) >= 2 :
217- with contextlib .suppress (ValueError ):
218- patch_val = int (version_parts [2 ]) if len (version_parts ) >= 3 else 0
219- msg_fallback_result = (parts [0 ], int (version_parts [0 ]), int (version_parts [1 ]), patch_val )
220-
221- if msg_fallback_result is not None :
222- return msg_fallback_result
223-
224- msg = f"No firmware version information found in { logfile } "
225- raise SystemExit (msg )
199+ try :
200+ msg_fallback_result : Union [tuple [str , int , int , int ], None ] = None
201+ while True :
202+ m = mlog .recv_match (type = ["VER" , "MSG" ])
203+ if m is None :
204+ break
205+ if m .get_type () == "VER" :
206+ fws = str (m .FWS ) # e.g. "ArduCopter V4.6.3 (3fc7011a)"
207+ vehicle_type = fws .split (maxsplit = 1 )[0 ] if fws else ""
208+ maj , min_ , pat = m .Maj , m .Min , m .Pat
209+ if maj is None or min_ is None or pat is None :
210+ continue
211+ return vehicle_type , int (maj ), int (min_ ), int (pat )
212+ # Parse each MSG; store the first parseable Vx.y one as fallback and keep scanning for VER
213+ if msg_fallback_result is None :
214+ parts = str (m .Message ).split ()
215+ if len (parts ) >= 2 and parts [1 ].startswith ("V" ):
216+ version_parts = parts [1 ][1 :].split ("." ) # Remove "V" prefix, split by "."
217+ if len (version_parts ) >= 2 :
218+ with contextlib .suppress (ValueError ):
219+ patch_val = int (version_parts [2 ]) if len (version_parts ) >= 3 else 0
220+ msg_fallback_result = (parts [0 ], int (version_parts [0 ]), int (version_parts [1 ]), patch_val )
221+
222+ if msg_fallback_result is not None :
223+ return msg_fallback_result
224+
225+ msg = f"No firmware version information found in { logfile } "
226+ raise SystemExit (msg )
227+ finally :
228+ close_method = getattr (mlog , "close" , None )
229+ if callable (close_method ):
230+ with contextlib .suppress (Exception ):
231+ close_method ()
226232
227233
228234def missionplanner_sort (item : str ) -> tuple [str , ...]:
0 commit comments