From 408ed939c794f19d93e47e0e163060fc14efe29c Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 2 Feb 2024 12:24:00 +1100 Subject: [PATCH] AP_Param: fixed setting of defaults for dynamic param trees when we load a VARPTR subtree we need to re-scan the parameter defaults file from @ROMFS/defaults.parm in case there are defaults applicable to this subtree --- libraries/AP_Param/AP_Param.cpp | 13 +++++++++++++ libraries/AP_Param/AP_Param.h | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/libraries/AP_Param/AP_Param.cpp b/libraries/AP_Param/AP_Param.cpp index 3ab10b87999db0..e3983e2812b9a6 100644 --- a/libraries/AP_Param/AP_Param.cpp +++ b/libraries/AP_Param/AP_Param.cpp @@ -115,6 +115,8 @@ uint16_t AP_Param::num_read_only; ObjectBuffer_TS AP_Param::save_queue{30}; bool AP_Param::registered_save_handler; +bool AP_Param::done_all_default_params; + AP_Param::defaults_list *AP_Param::default_list; // we need a dummy object for the parameter save callback @@ -1689,6 +1691,13 @@ void AP_Param::load_object_from_eeprom(const void *object_pointer, const struct } } + if (!done_all_default_params) { + /* + the new subtree may need defaults from defaults.parm + */ + reload_defaults_file(false); + } + // reset cached param counter as we may be loading a dynamic var_info invalidate_count(); } @@ -2250,6 +2259,7 @@ bool AP_Param::read_param_defaults_file(const char *filename, bool last_pass, ui return false; } + bool done_all = true; char line[100]; while (AP::FS().fgets(line, sizeof(line)-1, file_apfs)) { char *pname; @@ -2270,6 +2280,7 @@ bool AP_Param::read_param_defaults_file(const char *filename, bool last_pass, ui pname, filename); #endif } + done_all = false; continue; } if (idx >= param_overrides_len) { @@ -2289,6 +2300,8 @@ bool AP_Param::read_param_defaults_file(const char *filename, bool last_pass, ui } AP::FS().close(file_apfs); + done_all_default_params = done_all; + return true; } diff --git a/libraries/AP_Param/AP_Param.h b/libraries/AP_Param/AP_Param.h index 4fed080f07e663..85d533c1fd1487 100644 --- a/libraries/AP_Param/AP_Param.h +++ b/libraries/AP_Param/AP_Param.h @@ -636,6 +636,11 @@ class AP_Param static uint16_t _frame_type_flags; + /* + this is true if when scanning a defaults file we find all of the parameters + */ + static bool done_all_default_params; + /* structure for built-in defaults file that can be modified using apj_tool.py */