|
|
|
@ -72,7 +72,7 @@ using namespace time_literals;
@@ -72,7 +72,7 @@ using namespace time_literals;
|
|
|
|
|
#if defined(FLASH_BASED_PARAMS) |
|
|
|
|
#include "flashparams/flashparams.h" |
|
|
|
|
#else |
|
|
|
|
inline static int flash_param_save(bool only_unsaved, param_filter_func filter) { return -1; } |
|
|
|
|
inline static int flash_param_save(param_filter_func filter) { return -1; } |
|
|
|
|
inline static int flash_param_load() { return -1; } |
|
|
|
|
inline static int flash_param_import() { return -1; } |
|
|
|
|
#endif |
|
|
|
@ -91,12 +91,12 @@ static constexpr uint16_t param_info_count = sizeof(px4::parameters) / sizeof(pa
@@ -91,12 +91,12 @@ static constexpr uint16_t param_info_count = sizeof(px4::parameters) / sizeof(pa
|
|
|
|
|
static px4::AtomicBitset<param_info_count> params_active; // params found
|
|
|
|
|
static px4::AtomicBitset<param_info_count> params_changed; // params non-default
|
|
|
|
|
static px4::Bitset<param_info_count> params_custom_default; // params with runtime default value
|
|
|
|
|
static px4::AtomicBitset<param_info_count> params_unsaved; |
|
|
|
|
|
|
|
|
|
// Storage for modified parameters.
|
|
|
|
|
struct param_wbuf_s { |
|
|
|
|
union param_value_u val; |
|
|
|
|
param_t param; |
|
|
|
|
bool unsaved; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/** flexible array holding modified parameter values */ |
|
|
|
@ -413,12 +413,7 @@ bool param_is_volatile(param_t param)
@@ -413,12 +413,7 @@ bool param_is_volatile(param_t param)
|
|
|
|
|
bool |
|
|
|
|
param_value_unsaved(param_t param) |
|
|
|
|
{ |
|
|
|
|
struct param_wbuf_s *s; |
|
|
|
|
param_lock_reader(); |
|
|
|
|
s = param_find_changed(param); |
|
|
|
|
bool ret = s && s->unsaved; |
|
|
|
|
param_unlock_reader(); |
|
|
|
|
return ret; |
|
|
|
|
return handle_in_range(param) ? params_unsaved[param] : false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
size_t param_size(param_t param) |
|
|
|
@ -740,9 +735,8 @@ param_set_internal(param_t param, const void *val, bool mark_saved, bool notify_
@@ -740,9 +735,8 @@ param_set_internal(param_t param, const void *val, bool mark_saved, bool notify_
|
|
|
|
|
utarray_new(param_values, ¶m_icd); |
|
|
|
|
|
|
|
|
|
// mark all parameters unchanged (default)
|
|
|
|
|
for (int i = 0; i < params_changed.size(); i++) { |
|
|
|
|
params_changed.set(i, false); |
|
|
|
|
} |
|
|
|
|
params_changed.reset(); |
|
|
|
|
params_unsaved.reset(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (param_values == nullptr) { |
|
|
|
@ -768,31 +762,41 @@ param_set_internal(param_t param, const void *val, bool mark_saved, bool notify_
@@ -768,31 +762,41 @@ param_set_internal(param_t param, const void *val, bool mark_saved, bool notify_
|
|
|
|
|
s = param_find_changed(param); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (s != nullptr) { |
|
|
|
|
if (s == nullptr) { |
|
|
|
|
PX4_ERR("error param_values storage slot invalid"); |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
/* update the changed value */ |
|
|
|
|
switch (param_type(param)) { |
|
|
|
|
case PARAM_TYPE_INT32: |
|
|
|
|
param_changed = param_changed || s->val.i != *(int32_t *)val; |
|
|
|
|
s->val.i = *(int32_t *)val; |
|
|
|
|
s->unsaved = !mark_saved; |
|
|
|
|
if (s->val.i != *(int32_t *)val) { |
|
|
|
|
s->val.i = *(int32_t *)val; |
|
|
|
|
param_changed = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
params_changed.set(param, true); |
|
|
|
|
params_unsaved.set(param, !mark_saved); |
|
|
|
|
result = PX4_OK; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case PARAM_TYPE_FLOAT: |
|
|
|
|
param_changed = param_changed || fabsf(s->val.f - * (float *)val) > FLT_EPSILON; |
|
|
|
|
s->val.f = *(float *)val; |
|
|
|
|
s->unsaved = !mark_saved; |
|
|
|
|
if (fabsf(s->val.f - * (float *)val) > FLT_EPSILON) { |
|
|
|
|
s->val.f = *(float *)val; |
|
|
|
|
param_changed = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
params_changed.set(param, true); |
|
|
|
|
params_unsaved.set(param, !mark_saved); |
|
|
|
|
result = PX4_OK; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
PX4_ERR("param_set invalid param type for %s", param_name(param)); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ((result == PX4_OK) && !mark_saved) { // this is false when importing parameters
|
|
|
|
|
if ((result == PX4_OK) && param_changed && !mark_saved) { // this is false when importing parameters
|
|
|
|
|
param_autosave(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -870,15 +874,13 @@ int param_set_default_value(param_t param, const void *val)
@@ -870,15 +874,13 @@ int param_set_default_value(param_t param, const void *val)
|
|
|
|
|
utarray_new(param_custom_default_values, ¶m_icd); |
|
|
|
|
|
|
|
|
|
// mark all parameters unchanged (default)
|
|
|
|
|
for (int i = 0; i < params_custom_default.size(); i++) { |
|
|
|
|
params_custom_default.set(i, false); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
params_custom_default.reset(); |
|
|
|
|
|
|
|
|
|
if (param_custom_default_values == nullptr) { |
|
|
|
|
PX4_ERR("failed to allocate custom default values array"); |
|
|
|
|
param_unlock_writer(); |
|
|
|
|
return PX4_ERROR; |
|
|
|
|
if (param_custom_default_values == nullptr) { |
|
|
|
|
PX4_ERR("failed to allocate custom default values array"); |
|
|
|
|
param_unlock_writer(); |
|
|
|
|
return PX4_ERROR; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// check if param being set to default value
|
|
|
|
@ -890,7 +892,7 @@ int param_set_default_value(param_t param, const void *val)
@@ -890,7 +892,7 @@ int param_set_default_value(param_t param, const void *val)
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case PARAM_TYPE_FLOAT: |
|
|
|
|
setting_to_static_default = (fabsf(px4::parameters[param].val.f - * (float *)val) < FLT_EPSILON); |
|
|
|
|
setting_to_static_default = (fabsf(px4::parameters[param].val.f - * (float *)val) <= FLT_EPSILON); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -977,6 +979,7 @@ static int param_reset_internal(param_t param, bool notify = true)
@@ -977,6 +979,7 @@ static int param_reset_internal(param_t param, bool notify = true)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
params_changed.set(param, false); |
|
|
|
|
params_unsaved.set(param, true); |
|
|
|
|
|
|
|
|
|
param_found = true; |
|
|
|
|
} |
|
|
|
@ -1003,9 +1006,7 @@ param_reset_all_internal(bool auto_save)
@@ -1003,9 +1006,7 @@ param_reset_all_internal(bool auto_save)
|
|
|
|
|
if (param_values != nullptr) { |
|
|
|
|
utarray_free(param_values); |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < params_changed.size(); i++) { |
|
|
|
|
params_changed.set(i, false); |
|
|
|
|
} |
|
|
|
|
params_changed.reset(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* mark as reset / deleted */ |
|
|
|
@ -1147,7 +1148,7 @@ static int param_save_file_internal(const char *filename)
@@ -1147,7 +1148,7 @@ static int param_save_file_internal(const char *filename)
|
|
|
|
|
int fd = ::open(filename, O_WRONLY | O_CREAT, PX4_O_MODE_666); |
|
|
|
|
|
|
|
|
|
if (fd > -1) { |
|
|
|
|
res = param_export(fd, false, nullptr); |
|
|
|
|
res = param_export(fd, nullptr); |
|
|
|
|
::close(fd); |
|
|
|
|
|
|
|
|
|
if (res == PX4_OK) { |
|
|
|
@ -1184,6 +1185,7 @@ int param_save_default()
@@ -1184,6 +1185,7 @@ int param_save_default()
|
|
|
|
|
param_lock_writer(); |
|
|
|
|
perf_begin(param_export_perf); |
|
|
|
|
res = flash_param_save(false, nullptr); |
|
|
|
|
params_unsaved.reset(); |
|
|
|
|
perf_end(param_export_perf); |
|
|
|
|
param_unlock_writer(); |
|
|
|
|
} |
|
|
|
@ -1233,7 +1235,7 @@ param_load_default()
@@ -1233,7 +1235,7 @@ param_load_default()
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
param_export(int fd, bool only_unsaved, param_filter_func filter) |
|
|
|
|
param_export(int fd, param_filter_func filter) |
|
|
|
|
{ |
|
|
|
|
int result = -1; |
|
|
|
|
perf_begin(param_export_perf); |
|
|
|
@ -1241,7 +1243,8 @@ param_export(int fd, bool only_unsaved, param_filter_func filter)
@@ -1241,7 +1243,8 @@ param_export(int fd, bool only_unsaved, param_filter_func filter)
|
|
|
|
|
if (fd < 0) { |
|
|
|
|
param_lock_writer(); |
|
|
|
|
// flash_param_save() will take the shutdown lock
|
|
|
|
|
result = flash_param_save(only_unsaved, filter); |
|
|
|
|
result = flash_param_save(filter); |
|
|
|
|
params_unsaved.reset(); |
|
|
|
|
param_unlock_writer(); |
|
|
|
|
perf_end(param_export_perf); |
|
|
|
|
return result; |
|
|
|
@ -1271,14 +1274,6 @@ param_export(int fd, bool only_unsaved, param_filter_func filter)
@@ -1271,14 +1274,6 @@ param_export(int fd, bool only_unsaved, param_filter_func filter)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
while ((s = (struct param_wbuf_s *)utarray_next(param_values, s)) != nullptr) { |
|
|
|
|
/*
|
|
|
|
|
* If we are only saving values changed since last save, and this |
|
|
|
|
* one hasn't, then skip it |
|
|
|
|
*/ |
|
|
|
|
if (only_unsaved && !s->unsaved) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (filter && !filter(s->param)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
@ -1308,8 +1303,6 @@ param_export(int fd, bool only_unsaved, param_filter_func filter)
@@ -1308,8 +1303,6 @@ param_export(int fd, bool only_unsaved, param_filter_func filter)
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
s->unsaved = false; |
|
|
|
|
|
|
|
|
|
const char *name = param_name(s->param); |
|
|
|
|
const size_t size = param_size(s->param); |
|
|
|
|
|
|
|
|
@ -1347,7 +1340,12 @@ param_export(int fd, bool only_unsaved, param_filter_func filter)
@@ -1347,7 +1340,12 @@ param_export(int fd, bool only_unsaved, param_filter_func filter)
|
|
|
|
|
out: |
|
|
|
|
|
|
|
|
|
if (result == 0) { |
|
|
|
|
if (bson_encoder_fini(&encoder) != PX4_OK) { |
|
|
|
|
if (bson_encoder_fini(&encoder) == PX4_OK) { |
|
|
|
|
if (!filter) { |
|
|
|
|
params_unsaved.reset(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
PX4_ERR("BSON encoder finialize failed"); |
|
|
|
|
result = -1; |
|
|
|
|
} |
|
|
|
|