aboutsummaryrefslogtreecommitdiff
path: root/src/modules/systemlib/param/param.c
diff options
context:
space:
mode:
authorLorenz Meier <lm@inf.ethz.ch>2015-03-22 23:15:59 -0700
committerLorenz Meier <lm@inf.ethz.ch>2015-03-28 13:07:01 -0700
commitd6f7c9b8b4a9531aa77c65e106093380e3300d07 (patch)
treee93ad6132d395c382005ef8f43992a0fbfb821fb /src/modules/systemlib/param/param.c
parentfe12bffefaf1731464cb4e0be1892c3f300abb6b (diff)
downloadpx4-firmware-d6f7c9b8b4a9531aa77c65e106093380e3300d07.tar.gz
px4-firmware-d6f7c9b8b4a9531aa77c65e106093380e3300d07.tar.bz2
px4-firmware-d6f7c9b8b4a9531aa77c65e106093380e3300d07.zip
systemlib: Implement active param list fully
Diffstat (limited to 'src/modules/systemlib/param/param.c')
-rw-r--r--src/modules/systemlib/param/param.c42
1 files changed, 38 insertions, 4 deletions
diff --git a/src/modules/systemlib/param/param.c b/src/modules/systemlib/param/param.c
index ae680eeb0..8dea6e6cc 100644
--- a/src/modules/systemlib/param/param.c
+++ b/src/modules/systemlib/param/param.c
@@ -106,8 +106,6 @@ ORB_DEFINE(parameter_update, struct parameter_update_s);
/** parameter update topic handle */
static orb_advert_t param_topic = -1;
-static bool param_used_internal(param_t param);
-
static void param_set_used_internal(param_t param);
static param_t param_find_internal(const char *name, bool notification);
@@ -250,6 +248,20 @@ param_count(void)
return param_info_count;
}
+unsigned
+param_count_used(void)
+{
+ unsigned count = 0;
+ for (unsigned i = 0; i < sizeof(param_changed_storage) / sizeof(param_changed_storage[0]); i++) {
+ for (unsigned j = 0; j < 8; j++) {
+ if (param_changed_storage[i] & (1 << j)) {
+ count++;
+ }
+ }
+ }
+ return count;
+}
+
param_t
param_for_index(unsigned index)
{
@@ -268,6 +280,27 @@ param_get_index(param_t param)
return -1;
}
+int
+param_get_used_index(param_t param)
+{
+ if (!handle_in_range(param)) {
+ return -1;
+ }
+
+ /* walk all params and count */
+ int count = 0;
+
+ for (unsigned i = 0; i < (unsigned)param + 1; i++) {
+ for (unsigned j = 0; j < 8; j++) {
+ if (param_changed_storage[i] & (1 << j)) {
+ count++;
+ }
+ }
+ }
+
+ return count;
+}
+
const char *
param_name(param_t param)
{
@@ -481,7 +514,8 @@ param_set_no_notification(param_t param, const void *val)
return param_set_internal(param, val, false, false);
}
-bool param_used_internal(param_t param)
+bool
+param_used(param_t param)
{
int param_index = param_get_index(param);
if (param_index < 0) {
@@ -903,7 +937,7 @@ param_foreach(void (*func)(void *arg, param_t param), void *arg, bool only_chang
continue;
}
- if (only_used && !param_used_internal(param)) {
+ if (only_used && !param_used(param)) {
continue;
}