diff --git a/libraries/AP_Param/AP_Param.cpp b/libraries/AP_Param/AP_Param.cpp index 3ab10b8799..e3983e2812 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 4fed080f07..85d533c1fd 100644 --- a/libraries/AP_Param/AP_Param.h +++ b/libraries/AP_Param/AP_Param.h @@ -636,6 +636,11 @@ private: 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 */