diff --git a/libraries/AP_Param/AP_Param.cpp b/libraries/AP_Param/AP_Param.cpp index 3e45763931..2eb0da80df 100644 --- a/libraries/AP_Param/AP_Param.cpp +++ b/libraries/AP_Param/AP_Param.cpp @@ -1657,6 +1657,35 @@ void AP_Param::convert_old_parameters(const struct ConversionInfo *conversion_ta } } +/* + move old class variables for a class that was sub-classed to one that isn't + For example, used when the AP_MotorsTri class changed from having its own parameter table + plus a subgroup for AP_MotorsMulticopter to just inheriting the AP_MotorsMulticopter var_info + + This does not handle nesting beyond the single level shift +*/ +void AP_Param::convert_parent_class(uint8_t param_key, void *object_pointer, + const struct AP_Param::GroupInfo *group_info) +{ + for (uint8_t i=0; group_info[i].type != AP_PARAM_NONE; i++) { + struct ConversionInfo info; + info.old_key = param_key; + info.type = (ap_var_type)group_info[i].type; + info.new_name = nullptr; + info.old_group_element = uint16_t(group_info[i].idx)<<6; + uint8_t old_value[type_size(info.type)]; + AP_Param *ap = (AP_Param *)&old_value[0]; + + if (!AP_Param::find_old_parameter(&info, ap)) { + // the parameter wasn't set in the old eeprom + continue; + } + + uint8_t *new_value = group_info[i].offset + (uint8_t *)object_pointer; + memcpy(new_value, old_value, sizeof(old_value)); + } +} + /* set a parameter to a float value diff --git a/libraries/AP_Param/AP_Param.h b/libraries/AP_Param/AP_Param.h index 22033d876f..e5c43a3dc7 100644 --- a/libraries/AP_Param/AP_Param.h +++ b/libraries/AP_Param/AP_Param.h @@ -121,7 +121,7 @@ public: }; struct ConversionInfo { uint16_t old_key; // k_param_* - uint8_t old_group_element; // index in old object + uint32_t old_group_element; // index in old object enum ap_var_type type; // AP_PARAM_* const char *new_name; }; @@ -305,6 +305,10 @@ public: }; static void convert_old_parameter(const struct ConversionInfo *info, float scaler, uint8_t flags=0); + // move old class variables for a class that was sub-classed to one that isn't + static void convert_parent_class(uint8_t param_key, void *object_pointer, + const struct AP_Param::GroupInfo *group_info); + /// Erase all variables in EEPROM. /// static void erase_all(void);