Fact.h 7.78 KB
Newer Older
Don Gagne's avatar
Don Gagne committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
/*=====================================================================
 
 QGroundControl Open Source Ground Control Station
 
 (c) 2009 - 2014 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 
 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 <http://www.gnu.org/licenses/>.
 
 ======================================================================*/

/// @file
///     @author Don Gagne <don@thegagnes.com>

#ifndef Fact_H
#define Fact_H

#include "FactMetaData.h"

#include <QObject>
#include <QString>
#include <QVariant>
35
#include <QDebug>
Don Gagne's avatar
Don Gagne committed
36 37 38 39 40 41 42

/// @brief A Fact is used to hold a single value within the system.
class Fact : public QObject
{
    Q_OBJECT
    
public:
Don Gagne's avatar
Don Gagne committed
43
    Fact(QObject* parent = NULL);
44
    Fact(int componentId, QString name, FactMetaData::ValueType_t type, QObject* parent = NULL);
Don Gagne's avatar
Don Gagne committed
45 46 47 48
    Fact(const Fact& other, QObject* parent = NULL);

    const Fact& operator=(const Fact& other);

49 50 51 52 53 54
    Q_PROPERTY(int          componentId             READ componentId                                        CONSTANT)
    Q_PROPERTY(int          decimalPlaces           READ decimalPlaces                                      CONSTANT)
    Q_PROPERTY(QVariant     defaultValue            READ defaultValue                                       CONSTANT)
    Q_PROPERTY(QString      defaultValueString      READ defaultValueString                                 CONSTANT)
    Q_PROPERTY(bool         defaultValueAvailable   READ defaultValueAvailable                              CONSTANT)
    Q_PROPERTY(int          enumIndex               READ enumIndex              WRITE setEnumIndex          NOTIFY valueChanged)
55
    Q_PROPERTY(QStringList  enumStrings             READ enumStrings                                        NOTIFY enumStringsChanged)
56
    Q_PROPERTY(QString      enumStringValue         READ enumStringValue        WRITE setEnumStringValue    NOTIFY valueChanged)
57
    Q_PROPERTY(QVariantList enumValues              READ enumValues                                         NOTIFY enumValuesChanged)
58 59 60 61 62 63 64 65 66 67 68 69
    Q_PROPERTY(QString      group                   READ group                                              CONSTANT)
    Q_PROPERTY(QString      longDescription         READ longDescription                                    CONSTANT)
    Q_PROPERTY(QVariant     max                     READ max                                                CONSTANT)
    Q_PROPERTY(QString      maxString               READ maxString                                          CONSTANT)
    Q_PROPERTY(bool         maxIsDefaultForType     READ maxIsDefaultForType                                CONSTANT)
    Q_PROPERTY(QVariant     min                     READ min                                                CONSTANT)
    Q_PROPERTY(QString      minString               READ minString                                          CONSTANT)
    Q_PROPERTY(bool         minIsDefaultForType     READ minIsDefaultForType                                CONSTANT)
    Q_PROPERTY(QString      name                    READ name                                               CONSTANT)
    Q_PROPERTY(QString      shortDescription        READ shortDescription                                   CONSTANT)
    Q_PROPERTY(FactMetaData::ValueType_t type       READ type                                               CONSTANT)
    Q_PROPERTY(QString      units                   READ units                                              CONSTANT)
Don Gagne's avatar
Don Gagne committed
70
    Q_PROPERTY(QVariant     value                   READ cookedValue            WRITE setCookedValue        NOTIFY valueChanged)
71 72 73
    Q_PROPERTY(bool         valueEqualsDefault      READ valueEqualsDefault                                 NOTIFY valueChanged)
    Q_PROPERTY(QVariant     valueString             READ valueString                                        NOTIFY valueChanged)

Don Gagne's avatar
Don Gagne committed
74 75 76 77
    /// Convert and validate value
    ///     @param convertOnly true: validate type conversion only, false: validate against meta data as well
    Q_INVOKABLE QString validate(const QString& value, bool convertOnly);
    
Don Gagne's avatar
Don Gagne committed
78
    QVariant        cookedValue             (void) const;   /// Value after translation
79 80 81 82 83
    int             componentId             (void) const;
    int             decimalPlaces           (void) const;
    QVariant        defaultValue            (void) const;
    bool            defaultValueAvailable   (void) const;
    QString         defaultValueString      (void) const;
84
    int             enumIndex               (void);         // This is not const, since an unknown value can modify the enum lists
85
    QStringList     enumStrings             (void) const;
86
    QString         enumStringValue         (void);         // This is not const, since an unknown value can modify the enum lists
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
    QVariantList    enumValues              (void) const;
    QString         group                   (void) const;
    QString         longDescription         (void) const;
    QVariant        max                     (void) const;
    QString         maxString               (void) const;
    bool            maxIsDefaultForType     (void) const;
    QVariant        min                     (void) const;
    QString         minString               (void) const;
    bool            minIsDefaultForType     (void) const;
    QString         name                    (void) const;
    QVariant        rawValue                (void) const { return _rawValue; }  /// value prior to translation, careful
    QString         shortDescription        (void) const;
    FactMetaData::ValueType_t type          (void) const;
    QString         units                   (void) const;
    QString         valueString             (void) const;
    bool            valueEqualsDefault      (void) const;
103

104
    void setRawValue        (const QVariant& value);
Don Gagne's avatar
Don Gagne committed
105
    void setCookedValue     (const QVariant& value);
106 107
    void setEnumIndex       (int index);
    void setEnumStringValue (const QString& value);
108

109
    // C++ methods
110

111
    /// Sets and sends new value to vehicle even if value is the same
Don Gagne's avatar
Don Gagne committed
112
    void forceSetRawValue(const QVariant& value);
113
    
Don Gagne's avatar
Don Gagne committed
114
    /// Sets the meta data associated with the Fact.
115
    void setMetaData(FactMetaData* metaData);
Don Gagne's avatar
Don Gagne committed
116
    
Don Gagne's avatar
Don Gagne committed
117
    void _containerSetRawValue(const QVariant& value);
118
    
Don Gagne's avatar
Don Gagne committed
119 120 121
    /// Generally you should not change the name of a fact. But if you know what you are doing, you can.
    void _setName(const QString& name) { _name = name; }
    
Don Gagne's avatar
Don Gagne committed
122
signals:
123 124 125
    void enumStringsChanged(void);
    void enumValuesChanged(void);

Don Gagne's avatar
Don Gagne committed
126 127 128
    /// QObject Property System signal for value property changes
    ///
    /// This signal is only meant for use by the QT property system. It should not be connected to by client code.
129
    void valueChanged(QVariant value);
Don Gagne's avatar
Don Gagne committed
130
    
131 132 133
    /// Signalled when the param write ack comes back from the vehicle
    void vehicleUpdated(QVariant value);
    
Don Gagne's avatar
Don Gagne committed
134 135
    /// Signalled when property has been changed by a call to the property write accessor
    ///
136
    /// This signal is meant for use by Fact container implementations.
Don Gagne's avatar
Don Gagne committed
137
    void _containerRawValueChanged(const QVariant& value);
Don Gagne's avatar
Don Gagne committed
138 139
    
private:
140 141
    QString _variantToString(const QVariant& variant) const;

142
    QString                     _name;
143
    int                         _componentId;
144
    QVariant                    _rawValue;
145 146
    FactMetaData::ValueType_t   _type;
    FactMetaData*               _metaData;
Don Gagne's avatar
Don Gagne committed
147 148
};

149
#endif