Fix AP_Var::load - it has to ask the serialiser, not the unserialiser, for the variable's size.

Fix AP_Float16 - scaling was being done in the wrong direction, and the unserialiser wasn't reporting errors.

Add test cases for the above.


git-svn-id: https://arducopter.googlecode.com/svn/trunk@1696 f9c3cf11-9bcb-44bc-f272-b75c42450872
This commit is contained in:
DrZiplok@gmail.com 2011-02-20 00:38:09 +00:00
parent 3bf6257783
commit d036cb9360
3 changed files with 21 additions and 7 deletions

View File

@ -72,7 +72,7 @@ AP_Var::AP_Var(AP_Var_group *group, Key index, const prog_char *name, Flags flag
//
vp = &_grouped_variables;
while (*vp != NULL) {
if ((*vp)->_key > _key) {
if ((*vp)->_key >= _key) {
break;
}
vp = &((*vp)->_link);
@ -212,11 +212,11 @@ bool AP_Var::load(void)
return false;
}
// ask the unserializer how big the variable is
// ask the serializer how big the variable is
//
// XXX should check size in EEPROM var header too...
//
size = unserialize(NULL, 0);
size = serialize(NULL, 0);
// Read the buffer from EEPROM, now that _EEPROM_locate
// has converted _key into an EEPROM address.
@ -628,6 +628,8 @@ AP_Var_group::_serialize_unserialize(void *buf, size_t buf_size, bool do_seriali
debug("unserialize %p -> %u", vp, size);
}
// XXX HANDLE ERRORS HERE
// Account for the space that this variable consumes in the buffer
//
// We always count the total size, and we always advance the buffer pointer

View File

@ -865,7 +865,7 @@ public:
uint16_t *sval = (uint16_t *)buf;
if (size >= sizeof(*sval)) {
*sval = _value / 1024.0; // scale by power of 2, may be more efficient
*sval = _value * 1024.0; // scale by power of 2, may be more efficient
}
return sizeof(*sval);
}
@ -876,9 +876,10 @@ public:
uint16_t *sval = (uint16_t *)buf;
if (size >= sizeof(*sval)) {
_value = *sval * 1024.0; // scale by power of 2, may be more efficient
_value = (float)*sval / 1024.0; // scale by power of 2, may be more efficient
return sizeof(*sval);
}
return sizeof(*sval);
return 0;
}
// copy operators must be redefined in subclasses to get correct behavior

View File

@ -262,6 +262,7 @@ setup(void)
TEST(var_save_load);
AP_Float f1(10.0, 1);
AP_Float16 f2(1.23, 2);
AP_Var::erase_all();
REQUIRE(true == f1.save());
@ -269,6 +270,13 @@ setup(void)
f1 = 0;
REQUIRE(true == f1.load());
REQUIRE(f1 == 10.0);
REQUIRE(true == f2.save());
REQUIRE(f2 == 1.23);
f2 = 0;
REQUIRE(true == f2.load());
REQUIRE(f2 == 1.23);
}
// AP_Var: reload
@ -309,17 +317,20 @@ setup(void)
AP_Var_group group(10);
AP_Float f1(&group, 0, 10.0);
AP_Float f2(&group, 0, 123.0);
AP_Float f2(&group, 1, 123.0);
AP_Float f3(-1.0);
AP_Float16 f4(&group, 2, 7);
REQUIRE(true == group.save());
f1 = 0;
f2 = 0;
f3 = 0;
f4 = 0;
REQUIRE(true == group.load());
REQUIRE(f1 == 10.0);
REQUIRE(f2 == 123.0);
REQUIRE(f3 == 0);
REQUIRE(f4 == 7);
AP_Var::erase_all();
}