QGCUASParamManager.cc 6 KB
Newer Older
1 2
#include "QGCUASParamManager.h"

3
#include <QApplication>
tstellanova's avatar
tstellanova committed
4
#include <QDir>
5
#include <QMessageBox>
tstellanova's avatar
tstellanova committed
6 7

#include "UASInterface.h"
tstellanova's avatar
tstellanova committed
8 9
#include "UASParameterCommsMgr.h"

10
QGCUASParamManager::QGCUASParamManager(QObject *parent) :
11
    QObject(parent),
12
    mav(NULL),
13
    paramDataModel(this),
14 15
    paramCommsMgr(NULL),
    defaultComponentId(-1)
16
{
tstellanova's avatar
tstellanova committed
17

18 19 20 21 22 23 24 25

}

QGCUASParamManager* QGCUASParamManager::initWithUAS(UASInterface* uas)
{
    mav = uas;

    // Load default values and tooltips for data model
tstellanova's avatar
tstellanova committed
26
    loadParamMetaInfoCSV();
27

28 29 30
    paramCommsMgr = new UASParameterCommsMgr(this);
    paramCommsMgr->initWithUAS(uas);

31
    connectToModelAndComms();
32

33
    return this;
34 35
}

36
void QGCUASParamManager::connectToModelAndComms()
37 38 39 40 41 42 43
{
    // Pass along comms mgr status msgs
    connect(paramCommsMgr, SIGNAL(parameterStatusMsgUpdated(QString,int)),
            this, SIGNAL(parameterStatusMsgUpdated(QString,int)));

    connect(paramCommsMgr, SIGNAL(parameterListUpToDate()),
            this, SIGNAL(parameterListUpToDate()));
44 45 46 47 48 49 50 51 52

    // Pass along data model updates
    connect(&paramDataModel, SIGNAL(parameterUpdated(int, QString , QVariant )),
            this, SIGNAL(parameterUpdated(int, QString , QVariant )));

    connect(&paramDataModel, SIGNAL(pendingParamUpdate(int , const QString& , QVariant , bool )),
            this, SIGNAL(pendingParamUpdate(int , const QString& , QVariant , bool )));


53
}
54 55


56 57 58
void QGCUASParamManager::clearAllPendingParams()
{
    paramDataModel.clearAllPendingParams();
59 60
}

61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81

int QGCUASParamManager::getDefaultComponentId()
{
    int result = 0;

    if (-1 != defaultComponentId)
        return defaultComponentId;

    QList<int> components = getComponentForParam("SYS_AUTOSTART");//TODO is this the best way to find the right component?

    // Guard against multiple components responding - this will never show in practice
    if (1 == components.count()) {
        result = components.first();
        defaultComponentId = result;
    }

    qDebug() << "Default compId: " << result;

    return result;
}

82 83 84 85
QList<int> QGCUASParamManager::getComponentForParam(const QString& parameter) const
{
    return paramDataModel.getComponentForOnboardParam(parameter);
}
86 87


88 89
bool QGCUASParamManager::getParameterValue(int component, const QString& parameter, QVariant& value) const
{
90
    return paramDataModel.getOnboardParamValue(component,parameter,value);
tstellanova's avatar
tstellanova committed
91
}
92

tstellanova's avatar
tstellanova committed
93

94 95 96
void QGCUASParamManager::requestParameterUpdate(int component, const QString& parameter)
{
    if (mav) {
tstellanova's avatar
tstellanova committed
97
        paramCommsMgr->requestParameterUpdate(component,parameter);
98 99 100
    }
}

tstellanova's avatar
tstellanova committed
101 102


tstellanova's avatar
tstellanova committed
103 104 105 106 107 108
/**
 * Send a request to deliver the list of onboard parameters
 * to the MAV.
 */
void QGCUASParamManager::requestParameterList()
{
109 110 111
    if (mav) {
        emit parameterStatusMsgUpdated(tr("Requested param list.. waiting"), UASParameterCommsMgr::ParamCommsStatusLevel_OK);
        paramCommsMgr->requestParameterList();
tstellanova's avatar
tstellanova committed
112 113
    }
}
114

115
void QGCUASParamManager::requestParameterListIfEmpty()
116
{
117 118 119
    if (mav) {
        int totalOnboard = paramDataModel.countOnboardParams();
        if (totalOnboard < 2) { //TODO arbitrary constant, maybe 0 is OK?
120
            defaultComponentId = -1; //reset this ...we have no idea what the default component ID is
121 122 123
            requestParameterList();
        }
    }
124 125
}

126

127
void QGCUASParamManager::setParamDescriptions(const QMap<QString,QString>& paramInfo) {
128
    paramDataModel.setParamDescriptions(paramInfo);
129 130 131
}


132
void QGCUASParamManager::setParameter(int compId, QString paramName, QVariant value)
tstellanova's avatar
tstellanova committed
133
{
134 135 136 137
    if ((0 == compId) || (-1 == compId)) {
        //attempt to get an actual component ID
        compId = getDefaultComponentId();
    }
138
    paramDataModel.updatePendingParamWithValue(compId,paramName,value);
tstellanova's avatar
tstellanova committed
139
}
tstellanova's avatar
tstellanova committed
140

141
void QGCUASParamManager::sendPendingParameters(bool persistAfterSend)
tstellanova's avatar
tstellanova committed
142
{
143
    paramCommsMgr->sendPendingParameters(persistAfterSend);
tstellanova's avatar
tstellanova committed
144 145
}

146 147 148 149



void QGCUASParamManager::setPendingParam(int compId,  const QString& paramName,  const QVariant& value)
150
{
151 152 153 154
    if ((0 == compId) || (-1 == compId)) {
        //attempt to get an actual component ID
        compId = getDefaultComponentId();
    }
155
    paramDataModel.updatePendingParamWithValue(compId,paramName,value);
156 157
}

tstellanova's avatar
tstellanova committed
158

tstellanova's avatar
tstellanova committed
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177

void QGCUASParamManager::loadParamMetaInfoCSV()
{
    // Load default values and tooltips
    QString autopilot(mav->getAutopilotTypeName());

    QDir appDir = QApplication::applicationDirPath();
    appDir.cd("files");
    QString fileName = QString("%1/%2/parameter_tooltips/tooltips.txt").arg(appDir.canonicalPath()).arg(autopilot.toLower());
    QFile paramMetaFile(fileName);

    qDebug() << "loadParamMetaInfoCSV for autopilot: " << autopilot << " from file: " << fileName;

    if (!paramMetaFile.open(QIODevice::ReadOnly | QIODevice::Text))  {
        qWarning() << "loadParamMetaInfoCSV couldn't open:" << fileName;
        return;
    }

    QTextStream in(&paramMetaFile);
178
    paramDataModel.loadParamMetaInfoFromStream(in);
tstellanova's avatar
tstellanova committed
179 180 181 182
    paramMetaFile.close();

}

183

tstellanova's avatar
tstellanova committed
184 185 186 187
UASInterface* QGCUASParamManager::getUAS()
{
    return mav;
}
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233

UASParameterDataModel* QGCUASParamManager::dataModel()
{
    return &paramDataModel;
}



void QGCUASParamManager::writeOnboardParamsToStream(QTextStream &stream, const QString& uasName)
{
    paramDataModel.writeOnboardParamsToStream(stream,uasName);
}

void QGCUASParamManager::readPendingParamsFromStream(QTextStream &stream)
{
    paramDataModel.readUpdateParamsFromStream(stream);
}



void QGCUASParamManager::copyVolatileParamsToPersistent()
{
    int changedParamCount = paramDataModel.countPendingParams();

    if (changedParamCount > 0) {
        QMessageBox msgBox;
        msgBox.setText(tr("There are locally changed parameters. Please transmit them first (<TRANSMIT>) or update them with the onboard values (<REFRESH>) before storing onboard from RAM to ROM."));
        msgBox.exec();
    }
    else {
        paramCommsMgr->writeParamsToPersistentStorage();
    }
}


void QGCUASParamManager::copyPersistentParamsToVolatile()
{
    if (mav) {
        mav->readParametersFromStorage(); //TODO use comms mgr instead?
    }
}


void QGCUASParamManager::requestRcCalibrationParamsUpdate() {
    paramCommsMgr->requestRcCalibrationParamsUpdate();
}