From ce9954a9199fc661ff006ce107c79d602de89caf Mon Sep 17 00:00:00 2001 From: Matthias Grob Date: Wed, 26 Aug 2020 16:05:56 +0200 Subject: [PATCH] param: enable reseting specific parameters from shell Renaming previous "param reset" to "param reset_all". --- .ci/Jenkinsfile-hardware | 4 ++-- ROMFS/cannode/init.d/rcS | 2 +- ROMFS/px4fmu_common/init.d/rcS | 2 +- src/lib/parameters/param.h | 10 ++++++++++ src/lib/parameters/parameters.cpp | 27 ++++++++++++++++++++++++++- src/systemcmds/param/param.cpp | 30 +++++++++++++++++++++++++----- 6 files changed, 65 insertions(+), 10 deletions(-) diff --git a/.ci/Jenkinsfile-hardware b/.ci/Jenkinsfile-hardware index 60f2f6c89c..645a50ab21 100644 --- a/.ci/Jenkinsfile-hardware +++ b/.ci/Jenkinsfile-hardware @@ -993,7 +993,7 @@ void cleanupFTDI() { // wipe parameters sh './Tools/HIL/run_nsh_cmd.py --device `find /dev/serial -name *usb-FTDI_*` --cmd "mtd erase"' - sh './Tools/HIL/run_nsh_cmd.py --device `find /dev/serial -name *usb-FTDI_*` --cmd "param reset"' + sh './Tools/HIL/run_nsh_cmd.py --device `find /dev/serial -name *usb-FTDI_*` --cmd "param reset_all"' // disable buzzer and cleanup storage sh './Tools/HIL/run_nsh_cmd.py --device `find /dev/serial -name *usb-FTDI_*` --cmd "param set CBRK_BUZZER 782097"' @@ -1020,7 +1020,7 @@ void cleanupSEGGER() { // wipe parameters sh './Tools/HIL/run_nsh_cmd.py --device `find /dev/serial -name *usb-SEGGER_*` --cmd "mtd erase"' - sh './Tools/HIL/run_nsh_cmd.py --device `find /dev/serial -name *usb-SEGGER_*` --cmd "param reset"' + sh './Tools/HIL/run_nsh_cmd.py --device `find /dev/serial -name *usb-SEGGER_*` --cmd "param reset_all"' // disable buzzer and cleanup storage sh './Tools/HIL/run_nsh_cmd.py --device `find /dev/serial -name *usb-SEGGER_*` --cmd "param set CBRK_BUZZER 782097"' diff --git a/ROMFS/cannode/init.d/rcS b/ROMFS/cannode/init.d/rcS index 9c929c23d5..2ae7a14288 100644 --- a/ROMFS/cannode/init.d/rcS +++ b/ROMFS/cannode/init.d/rcS @@ -51,7 +51,7 @@ fi param select $PARAM_FILE if ! param load then - param reset + param reset_all fi # diff --git a/ROMFS/px4fmu_common/init.d/rcS b/ROMFS/px4fmu_common/init.d/rcS index f6f43b8c03..8f384dcb28 100644 --- a/ROMFS/px4fmu_common/init.d/rcS +++ b/ROMFS/px4fmu_common/init.d/rcS @@ -169,7 +169,7 @@ else param select $PARAM_FILE if ! param load then - param reset + param reset_all fi # diff --git a/src/lib/parameters/param.h b/src/lib/parameters/param.h index 818300af42..dc63c958ee 100644 --- a/src/lib/parameters/param.h +++ b/src/lib/parameters/param.h @@ -278,6 +278,16 @@ __EXPORT void param_reset_all(void); */ __EXPORT void param_reset_excludes(const char *excludes[], int num_excludes); +/** + * Reset only specific parameters to their default values. + * + * This function also releases the storage used by struct parameters. + * + * @param resets Array of param names to reset. Use a wildcard at the end to reset parameters with a certain prefix. + * @param num_resets The number of passed reset conditions in the resets array. + */ +__EXPORT void param_reset_specific(const char *resets[], int num_resets); + /** * Export changed parameters to a file. * Note: this method requires a large amount of stack size! diff --git a/src/lib/parameters/parameters.cpp b/src/lib/parameters/parameters.cpp index 5581ce5cfd..3f88b1f999 100644 --- a/src/lib/parameters/parameters.cpp +++ b/src/lib/parameters/parameters.cpp @@ -881,8 +881,33 @@ param_reset_excludes(const char *excludes[], int num_excludes) param_reset(param); } } +} - _param_notify_changes(); +void +param_reset_specific(const char *resets[], int num_resets) +{ + param_t param; + + for (param = 0; handle_in_range(param); param++) { + const char *name = param_name(param); + bool reset = false; + + for (int index = 0; index < num_resets; index++) { + int len = strlen(resets[index]); + + if ((resets[index][len - 1] == '*' + && strncmp(name, resets[index], len - 1) == 0) + || strcmp(name, resets[index]) == 0) { + + reset = true; + break; + } + } + + if (reset) { + param_reset(param); + } + } } int diff --git a/src/systemcmds/param/param.cpp b/src/systemcmds/param/param.cpp index e2ddc34dfa..634436d5ea 100644 --- a/src/systemcmds/param/param.cpp +++ b/src/systemcmds/param/param.cpp @@ -92,7 +92,8 @@ static void do_show_print(void *arg, param_t param); static int 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 cmd_op, enum COMPARE_ERROR_LEVEL err_level); -static int do_reset(const char *excludes[], int num_excludes); +static int do_reset_all(const char *excludes[], int num_excludes); +static int do_reset_specific(const char *resets[], int num_resets); static int do_touch(const char *params[], int num_params); static int do_reset_nostart(const char *excludes[], int num_excludes); static int do_find(const char *name); @@ -161,7 +162,9 @@ $ reboot PRINT_MODULE_USAGE_COMMAND_DESCR("touch", "Mark a parameter as used"); PRINT_MODULE_USAGE_ARG(" []", "Parameter name (one or more)", true); - PRINT_MODULE_USAGE_COMMAND_DESCR("reset", "Reset params to default"); + PRINT_MODULE_USAGE_COMMAND_DESCR("reset", "Reset only specified params to default"); + PRINT_MODULE_USAGE_ARG(" []", "Parameter names to reset (wildcard at end allowed)", true); + PRINT_MODULE_USAGE_COMMAND_DESCR("reset_all", "Reset all params to default"); PRINT_MODULE_USAGE_ARG(" []", "Do not reset matching params (wildcard at end allowed)", true); PRINT_MODULE_USAGE_COMMAND_DESCR("reset_nostart", "Reset params to default, but keep SYS_AUTOSTART and SYS_AUTOCONFIG"); @@ -302,10 +305,20 @@ param_main(int argc, char *argv[]) if (!strcmp(argv[1], "reset")) { if (argc >= 3) { - return do_reset((const char **) &argv[2], argc - 2); + return do_reset_specific((const char **) &argv[2], argc - 2); } else { - return do_reset(nullptr, 0); + PX4_ERR("not enough arguments (use 'param reset_all' to reset all)."); + return 1; + } + } + + if (!strcmp(argv[1], "reset_all")) { + if (argc >= 3) { + return do_reset_all((const char **) &argv[2], argc - 2); + + } else { + return do_reset_all(nullptr, 0); } } @@ -794,7 +807,7 @@ do_compare(const char *name, char *vals[], unsigned comparisons, enum COMPARE_OP } static int -do_reset(const char *excludes[], int num_excludes) +do_reset_all(const char *excludes[], int num_excludes) { if (num_excludes > 0) { param_reset_excludes(excludes, num_excludes); @@ -806,6 +819,13 @@ do_reset(const char *excludes[], int num_excludes) return 0; } +static int +do_reset_specific(const char *resets[], int num_resets) +{ + param_reset_specific(resets, num_resets); + return 0; +} + static int do_touch(const char *params[], int num_params) {