ardupilot-methodic-configurator 2.6.1__py3-none-any.whl → 2.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ardupilot-methodic-configurator might be problematic. Click here for more details.

Files changed (106) hide show
  1. ardupilot_methodic_configurator/__init__.py +2 -2
  2. ardupilot_methodic_configurator/__main__.py +25 -1
  3. ardupilot_methodic_configurator/annotate_params.py +49 -14
  4. ardupilot_methodic_configurator/argparse_check_range.py +1 -1
  5. ardupilot_methodic_configurator/backend_filesystem.py +7 -3
  6. ardupilot_methodic_configurator/backend_filesystem_configuration_steps.py +53 -6
  7. ardupilot_methodic_configurator/backend_filesystem_json_with_schema.py +3 -3
  8. ardupilot_methodic_configurator/backend_filesystem_program_settings.py +145 -8
  9. ardupilot_methodic_configurator/backend_filesystem_vehicle_components.py +3 -3
  10. ardupilot_methodic_configurator/backend_flightcontroller.py +37 -20
  11. ardupilot_methodic_configurator/backend_flightcontroller_info.py +1 -1
  12. ardupilot_methodic_configurator/backend_internet.py +1 -1
  13. ardupilot_methodic_configurator/backend_mavftp.py +1 -1
  14. ardupilot_methodic_configurator/battery_cell_voltages.py +1 -1
  15. ardupilot_methodic_configurator/common_arguments.py +1 -1
  16. ardupilot_methodic_configurator/configuration_manager.py +450 -115
  17. ardupilot_methodic_configurator/configuration_steps_ArduCopter.json +6 -4
  18. ardupilot_methodic_configurator/configuration_steps_ArduPlane.json +3 -1
  19. ardupilot_methodic_configurator/configuration_steps_Heli.json +3 -1
  20. ardupilot_methodic_configurator/configuration_steps_Rover.json +3 -1
  21. ardupilot_methodic_configurator/configuration_steps_strings.py +5 -3
  22. ardupilot_methodic_configurator/data_model_ardupilot_parameter.py +55 -2
  23. ardupilot_methodic_configurator/data_model_configuration_step.py +96 -46
  24. ardupilot_methodic_configurator/data_model_fc_ids.py +16 -7
  25. ardupilot_methodic_configurator/data_model_motor_test.py +1 -1
  26. ardupilot_methodic_configurator/data_model_par_dict.py +25 -11
  27. ardupilot_methodic_configurator/data_model_software_updates.py +1 -1
  28. ardupilot_methodic_configurator/data_model_template_overview.py +1 -1
  29. ardupilot_methodic_configurator/data_model_vehicle_components.py +1 -1
  30. ardupilot_methodic_configurator/data_model_vehicle_components_base.py +3 -2
  31. ardupilot_methodic_configurator/data_model_vehicle_components_display.py +1 -1
  32. ardupilot_methodic_configurator/data_model_vehicle_components_import.py +2 -1
  33. ardupilot_methodic_configurator/data_model_vehicle_components_json_schema.py +1 -1
  34. ardupilot_methodic_configurator/data_model_vehicle_components_templates.py +1 -1
  35. ardupilot_methodic_configurator/data_model_vehicle_components_validation.py +41 -1
  36. ardupilot_methodic_configurator/data_model_vehicle_project.py +1 -1
  37. ardupilot_methodic_configurator/data_model_vehicle_project_creator.py +1 -1
  38. ardupilot_methodic_configurator/data_model_vehicle_project_opener.py +1 -1
  39. ardupilot_methodic_configurator/extract_param_defaults.py +1 -1
  40. ardupilot_methodic_configurator/frontend_tkinter_autoresize_combobox.py +1 -1
  41. ardupilot_methodic_configurator/frontend_tkinter_base_window.py +5 -1
  42. ardupilot_methodic_configurator/frontend_tkinter_component_editor.py +55 -29
  43. ardupilot_methodic_configurator/frontend_tkinter_component_editor_base.py +18 -13
  44. ardupilot_methodic_configurator/frontend_tkinter_component_template_manager.py +1 -1
  45. ardupilot_methodic_configurator/frontend_tkinter_connection_selection.py +1 -1
  46. ardupilot_methodic_configurator/frontend_tkinter_directory_selection.py +1 -1
  47. ardupilot_methodic_configurator/frontend_tkinter_entry_dynamic.py +1 -1
  48. ardupilot_methodic_configurator/frontend_tkinter_flightcontroller_info.py +1 -1
  49. ardupilot_methodic_configurator/frontend_tkinter_font.py +1 -1
  50. ardupilot_methodic_configurator/frontend_tkinter_motor_test.py +1 -1
  51. ardupilot_methodic_configurator/frontend_tkinter_pair_tuple_combobox.py +7 -1
  52. ardupilot_methodic_configurator/frontend_tkinter_parameter_editor.py +50 -102
  53. ardupilot_methodic_configurator/frontend_tkinter_parameter_editor_documentation_frame.py +24 -58
  54. ardupilot_methodic_configurator/frontend_tkinter_parameter_editor_table.py +24 -56
  55. ardupilot_methodic_configurator/frontend_tkinter_progress_window.py +1 -1
  56. ardupilot_methodic_configurator/frontend_tkinter_project_creator.py +1 -1
  57. ardupilot_methodic_configurator/frontend_tkinter_project_opener.py +1 -1
  58. ardupilot_methodic_configurator/frontend_tkinter_rich_text.py +1 -1
  59. ardupilot_methodic_configurator/frontend_tkinter_scroll_frame.py +1 -1
  60. ardupilot_methodic_configurator/frontend_tkinter_show.py +1 -1
  61. ardupilot_methodic_configurator/frontend_tkinter_software_update.py +1 -1
  62. ardupilot_methodic_configurator/frontend_tkinter_stage_progress.py +19 -29
  63. ardupilot_methodic_configurator/frontend_tkinter_template_overview.py +1 -1
  64. ardupilot_methodic_configurator/frontend_tkinter_usage_popup_window.py +1 -1
  65. ardupilot_methodic_configurator/internationalization.py +1 -1
  66. ardupilot_methodic_configurator/param_pid_adjustment_update.py +43 -39
  67. ardupilot_methodic_configurator/tempcal_imu.py +1 -1
  68. ardupilot_methodic_configurator/vehicle_components.py +1 -1
  69. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/AirCar_v1/14_logging.param +3 -3
  70. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Big_Owl/14_logging.param +3 -3
  71. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Chimera7/14_logging.param +3 -3
  72. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/FETtec-5/14_logging.param +3 -3
  73. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/GazeboIrisWithTargetFollow/14_logging.param +3 -3
  74. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Holybro_X500/14_logging.param +3 -3
  75. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Holybro_X500_V2/14_logging.param +3 -3
  76. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Holybro_X650_LTE/14_logging.param +3 -3
  77. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Hoverit_X11+/14_logging.param +3 -3
  78. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Hoverit_X13/14_logging.param +3 -3
  79. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Marmotte5v2/14_logging.param +3 -3
  80. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/ReadyToSkyZD550/14_logging.param +3 -3
  81. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/TarotFY680Hexacopter/05_remote_controller.param +1 -1
  82. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/TarotFY680Hexacopter/14_logging.param +3 -3
  83. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/TarotFY680Hexacopter/47_position_controller.param +2 -2
  84. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Tarot_X4/14_logging.param +3 -3
  85. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/X11_plus/14_logging.param +3 -3
  86. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/diatone_taycan_mxc/4.3.8-params/14_logging.param +3 -3
  87. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/diatone_taycan_mxc/4.4.4-params/14_logging.param +3 -3
  88. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/diatone_taycan_mxc/4.5.x-params/14_logging.param +3 -3
  89. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/diatone_taycan_mxc/4.6.x-params/14_logging.param +3 -3
  90. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/empty_4.5.x/10_gnss.param +1 -1
  91. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/empty_4.6.x/10_gnss.param +1 -1
  92. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/METADATA +11 -6
  93. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/RECORD +106 -106
  94. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/WHEEL +0 -0
  95. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/entry_points.txt +0 -0
  96. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/licenses/LICENSE.md +0 -0
  97. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/licenses/LICENSES/Apache-2.0.txt +0 -0
  98. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/licenses/LICENSES/BSD-3-Clause.txt +0 -0
  99. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/licenses/LICENSES/GPL-3.0-or-later.txt +0 -0
  100. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/licenses/LICENSES/LGPL-3.0-or-later.txt +0 -0
  101. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/licenses/LICENSES/MIT-CMU.txt +0 -0
  102. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/licenses/LICENSES/MIT.txt +0 -0
  103. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/licenses/LICENSES/MPL-2.0.txt +0 -0
  104. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/licenses/LICENSES/PSF-2.0.txt +0 -0
  105. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/licenses/credits/CREDITS.md +0 -0
  106. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.0.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  """
2
2
  Parameter editor table GUI using the "Ardupilot Parameter data model".
3
3
 
4
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
4
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
5
5
 
6
6
  SPDX-FileCopyrightText: 2024-2025 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>
7
7
 
@@ -60,7 +60,6 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
60
60
  self.configuration_manager = configuration_manager
61
61
  self.parameter_editor = parameter_editor # the parent window that contains this table
62
62
  self.upload_checkbutton_var: dict[str, tk.BooleanVar] = {}
63
- self.at_least_one_param_edited = False
64
63
 
65
64
  # Track last return values to prevent duplicate event processing
66
65
  self._last_return_values: dict[tk.Misc, str] = {}
@@ -128,7 +127,7 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
128
127
  return tuple(base_headers), tuple(base_tooltips)
129
128
 
130
129
  def repopulate( # pylint: disable=too-many-locals
131
- self, show_only_differences: bool, gui_complexity: str
130
+ self, show_only_differences: bool, gui_complexity: str, regenerate_from_disk: bool
132
131
  ) -> None:
133
132
  for widget in self.view_port.winfo_children():
134
133
  widget.destroy()
@@ -151,14 +150,13 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
151
150
  self.upload_checkbutton_var = {}
152
151
 
153
152
  # Process configuration step and create domain model parameters
154
- (config_step_edited, ui_errors, ui_infos) = self.configuration_manager.repopulate_configuration_step_parameters()
155
- if config_step_edited:
156
- self.at_least_one_param_edited = True
153
+ if regenerate_from_disk:
154
+ (ui_errors, ui_infos) = self.configuration_manager.repopulate_configuration_step_parameters()
157
155
 
158
- for title, msg in ui_errors:
159
- messagebox.showerror(title, msg)
160
- for title, msg in ui_infos:
161
- messagebox.showinfo(title, msg)
156
+ for title, msg in ui_errors:
157
+ messagebox.showerror(title, msg)
158
+ for title, msg in ui_infos:
159
+ messagebox.showinfo(title, msg)
162
160
 
163
161
  if show_only_differences:
164
162
  # Filter to show only different parameters
@@ -173,7 +171,7 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
173
171
  self.parameter_editor.on_skip_click()
174
172
  return
175
173
  else:
176
- self._update_table(self.configuration_manager.parameters, self.parameter_editor.gui_complexity)
174
+ self._update_table(self.configuration_manager.current_step_parameters, self.parameter_editor.gui_complexity)
177
175
  self._apply_scroll_position(scroll_to_bottom)
178
176
 
179
177
  def _apply_scroll_position(self, scroll_to_bottom: bool) -> None:
@@ -341,7 +339,7 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
341
339
  new_value_str = combobox_widget.get_selected_key() or ""
342
340
  try:
343
341
  # Pass the string to the domain model; it will validate and raise on error
344
- new_value = param.set_new_value(new_value_str)
342
+ param.set_new_value(new_value_str)
345
343
  except ParameterUnchangedError:
346
344
  # valid but no change; just refresh style
347
345
  pass
@@ -350,10 +348,8 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
350
348
  logging_exception(msg, exc)
351
349
  messagebox.showerror(_("Error"), str(exc))
352
350
  else:
353
- # Success: mark edited and update the stored file parameter value
351
+ # Success: mark edited and sync the ArduPilotParameter back to filesystem
354
352
  show_tooltip(change_reason_widget, param.tooltip_change_reason)
355
- self.at_least_one_param_edited = True
356
- self.configuration_manager.current_file_parameters[param.name].value = new_value
357
353
  value_is_different.config(text=NEW_VALUE_DIFFERENT_STR if param.is_different_from_fc else " ")
358
354
 
359
355
  combobox_widget.configure(
@@ -469,18 +465,17 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
469
465
  if hasattr(event, "type") and event.type == tk.EventType.KeyPress: # KeyPress event (Return/Enter)
470
466
  self._last_return_values[event.widget] = new_value
471
467
 
472
- new_value_result = None
473
468
  valid = True
474
469
 
475
470
  try:
476
471
  # first attempt: let the model validate the provided string
477
472
  # (it will convert/validate as required)
478
- new_value_result = param.set_new_value(new_value)
473
+ param.set_new_value(new_value)
479
474
  except ParameterOutOfRangeError as oor: # user-visible warning from model
480
475
  # Ask the user if they want to accept the out-of-range value
481
476
  if messagebox.askyesno(_("Out-of-range value"), str(oor) + _(" Use out-of-range value?"), icon="warning"):
482
477
  # Retry accepting the value while telling the model to ignore range checks
483
- new_value_result = param.set_new_value(new_value, ignore_out_of_range=True)
478
+ param.set_new_value(new_value, ignore_out_of_range=True)
484
479
  else:
485
480
  valid = False
486
481
  except ParameterUnchangedError:
@@ -491,13 +486,9 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
491
486
  messagebox.showerror(_("Invalid value"), str(exc))
492
487
  valid = False
493
488
 
494
- if valid and new_value_result is not None:
489
+ if valid:
495
490
  logging_debug(_("Parameter %s changed, will later ask if change(s) should be saved to file."), param.name)
496
491
  show_tooltip(change_reason_widget, param.tooltip_change_reason)
497
- self.at_least_one_param_edited = True
498
- # Update the corresponding file parameter with the model-returned value
499
- # (model returns the canonical numeric/string representation)
500
- self.configuration_manager.current_file_parameters[param.name].value = new_value_result
501
492
  value_is_different.config(text=NEW_VALUE_DIFFERENT_STR if param.is_different_from_fc else " ")
502
493
 
503
494
  # Update the displayed value in the Entry or Combobox
@@ -547,18 +538,15 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
547
538
  )
548
539
  return
549
540
 
550
- new_value_result = None
551
541
  valid = True
552
542
  # Update the parameter value and entry text
553
543
  try:
554
- new_value_result = param.set_new_value(BitmaskHelper.get_value_from_keys(checked_keys))
544
+ param.set_new_value(BitmaskHelper.get_value_from_keys(checked_keys))
555
545
  except ParameterOutOfRangeError as oor: # user-visible warning from model
556
546
  # Ask the user if they want to accept the out-of-range value
557
547
  if messagebox.askyesno(_("Unknown bit set"), str(oor) + _(" Use out-of-range value?"), icon="warning"):
558
548
  # Retry accepting the value while telling the model to ignore range checks
559
- new_value_result = param.set_new_value(
560
- BitmaskHelper.get_value_from_keys(checked_keys), ignore_out_of_range=True
561
- )
549
+ param.set_new_value(BitmaskHelper.get_value_from_keys(checked_keys), ignore_out_of_range=True)
562
550
  else:
563
551
  valid = False
564
552
  except ParameterUnchangedError:
@@ -569,11 +557,8 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
569
557
  messagebox.showerror(_("Error"), str(exc))
570
558
  valid = False
571
559
 
572
- if valid and new_value_result is not None:
560
+ if valid:
573
561
  show_tooltip(change_reason_widget, param.tooltip_change_reason)
574
- self.at_least_one_param_edited = True
575
- # Update the corresponding file parameter
576
- self.configuration_manager.current_file_parameters[param.name].value = new_value_result
577
562
  value_is_different.config(text=NEW_VALUE_DIFFERENT_STR if param.is_different_from_fc else " ")
578
563
 
579
564
  # Update new_value_entry with the new decimal value
@@ -717,9 +702,6 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
717
702
  param.change_reason,
718
703
  new_comment,
719
704
  )
720
- self.at_least_one_param_edited = True
721
- # Update the corresponding file parameter comment
722
- self.configuration_manager.current_file_parameters[param.name].comment = new_comment
723
705
 
724
706
  change_reason_entry.bind("<FocusOut>", _on_change_reason_change)
725
707
  change_reason_entry.bind("<Return>", _on_change_reason_change)
@@ -737,8 +719,7 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
737
719
 
738
720
  # Delete the parameter
739
721
  self.configuration_manager.delete_parameter_from_current_file(param_name)
740
- self.at_least_one_param_edited = True
741
- self.parameter_editor.repopulate_parameter_table()
722
+ self.parameter_editor.repopulate_parameter_table(regenerate_from_disk=False)
742
723
 
743
724
  # Restore the scroll position
744
725
  self.canvas.yview_moveto(current_scroll_position)
@@ -788,9 +769,8 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
788
769
  """Confirm and process parameter addition using ConfigurationManager."""
789
770
  try:
790
771
  if self.configuration_manager.add_parameter_to_current_file(param_name):
791
- self.at_least_one_param_edited = True
792
772
  self._pending_scroll_to_bottom = True
793
- self.parameter_editor.repopulate_parameter_table()
773
+ self.parameter_editor.repopulate_parameter_table(regenerate_from_disk=False)
794
774
  return True
795
775
  except InvalidParameterNameError as exc:
796
776
  messagebox.showerror(_("Invalid parameter name."), str(exc))
@@ -804,21 +784,9 @@ class ParameterEditorTable(ScrollFrame): # pylint: disable=too-many-ancestors
804
784
  """Get the parameters selected for upload."""
805
785
  # Check if we should show upload column based on GUI complexity
806
786
  if not self._should_show_upload_column(gui_complexity):
807
- # all parameters are selected for upload in simple mode
808
- return self.configuration_manager.current_file_parameters
809
-
810
- return ParDict(
811
- {
812
- param_name: self.configuration_manager.current_file_parameters[param_name]
813
- for param_name, checkbutton_state in self.upload_checkbutton_var.items()
814
- if checkbutton_state.get()
815
- }
816
- )
817
-
818
- def get_at_least_one_param_edited(self) -> bool:
819
- """Get whether at least one parameter has been edited."""
820
- return self.at_least_one_param_edited
787
+ # All parameters are selected for upload in simple mode
788
+ return self.configuration_manager.get_parameters_as_par_dict()
821
789
 
822
- def set_at_least_one_param_edited(self, value: bool) -> None:
823
- """Set whether at least one parameter has been edited."""
824
- self.at_least_one_param_edited = value
790
+ # Get only selected parameters
791
+ selected_names = [name for name, checkbutton_state in self.upload_checkbutton_var.items() if checkbutton_state.get()]
792
+ return self.configuration_manager.get_parameters_as_par_dict(selected_names)
@@ -1,7 +1,7 @@
1
1
  """
2
2
  TKinter progress window class.
3
3
 
4
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
4
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
5
5
 
6
6
  SPDX-FileCopyrightText: 2024-2025 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>
7
7
 
@@ -3,7 +3,7 @@
3
3
  """
4
4
  GUI to create the directory to store the vehicle configuration files.
5
5
 
6
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
6
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
7
7
 
8
8
  SPDX-FileCopyrightText: 2024-2025 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>
9
9
 
@@ -3,7 +3,7 @@
3
3
  """
4
4
  GUI to select the directory to store the vehicle configuration files.
5
5
 
6
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
6
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
7
7
 
8
8
  SPDX-FileCopyrightText: 2024-2025 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>
9
9
 
@@ -1,7 +1,7 @@
1
1
  """
2
2
  TKinter base classes reused in multiple parts of the code.
3
3
 
4
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
4
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
5
5
 
6
6
  SPDX-FileCopyrightText: 2024-2025 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>
7
7
 
@@ -1,7 +1,7 @@
1
1
  """
2
2
  TKinter base classes reused in multiple parts of the code.
3
3
 
4
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
4
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
5
5
 
6
6
  SPDX-FileCopyrightText: 2024-2025 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>
7
7
 
@@ -1,7 +1,7 @@
1
1
  """
2
2
  TKinter base classes reused in multiple parts of the code.
3
3
 
4
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
4
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
5
5
 
6
6
  SPDX-FileCopyrightText: 2024-2025 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>
7
7
 
@@ -1,7 +1,7 @@
1
1
  """
2
2
  Check for software updates and install them if available.
3
3
 
4
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
4
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
5
5
 
6
6
  SPDX-FileCopyrightText: 2024-2025 Amilcar Lucas
7
7
 
@@ -29,7 +29,7 @@ Each phase's progress bar automatically:
29
29
  The UI dynamically adjusts to window resizing while maintaining proportional spacing
30
30
  between phases.
31
31
 
32
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
32
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
33
33
 
34
34
  SPDX-FileCopyrightText: 2024-2025 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>
35
35
 
@@ -45,7 +45,7 @@ from tkinter import ttk
45
45
  from typing import Union
46
46
 
47
47
  from ardupilot_methodic_configurator import _
48
- from ardupilot_methodic_configurator.backend_filesystem_configuration_steps import ConfigurationSteps
48
+ from ardupilot_methodic_configurator.backend_filesystem_configuration_steps import ConfigurationSteps, PhaseData
49
49
  from ardupilot_methodic_configurator.common_arguments import add_common_arguments
50
50
  from ardupilot_methodic_configurator.frontend_tkinter_show import show_tooltip
51
51
 
@@ -54,10 +54,15 @@ class StageProgressBar(ttk.LabelFrame): # pylint: disable=too-many-ancestors
54
54
  """Stage-segmented Configuration sequence progress UI."""
55
55
 
56
56
  def __init__(
57
- self, master: Union[tk.Widget, tk.Tk], phases: dict[str, dict], total_steps: int, gui_complexity: str, **kwargs
57
+ self,
58
+ master: Union[tk.Widget, tk.Tk],
59
+ sorted_phases: dict[str, PhaseData],
60
+ total_steps: int,
61
+ gui_complexity: str,
62
+ **kwargs,
58
63
  ) -> None:
59
64
  super().__init__(master, text=_("Configuration sequence progress"), **kwargs)
60
- self.phases = phases
65
+ self.phases = sorted_phases
61
66
  self.total_files = total_steps
62
67
  self.phase_frames: dict[str, ttk.Frame] = {}
63
68
  self.phase_bars: list[dict[str, Union[ttk.Progressbar, int]]] = []
@@ -78,26 +83,10 @@ class StageProgressBar(ttk.LabelFrame): # pylint: disable=too-many-ancestors
78
83
 
79
84
  def create_phase_frames(self, gui_complexity: str) -> None:
80
85
  """Create frames for each phase with progress bars and labels."""
81
- # Get phases with start positions
82
- active_phases = {k: v for k, v in self.phases.items() if "start" in v}
83
-
84
- # Sort phases by start position
85
- sorted_phases = dict(sorted(active_phases.items(), key=lambda x: x[1]["start"]))
86
-
87
- # Add the end information to each phase using the start of the next phase
88
- phase_names = list(sorted_phases.keys())
89
- for i, phase_name in enumerate(phase_names):
90
- if i < len(phase_names) - 1:
91
- next_phase_name = phase_names[i + 1]
92
- sorted_phases[phase_name]["end"] = sorted_phases[next_phase_name]["start"]
93
- else:
94
- sorted_phases[phase_name]["end"] = self.total_files
95
- sorted_phases[phase_name]["weight"] = max(2, sorted_phases[phase_name]["end"] - sorted_phases[phase_name]["start"])
96
-
97
86
  # Calculate non-optional phases
98
- non_optional_sorted_phases = {name: data for name, data in sorted_phases.items() if not data.get("optional", False)}
87
+ non_optional_phases = {name: data for name, data in self.phases.items() if not data.get("optional", False)}
99
88
 
100
- phases_to_display = non_optional_sorted_phases if gui_complexity == "simple" else sorted_phases
89
+ phases_to_display = non_optional_phases if gui_complexity == "simple" else self.phases
101
90
 
102
91
  # Create container frame that will expand
103
92
  container = ttk.Frame(self)
@@ -106,14 +95,14 @@ class StageProgressBar(ttk.LabelFrame): # pylint: disable=too-many-ancestors
106
95
  # Configure container columns to expand equally
107
96
  for i, (phase_name, phase_data) in enumerate(phases_to_display.items()):
108
97
  container.grid_columnconfigure(
109
- i, weight=phase_data["weight"] if gui_complexity == "simple" else 1, uniform="phase"
98
+ i, weight=phase_data.get("weight", 1) if gui_complexity == "simple" else 1, uniform="phase"
110
99
  )
111
- start = phase_data["start"]
112
- end = phase_data["end"]
100
+ start = phase_data.get("start", 0)
101
+ end = phase_data.get("end", self.total_files)
113
102
  self.phase_frames[phase_name] = self._create_phase_frame(container, i, phase_name, phase_data, (start, end))
114
103
 
115
104
  def _create_phase_frame( # pylint: disable=too-many-arguments, too-many-positional-arguments
116
- self, container: ttk.Frame, i: int, phase_name: str, phase_data: dict[str, Union[str, bool]], limits: tuple[int, int]
105
+ self, container: ttk.Frame, i: int, phase_name: str, phase_data: PhaseData, limits: tuple[int, int]
117
106
  ) -> ttk.Frame:
118
107
  frame = ttk.Frame(container)
119
108
  frame.grid(row=0, column=i, sticky="nsew", padx=1)
@@ -136,7 +125,7 @@ class StageProgressBar(ttk.LabelFrame): # pylint: disable=too-many-ancestors
136
125
  # Use gray text color if phase is marked as optional
137
126
  is_optional = False
138
127
  if "optional" in phase_data and isinstance(phase_data["optional"], bool):
139
- is_optional = phase_data.get("optional", False) # type: ignore[assignment]
128
+ is_optional = phase_data.get("optional", False)
140
129
  label_fg = "gray" if is_optional else "black"
141
130
 
142
131
  label = ttk.Label(
@@ -150,7 +139,7 @@ class StageProgressBar(ttk.LabelFrame): # pylint: disable=too-many-ancestors
150
139
  label.grid(row=1, column=0, sticky="ew")
151
140
 
152
141
  if "description" in phase_data and isinstance(phase_data["description"], str):
153
- tooltip_msg = _(phase_data.get("description", "")) # type: ignore[arg-type]
142
+ tooltip_msg = _(phase_data.get("description", ""))
154
143
  if is_optional:
155
144
  tooltip_msg += "\n" + _("This phase is optional.")
156
145
  show_tooltip(frame, tooltip_msg)
@@ -244,7 +233,8 @@ def main() -> None:
244
233
  config_steps = ConfigurationSteps("", "ArduCopter")
245
234
  config_steps.re_init("", "ArduCopter")
246
235
 
247
- progress = StageProgressBar(root, config_steps.configuration_phases, 54, "normal")
236
+ processed_phases = config_steps.get_sorted_phases_with_end_and_weight(54)
237
+ progress = StageProgressBar(root, processed_phases, 54, "normal")
248
238
  progress.pack(padx=10, pady=10, fill="both", expand=True)
249
239
 
250
240
  # Demo update function
@@ -3,7 +3,7 @@
3
3
  """
4
4
  Vehicle template overview GUI.
5
5
 
6
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
6
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
7
7
 
8
8
  SPDX-FileCopyrightText: 2024-2025 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>
9
9
 
@@ -1,7 +1,7 @@
1
1
  """
2
2
  A reusable usage popup window.
3
3
 
4
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
4
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
5
5
 
6
6
  SPDX-FileCopyrightText: 2024-2025 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>
7
7
 
@@ -1,7 +1,7 @@
1
1
  """
2
2
  Translations to other written languages.
3
3
 
4
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
4
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
5
5
 
6
6
  SPDX-FileCopyrightText: 2024-2025 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>
7
7
 
@@ -1,4 +1,4 @@
1
- #!/usr/bin/python3
1
+ #!/usr/bin/env python3
2
2
  # PYTHON_ARGCOMPLETE_OK
3
3
 
4
4
  """
@@ -7,7 +7,7 @@ Updates the PID adjustment parameters to be factor of the corresponding autotune
7
7
  Usage:
8
8
  ./param_pid_adjustment_update.py -d /path/to/directory optimized_parameter_file.param
9
9
 
10
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
10
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
11
11
 
12
12
  SPDX-FileCopyrightText: 2024-2025 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>
13
13
 
@@ -113,43 +113,47 @@ def load_param_file_with_content(param_file: str) -> tuple[ParDict, list[str]]:
113
113
  """
114
114
  parameter_dict = ParDict()
115
115
  content = []
116
- with open(param_file, encoding="utf-8") as f_handle:
117
- for n, f_line in enumerate(f_handle, start=1):
118
- line = f_line.strip()
119
- content.append(line)
120
- comment = None
121
- if not line or line.startswith("#"):
122
- continue
123
- if "#" in line:
124
- line, comment = line.split("#", 1)
125
- comment = comment.strip()
126
- if "," in line:
127
- parameter, value = line.split(",", 1)
128
- elif " " in line:
129
- parameter, value = line.split(" ", 1)
130
- elif "\t" in line:
131
- parameter, value = line.split("\t", 1)
132
- else:
133
- msg = f"Missing parameter-value separator: {line} in {param_file} line {n}"
134
- raise SystemExit(msg)
135
- # Strip whitespace from both parameter name and value immediately after splitting
136
- parameter = parameter.strip()
137
- value = value.strip()
138
- if len(parameter) > PARAM_NAME_MAX_LEN:
139
- msg = f"Too long parameter name: {parameter} in {param_file} line {n}"
140
- raise SystemExit(msg)
141
- if not re.match(PARAM_NAME_REGEX, parameter):
142
- msg = f"Invalid characters in parameter name {parameter} in {param_file} line {n}"
143
- raise SystemExit(msg)
144
- try:
145
- fvalue = float(value)
146
- except ValueError as exc:
147
- msg = f"Invalid parameter value {value} in {param_file} line {n}"
148
- raise SystemExit(msg) from exc
149
- if parameter in parameter_dict:
150
- msg = f"Duplicated parameter {parameter} in {param_file} line {n}"
151
- raise SystemExit(msg)
152
- parameter_dict[parameter] = Par(fvalue, comment)
116
+ try:
117
+ with open(param_file, encoding="utf-8-sig") as f_handle:
118
+ for n, f_line in enumerate(f_handle, start=1):
119
+ line = f_line.strip()
120
+ content.append(line)
121
+ comment = None
122
+ if not line or line.startswith("#"):
123
+ continue
124
+ if "#" in line:
125
+ line, comment = line.split("#", 1)
126
+ comment = comment.strip()
127
+ if "," in line:
128
+ parameter, value = line.split(",", 1)
129
+ elif " " in line:
130
+ parameter, value = line.split(" ", 1)
131
+ elif "\t" in line:
132
+ parameter, value = line.split("\t", 1)
133
+ else:
134
+ msg = f"Missing parameter-value separator: {line} in {param_file} line {n}"
135
+ raise SystemExit(msg)
136
+ # Strip whitespace from both parameter name and value immediately after splitting
137
+ parameter = parameter.strip()
138
+ value = value.strip()
139
+ if len(parameter) > PARAM_NAME_MAX_LEN:
140
+ msg = f"Too long parameter name: {parameter} in {param_file} line {n}"
141
+ raise SystemExit(msg)
142
+ if not re.match(PARAM_NAME_REGEX, parameter):
143
+ msg = f"Invalid characters in parameter name {parameter} in {param_file} line {n}"
144
+ raise SystemExit(msg)
145
+ try:
146
+ fvalue = float(value)
147
+ except ValueError as exc:
148
+ msg = f"Invalid parameter value {value} in {param_file} line {n}"
149
+ raise SystemExit(msg) from exc
150
+ if parameter in parameter_dict:
151
+ msg = f"Duplicated parameter {parameter} in {param_file} line {n}"
152
+ raise SystemExit(msg)
153
+ parameter_dict[parameter] = Par(fvalue, comment)
154
+ except UnicodeDecodeError as exp:
155
+ msg = f"Fatal error reading {param_file}, file must be UTF-8 encoded: {exp}"
156
+ raise SystemExit(msg) from exp
153
157
  return parameter_dict, content
154
158
 
155
159
 
@@ -5,7 +5,7 @@ Create temperature calibration parameters for IMUs based on log data.
5
5
  The original (python2) version of this file is part of the Ardupilot project.
6
6
  This version has been modified to work with >= python3.6 and to pass pylint and ruff checks.
7
7
 
8
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
8
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
9
9
 
10
10
  SPDX-FileCopyrightText: 2021 Andrew Tridgell <andrew@tridgell.net>, 2024-2025 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>
11
11
 
@@ -1,7 +1,7 @@
1
1
  """
2
2
  Auto-generated by the update_vehicle_components_translation.py. Do not edit, ALL CHANGES WILL BE LOST.
3
3
 
4
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
4
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
5
5
 
6
6
  SPDX-FileCopyrightText: 2024-2025 Amilcar Lucas
7
7
 
@@ -1,6 +1,6 @@
1
1
  INS_LOG_BAT_CNT,1024 # the default of 1024 causes some problems with https://firmware.ardupilot.org/Tools/WebTools/FilterReview/
2
- INS_LOG_BAT_MASK,0 # Use acc and gyro batch logging on F4 processors, gyro raw logging on others
3
- INS_LOG_BAT_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
4
- INS_RAW_LOG_OPT,9 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
2
+ INS_LOG_BAT_MASK,1 # Use acc and gyro batch logging on F4 processors or big props, gyro raw logging on others
3
+ INS_LOG_BAT_OPT,4 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
4
+ INS_RAW_LOG_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
5
5
  LOG_BITMASK,145118 # Log all but fast att, Nav, Mission, OF, camera, fast IMU, raw, IMU, video stabilization. These are not needed now
6
6
  LOG_FILE_DSRMROT,1 # One .bin log file per flight, not per battery/reboot
@@ -1,6 +1,6 @@
1
- INS_LOG_BAT_MASK,0 # Use acc and gyro batch logging on F4 processors, gyro raw logging on others
2
- INS_LOG_BAT_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
3
- INS_RAW_LOG_OPT,9 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
1
+ INS_LOG_BAT_MASK,1 # Use acc and gyro batch logging on F4 processors or big props, gyro raw logging on others
2
+ INS_LOG_BAT_OPT,4 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
3
+ INS_RAW_LOG_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
4
4
  LOG_BACKEND_TYPE,1 # we want to log data to the SDCard
5
5
  LOG_BITMASK,145118 # Log all but fast att, Nav, Mission, OF, camera, fast IMU, raw, IMU, video stabilization. These are not needed now
6
6
  LOG_FILE_DSRMROT,1 # One .bin log file per flight, not per battery/reboot
@@ -1,5 +1,5 @@
1
- INS_LOG_BAT_MASK,1 # Use acc and gyro batch logging on F4 processors, gyro raw logging on others
2
- INS_LOG_BAT_OPT,4 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
3
- INS_RAW_LOG_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
1
+ INS_LOG_BAT_MASK,0 # Use acc and gyro batch logging on F4 processors or big props, gyro raw logging on others
2
+ INS_LOG_BAT_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
3
+ INS_RAW_LOG_OPT,9 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
4
4
  LOG_BITMASK,145118 # Log all but fast att, Nav, Mission, OF, camera, fast IMU, raw, IMU, video stabilization. These are not needed now
5
5
  LOG_FILE_DSRMROT,1 # One .bin log file per flight, not per battery/reboot
@@ -1,5 +1,5 @@
1
- INS_LOG_BAT_MASK,1 # Use acc and gyro batch logging on F4 processors, gyro raw logging on others
2
- INS_LOG_BAT_OPT,4 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
3
- INS_RAW_LOG_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
1
+ INS_LOG_BAT_MASK,0 # Use acc and gyro batch logging on F4 processors or big props, gyro raw logging on others
2
+ INS_LOG_BAT_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
3
+ INS_RAW_LOG_OPT,9 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
4
4
  LOG_BITMASK,145118 # Log all but fast att, Nav, Mission, OF, camera, fast IMU, raw, IMU, video stabilization. These are not needed now
5
5
  LOG_FILE_DSRMROT,1 # One .bin log file per flight, not per battery/reboot
@@ -1,5 +1,5 @@
1
- INS_LOG_BAT_MASK,1 # Use acc and gyro batch logging on F4 processors, gyro raw logging on others
2
- INS_LOG_BAT_OPT,4 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
3
- INS_RAW_LOG_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
1
+ INS_LOG_BAT_MASK,0 # Use acc and gyro batch logging on F4 processors or big props, gyro raw logging on others
2
+ INS_LOG_BAT_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
3
+ INS_RAW_LOG_OPT,9 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
4
4
  LOG_BITMASK,145118 # Log all but fast att, Nav, Mission, OF, camera, fast IMU, raw, IMU, video stabilization. These are not needed now
5
5
  LOG_FILE_DSRMROT,1 # One .bin log file per flight, not per battery/reboot
@@ -1,7 +1,7 @@
1
1
  INS_LOG_BAT_CNT,1024 # the default of 1024 causes some problems with https://firmware.ardupilot.org/Tools/WebTools/FilterReview/
2
- INS_LOG_BAT_MASK,1 # Use acc and gyro batch logging on F4 processors, gyro raw logging on others
3
- INS_LOG_BAT_OPT,4 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
4
- INS_RAW_LOG_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
2
+ INS_LOG_BAT_MASK,0 # Use acc and gyro batch logging on F4 processors or big props, gyro raw logging on others
3
+ INS_LOG_BAT_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
4
+ INS_RAW_LOG_OPT,9 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
5
5
  LOG_BITMASK,145118 # Log all but fast att, Nav, Mission, OF, camera, fast IMU, raw, IMU, video stabilization. These are not needed now
6
6
  LOG_FILE_BUFSIZE,50 # We have a F7 processor, so be a bit conservative
7
7
  LOG_FILE_DSRMROT,1 # One .bin log file per flight, not per battery/reboot
@@ -1,6 +1,6 @@
1
1
  INS_LOG_BAT_CNT,992 # the default of 1024 causes some problems with https://firmware.ardupilot.org/Tools/WebTools/FilterReview/
2
- INS_LOG_BAT_MASK,1 # Use acc and gyro batch logging on F4 processors, gyro raw logging on others
3
- INS_LOG_BAT_OPT,4 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
4
- INS_RAW_LOG_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors, pre-post gyro raw logging on others
2
+ INS_LOG_BAT_MASK,0 # Use acc and gyro batch logging on F4 processors or big props, gyro raw logging on others
3
+ INS_LOG_BAT_OPT,0 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
4
+ INS_RAW_LOG_OPT,9 # Use pre and post filters acc and gyro batch logging on F4 processors or big props, pre-post gyro raw logging on others
5
5
  LOG_BITMASK,145118 # Log all but fast att, Nav, Mission, OF, camera, fast IMU, raw, IMU, video stabilization. These are not needed now
6
6
  LOG_FILE_DSRMROT,1 # One .bin log file per flight, not per battery/reboot