parameters runtime defaults

This commit is contained in:
Daniel Agar
2021-02-08 14:15:01 -05:00
parent da1a38b44e
commit b8b13bb882
3 changed files with 349 additions and 75 deletions

View File

@@ -44,6 +44,7 @@
#include <px4_platform_common/module.h>
#include <px4_platform_common/posix.h>
#include <float.h>
#include <errno.h>
#include <stdio.h>
#include <ctype.h>
@@ -92,6 +93,7 @@ static int do_show_index(const char *index, bool used_index);
static void do_show_print(void *arg, param_t param);
static void do_show_print_for_airframe(void *arg, param_t param);
static int do_set(const char *name, const char *val, bool fail_on_not_found);
static int do_set_custom_default(const char *name, const char *val);
static int do_compare(const char *name, char *vals[], unsigned comparisons, enum COMPARE_OPERATOR cmd_op,
enum COMPARE_ERROR_LEVEL err_level);
static int do_reset_all(const char *excludes[], int num_excludes);
@@ -151,6 +153,10 @@ $ reboot
PRINT_MODULE_USAGE_ARG("<param_name> <value>", "Parameter name and value to set", false);
PRINT_MODULE_USAGE_ARG("fail", "If provided, let the command fail if param is not found", true);
PRINT_MODULE_USAGE_COMMAND_DESCR("set-default", "Set parameter default to a value");
PRINT_MODULE_USAGE_ARG("<param_name> <value>", "Parameter name and value to set", false);
PRINT_MODULE_USAGE_ARG("fail", "If provided, let the command fail if param is not found", true);
PRINT_MODULE_USAGE_COMMAND_DESCR("compare", "Compare a param with a value. Command will succeed if equal");
PRINT_MODULE_USAGE_PARAM_FLAG('s', "If provided, silent errors if parameter doesn't exists", true);
PRINT_MODULE_USAGE_ARG("<param_name> <value>", "Parameter name and value to compare", false);
@@ -226,9 +232,11 @@ param_main(int argc, char *argv[])
}
const char *default_file = param_get_default_file();
if (default_file) {
PX4_INFO("selected parameter default file %s", default_file);
}
return 0;
}
@@ -250,6 +258,7 @@ param_main(int argc, char *argv[])
if (argc >= 4) {
return do_show_quiet(argv[3]);
}
} else {
return do_show(argv[2], false);
}
@@ -285,11 +294,23 @@ param_main(int argc, char *argv[])
}
}
if (!strcmp(argv[1], "set-default")) {
if (argc == 4) {
return do_set_custom_default(argv[2], argv[3]);
} else {
PX4_ERR("not enough arguments.\nTry 'param set-default PARAM_NAME 3'");
return 1;
}
}
if (!strcmp(argv[1], "compare")) {
if(argc >= 5 && !strcmp(argv[2], "-s")) {
if (argc >= 5 && !strcmp(argv[2], "-s")) {
return do_compare(argv[3], &argv[4], argc - 4, COMPARE_OPERATOR::EQUAL, COMPARE_ERROR_LEVEL::SILENT);
} else if (argc >= 4) {
return do_compare(argv[2], &argv[3], argc - 3, COMPARE_OPERATOR::EQUAL, COMPARE_ERROR_LEVEL::DO_ERROR);
} else {
PX4_ERR("not enough arguments.\nTry 'param compare PARAM_NAME 3'");
return 1;
@@ -297,10 +318,12 @@ param_main(int argc, char *argv[])
}
if (!strcmp(argv[1], "greater")) {
if(argc >= 5 && !strcmp(argv[2], "-s")) {
if (argc >= 5 && !strcmp(argv[2], "-s")) {
return do_compare(argv[3], &argv[4], argc - 4, COMPARE_OPERATOR::GREATER, COMPARE_ERROR_LEVEL::SILENT);
} else if (argc >= 4) {
return do_compare(argv[2], &argv[3], argc - 3, COMPARE_OPERATOR::GREATER, COMPARE_ERROR_LEVEL::DO_ERROR);
} else {
PX4_ERR("not enough arguments.\nTry 'param greater PARAM_NAME 3'");
return 1;
@@ -329,6 +352,7 @@ param_main(int argc, char *argv[])
if (!strcmp(argv[1], "touch")) {
if (argc >= 3) {
return do_touch((const char **) &argv[2], argc - 2);
} else {
PX4_ERR("not enough arguments.");
return 1;
@@ -399,6 +423,7 @@ static int
do_load(const char *param_file_name)
{
int fd = -1;
if (param_file_name) { // passing NULL means to select the flash storage
fd = open(param_file_name, O_RDONLY);
@@ -409,6 +434,7 @@ do_load(const char *param_file_name)
}
int result = param_load(fd);
if (fd >= 0) {
close(fd);
}
@@ -416,9 +442,11 @@ do_load(const char *param_file_name)
if (result < 0) {
if (param_file_name) {
PX4_ERR("importing from '%s' failed (%i)", param_file_name, result);
} else {
PX4_ERR("importing failed (%i)", result);
}
return 1;
}
@@ -429,12 +457,14 @@ static int
do_import(const char *param_file_name)
{
bool mark_saved = false;
if (param_file_name == nullptr) {
param_file_name = param_get_default_file();
mark_saved = true; // if imported from default storage, mark as saved
}
int fd = -1;
if (param_file_name) { // passing NULL means to select the flash storage
fd = open(param_file_name, O_RDONLY);
@@ -445,6 +475,7 @@ do_import(const char *param_file_name)
}
int result = param_import(fd, mark_saved);
if (fd >= 0) {
close(fd);
}
@@ -452,9 +483,11 @@ do_import(const char *param_file_name)
if (result < 0) {
if (param_file_name) {
PX4_ERR("importing from '%s' failed (%i)", param_file_name, result);
} else {
PX4_ERR("importing failed (%i)", result);
}
return 1;
}
@@ -674,16 +707,19 @@ static void
do_show_print_for_airframe(void *arg, param_t param)
{
// exceptions
const char* p_name = param_name(param);
const char *p_name = param_name(param);
if (!p_name || param_is_volatile(param)) {
return;
}
if (!strcmp(p_name, "SYS_AUTOSTART") || !strcmp(p_name, "SYS_AUTOCONFIG")) {
return;
}
if (!strncmp(p_name, "RC", 2) || !strncmp(p_name, "TC_", 3) || !strncmp(p_name, "CAL_", 4) ||
!strncmp(p_name, "SENS_BOARD_", 11) || !strcmp(p_name, "SENS_DPRES_OFF") ||
!strcmp(p_name, "MAV_TYPE")) {
!strncmp(p_name, "SENS_BOARD_", 11) || !strcmp(p_name, "SENS_DPRES_OFF") ||
!strcmp(p_name, "MAV_TYPE")) {
return;
}
@@ -697,6 +733,7 @@ do_show_print_for_airframe(void *arg, param_t param)
PARAM_PRINT("%ld\n", (long)i);
return;
}
break;
case PARAM_TYPE_FLOAT:
@@ -704,6 +741,7 @@ do_show_print_for_airframe(void *arg, param_t param)
PARAM_PRINT("%4.4f\n", (double)f);
return;
}
break;
default:
@@ -783,7 +821,62 @@ do_set(const char *name, const char *val, bool fail_on_not_found)
}
static int
do_compare(const char *name, char *vals[], unsigned comparisons, enum COMPARE_OPERATOR cmp_op, enum COMPARE_ERROR_LEVEL err_level)
do_set_custom_default(const char *name, const char *val)
{
param_t param = param_find_no_notification(name);
/* set nothing if parameter cannot be found */
if (param == PARAM_INVALID) {
/* param not found - fail silenty in scripts as it prevents booting */
PX4_ERR("Parameter %s not found.", name);
return PX4_ERROR;
}
// Set parameter if type is known and conversion from string to value turns out fine
switch (param_type(param)) {
case PARAM_TYPE_INT32: {
int32_t i;
if (param_get_default_value(param, &i) == PX4_OK) {
/* convert string */
char *end;
int32_t newval = strtol(val, &end, 10);
if ((i != newval) && (param_set_default_value(param, &newval) == PX4_OK)) {
PARAM_PRINT(" parameter default: %s %d -> %d\n", param_name(param), i, newval);
}
}
}
break;
case PARAM_TYPE_FLOAT: {
float f;
if (param_get_default_value(param, &f) == PX4_OK) {
/* convert string */
char *end;
float newval = strtod(val, &end);
if ((fabsf(f - newval) > FLT_EPSILON) && (param_set_default_value(param, &newval) == PX4_OK)) {
PARAM_PRINT(" parameter default: %s %4.2f -> %4.2f\n", param_name(param), (double)f, (double)newval);
}
}
}
break;
default:
PX4_ERR("<unknown / unsupported type %d>\n", 0 + param_type(param));
return 1;
}
return 0;
}
static int
do_compare(const char *name, char *vals[], unsigned comparisons, enum COMPARE_OPERATOR cmp_op,
enum COMPARE_ERROR_LEVEL err_level)
{
int32_t i;
float f;
@@ -792,10 +885,10 @@ do_compare(const char *name, char *vals[], unsigned comparisons, enum COMPARE_OP
/* set nothing if parameter cannot be found */
if (param == PARAM_INVALID) {
/* param not found */
if(err_level == COMPARE_ERROR_LEVEL::DO_ERROR)
{
if (err_level == COMPARE_ERROR_LEVEL::DO_ERROR) {
PX4_ERR("Parameter %s not found", name);
}
return 1;
}
@@ -888,5 +981,6 @@ do_touch(const char *params[], int num_params)
PX4_ERR("param %s not found", params[i]);
}
}
return 0;
}