diff --git a/src/lib/parameters/parameters.cpp b/src/lib/parameters/parameters.cpp index d5bc65f8a2..b616e964d2 100644 --- a/src/lib/parameters/parameters.cpp +++ b/src/lib/parameters/parameters.cpp @@ -69,6 +69,9 @@ using namespace time_literals; #include #include +/* Include functions common to user and kernel sides */ +#include "parameters_common.cpp" + #if defined(FLASH_BASED_PARAMS) #include "flashparams/flashparams.h" #else @@ -87,7 +90,6 @@ static struct work_s autosave_work {}; static px4::atomic_bool autosave_scheduled{false}; static bool autosave_disabled = false; -static constexpr uint16_t param_info_count = sizeof(px4::parameters) / sizeof(param_info_s); static px4::AtomicBitset params_active; // params found static px4::AtomicBitset params_changed; // params non-default static px4::Bitset params_custom_default; // params with runtime default value @@ -192,14 +194,6 @@ param_init() param_set_perf = perf_alloc(PC_ELAPSED, "param: set"); } -/** - * Test whether a param_t is value. - * - * @param param The parameter handle to test. - * @return True if the handle is valid. - */ -static constexpr bool handle_in_range(param_t param) { return (param < param_info_count); } - /** * Compare two modified parameter structures to determine ordering. * @@ -312,25 +306,11 @@ param_t param_find_no_notification(const char *name) return param_find_internal(name, false); } -unsigned param_count() -{ - return param_info_count; -} - unsigned param_count_used() { return params_active.count(); } -param_t param_for_index(unsigned index) -{ - if (index < param_info_count) { - return (param_t)index; - } - - return PARAM_INVALID; -} - param_t param_for_used_index(unsigned index) { // walk all params and count used params @@ -353,15 +333,6 @@ param_t param_for_used_index(unsigned index) return PARAM_INVALID; } -int param_get_index(param_t param) -{ - if (handle_in_range(param)) { - return (unsigned)param; - } - - return -1; -} - int param_get_used_index(param_t param) { /* this tests for out of bounds and does a constant time lookup */ @@ -386,51 +357,12 @@ int param_get_used_index(param_t param) return -1; } -const char *param_name(param_t param) -{ - return handle_in_range(param) ? px4::parameters[param].name : nullptr; -} - -param_type_t param_type(param_t param) -{ - return handle_in_range(param) ? px4::parameters_type[param] : PARAM_TYPE_UNKNOWN; -} - -bool param_is_volatile(param_t param) -{ - if (handle_in_range(param)) { - for (const auto &p : px4::parameters_volatile) { - if (static_cast(param) == p) { - return true; - } - } - } - - return false; -} - bool param_value_unsaved(param_t param) { return handle_in_range(param) ? params_unsaved[param] : false; } -size_t param_size(param_t param) -{ - if (handle_in_range(param)) { - switch (param_type(param)) { - case PARAM_TYPE_INT32: - case PARAM_TYPE_FLOAT: - return 4; - - default: - return 0; - } - } - - return 0; -} - /** * Obtain a pointer to the storage allocated for a parameter. * @@ -641,32 +573,6 @@ bool param_value_is_default(param_t param) return true; } -int -param_get_system_default_value(param_t param, void *default_val) -{ - if (!handle_in_range(param)) { - return PX4_ERROR; - } - - int ret = PX4_OK; - - switch (param_type(param)) { - case PARAM_TYPE_INT32: - memcpy(default_val, &px4::parameters[param].val.i, param_size(param)); - break; - - case PARAM_TYPE_FLOAT: - memcpy(default_val, &px4::parameters[param].val.f, param_size(param)); - break; - - default: - ret = PX4_ERROR; - break; - } - - return ret; -} - /** * worker callback method to save the parameters * @param arg unused diff --git a/src/lib/parameters/parameters_common.cpp b/src/lib/parameters/parameters_common.cpp new file mode 100644 index 0000000000..0fc6eaaca2 --- /dev/null +++ b/src/lib/parameters/parameters_common.cpp @@ -0,0 +1,137 @@ +/**************************************************************************** + * + * Copyright (c) 2012-2022 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file parameters_common.cpp + * + * Global parameter store, functions common to kernel and user sides + * + */ + +static constexpr uint16_t param_info_count = sizeof(px4::parameters) / sizeof(param_info_s); + +/** + * Test whether a param_t is value. + * + * @param param The parameter handle to test. + * @return True if the handle is valid. + */ +static constexpr bool handle_in_range(param_t param) { return (param < param_info_count); } + +unsigned param_count() +{ + return param_info_count; +} + +int param_get_index(param_t param) +{ + if (handle_in_range(param)) { + return (unsigned)param; + } + + return -1; +} + +param_t param_for_index(unsigned index) +{ + if (index < param_info_count) { + return (param_t)index; + } + + return PARAM_INVALID; +} + +const char *param_name(param_t param) +{ + return handle_in_range(param) ? px4::parameters[param].name : nullptr; +} + +param_type_t param_type(param_t param) +{ + return handle_in_range(param) ? px4::parameters_type[param] : PARAM_TYPE_UNKNOWN; +} + +bool param_is_volatile(param_t param) +{ + if (handle_in_range(param)) { + for (const auto &p : px4::parameters_volatile) { + if (static_cast(param) == p) { + return true; + } + } + } + + return false; +} + +size_t param_size(param_t param) +{ + if (handle_in_range(param)) { + switch (param_type(param)) { + case PARAM_TYPE_INT32: + case PARAM_TYPE_FLOAT: + return 4; + + default: + return 0; + } + } + + return 0; +} + +int +param_get_system_default_value(param_t param, void *default_val) +{ + if (!handle_in_range(param)) { + return PX4_ERROR; + } + + int ret = PX4_OK; + + switch (param_type(param)) { + case PARAM_TYPE_INT32: + memcpy(default_val, &px4::parameters[param].val.i, param_size(param)); + break; + + case PARAM_TYPE_FLOAT: + memcpy(default_val, &px4::parameters[param].val.f, param_size(param)); + break; + + default: + ret = PX4_ERROR; + break; + } + + return ret; +}