/*===================================================================== QGroundControl Open Source Ground Control Station (c) 2009 - 2014 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 PARAMETERLOADER_H #define PARAMETERLOADER_H #include #include #include #include #include #include "FactSystem.h" #include "MAVLinkProtocol.h" #include "AutoPilotPlugin.h" #include "QGCMAVLink.h" #include "Vehicle.h" /// @file /// @author Don Gagne Q_DECLARE_LOGGING_CATEGORY(ParameterLoaderLog) Q_DECLARE_LOGGING_CATEGORY(ParameterLoaderVerboseLog) /// Connects to Parameter Manager to load/update Facts class ParameterLoader : public QObject { Q_OBJECT public: /// @param uas Uas which this set of facts is associated with ParameterLoader(AutoPilotPlugin* autopilot, Vehicle* vehicle, QObject* parent = NULL); ~ParameterLoader(); /// Returns true if the full set of facts are ready bool parametersAreReady(void) { return _parametersReady; } public slots: /// Re-request the full set of parameters from the autopilot void refreshAllParameters(void); public: /// Request a refresh on the specific parameter void refreshParameter(int componentId, const QString& name); /// Request a refresh on all parameters that begin with the specified prefix void refreshParametersPrefix(int componentId, const QString& namePrefix); /// Returns true if the specifed parameter exists bool parameterExists(int componentId, ///< fact component, -1=default component const QString& name); ///< fact name /// Returns all parameter names QStringList parameterNames(int componentId); /// Returns the specified Fact. /// WARNING: Will assert if parameter does not exists. If that possibily exists, check for existince first with /// parameterExists. Fact* getFact(int componentId, ///< fact component, -1=default component const QString& name); ///< fact name const QMap >& getGroupMap(void); /// Returns error messages from loading QString readParametersFromStream(QTextStream& stream); void writeParametersToStream(QTextStream &stream, const QString& name); signals: /// Signalled when the full set of facts are ready void parametersReady(bool missingParameters); /// Signalled to update progress of full parameter list request void parameterListProgress(float value); /// Signalled to ourselves in order to get call on our own thread void restartWaitingParamTimer(void); protected: AutoPilotPlugin* _autopilot; Vehicle* _vehicle; MAVLinkProtocol* _mavlink; private slots: void _parameterUpdate(int uasId, int componentId, QString parameterName, int parameterCount, int parameterId, int mavType, QVariant value); void _valueUpdated(const QVariant& value); void _restartWaitingParamTimer(void); void _waitingParamTimeout(void); void _tryCacheLookup(void); private: static QVariant _stringToTypedVariant(const QString& string, FactMetaData::ValueType_t type, bool failOk = false); int _actualComponentId(int componentId); void _determineDefaultComponentId(void); void _setupGroupMap(void); void _readParameterRaw(int componentId, const QString& paramName, int paramIndex); void _writeParameterRaw(int componentId, const QString& paramName, const QVariant& value); void _writeLocalParamCache(); void _tryCacheHashLoad(int uasId, QVariant hash_value); MAV_PARAM_TYPE _factTypeToMavType(FactMetaData::ValueType_t factType); FactMetaData::ValueType_t _mavTypeToFactType(MAV_PARAM_TYPE mavType); void _saveToEEPROM(void); void _checkInitialLoadComplete(void); /// First mapping is by component id /// Second mapping is parameter name, to Fact* in QVariant QMap _mapParameterName2Variant; QMap > _mapParameterId2Name; /// First mapping is by component id /// Second mapping is group name, to Fact QMap > _mapGroup2ParameterName; bool _parametersReady; ///< true: full set of parameters correctly loaded bool _initialLoadComplete; ///< true: Initial load of all parameters complete, whether succesful or not int _defaultComponentId; QString _defaultComponentIdParam; static const int _maxInitialLoadRetry = 5; ///< Maximum a retries on initial index based load QMap _paramCountMap; ///< Key: Component id, Value: count of parameters in this component QMap > _waitingReadParamIndexMap; ///< Key: Component id, Value: Map { Key: parameter index still waiting for, Value: retry count } QMap > _waitingReadParamNameMap; ///< Key: Component id, Value: Map { Key: parameter name still waiting for, Value: retry count } QMap > _waitingWriteParamNameMap; ///< Key: Component id, Value: Map { Key: parameter name still waiting for, Value: retry count } QMap > _failedReadParamIndexMap; ///< Key: Component id, Value: failed parameter index int _totalParamCount; ///< Number of parameters across all components QTimer _waitingParamTimeoutTimer; QTimer _cacheTimeoutTimer; QMutex _dataMutex; static Fact _defaultFact; ///< Used to return default fact, when parameter not found }; #endif