/*===================================================================== QGroundControl Open Source Ground Control Station (c) 2009, 2010 QGROUNDCONTROL PROJECT This file is part of the QGROUNDCONTROL project QGROUNDCONTROL is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. QGROUNDCONTROL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with QGROUNDCONTROL. If not, see . ======================================================================*/ #ifndef PARAMETERLIST_H #define PARAMETERLIST_H #include #include #include #include #include #include #include #include #include "mavlink_types.h" #include "QGCParamID.h" #include "Parameter.h" #include "OpalRT.h" namespace OpalRT { class ParameterList { public: class const_iterator { friend class ParameterList; public: inline const_iterator() {} const_iterator(const const_iterator& other); const_iterator& operator+=(int i) {index += i; return *this;} bool operator<(const const_iterator& other) const {return (this->paramList == other.paramList) &&(this->indexparamList == other.paramList) &&(this->index==other.index);} bool operator!=(const const_iterator& other) const {return !((*this) == other);} const Parameter& operator*() const {return paramList[index];} const Parameter* operator->() const {return ¶mList[index];} const_iterator& operator++() {++index; return *this;} private: const_iterator(QList); QList paramList; int index; }; ParameterList(); ~ParameterList(); /** Count the number of parameters in the list. \return Total number of parameters */ int count(); /** Find p in the list and return its index. \note In order to use this index to look up p, the component is also needed. \return the index of p or -1 if p is not found \example \code int compid = OpalRT::CONTROLLER_ID; Parameter p("simulinkpath", "simulinkparamname", compid, QGCParamID("PID_GAIN")); ParameterList pList; if ((int index=pList.indexOf(p)) != -1) qDebug() << "PID_GAIN is at index " << index; \endcode */ int indexOf(const Parameter& p); bool contains(int compid, QGCParamID paramid) const {return (*params)[compid].contains(paramid);} /// Get a parameter from the list const Parameter getParameter(int compid, QGCParamID paramid) const {return (*params)[compid][paramid];} Parameter& getParameter(int compid, QGCParamID paramid) {return (*params)[compid][paramid];} const Parameter getParameter(int compid, int index) const {return *((*paramList)[compid][index]);} /** Convenient syntax for calling OpalRT::Parameter::getParameter() */ Parameter& operator()(int compid, QGCParamID paramid) {return getParameter(compid, paramid);} Parameter& operator()(uint8_t compid, QGCParamID paramid) {return getParameter(static_cast(compid), paramid);} const_iterator begin() const; const_iterator end() const; protected: /** Store the parameters mapped by componentid, and paramid. \code // Look up a parameter int compid = 1; QGCParamID paramid("PID_GAIN"); Parameter p = params[compid][paramid]; \endcode */ QMap > *params; /** Store pointers to the parameters to allow fast lookup by index. This variable may be changed to const pointers to ensure all changes are made through the map container. */ QList > *paramList; /** List of parameters which are necessary to control the servos. */ QStringList *reqdServoParams; /** Get the list of available parameters from Opal-RT. \param[out] opalParams Map of parameter paths/names to ids which are valid in Opal-RT */ void getParameterList(QMap* opalParams); /** Open a file for reading in the xml config data */ bool open(QString filename=QString()); /** Attempt to read XML configuration data from device \param[in] the device to read the xml data from \return true if the configuration was read successfully, false otherwise */ bool read(QIODevice *device); void parseBlock(const QDomElement &block); }; } #endif // PARAMETERLIST_H