parameters: add simple backup and restore mechanism

This commit is contained in:
Daniel Agar
2021-11-19 15:00:25 -05:00
parent e692f4ca01
commit 1f6acd0171
5 changed files with 124 additions and 24 deletions
+73 -23
View File
@@ -71,15 +71,14 @@ using namespace time_literals;
#if defined(FLASH_BASED_PARAMS)
#include "flashparams/flashparams.h"
static const char *param_default_file = nullptr; // nullptr means to store to FLASH
#else
inline static int flash_param_save(bool only_unsaved, param_filter_func filter) { return -1; }
inline static int flash_param_load() { return -1; }
inline static int flash_param_import() { return -1; }
static const char *param_default_file = PX4_ROOTFSDIR"/eeprom/parameters";
#endif
static char *param_user_file = nullptr;
static char *param_default_file = nullptr;
static char *param_backup_file = nullptr;
#include <px4_platform_common/workqueue.h>
/* autosaving variables */
@@ -1080,19 +1079,24 @@ param_reset_specific(const char *resets[], int num_resets)
int
param_set_default_file(const char *filename)
{
if ((param_backup_file && strcmp(filename, param_backup_file) == 0)) {
PX4_ERR("default file can't be the same as the backup file %s", filename);
return PX4_ERROR;
}
#ifdef FLASH_BASED_PARAMS
// the default for flash-based params is always the FLASH
(void)filename;
#else
if (param_user_file != nullptr) {
if (param_default_file != nullptr) {
// we assume this is not in use by some other thread
free(param_user_file);
param_user_file = nullptr;
free(param_default_file);
param_default_file = nullptr;
}
if (filename) {
param_user_file = strdup(filename);
param_default_file = strdup(filename);
}
#endif /* FLASH_BASED_PARAMS */
@@ -1100,27 +1104,42 @@ param_set_default_file(const char *filename)
return 0;
}
const char *
param_get_default_file()
const char *param_get_default_file()
{
return (param_user_file != nullptr) ? param_user_file : param_default_file;
return param_default_file;
}
int param_save_default()
int param_set_backup_file(const char *filename)
{
int res = PX4_ERROR;
const char *filename = param_get_default_file();
if (!filename) {
param_lock_writer();
perf_begin(param_export_perf);
res = flash_param_save(false, nullptr);
perf_end(param_export_perf);
param_unlock_writer();
return res;
if (param_default_file && strcmp(filename, param_default_file) == 0) {
PX4_ERR("backup file can't be the same as the default file %s", filename);
return PX4_ERROR;
}
if (param_backup_file != nullptr) {
// we assume this is not in use by some other thread
free(param_backup_file);
param_backup_file = nullptr;
}
if (filename) {
param_backup_file = strdup(filename);
} else {
param_backup_file = nullptr; // backup disabled
}
return 0;
}
const char *param_get_backup_file()
{
return param_backup_file;
}
static int param_save_file_internal(const char *filename)
{
int res = PX4_ERROR;
int attempts = 5;
while (res != OK && attempts > 0) {
@@ -1131,7 +1150,10 @@ int param_save_default()
res = param_export(fd, false, nullptr);
::close(fd);
if (res != PX4_OK) {
if (res == PX4_OK) {
return PX4_OK;
} else {
PX4_ERR("param_export failed, retrying %d", attempts);
px4_usleep(10000); // wait at least 10 milliseconds before trying again
}
@@ -1147,6 +1169,30 @@ int param_save_default()
PX4_ERR("failed to write parameters to file: %s", filename);
}
return PX4_ERROR;
}
int param_save_default()
{
int res = PX4_ERROR;
const char *filename = param_get_default_file();
if (filename) {
res = param_save_file_internal(filename);
} else {
param_lock_writer();
perf_begin(param_export_perf);
res = flash_param_save(false, nullptr);
perf_end(param_export_perf);
param_unlock_writer();
}
// backup file
if (param_backup_file) {
param_save_file_internal(param_backup_file);
}
return res;
}
@@ -1593,6 +1639,10 @@ void param_print_status()
PX4_INFO("file: %s", param_get_default_file());
}
if (param_backup_file) {
PX4_INFO("backup file: %s", param_backup_file);
}
#endif /* FLASH_BASED_PARAMS */
if (param_values != nullptr) {