ardupilot-methodic-configurator 2.6.1__py3-none-any.whl → 2.7.1__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 (107) hide show
  1. ardupilot_methodic_configurator/__init__.py +2 -2
  2. ardupilot_methodic_configurator/__main__.py +34 -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_freedesktop.py +275 -0
  8. ardupilot_methodic_configurator/backend_filesystem_json_with_schema.py +3 -3
  9. ardupilot_methodic_configurator/backend_filesystem_program_settings.py +26 -8
  10. ardupilot_methodic_configurator/backend_filesystem_vehicle_components.py +3 -3
  11. ardupilot_methodic_configurator/backend_flightcontroller.py +37 -20
  12. ardupilot_methodic_configurator/backend_flightcontroller_info.py +1 -1
  13. ardupilot_methodic_configurator/backend_internet.py +1 -1
  14. ardupilot_methodic_configurator/backend_mavftp.py +1 -1
  15. ardupilot_methodic_configurator/battery_cell_voltages.py +1 -1
  16. ardupilot_methodic_configurator/common_arguments.py +1 -1
  17. ardupilot_methodic_configurator/configuration_manager.py +561 -121
  18. ardupilot_methodic_configurator/configuration_steps_ArduCopter.json +7 -5
  19. ardupilot_methodic_configurator/configuration_steps_ArduPlane.json +3 -1
  20. ardupilot_methodic_configurator/configuration_steps_Heli.json +3 -1
  21. ardupilot_methodic_configurator/configuration_steps_Rover.json +3 -1
  22. ardupilot_methodic_configurator/configuration_steps_strings.py +5 -3
  23. ardupilot_methodic_configurator/data_model_ardupilot_parameter.py +55 -2
  24. ardupilot_methodic_configurator/data_model_configuration_step.py +96 -46
  25. ardupilot_methodic_configurator/data_model_fc_ids.py +16 -7
  26. ardupilot_methodic_configurator/data_model_motor_test.py +1 -1
  27. ardupilot_methodic_configurator/data_model_par_dict.py +25 -11
  28. ardupilot_methodic_configurator/data_model_software_updates.py +1 -1
  29. ardupilot_methodic_configurator/data_model_template_overview.py +1 -1
  30. ardupilot_methodic_configurator/data_model_vehicle_components.py +1 -1
  31. ardupilot_methodic_configurator/data_model_vehicle_components_base.py +3 -2
  32. ardupilot_methodic_configurator/data_model_vehicle_components_display.py +1 -1
  33. ardupilot_methodic_configurator/data_model_vehicle_components_import.py +2 -1
  34. ardupilot_methodic_configurator/data_model_vehicle_components_json_schema.py +1 -1
  35. ardupilot_methodic_configurator/data_model_vehicle_components_templates.py +1 -1
  36. ardupilot_methodic_configurator/data_model_vehicle_components_validation.py +41 -1
  37. ardupilot_methodic_configurator/data_model_vehicle_project.py +1 -1
  38. ardupilot_methodic_configurator/data_model_vehicle_project_creator.py +1 -1
  39. ardupilot_methodic_configurator/data_model_vehicle_project_opener.py +1 -1
  40. ardupilot_methodic_configurator/extract_param_defaults.py +1 -1
  41. ardupilot_methodic_configurator/frontend_tkinter_autoresize_combobox.py +1 -1
  42. ardupilot_methodic_configurator/frontend_tkinter_base_window.py +6 -2
  43. ardupilot_methodic_configurator/frontend_tkinter_component_editor.py +56 -29
  44. ardupilot_methodic_configurator/frontend_tkinter_component_editor_base.py +18 -13
  45. ardupilot_methodic_configurator/frontend_tkinter_component_template_manager.py +1 -1
  46. ardupilot_methodic_configurator/frontend_tkinter_connection_selection.py +1 -1
  47. ardupilot_methodic_configurator/frontend_tkinter_directory_selection.py +1 -1
  48. ardupilot_methodic_configurator/frontend_tkinter_entry_dynamic.py +1 -1
  49. ardupilot_methodic_configurator/frontend_tkinter_flightcontroller_info.py +1 -1
  50. ardupilot_methodic_configurator/frontend_tkinter_font.py +1 -1
  51. ardupilot_methodic_configurator/frontend_tkinter_motor_test.py +1 -1
  52. ardupilot_methodic_configurator/frontend_tkinter_pair_tuple_combobox.py +7 -1
  53. ardupilot_methodic_configurator/frontend_tkinter_parameter_editor.py +107 -156
  54. ardupilot_methodic_configurator/frontend_tkinter_parameter_editor_documentation_frame.py +24 -58
  55. ardupilot_methodic_configurator/frontend_tkinter_parameter_editor_table.py +24 -56
  56. ardupilot_methodic_configurator/frontend_tkinter_progress_window.py +1 -1
  57. ardupilot_methodic_configurator/frontend_tkinter_project_creator.py +1 -1
  58. ardupilot_methodic_configurator/frontend_tkinter_project_opener.py +1 -1
  59. ardupilot_methodic_configurator/frontend_tkinter_rich_text.py +1 -1
  60. ardupilot_methodic_configurator/frontend_tkinter_scroll_frame.py +1 -1
  61. ardupilot_methodic_configurator/frontend_tkinter_show.py +3 -3
  62. ardupilot_methodic_configurator/frontend_tkinter_software_update.py +1 -1
  63. ardupilot_methodic_configurator/frontend_tkinter_stage_progress.py +19 -29
  64. ardupilot_methodic_configurator/frontend_tkinter_template_overview.py +1 -1
  65. ardupilot_methodic_configurator/frontend_tkinter_usage_popup_window.py +1 -1
  66. ardupilot_methodic_configurator/internationalization.py +1 -1
  67. ardupilot_methodic_configurator/param_pid_adjustment_update.py +43 -39
  68. ardupilot_methodic_configurator/tempcal_imu.py +1 -1
  69. ardupilot_methodic_configurator/vehicle_components.py +1 -1
  70. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/AirCar_v1/14_logging.param +3 -3
  71. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Big_Owl/14_logging.param +3 -3
  72. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Chimera7/14_logging.param +3 -3
  73. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/FETtec-5/14_logging.param +3 -3
  74. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/GazeboIrisWithTargetFollow/14_logging.param +3 -3
  75. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Holybro_X500/14_logging.param +3 -3
  76. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Holybro_X500_V2/14_logging.param +3 -3
  77. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Holybro_X650_LTE/14_logging.param +3 -3
  78. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Hoverit_X11+/14_logging.param +3 -3
  79. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Hoverit_X13/14_logging.param +3 -3
  80. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Marmotte5v2/14_logging.param +3 -3
  81. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/ReadyToSkyZD550/14_logging.param +3 -3
  82. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/TarotFY680Hexacopter/05_remote_controller.param +1 -1
  83. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/TarotFY680Hexacopter/14_logging.param +3 -3
  84. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/TarotFY680Hexacopter/47_position_controller.param +2 -2
  85. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/Tarot_X4/14_logging.param +3 -3
  86. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/X11_plus/14_logging.param +3 -3
  87. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/diatone_taycan_mxc/4.3.8-params/14_logging.param +3 -3
  88. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/diatone_taycan_mxc/4.4.4-params/14_logging.param +3 -3
  89. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/diatone_taycan_mxc/4.5.x-params/14_logging.param +3 -3
  90. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/diatone_taycan_mxc/4.6.x-params/14_logging.param +3 -3
  91. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/empty_4.5.x/10_gnss.param +1 -1
  92. ardupilot_methodic_configurator/vehicle_templates/ArduCopter/empty_4.6.x/10_gnss.param +1 -1
  93. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/METADATA +12 -7
  94. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/RECORD +107 -106
  95. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/licenses/credits/CREDITS.md +1 -0
  96. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/WHEEL +0 -0
  97. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/entry_points.txt +0 -0
  98. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/licenses/LICENSE.md +0 -0
  99. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/licenses/LICENSES/Apache-2.0.txt +0 -0
  100. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/licenses/LICENSES/BSD-3-Clause.txt +0 -0
  101. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/licenses/LICENSES/GPL-3.0-or-later.txt +0 -0
  102. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/licenses/LICENSES/LGPL-3.0-or-later.txt +0 -0
  103. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/licenses/LICENSES/MIT-CMU.txt +0 -0
  104. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/licenses/LICENSES/MIT.txt +0 -0
  105. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/licenses/LICENSES/MPL-2.0.txt +0 -0
  106. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/licenses/LICENSES/PSF-2.0.txt +0 -0
  107. {ardupilot_methodic_configurator-2.6.1.dist-info → ardupilot_methodic_configurator-2.7.1.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  """
2
2
  Manages program settings at the filesystem level.
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
 
@@ -9,7 +9,8 @@ SPDX-License-Identifier: GPL-3.0-or-later
9
9
  """
10
10
 
11
11
  # from sys import exit as sys_exit
12
- import glob
12
+ from contextlib import suppress as contextlib_suppress
13
+ from glob import glob as glob_glob
13
14
  from importlib.resources import files as importlib_files
14
15
  from json import dump as json_dump
15
16
  from json import load as json_load
@@ -108,8 +109,18 @@ class ProgramSettings:
108
109
 
109
110
  @staticmethod
110
111
  def application_icon_filepath() -> str:
111
- package_path = importlib_files("ardupilot_methodic_configurator")
112
- return str(package_path / "images" / "ArduPilot_icon.png")
112
+ """Get the application icon path, with fallback options."""
113
+ try:
114
+ package_path = importlib_files("ardupilot_methodic_configurator")
115
+ except (ImportError, FileNotFoundError):
116
+ # Fallback: try to find icon relative to the script
117
+ package_path = Path(os_path.dirname(os_path.abspath(__file__)))
118
+
119
+ icon_path = str(package_path / "images" / "ArduPilot_icon.png")
120
+ if os_path.exists(icon_path):
121
+ return icon_path
122
+ # If no icon found, return empty string (GUI will handle the error)
123
+ return ""
113
124
 
114
125
  @staticmethod
115
126
  def application_logo_filepath() -> str:
@@ -152,9 +163,12 @@ class ProgramSettings:
152
163
  @staticmethod
153
164
  def _user_config_dir() -> str:
154
165
  user_config_directory = user_config_dir(
155
- ".ardupilot_methodic_configurator", appauthor=False, roaming=True, ensure_exists=True
166
+ ".ardupilot_methodic_configurator", appauthor=False, roaming=True, ensure_exists=False
156
167
  )
157
168
 
169
+ if not os_path.exists(user_config_directory):
170
+ os_makedirs(user_config_directory, exist_ok=True)
171
+
158
172
  if not os_path.exists(user_config_directory):
159
173
  error_msg = _("The user configuration directory '{user_config_directory}' does not exist.")
160
174
  raise FileNotFoundError(error_msg.format(**locals()))
@@ -167,9 +181,13 @@ class ProgramSettings:
167
181
  @staticmethod
168
182
  def _site_config_dir() -> str:
169
183
  site_config_directory = site_config_dir(
170
- ".ardupilot_methodic_configurator", appauthor=False, version=None, multipath=False, ensure_exists=True
184
+ ".ardupilot_methodic_configurator", appauthor=False, version=None, multipath=False, ensure_exists=False
171
185
  )
172
186
 
187
+ if not os_path.exists(site_config_directory):
188
+ with contextlib_suppress(OSError):
189
+ os_makedirs(site_config_directory, exist_ok=True)
190
+
173
191
  if not os_path.exists(site_config_directory):
174
192
  error_msg = _("The site configuration directory '{site_config_directory}' does not exist.")
175
193
  raise FileNotFoundError(error_msg.format(**locals()))
@@ -189,7 +207,7 @@ class ProgramSettings:
189
207
 
190
208
  """
191
209
  try:
192
- with open(settings_path, encoding="utf-8") as settings_file:
210
+ with open(settings_path, encoding="utf-8-sig") as settings_file:
193
211
  loaded_settings: dict[str, Any] = json_load(settings_file)
194
212
  return loaded_settings
195
213
  except FileNotFoundError:
@@ -365,7 +383,7 @@ class ProgramSettings:
365
383
  filename = f"m_{frame_class:02d}_{frame_type:02d}_*.png"
366
384
 
367
385
  # Search for matching PNG file (since exact naming varies)
368
- matching_files = glob.glob(str(images_dir / filename))
386
+ matching_files = glob_glob(str(images_dir / filename))
369
387
 
370
388
  err_msg = (
371
389
  ""
@@ -1,7 +1,7 @@
1
1
  """
2
2
  Manages vehicle components at the filesystem level.
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
 
@@ -99,7 +99,7 @@ class VehicleComponents:
99
99
 
100
100
  templates = {}
101
101
  try:
102
- with open(filepath, encoding="utf-8") as file:
102
+ with open(filepath, encoding="utf-8-sig") as file:
103
103
  templates = json_load(file)
104
104
  except FileNotFoundError:
105
105
  logging_debug(_("System component templates file '%s' not found."), filepath)
@@ -119,7 +119,7 @@ class VehicleComponents:
119
119
 
120
120
  templates = {}
121
121
  try:
122
- with open(filepath, encoding="utf-8") as file:
122
+ with open(filepath, encoding="utf-8-sig") as file:
123
123
  templates = json_load(file)
124
124
  except FileNotFoundError:
125
125
  logging_debug(_("User component templates file '%s' not found."), filepath)
@@ -1,7 +1,7 @@
1
1
  """
2
2
  Flight controller interface.
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
 
@@ -234,7 +234,7 @@ class FlightController: # pylint: disable=too-many-public-methods,too-many-inst
234
234
  except OSError:
235
235
  pass # Not a soft link, proceed with the original device path
236
236
  err = self._register_and_try_connect(
237
- comport=autodetect_serial[0],
237
+ comport=autodetect_serial[-1],
238
238
  progress_callback=progress_callback,
239
239
  baudrate=connection_baudrate,
240
240
  log_errors=False,
@@ -408,7 +408,7 @@ class FlightController: # pylint: disable=too-many-public-methods,too-many-inst
408
408
  logging_error(error_msg)
409
409
  return False, error_msg
410
410
 
411
- def __create_connection_with_retry( # pylint: disable=too-many-arguments, too-many-positional-arguments
411
+ def __create_connection_with_retry( # pylint: disable=too-many-arguments, too-many-positional-arguments, too-many-locals, too-many-branches
412
412
  self,
413
413
  progress_callback: Union[None, Callable[[int, int], None]],
414
414
  retries: int = 3,
@@ -452,29 +452,45 @@ class FlightController: # pylint: disable=too-many-public-methods,too-many-inst
452
452
  retries=retries,
453
453
  progress_callback=progress_callback,
454
454
  )
455
- logging_debug(_("Waiting for MAVLink heartbeat"))
455
+ logging_debug(_("Waiting for MAVLink heartbeats..."))
456
456
  if not self.master:
457
457
  msg = f"Failed to create mavlink connect to {self.comport.device}"
458
458
  raise ConnectionError(msg)
459
- m = self.master.wait_heartbeat(timeout=timeout)
460
- if m is None:
459
+ # --- NEW: collect all vehicles detected within timeout ---
460
+ start_time = time_time()
461
+ detected_vehicles = {} # (sysid, compid) -> last HEARTBEAT
462
+
463
+ while time_time() - start_time < timeout:
464
+ m = self.master.recv_match(type="HEARTBEAT", blocking=False)
465
+ if m is None:
466
+ time_sleep(0.1)
467
+ continue
468
+ sysid = m.get_srcSystem()
469
+ compid = m.get_srcComponent()
470
+ detected_vehicles[(sysid, compid)] = m
471
+ logging_debug(_("Detected vehicle %u:%u (autopilot=%u, type=%u)"), sysid, compid, m.autopilot, m.type)
472
+
473
+ if not detected_vehicles:
461
474
  return _("No MAVLink heartbeat received, connection failed.")
462
- self.info.set_system_id_and_component_id(m.get_srcSystem(), m.get_srcComponent())
463
- logging_debug(
464
- _("Connection established with systemID %d, componentID %d."), self.info.system_id, self.info.component_id
465
- )
466
475
 
467
- self.info.set_autopilot(m.autopilot)
468
- if self.info.is_supported:
469
- msg = _("Autopilot type {self.info.autopilot}")
470
- logging_info(msg.format(**locals()))
471
- else:
476
+ for (sysid, compid), m in detected_vehicles.items():
477
+ self.info.set_system_id_and_component_id(sysid, compid)
478
+ logging_debug(
479
+ _("Connection established with systemID %d, componentID %d."), self.info.system_id, self.info.component_id
480
+ )
481
+ self.info.set_autopilot(m.autopilot)
482
+ if self.info.is_supported:
483
+ msg = _("Autopilot type {self.info.autopilot}")
484
+ logging_info(msg.format(**locals()))
485
+ self.info.set_type(m.type)
486
+ msg = _("Vehicle type: {self.info.mav_type} running {self.info.vehicle_type} firmware")
487
+ logging_info(msg.format(**locals()))
488
+ break
472
489
  msg = _("Unsupported autopilot type {self.info.autopilot}")
473
- return msg.format(**locals())
490
+ logging_info(msg.format(**locals()))
474
491
 
475
- self.info.set_type(m.type)
476
- msg = _("Vehicle type: {self.info.mav_type} running {self.info.vehicle_type} firmware")
477
- logging_info(msg.format(**locals()))
492
+ if not self.info.is_supported:
493
+ return _("No supported autopilots found")
478
494
 
479
495
  self.__request_banner()
480
496
  banner_msgs = self.__receive_banner_text()
@@ -482,6 +498,7 @@ class FlightController: # pylint: disable=too-many-public-methods,too-many-inst
482
498
  self.__request_message(mavutil.mavlink.MAVLINK_MSG_ID_AUTOPILOT_VERSION)
483
499
  m = self.master.recv_match(type="AUTOPILOT_VERSION", blocking=True, timeout=timeout)
484
500
  return self.__process_autopilot_version(m, banner_msgs)
501
+
485
502
  except (ConnectionError, SerialException, PermissionError, ConnectionRefusedError) as e:
486
503
  if log_errors:
487
504
  logging_warning(_("Connection failed: %s"), e)
@@ -1157,12 +1174,12 @@ class FlightController: # pylint: disable=too-many-public-methods,too-many-inst
1157
1174
  def __auto_detect_serial(self) -> list[mavutil.SerialPort]:
1158
1175
  preferred_ports = [
1159
1176
  "*FTDI*",
1160
- "*Arduino_Mega_2560*",
1161
1177
  "*3D*",
1162
1178
  "*USB_to_UART*",
1163
1179
  "*Ardu*",
1164
1180
  "*PX4*",
1165
1181
  "*Hex_*",
1182
+ "*ProfiCNC*",
1166
1183
  "*Holybro_*",
1167
1184
  "*mRo*",
1168
1185
  "*FMU*",
@@ -1,7 +1,7 @@
1
1
  """
2
2
  Manages FC information using FC interface.
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
 
@@ -6,7 +6,7 @@ MAVLink File Transfer Protocol support - https://mavlink.io/en/services/ftp.html
6
6
 
7
7
  Original from MAVProxy/MAVProxy/modules/mavproxy_ftp.py
8
8
 
9
- This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator
9
+ This file is part of ArduPilot Methodic Configurator. https://github.com/ArduPilot/MethodicConfigurator
10
10
 
11
11
  SPDX-FileCopyrightText: 2011-2024 Andrew Tridgell, 2024-2025 Amilcar Lucas
12
12
 
@@ -1,7 +1,7 @@
1
1
  """
2
2
  Battery cell voltages management.
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
  Common arguments used by all sub applications.
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