From f0dd9fa445de3915dda532a86393088c4aeea985 Mon Sep 17 00:00:00 2001 From: Thomas Debrunner Date: Wed, 8 Mar 2023 15:54:49 +0100 Subject: [PATCH] param: Add contained-params-bitset export interface to the param layers Allows for efficient looping over the contained data --- src/lib/parameters/ConstLayer.h | 11 +++++++++++ src/lib/parameters/DynamicSparseLayer.h | 13 +++++++++++++ src/lib/parameters/ExhaustiveLayer.h | 5 +++++ src/lib/parameters/ParamLayer.h | 8 ++++---- src/lib/parameters/StaticSparseLayer.h | 12 ++++++++++++ src/lib/parameters/flashparams/flashparams.cpp | 9 +++++---- src/lib/parameters/parameters.cpp | 3 ++- 7 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/lib/parameters/ConstLayer.h b/src/lib/parameters/ConstLayer.h index 0edca5ff59..7c42667538 100644 --- a/src/lib/parameters/ConstLayer.h +++ b/src/lib/parameters/ConstLayer.h @@ -51,6 +51,17 @@ public: return param < PARAM_COUNT; } + px4::AtomicBitset containedAsBitset() const override + { + px4::AtomicBitset set; + + for (int i = 0; i < PARAM_COUNT; i++) { + set.set(i); + } + + return set; + } + param_value_u get(param_t param) const override { if (param >= PARAM_COUNT) { diff --git a/src/lib/parameters/DynamicSparseLayer.h b/src/lib/parameters/DynamicSparseLayer.h index 1491f53360..926958b38a 100644 --- a/src/lib/parameters/DynamicSparseLayer.h +++ b/src/lib/parameters/DynamicSparseLayer.h @@ -97,6 +97,19 @@ public: return _getIndex(param) < _next_slot; } + px4::AtomicBitset containedAsBitset() const override + { + px4::AtomicBitset set; + const AtomicTransaction transaction; + Slot *slots = _slots.load(); + + for (int i = 0; i < _next_slot; i++) { + set.set(slots[i].param); + } + + return set; + } + param_value_u get(param_t param) const override { const AtomicTransaction transaction; diff --git a/src/lib/parameters/ExhaustiveLayer.h b/src/lib/parameters/ExhaustiveLayer.h index 9b91c12d9c..cc2c22d6d7 100644 --- a/src/lib/parameters/ExhaustiveLayer.h +++ b/src/lib/parameters/ExhaustiveLayer.h @@ -67,6 +67,11 @@ public: return param < PARAM_COUNT && _ownership_set[param]; } + px4::AtomicBitset containedAsBitset() const override + { + return _ownership_set; + } + param_value_u get(param_t param) const override { if (param >= PARAM_COUNT) { diff --git a/src/lib/parameters/ParamLayer.h b/src/lib/parameters/ParamLayer.h index 3a3d5be87e..5d9a6e2395 100644 --- a/src/lib/parameters/ParamLayer.h +++ b/src/lib/parameters/ParamLayer.h @@ -31,9 +31,9 @@ * ****************************************************************************/ -#ifndef PX4_PARAMLAYER_H -#define PX4_PARAMLAYER_H +#pragma once +#include #include "atomic_transaction.h" #include "param.h" #include @@ -55,6 +55,8 @@ public: virtual bool contains(param_t param) const = 0; + virtual px4::AtomicBitset containedAsBitset() const = 0; + virtual param_value_u get(param_t param) const = 0; virtual void reset(param_t param) = 0; @@ -68,5 +70,3 @@ public: protected: ParamLayer *const _parent; }; - -#endif //PX4_PARAMLAYER_H diff --git a/src/lib/parameters/StaticSparseLayer.h b/src/lib/parameters/StaticSparseLayer.h index 98f0c73267..0ae538e862 100644 --- a/src/lib/parameters/StaticSparseLayer.h +++ b/src/lib/parameters/StaticSparseLayer.h @@ -74,6 +74,18 @@ public: return _getIndex(param) < _next_slot; } + px4::AtomicBitset containedAsBitset() const override + { + px4::AtomicBitset set; + const AtomicTransaction transaction; + + for (int i = 0; i < _next_slot; i++) { + set.set(_slots[i].param); + } + + return set; + } + param_value_u get(param_t param) const override { const AtomicTransaction transaction; diff --git a/src/lib/parameters/flashparams/flashparams.cpp b/src/lib/parameters/flashparams/flashparams.cpp index 16bc24b5eb..f466fd805e 100644 --- a/src/lib/parameters/flashparams/flashparams.cpp +++ b/src/lib/parameters/flashparams/flashparams.cpp @@ -84,16 +84,17 @@ param_export_internal(param_filter_func filter) /* Use realloc */ bson_encoder_init_buf(&encoder, nullptr, 0); + auto changed_params = user_config.containedAsBitset(); for (param_t param = 0; param < user_config.PARAM_COUNT; param++) { - int32_t i; - float f; - - if (filter && !filter(param)) { + if (!changed_params[param] || (filter && !filter(param))) { continue; } + int32_t i; + float f; + /* append the appropriate BSON type object */ switch (param_type(param)) { diff --git a/src/lib/parameters/parameters.cpp b/src/lib/parameters/parameters.cpp index 30c5e3dd2a..918dbe25fb 100644 --- a/src/lib/parameters/parameters.cpp +++ b/src/lib/parameters/parameters.cpp @@ -1039,6 +1039,7 @@ param_export(const char *filename, param_filter_func filter) static int param_export_internal(int fd, param_filter_func filter) { PX4_DEBUG("param_export_internal"); + const auto changed_params = user_config.containedAsBitset(); int result = -1; bson_encoder_s encoder{}; @@ -1054,7 +1055,7 @@ static int param_export_internal(int fd, param_filter_func filter) } for (param_t param = 0; handle_in_range(param); param++) { - if (filter && !filter(param)) { + if (!changed_params[param] || (filter && !filter(param))) { continue; }