Skip to content

Commit 47fd6cd

Browse files
authored
refactor(parameter editor): do not unnecessarily reset the FC (#1348)
No need to reset the FC if SID_AXIS changes, only when it changes from 0 to something else Signed-off-by: Amilcar Lucas <amilcar.lucas@iav.de>
1 parent 98e2712 commit 47fd6cd

File tree

2 files changed

+120
-1
lines changed

2 files changed

+120
-1
lines changed

ardupilot_methodic_configurator/data_model_parameter_editor.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,12 @@ def upload_parameters_that_require_reset_workflow( # pylint: disable=too-many-l
711711
logging_info(_("Parameter %s changed to %f, reset required"), param_name, param.value)
712712
reset_required = True
713713
# Check if any of the selected parameters have a _TYPE, _EN, or _ENABLE suffix
714-
elif param_name.endswith(("_TYPE", "_EN", "_ENABLE", "SID_AXIS")):
714+
# SID_AXIS only requires a possible reset when changing from 0 to a non-zero value
715+
elif param_name.endswith(("_TYPE", "_EN", "_ENABLE")) or (
716+
param_name == "SID_AXIS"
717+
and float(self._flight_controller.fc_parameters.get("SID_AXIS", 0.0)) == 0.0
718+
and float(param.value) != 0.0
719+
):
715720
success, error_msg = self._flight_controller.set_param(param_name, float(param.value))
716721
if not success:
717722
logging_error(_("Failed to set parameter %s: %s"), param_name, error_msg)

tests/test_data_model_parameter_editor.py

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,10 +602,124 @@ def test_user_handles_parameter_upload_errors_gracefully(self, parameter_editor)
602602
# Assert: Errors handled via callback
603603
assert reset_required is False # No successful uploads
604604
assert len(uploaded_params) == 0 # No parameters were uploaded
605+
mock_ask_confirmation.assert_not_called()
605606
mock_show_error.assert_called_once()
606607
error_call_args = mock_show_error.call_args[0]
607608
assert "Failed to set parameter" in error_call_args[1] # Second argument is the error message
608609

610+
def test_user_uploads_sid_axis_from_zero_to_nonzero_triggers_possible_reset(self, parameter_editor) -> None:
611+
"""
612+
Uploading SID_AXIS from 0 to a non-zero value triggers a possible reset confirmation.
613+
614+
GIVEN: SID_AXIS is currently 0 on the flight controller
615+
WHEN: The user uploads SID_AXIS with a new non-zero value
616+
THEN: A possible reset should be triggered (parameter added to reset_unsure_params)
617+
"""
618+
# Arrange: SID_AXIS currently 0 on FC, new value is non-zero
619+
selected_params = {"SID_AXIS": Par(1.0, "Sys ID axis")}
620+
parameter_editor._flight_controller.fc_parameters = {"SID_AXIS": 0}
621+
parameter_editor._local_filesystem.doc_dict = {"SID_AXIS": {"RebootRequired": False}}
622+
parameter_editor._reset_and_reconnect_flight_controller = MagicMock(return_value=None)
623+
624+
mock_ask_confirmation = MagicMock(return_value=True)
625+
mock_show_error = MagicMock()
626+
627+
# Act
628+
reset_happened, uploaded_params = parameter_editor.upload_parameters_that_require_reset_workflow(
629+
selected_params, mock_ask_confirmation, mock_show_error
630+
)
631+
632+
# Assert: Possible reset triggered and parameter uploaded
633+
assert reset_happened is True
634+
assert "SID_AXIS" in uploaded_params
635+
mock_ask_confirmation.assert_called_once()
636+
mock_show_error.assert_not_called()
637+
638+
def test_user_uploads_sid_axis_from_nonzero_to_different_nonzero_skips_reset(self, parameter_editor) -> None:
639+
"""
640+
Uploading SID_AXIS from one non-zero value to another does not trigger a reset.
641+
642+
GIVEN: SID_AXIS is currently non-zero on the flight controller
643+
WHEN: The user uploads SID_AXIS with a different non-zero value
644+
THEN: No possible reset should be triggered
645+
"""
646+
# Arrange: SID_AXIS currently 1 on FC, new value is 2
647+
selected_params = {"SID_AXIS": Par(2.0, "Sys ID axis")}
648+
parameter_editor._flight_controller.fc_parameters = {"SID_AXIS": 1.0}
649+
parameter_editor._local_filesystem.doc_dict = {"SID_AXIS": {"RebootRequired": False}}
650+
parameter_editor._reset_and_reconnect_flight_controller = MagicMock(return_value=None)
651+
652+
mock_ask_confirmation = MagicMock(return_value=False)
653+
mock_show_error = MagicMock()
654+
655+
# Act
656+
reset_happened, uploaded_params = parameter_editor.upload_parameters_that_require_reset_workflow(
657+
selected_params, mock_ask_confirmation, mock_show_error
658+
)
659+
660+
# Assert: No reset triggered; SID_AXIS is NOT in uploaded_params because it fell through
661+
# to the normal upload path (not handled by this workflow)
662+
assert reset_happened is False
663+
assert "SID_AXIS" not in uploaded_params
664+
mock_ask_confirmation.assert_not_called()
665+
mock_show_error.assert_not_called()
666+
667+
def test_user_uploads_sid_axis_from_nonzero_to_zero_skips_reset(self, parameter_editor) -> None:
668+
"""
669+
Uploading SID_AXIS from a non-zero value to 0 does not trigger a reset.
670+
671+
GIVEN: SID_AXIS is currently non-zero on the flight controller
672+
WHEN: The user uploads SID_AXIS with value 0
673+
THEN: No possible reset should be triggered
674+
"""
675+
# Arrange: SID_AXIS currently 1 on FC, new value is 0
676+
selected_params = {"SID_AXIS": Par(0.0, "Sys ID axis")}
677+
parameter_editor._flight_controller.fc_parameters = {"SID_AXIS": 1.0}
678+
parameter_editor._local_filesystem.doc_dict = {"SID_AXIS": {"RebootRequired": False}}
679+
parameter_editor._reset_and_reconnect_flight_controller = MagicMock(return_value=None)
680+
681+
mock_ask_confirmation = MagicMock(return_value=False)
682+
mock_show_error = MagicMock()
683+
684+
# Act
685+
reset_happened, uploaded_params = parameter_editor.upload_parameters_that_require_reset_workflow(
686+
selected_params, mock_ask_confirmation, mock_show_error
687+
)
688+
689+
# Assert: No reset triggered
690+
assert reset_happened is False
691+
assert "SID_AXIS" not in uploaded_params
692+
mock_ask_confirmation.assert_not_called()
693+
mock_show_error.assert_not_called()
694+
695+
def test_user_uploads_sid_axis_absent_from_fc_to_nonzero_triggers_possible_reset(self, parameter_editor) -> None:
696+
"""
697+
Uploading SID_AXIS to a non-zero value when it is absent from FC (treated as 0) triggers a possible reset.
698+
699+
GIVEN: SID_AXIS is not present in the flight controller parameter cache
700+
WHEN: The user uploads SID_AXIS with a non-zero value
701+
THEN: A possible reset should be triggered (absent value defaults to 0)
702+
"""
703+
# Arrange: SID_AXIS not in FC params (defaults to 0), new value is non-zero
704+
selected_params = {"SID_AXIS": Par(3.0, "Sys ID axis")}
705+
parameter_editor._flight_controller.fc_parameters = {}
706+
parameter_editor._local_filesystem.doc_dict = {"SID_AXIS": {"RebootRequired": False}}
707+
parameter_editor._reset_and_reconnect_flight_controller = MagicMock(return_value=None)
708+
709+
mock_ask_confirmation = MagicMock(return_value=True)
710+
mock_show_error = MagicMock()
711+
712+
# Act
713+
reset_happened, uploaded_params = parameter_editor.upload_parameters_that_require_reset_workflow(
714+
selected_params, mock_ask_confirmation, mock_show_error
715+
)
716+
717+
# Assert: Possible reset triggered and parameter uploaded
718+
assert reset_happened is True
719+
assert "SID_AXIS" in uploaded_params
720+
mock_ask_confirmation.assert_called_once()
721+
mock_show_error.assert_not_called()
722+
609723

610724
class TestFileDownloadUrlWorkflows:
611725
"""Test file download URL workflow business logic methods with callback injection."""

0 commit comments

Comments
 (0)