mirror of
https://gitee.com/xiaohuolufeihua/bizhang_-obav.git
synced 2026-05-21 09:22:18 +00:00
parameters runtime defaults
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user