From 7aa98d55eb6c678081f8050bd23875a6af490f29 Mon Sep 17 00:00:00 2001 From: Andy Piper Date: Sun, 10 May 2020 15:04:03 +0100 Subject: [PATCH] AP_Param: expose the stable key for use by AP_OSD add support for finding parameters by name and returning the token --- libraries/AP_Param/AP_Param.cpp | 20 ++++++++++++++++++++ libraries/AP_Param/AP_Param.h | 6 ++++++ 2 files changed, 26 insertions(+) diff --git a/libraries/AP_Param/AP_Param.cpp b/libraries/AP_Param/AP_Param.cpp index ca0de8372a..933b026106 100644 --- a/libraries/AP_Param/AP_Param.cpp +++ b/libraries/AP_Param/AP_Param.cpp @@ -909,6 +909,26 @@ AP_Param::find_by_index(uint16_t idx, enum ap_var_type *ptype, ParamToken *token return ap; } +// by-name equivalent of find_by_index() +AP_Param* AP_Param::find_by_name(const char* name, enum ap_var_type *ptype, ParamToken *token) +{ + AP_Param *ap; + uint16_t count = 0; + for (ap = AP_Param::first(token, ptype); + ap && *ptype != AP_PARAM_GROUP && *ptype != AP_PARAM_NONE; + ap = AP_Param::next_scalar(token, ptype)) { + int32_t ret = strncasecmp(name, _var_info[token->key].name, AP_MAX_NAME_SIZE); + if (ret >= 0) { + char buf[AP_MAX_NAME_SIZE]; + ap->copy_name_token(*token, buf, AP_MAX_NAME_SIZE); + if (strncasecmp(name, buf, AP_MAX_NAME_SIZE) == 0) { + break; + } + } + count++; + } + return ap; +} /* Find a variable by pointer, returning key. This is used for loading pointer variables diff --git a/libraries/AP_Param/AP_Param.h b/libraries/AP_Param/AP_Param.h index 3d42ac1345..a477d91e0e 100644 --- a/libraries/AP_Param/AP_Param.h +++ b/libraries/AP_Param/AP_Param.h @@ -314,6 +314,9 @@ public: /// static AP_Param * find_by_index(uint16_t idx, enum ap_var_type *ptype, ParamToken *token); + // by-name equivalent of find_by_index() + static AP_Param* find_by_name(const char* name, enum ap_var_type *ptype, ParamToken *token); + /// Find a variable by pointer /// /// @@ -474,6 +477,9 @@ public: // return true if the parameter is read-only bool is_read_only(void) const; + + // return the persistent top level key for the ParamToken key + static uint16_t get_persistent_key(uint16_t key) { return _var_info[key].key; } // count of parameters in tree static uint16_t count_parameters(void);