param_t param_for_used_index(unsigned index) { int count = get_param_info_count(); if (count && index < count) { /* walk all params and count used params */ unsigned used_count = 0; for (unsigned i = 0; i < (unsigned)size_param_changed_storage_bytes; i++) { for (unsigned j = 0; j < bits_per_allocation_unit; j++) { if (param_changed_storage[i] & (1 << j)) { /* we found the right used count, * return the param value */ if (index == used_count) { return (param_t)(i * bits_per_allocation_unit + j); } used_count++; } } } } return PARAM_INVALID; }
param_t param_for_index(unsigned index) { unsigned count = get_param_info_count(); if (count && index < count) { return (param_t)index; } return PARAM_INVALID; }
unsigned param_count_used(void) { //TODO FIXME: all params used right now #if 0 unsigned count = 0; // ensure the allocation has been done if (get_param_info_count()) { for (unsigned i = 0; i < size_param_changed_storage_bytes; i++) { for (unsigned j = 0; j < bits_per_allocation_unit; j++) { if (param_changed_storage[i] & (1 << j)) { count++; } } } } return count; #else return get_param_info_count(); #endif }
unsigned param_count_used(void) { unsigned count = 0; // ensure the allocation has been done if (get_param_info_count()) { for (unsigned i = 0; i < size_param_changed_storage_bytes; i++) { for (unsigned j = 0; j < bits_per_allocation_unit; j++) { if (param_changed_storage[i] & (1 << j)) { count++; } } } } return count; }
unsigned param_count(void) { return get_param_info_count(); }
/** * Test whether a param_t is value. * * @param param The parameter handle to test. * @return True if the handle is valid. */ static bool handle_in_range(param_t param) { int count = get_param_info_count(); return (count && param < count); }
static void _param_notify_changes(void) { #if !defined(PARAM_NO_ORB) struct parameter_update_s pup = { .timestamp = hrt_absolute_time(), .instance = param_instance++, }; /* * If we don't have a handle to our topic, create one now; otherwise * just publish. */ if (param_topic == NULL) { param_topic = orb_advertise(ORB_ID(parameter_update), &pup); } else { orb_publish(ORB_ID(parameter_update), param_topic, &pup); } #endif } void param_notify_changes(void) { _param_notify_changes(); } param_t param_find_internal(const char *name, bool notification) { perf_begin(param_find_perf); param_t middle; param_t front = 0; param_t last = get_param_info_count(); /* perform a binary search of the known parameters */ while (front <= last) { middle = front + (last - front) / 2; int ret = strcmp(name, param_info_base[middle].name); if (ret == 0) { if (notification) { param_set_used_internal(middle); } perf_end(param_find_perf); return middle; } else if (middle == front) { /* An end point has been hit, but there has been no match */ break; } else if (ret < 0) { last = middle; } else { front = middle; } } perf_end(param_find_perf); /* not found */ return PARAM_INVALID; }