diff --git a/platforms/common/include/px4_platform_common/cli.h b/platforms/common/include/px4_platform_common/cli.h index 1e08cfabd0..5667ae685e 100644 --- a/platforms/common/include/px4_platform_common/cli.h +++ b/platforms/common/include/px4_platform_common/cli.h @@ -50,3 +50,15 @@ * @return 0 on success, -errno otherwise */ int px4_get_parameter_value(const char *option, int &value); + +/** + * Parse a CLI argument to a float. There are 2 valid formats: + * - 'p:' + * in this case the parameter is loaded from an integer parameter + * - + * a floating-point value, so just a string to float conversion is done + * @param option CLI argument + * @param value returned value + * @return 0 on success, -errno otherwise + */ +int px4_get_parameter_value(const char *option, float &value); diff --git a/platforms/common/px4_cli.cpp b/platforms/common/px4_cli.cpp index bf0e5f3949..d2ffa7230d 100644 --- a/platforms/common/px4_cli.cpp +++ b/platforms/common/px4_cli.cpp @@ -59,6 +59,7 @@ int px4_get_parameter_value(const char *option, int &value) if (param_handle != PARAM_INVALID) { if (param_type(param_handle) != PARAM_TYPE_INT32) { + PX4_ERR("Type of param '%s' is different from INT32", param_name); return -EINVAL; } @@ -87,3 +88,48 @@ int px4_get_parameter_value(const char *option, int &value) return 0; } + +int px4_get_parameter_value(const char *option, float &value) +{ + value = 0; + + /* check if this is a param name */ + if (strncmp("p:", option, 2) == 0) { + + const char *param_name = option + 2; + + /* user wants to use a param name */ + param_t param_handle = param_find(param_name); + + if (param_handle != PARAM_INVALID) { + + if (param_type(param_handle) != PARAM_TYPE_FLOAT) { + PX4_ERR("Type of param '%s' is different from FLOAT", param_name); + return -EINVAL; + } + + float pwm_parm; + int ret = param_get(param_handle, &pwm_parm); + + if (ret != 0) { + return ret; + } + + value = pwm_parm; + + } else { + PX4_ERR("param name '%s' not found", param_name); + return -ENXIO; + } + + } else { + char *ep; + value = strtof(option, &ep); + + if (*ep != '\0') { + return -EINVAL; + } + } + + return 0; +}