MissionCommandList.cc 3.28 KB
Newer Older
1 2
/****************************************************************************
 *
Gus Grubba's avatar
Gus Grubba committed
3
 * (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
4 5 6 7 8
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/
9 10 11 12 13 14 15

#include "MissionCommandList.h"
#include "FactMetaData.h"
#include "Vehicle.h"
#include "FirmwarePluginManager.h"
#include "QGCApplication.h"
#include "QGroundControlQmlGlobal.h"
Don Gagne's avatar
Don Gagne committed
16
#include "JsonHelper.h"
17
#include "MissionCommandUIInfo.h"
18 19 20 21 22 23 24 25

#include <QStringList>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonArray>
#include <QDebug>
#include <QFile>

26 27 28 29
const char* MissionCommandList::_versionJsonKey =       "version";
const char* MissionCommandList::_mavCmdInfoJsonKey =    "mavCmdInfo";

MissionCommandList::MissionCommandList(const QString& jsonFilename, bool baseCommandList, QObject* parent)
30 31
    : QObject(parent)
{
32
    _loadMavCmdInfoJson(jsonFilename, baseCommandList);
33 34
}

35
void MissionCommandList::_loadMavCmdInfoJson(const QString& jsonFilename, bool baseCommandList)
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
{
    if (jsonFilename.isEmpty()) {
        return;
    }

    qCDebug(MissionCommandsLog) << "Loading" << jsonFilename;

    QFile jsonFile(jsonFilename);
    if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qWarning() << "Unable to open file" << jsonFilename << jsonFile.errorString();
        return;
    }

    QByteArray bytes = jsonFile.readAll();
    jsonFile.close();
    QJsonParseError jsonParseError;
    QJsonDocument doc = QJsonDocument::fromJson(bytes, &jsonParseError);
    if (jsonParseError.error != QJsonParseError::NoError) {
Don Gagne's avatar
Don Gagne committed
54
        qWarning() << jsonFilename << "Unable to open json document" << jsonParseError.errorString();
55 56 57 58 59 60 61
        return;
    }

    QJsonObject json = doc.object();

    int version = json.value(_versionJsonKey).toInt();
    if (version != 1) {
Don Gagne's avatar
Don Gagne committed
62
        qWarning() << jsonFilename << "Invalid version" << version;
63 64 65 66 67
        return;
    }

    QJsonValue jsonValue = json.value(_mavCmdInfoJsonKey);
    if (!jsonValue.isArray()) {
Don Gagne's avatar
Don Gagne committed
68
        qWarning() << jsonFilename << "mavCmdInfo not array";
69 70 71
        return;
    }

72
    // Iterate over MissionCommandUIInfo objects
73
    QJsonArray jsonArray = jsonValue.toArray();
74
    for(QJsonValue info: jsonArray) {
75
        if (!info.isObject()) {
Don Gagne's avatar
Don Gagne committed
76
            qWarning() << jsonFilename << "mavCmdArray should contain objects";
77 78 79
            return;
        }

80
        MissionCommandUIInfo* uiInfo = new MissionCommandUIInfo(this);
81

82 83 84
        QString errorString;
        if (!uiInfo->loadJsonInfo(info.toObject(), baseCommandList, errorString)) {
            uiInfo->deleteLater();
Don Gagne's avatar
Don Gagne committed
85
            qWarning() << jsonFilename << errorString;
86 87 88
            return;
        }

89 90 91 92
        // Update list of known categories
        QString newCategory = uiInfo->category();
        if (!newCategory.isEmpty() && !_categories.contains(newCategory)) {
            _categories.append(newCategory);
93 94
        }

95
        _infoMap[uiInfo->command()] = uiInfo;
96 97
    }

98
    // Build id list
99
    for (MAV_CMD id: _infoMap.keys()) {
100
        _ids << id;
101 102 103
    }
}

104
MissionCommandUIInfo* MissionCommandList::getUIInfo(MAV_CMD command) const
105
{
106
    if (!_infoMap.contains(command)) {
107
        return nullptr;
108 109
    }

110
    return _infoMap[command];
111
}