AP_Param: change method of loading defaults

this avoids a dependency on the constructor ordering by loading
defaults for each object separately
This commit is contained in:
Andrew Tridgell 2012-12-13 08:40:42 +11:00
parent 562b6a20c9
commit 95d4cc2ce9
2 changed files with 18 additions and 27 deletions

View File

@ -753,17 +753,17 @@ void AP_Param::set_value(enum ap_var_type type, void *ptr, float def_value)
}
}
// load default values for scalars in a group
void AP_Param::load_defaults_group(const struct GroupInfo *group_info, uintptr_t base)
// load default values for scalars in a group. This does not recurse
// into other objects. This is a static function that should be called
// in the objects constructor
void AP_Param::setup_object_defaults(const void *object_pointer, const struct GroupInfo *group_info)
{
uintptr_t base = (uintptr_t)object_pointer;
uint8_t type;
for (uint8_t i=0;
(type=PGM_UINT8(&group_info[i].type)) != AP_PARAM_NONE;
i++) {
if (type == AP_PARAM_GROUP) {
const struct GroupInfo *ginfo = (const struct GroupInfo *)PGM_POINTER(&group_info[i].group_info);
load_defaults_group(ginfo, base);
} else if (type <= AP_PARAM_FLOAT) {
if (type <= AP_PARAM_FLOAT) {
void *ptr = (void *)(base + PGM_UINT16(&group_info[i].offset));
set_value((enum ap_var_type)type, ptr, PGM_FLOAT(&group_info[i].def_value));
}
@ -771,16 +771,14 @@ void AP_Param::load_defaults_group(const struct GroupInfo *group_info, uintptr_t
}
// load default values for all scalars
void AP_Param::load_defaults(void)
// load default values for all scalars in a sketch. This does not
// recurse into sub-objects
void AP_Param::setup_sketch_defaults(const struct Info *info, uint16_t eeprom_size)
{
setup(info, eeprom_size);
for (uint8_t i=0; i<_num_vars; i++) {
uint8_t type = PGM_UINT8(&_var_info[i].type);
if (type == AP_PARAM_GROUP) {
const struct GroupInfo *group_info = (const struct GroupInfo *)PGM_POINTER(&_var_info[i].group_info);
uintptr_t base = PGM_POINTER(&_var_info[i].ptr);
load_defaults_group(group_info, base);
} else if (type <= AP_PARAM_FLOAT) {
if (type <= AP_PARAM_FLOAT) {
void *ptr = (void*)PGM_POINTER(&_var_info[i].ptr);
set_value((enum ap_var_type)type, ptr, PGM_FLOAT(&_var_info[i].def_value));
}

View File

@ -16,8 +16,7 @@
#include <string.h>
#include <stdint.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <AP_Progmem.h>
#define AP_MAX_NAME_SIZE 16
#define AP_NESTED_GROUPS_ENABLED
@ -89,15 +88,8 @@ public:
// wrong version is found
static bool setup(const struct Info *info, uint16_t eeprom_size);
// constructor to load default values and setup var_info table
AP_Param(const struct Info *info, uint16_t eeprom_size) {
setup(info, eeprom_size);
load_defaults();
}
// empty constructor for child classes
AP_Param() {
}
// empty constructor
AP_Param() {}
// a token used for first()/next() state
typedef struct {
@ -167,10 +159,11 @@ public:
static void set_value(enum ap_var_type type, void *ptr, float def_value);
// load default values for scalars in a group
static void load_defaults_group(const struct GroupInfo *group_info, uintptr_t base);
static void setup_object_defaults(const void *object_pointer, const struct GroupInfo *group_info);
// load default values for all scalars
static void load_defaults(void);
// load default values for all scalars in the main sketch. This
// does not recurse into the sub-objects
static void setup_sketch_defaults(const struct Info *info, uint16_t eeprom_size);
/// Erase all variables in EEPROM.
///