|
|
|
@ -195,172 +195,6 @@ void QGCPX4VehicleConfig::toggleSpektrumPairing(bool enabled)
@@ -195,172 +195,6 @@ void QGCPX4VehicleConfig::toggleSpektrumPairing(bool enabled)
|
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
void QGCPX4VehicleConfig::loadQgcConfig(bool primary) |
|
|
|
|
{ |
|
|
|
|
Q_UNUSED(primary); |
|
|
|
|
QDir autopilotdir(qApp->applicationDirPath() + "/files/" + mav->getAutopilotTypeName().toLower()); |
|
|
|
|
QDir generaldir = QDir(autopilotdir.absolutePath() + "/general/widgets"); |
|
|
|
|
QDir vehicledir = QDir(autopilotdir.absolutePath() + "/" + mav->getSystemTypeName().toLower() + "/widgets"); |
|
|
|
|
if (!autopilotdir.exists("general")) |
|
|
|
|
{ |
|
|
|
|
//TODO: Throw some kind of error here. There is no general configuration directory
|
|
|
|
|
qDebug() << "Invalid general dir. no general configuration will be loaded."; |
|
|
|
|
} |
|
|
|
|
if (!autopilotdir.exists(mav->getAutopilotTypeName().toLower())) |
|
|
|
|
{ |
|
|
|
|
//TODO: Throw an error here too, no autopilot specific configuration
|
|
|
|
|
qDebug() << "Invalid vehicle dir, no vehicle specific configuration will be loaded."; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Generate widgets for the General tab.
|
|
|
|
|
QGCToolWidget *tool; |
|
|
|
|
bool left = true; |
|
|
|
|
foreach (QString file,generaldir.entryList(QDir::Files | QDir::NoDotAndDotDot)) |
|
|
|
|
{ |
|
|
|
|
if (file.toLower().endsWith(".qgw")) { |
|
|
|
|
QWidget* parent = left?ui->generalLeftContents:ui->generalRightContents; |
|
|
|
|
tool = new QGCToolWidget("", "", parent); |
|
|
|
|
if (tool->loadSettings(generaldir.absoluteFilePath(file), false)) |
|
|
|
|
{ |
|
|
|
|
toolWidgets.append(tool); |
|
|
|
|
QGroupBox *box = new QGroupBox(parent); |
|
|
|
|
box->setTitle(tool->objectName()); |
|
|
|
|
box->setLayout(new QVBoxLayout(box)); |
|
|
|
|
box->layout()->addWidget(tool); |
|
|
|
|
if (left) |
|
|
|
|
{ |
|
|
|
|
left = false; |
|
|
|
|
ui->generalLeftLayout->addWidget(box); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
left = true; |
|
|
|
|
ui->generalRightLayout->addWidget(box); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
delete tool; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//TODO fix and reintegrate the Advanced parameter editor
|
|
|
|
|
// // Generate widgets for the Advanced tab.
|
|
|
|
|
// foreach (QString file,vehicledir.entryList(QDir::Files | QDir::NoDotAndDotDot))
|
|
|
|
|
// {
|
|
|
|
|
// if (file.toLower().endsWith(".qgw")) {
|
|
|
|
|
// QWidget* parent = ui->advanceColumnContents;
|
|
|
|
|
// tool = new QGCToolWidget("", parent);
|
|
|
|
|
// if (tool->loadSettings(vehicledir.absoluteFilePath(file), false))
|
|
|
|
|
// {
|
|
|
|
|
// toolWidgets.append(tool);
|
|
|
|
|
// QGroupBox *box = new QGroupBox(parent);
|
|
|
|
|
// box->setTitle(tool->objectName());
|
|
|
|
|
// box->setLayout(new QVBoxLayout(box));
|
|
|
|
|
// box->layout()->addWidget(tool);
|
|
|
|
|
// ui->advancedColumnLayout->addWidget(box);
|
|
|
|
|
|
|
|
|
|
// } else {
|
|
|
|
|
// delete tool;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Load tabs for general configuration
|
|
|
|
|
foreach (QString dir,generaldir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) |
|
|
|
|
{ |
|
|
|
|
QPushButton *button = new QPushButton(this); |
|
|
|
|
connect(button,SIGNAL(clicked()),this,SLOT(menuButtonClicked())); |
|
|
|
|
ui->navBarLayout->insertWidget(2,button); |
|
|
|
|
button->setMinimumHeight(75); |
|
|
|
|
button->setMinimumWidth(100); |
|
|
|
|
button->show(); |
|
|
|
|
button->setText(dir); |
|
|
|
|
QWidget *tab = new QWidget(ui->stackedWidget); |
|
|
|
|
ui->stackedWidget->insertWidget(2,tab); |
|
|
|
|
buttonToWidgetMap[button] = tab; |
|
|
|
|
tab->setLayout(new QVBoxLayout()); |
|
|
|
|
tab->show(); |
|
|
|
|
QScrollArea *area = new QScrollArea(tab); |
|
|
|
|
tab->layout()->addWidget(area); |
|
|
|
|
QWidget *scrollArea = new QWidget(tab); |
|
|
|
|
scrollArea->setLayout(new QVBoxLayout(tab)); |
|
|
|
|
area->setWidget(scrollArea); |
|
|
|
|
area->setWidgetResizable(true); |
|
|
|
|
area->show(); |
|
|
|
|
scrollArea->show(); |
|
|
|
|
QDir newdir = QDir(generaldir.absoluteFilePath(dir)); |
|
|
|
|
foreach (QString file,newdir.entryList(QDir::Files| QDir::NoDotAndDotDot)) |
|
|
|
|
{ |
|
|
|
|
if (file.toLower().endsWith(".qgw")) { |
|
|
|
|
tool = new QGCToolWidget("", "", tab); |
|
|
|
|
if (tool->loadSettings(newdir.absoluteFilePath(file), false)) |
|
|
|
|
{ |
|
|
|
|
toolWidgets.append(tool); |
|
|
|
|
//ui->sensorLayout->addWidget(tool);
|
|
|
|
|
QGroupBox *box = new QGroupBox(tab); |
|
|
|
|
box->setTitle(tool->objectName()); |
|
|
|
|
box->setLayout(new QVBoxLayout(tab)); |
|
|
|
|
box->layout()->addWidget(tool); |
|
|
|
|
scrollArea->layout()->addWidget(box); |
|
|
|
|
} else { |
|
|
|
|
delete tool; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Load additional tabs for vehicle specific configuration
|
|
|
|
|
foreach (QString dir,vehicledir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) |
|
|
|
|
{ |
|
|
|
|
QPushButton *button = new QPushButton(this); |
|
|
|
|
connect(button,SIGNAL(clicked()),this,SLOT(menuButtonClicked())); |
|
|
|
|
ui->navBarLayout->insertWidget(2,button); |
|
|
|
|
|
|
|
|
|
QWidget *tab = new QWidget(ui->stackedWidget); |
|
|
|
|
ui->stackedWidget->insertWidget(2,tab); |
|
|
|
|
buttonToWidgetMap[button] = tab; |
|
|
|
|
|
|
|
|
|
button->setMinimumHeight(75); |
|
|
|
|
button->setMinimumWidth(100); |
|
|
|
|
button->show(); |
|
|
|
|
button->setText(dir); |
|
|
|
|
tab->setLayout(new QVBoxLayout()); |
|
|
|
|
tab->show(); |
|
|
|
|
QScrollArea *area = new QScrollArea(tab); |
|
|
|
|
tab->layout()->addWidget(area); |
|
|
|
|
QWidget *scrollArea = new QWidget(tab); |
|
|
|
|
scrollArea->setLayout(new QVBoxLayout(tab)); |
|
|
|
|
area->setWidget(scrollArea); |
|
|
|
|
area->setWidgetResizable(true); |
|
|
|
|
area->show(); |
|
|
|
|
scrollArea->show(); |
|
|
|
|
|
|
|
|
|
QDir newdir = QDir(vehicledir.absoluteFilePath(dir)); |
|
|
|
|
foreach (QString file,newdir.entryList(QDir::Files| QDir::NoDotAndDotDot)) |
|
|
|
|
{ |
|
|
|
|
if (file.toLower().endsWith(".qgw")) { |
|
|
|
|
tool = new QGCToolWidget("", "", tab); |
|
|
|
|
tool->addUAS(mav); |
|
|
|
|
if (tool->loadSettings(newdir.absoluteFilePath(file), false)) |
|
|
|
|
{ |
|
|
|
|
toolWidgets.append(tool); |
|
|
|
|
//ui->sensorLayout->addWidget(tool);
|
|
|
|
|
QGroupBox *box = new QGroupBox(tab); |
|
|
|
|
box->setTitle(tool->objectName()); |
|
|
|
|
box->setLayout(new QVBoxLayout(box)); |
|
|
|
|
box->layout()->addWidget(tool); |
|
|
|
|
scrollArea->layout()->addWidget(box); |
|
|
|
|
box->show(); |
|
|
|
|
//gbox->layout()->addWidget(box);
|
|
|
|
|
} else { |
|
|
|
|
delete tool; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
void QGCPX4VehicleConfig::menuButtonClicked() |
|
|
|
|
{ |
|
|
|
|
QPushButton *button = qobject_cast<QPushButton*>(sender()); |
|
|
|
@ -375,325 +209,6 @@ void QGCPX4VehicleConfig::menuButtonClicked()
@@ -375,325 +209,6 @@ void QGCPX4VehicleConfig::menuButtonClicked()
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void QGCPX4VehicleConfig::loadConfig() |
|
|
|
|
{ |
|
|
|
|
QGCToolWidget* tool; |
|
|
|
|
|
|
|
|
|
QDir autopilotdir(qApp->applicationDirPath() + "/files/" + mav->getAutopilotTypeName().toLower()); |
|
|
|
|
qDebug() << autopilotdir.absolutePath(); |
|
|
|
|
|
|
|
|
|
QFile xmlfile(autopilotdir.absolutePath() + "/arduplane.pdef.xml"); |
|
|
|
|
if (!xmlfile.open(QIODevice::ReadOnly)) |
|
|
|
|
{ |
|
|
|
|
loadQgcConfig(false); |
|
|
|
|
doneLoadingConfig = true; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
loadQgcConfig(true); |
|
|
|
|
|
|
|
|
|
QXmlStreamReader xml(xmlfile.readAll()); |
|
|
|
|
xmlfile.close(); |
|
|
|
|
|
|
|
|
|
//TODO: Testing to ensure that incorrectly formatted XML won't break this.
|
|
|
|
|
while (!xml.atEnd()) |
|
|
|
|
{ |
|
|
|
|
if (xml.isStartElement() && xml.name() == "paramfile") |
|
|
|
|
{ |
|
|
|
|
xml.readNext(); |
|
|
|
|
while ((xml.name() != "paramfile") && !xml.atEnd()) |
|
|
|
|
{ |
|
|
|
|
QString valuetype = ""; |
|
|
|
|
if (xml.isStartElement() && (xml.name() == "vehicles" || xml.name() == "libraries")) //Enter into the vehicles loop
|
|
|
|
|
{ |
|
|
|
|
valuetype = xml.name().toString(); |
|
|
|
|
xml.readNext(); |
|
|
|
|
while ((xml.name() != valuetype) && !xml.atEnd()) |
|
|
|
|
{ |
|
|
|
|
if (xml.isStartElement() && xml.name() == "parameters") //This is a parameter block
|
|
|
|
|
{ |
|
|
|
|
QString parametersname = ""; |
|
|
|
|
if (xml.attributes().hasAttribute("name")) |
|
|
|
|
{ |
|
|
|
|
parametersname = xml.attributes().value("name").toString(); |
|
|
|
|
} |
|
|
|
|
QVariantMap genset; |
|
|
|
|
QVariantMap advset; |
|
|
|
|
|
|
|
|
|
QString setname = parametersname; |
|
|
|
|
xml.readNext(); |
|
|
|
|
int genarraycount = 0; |
|
|
|
|
int advarraycount = 0; |
|
|
|
|
while ((xml.name() != "parameters") && !xml.atEnd()) |
|
|
|
|
{ |
|
|
|
|
if (xml.isStartElement() && xml.name() == "param") |
|
|
|
|
{ |
|
|
|
|
QString humanname = xml.attributes().value("humanName").toString(); |
|
|
|
|
QString name = xml.attributes().value("name").toString(); |
|
|
|
|
QString tab= xml.attributes().value("user").toString(); |
|
|
|
|
if (tab == "Advanced") |
|
|
|
|
{ |
|
|
|
|
advset["title"] = parametersname; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
genset["title"] = parametersname; |
|
|
|
|
} |
|
|
|
|
if (name.contains(":")) |
|
|
|
|
{ |
|
|
|
|
name = name.split(":")[1]; |
|
|
|
|
} |
|
|
|
|
QString docs = xml.attributes().value("documentation").toString(); |
|
|
|
|
paramTooltips[name] = name + " - " + docs; |
|
|
|
|
|
|
|
|
|
int type = -1; //Type of item
|
|
|
|
|
QMap<QString,QString> fieldmap; |
|
|
|
|
xml.readNext(); |
|
|
|
|
while ((xml.name() != "param") && !xml.atEnd()) |
|
|
|
|
{ |
|
|
|
|
if (xml.isStartElement() && xml.name() == "values") |
|
|
|
|
{ |
|
|
|
|
type = 1; //1 is a combobox
|
|
|
|
|
if (tab == "Advanced") |
|
|
|
|
{ |
|
|
|
|
advset[setname + "\\" + QString::number(advarraycount) + "\\" + "TYPE"] = "COMBO"; |
|
|
|
|
advset[setname + "\\" + QString::number(advarraycount) + "\\" + "QGC_PARAM_COMBOBOX_DESCRIPTION"] = humanname; |
|
|
|
|
advset[setname + "\\" + QString::number(advarraycount) + "\\" + "QGC_PARAM_COMBOBOX_PARAMID"] = name; |
|
|
|
|
advset[setname + "\\" + QString::number(advarraycount) + "\\" + "QGC_PARAM_COMBOBOX_COMPONENTID"] = 1; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
genset[setname + "\\" + QString::number(genarraycount) + "\\" + "TYPE"] = "COMBO"; |
|
|
|
|
genset[setname + "\\" + QString::number(genarraycount) + "\\" + "QGC_PARAM_COMBOBOX_DESCRIPTION"] = humanname; |
|
|
|
|
genset[setname + "\\" + QString::number(genarraycount) + "\\" + "QGC_PARAM_COMBOBOX_PARAMID"] = name; |
|
|
|
|
genset[setname + "\\" + QString::number(genarraycount) + "\\" + "QGC_PARAM_COMBOBOX_COMPONENTID"] = 1; |
|
|
|
|
} |
|
|
|
|
int paramcount = 0; |
|
|
|
|
xml.readNext(); |
|
|
|
|
while ((xml.name() != "values") && !xml.atEnd()) |
|
|
|
|
{ |
|
|
|
|
if (xml.isStartElement() && xml.name() == "value") |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
QString code = xml.attributes().value("code").toString(); |
|
|
|
|
QString arg = xml.readElementText(); |
|
|
|
|
if (tab == "Advanced") |
|
|
|
|
{ |
|
|
|
|
advset[setname + "\\" + QString::number(advarraycount) + "\\" + "QGC_PARAM_COMBOBOX_ITEM_" + QString::number(paramcount) + "_TEXT"] = arg; |
|
|
|
|
advset[setname + "\\" + QString::number(advarraycount) + "\\" + "QGC_PARAM_COMBOBOX_ITEM_" + QString::number(paramcount) + "_VAL"] = code.toInt(); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
genset[setname + "\\" + QString::number(genarraycount) + "\\" + "QGC_PARAM_COMBOBOX_ITEM_" + QString::number(paramcount) + "_TEXT"] = arg; |
|
|
|
|
genset[setname + "\\" + QString::number(genarraycount) + "\\" + "QGC_PARAM_COMBOBOX_ITEM_" + QString::number(paramcount) + "_VAL"] = code.toInt(); |
|
|
|
|
} |
|
|
|
|
paramcount++; |
|
|
|
|
} |
|
|
|
|
xml.readNext(); |
|
|
|
|
} |
|
|
|
|
if (tab == "Advanced") |
|
|
|
|
{ |
|
|
|
|
advset[setname + "\\" + QString::number(advarraycount) + "\\" + "QGC_PARAM_COMBOBOX_COUNT"] = paramcount; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
genset[setname + "\\" + QString::number(genarraycount) + "\\" + "QGC_PARAM_COMBOBOX_COUNT"] = paramcount; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (xml.isStartElement() && xml.name() == "field") |
|
|
|
|
{ |
|
|
|
|
type = 2; //2 is a slider
|
|
|
|
|
QString fieldtype = xml.attributes().value("name").toString(); |
|
|
|
|
QString text = xml.readElementText(); |
|
|
|
|
fieldmap[fieldtype] = text; |
|
|
|
|
} |
|
|
|
|
xml.readNext(); |
|
|
|
|
} |
|
|
|
|
if (type == -1) |
|
|
|
|
{ |
|
|
|
|
//Nothing inside! Assume it's a value, give it a default range.
|
|
|
|
|
type = 2; |
|
|
|
|
QString fieldtype = "Range"; |
|
|
|
|
QString text = "0 100"; //TODO: Determine a better way of figuring out default ranges.
|
|
|
|
|
fieldmap[fieldtype] = text; |
|
|
|
|
} |
|
|
|
|
if (type == 2) |
|
|
|
|
{ |
|
|
|
|
if (tab == "Advanced") |
|
|
|
|
{ |
|
|
|
|
advset[setname + "\\" + QString::number(advarraycount) + "\\" + "TYPE"] = "SLIDER"; |
|
|
|
|
advset[setname + "\\" + QString::number(advarraycount) + "\\" + "QGC_PARAM_SLIDER_DESCRIPTION"] = humanname; |
|
|
|
|
advset[setname + "\\" + QString::number(advarraycount) + "\\" + "QGC_PARAM_SLIDER_PARAMID"] = name; |
|
|
|
|
advset[setname + "\\" + QString::number(advarraycount) + "\\" + "QGC_PARAM_SLIDER_COMPONENTID"] = 1; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
genset[setname + "\\" + QString::number(genarraycount) + "\\" + "TYPE"] = "SLIDER"; |
|
|
|
|
genset[setname + "\\" + QString::number(genarraycount) + "\\" + "QGC_PARAM_SLIDER_DESCRIPTION"] = humanname; |
|
|
|
|
genset[setname + "\\" + QString::number(genarraycount) + "\\" + "QGC_PARAM_SLIDER_PARAMID"] = name; |
|
|
|
|
genset[setname + "\\" + QString::number(genarraycount) + "\\" + "QGC_PARAM_SLIDER_COMPONENTID"] = 1; |
|
|
|
|
} |
|
|
|
|
if (fieldmap.contains("Range")) |
|
|
|
|
{ |
|
|
|
|
float min = 0; |
|
|
|
|
float max = 0; |
|
|
|
|
//Some range fields list "0-10" and some list "0 10". Handle both.
|
|
|
|
|
if (fieldmap["Range"].split(" ").size() > 1) |
|
|
|
|
{ |
|
|
|
|
min = fieldmap["Range"].split(" ")[0].trimmed().toFloat(); |
|
|
|
|
max = fieldmap["Range"].split(" ")[1].trimmed().toFloat(); |
|
|
|
|
} |
|
|
|
|
else if (fieldmap["Range"].split("-").size() > 1) |
|
|
|
|
{ |
|
|
|
|
min = fieldmap["Range"].split("-")[0].trimmed().toFloat(); |
|
|
|
|
max = fieldmap["Range"].split("-")[1].trimmed().toFloat(); |
|
|
|
|
} |
|
|
|
|
if (tab == "Advanced") |
|
|
|
|
{ |
|
|
|
|
advset[setname + "\\" + QString::number(advarraycount) + "\\" + "QGC_PARAM_SLIDER_MIN"] = min; |
|
|
|
|
advset[setname + "\\" + QString::number(advarraycount) + "\\" + "QGC_PARAM_SLIDER_MAX"] = max; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
genset[setname + "\\" + QString::number(genarraycount) + "\\" + "QGC_PARAM_SLIDER_MIN"] = min; |
|
|
|
|
genset[setname + "\\" + QString::number(genarraycount) + "\\" + "QGC_PARAM_SLIDER_MAX"] = max; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (tab == "Advanced") |
|
|
|
|
{ |
|
|
|
|
advarraycount++; |
|
|
|
|
advset["count"] = advarraycount; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
genarraycount++; |
|
|
|
|
genset["count"] = genarraycount; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
xml.readNext(); |
|
|
|
|
} |
|
|
|
|
if (genarraycount > 0) |
|
|
|
|
{ |
|
|
|
|
QWidget* parent = this; |
|
|
|
|
if (valuetype == "vehicles") |
|
|
|
|
{ |
|
|
|
|
parent = ui->generalLeftContents; |
|
|
|
|
} |
|
|
|
|
else if (valuetype == "libraries") |
|
|
|
|
{ |
|
|
|
|
parent = ui->generalRightContents; |
|
|
|
|
} |
|
|
|
|
tool = new QGCToolWidget(parametersname, parametersname, parent); |
|
|
|
|
tool->addUAS(mav); |
|
|
|
|
tool->setSettings(genset); |
|
|
|
|
QList<QString> paramlist = tool->getParamList(); |
|
|
|
|
for (int i=0;i<paramlist.size();i++) |
|
|
|
|
{ |
|
|
|
|
//Based on the airframe, we add the parameter to different categories.
|
|
|
|
|
if (parametersname == "ArduPlane") //MAV_TYPE_FIXED_WING FIXED_WING
|
|
|
|
|
{ |
|
|
|
|
systemTypeToParamMap["FIXED_WING"].insert(paramlist[i],tool); |
|
|
|
|
} |
|
|
|
|
else if (parametersname == "ArduCopter") //MAV_TYPE_QUADROTOR "QUADROTOR
|
|
|
|
|
{ |
|
|
|
|
systemTypeToParamMap["QUADROTOR"].insert(paramlist[i],tool); |
|
|
|
|
} |
|
|
|
|
else if (parametersname == "APMrover2") //MAV_TYPE_GROUND_ROVER GROUND_ROVER
|
|
|
|
|
{ |
|
|
|
|
systemTypeToParamMap["GROUND_ROVER"].insert(paramlist[i],tool); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
libParamToWidgetMap.insert(paramlist[i],tool); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
toolWidgets.append(tool); |
|
|
|
|
QGroupBox *box = new QGroupBox(parent); |
|
|
|
|
box->setTitle(tool->objectName()); |
|
|
|
|
box->setLayout(new QVBoxLayout(box)); |
|
|
|
|
box->layout()->addWidget(tool); |
|
|
|
|
if (valuetype == "vehicles") |
|
|
|
|
{ |
|
|
|
|
ui->generalLeftLayout->addWidget(box); |
|
|
|
|
} |
|
|
|
|
else if (valuetype == "libraries") |
|
|
|
|
{ |
|
|
|
|
ui->generalRightLayout->addWidget(box); |
|
|
|
|
} |
|
|
|
|
box->hide(); |
|
|
|
|
toolToBoxMap[tool] = box; |
|
|
|
|
} |
|
|
|
|
if (advarraycount > 0) |
|
|
|
|
{ |
|
|
|
|
QWidget* parent = this; |
|
|
|
|
if (valuetype == "vehicles") |
|
|
|
|
{ |
|
|
|
|
parent = ui->generalLeftContents; |
|
|
|
|
} |
|
|
|
|
else if (valuetype == "libraries") |
|
|
|
|
{ |
|
|
|
|
parent = ui->generalRightContents; |
|
|
|
|
} |
|
|
|
|
tool = new QGCToolWidget(parametersname, parametersname, parent); |
|
|
|
|
tool->addUAS(mav); |
|
|
|
|
tool->setSettings(advset); |
|
|
|
|
QList<QString> paramlist = tool->getParamList(); |
|
|
|
|
for (int i=0;i<paramlist.size();i++) |
|
|
|
|
{ |
|
|
|
|
//Based on the airframe, we add the parameter to different categories.
|
|
|
|
|
if (parametersname == "ArduPlane") //MAV_TYPE_FIXED_WING FIXED_WING
|
|
|
|
|
{ |
|
|
|
|
systemTypeToParamMap["FIXED_WING"].insert(paramlist[i],tool); |
|
|
|
|
} |
|
|
|
|
else if (parametersname == "ArduCopter") //MAV_TYPE_QUADROTOR "QUADROTOR
|
|
|
|
|
{ |
|
|
|
|
systemTypeToParamMap["QUADROTOR"].insert(paramlist[i],tool); |
|
|
|
|
} |
|
|
|
|
else if (parametersname == "APMrover2") //MAV_TYPE_GROUND_ROVER GROUND_ROVER
|
|
|
|
|
{ |
|
|
|
|
systemTypeToParamMap["GROUND_ROVER"].insert(paramlist[i],tool); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
libParamToWidgetMap.insert(paramlist[i],tool); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
toolWidgets.append(tool); |
|
|
|
|
QGroupBox *box = new QGroupBox(parent); |
|
|
|
|
box->setTitle(tool->objectName()); |
|
|
|
|
box->setLayout(new QVBoxLayout(box)); |
|
|
|
|
box->layout()->addWidget(tool); |
|
|
|
|
if (valuetype == "vehicles") |
|
|
|
|
{ |
|
|
|
|
ui->generalLeftLayout->addWidget(box); |
|
|
|
|
} |
|
|
|
|
else if (valuetype == "libraries") |
|
|
|
|
{ |
|
|
|
|
ui->generalRightLayout->addWidget(box); |
|
|
|
|
} |
|
|
|
|
box->hide(); |
|
|
|
|
toolToBoxMap[tool] = box; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
xml.readNext(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
xml.readNext(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
xml.readNext(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!paramTooltips.isEmpty()) { |
|
|
|
|
paramMgr->setParamDescriptions(paramTooltips); |
|
|
|
|
} |
|
|
|
|
doneLoadingConfig = true; |
|
|
|
|
//Config is finished, lets do a parameter request to ensure none are missed if someone else started requesting before we were finished.
|
|
|
|
|
paramMgr->requestParameterListIfEmpty(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void QGCPX4VehicleConfig::setActiveUAS(UASInterface* active) |
|
|
|
|
{ |
|
|
|
|
// Hide items if NULL and abort
|
|
|
|
@ -713,20 +228,6 @@ void QGCPX4VehicleConfig::setActiveUAS(UASInterface* active)
@@ -713,20 +228,6 @@ void QGCPX4VehicleConfig::setActiveUAS(UASInterface* active)
|
|
|
|
|
disconnect(mav, SIGNAL(parameterChanged(int,int,QString,QVariant)), this, |
|
|
|
|
SLOT(parameterChanged(int,int,QString,QVariant))); |
|
|
|
|
|
|
|
|
|
// Delete all children from all fixed tabs.
|
|
|
|
|
foreach(QWidget* child, ui->generalLeftContents->findChildren<QWidget*>()) { |
|
|
|
|
child->deleteLater(); |
|
|
|
|
} |
|
|
|
|
foreach(QWidget* child, ui->generalRightContents->findChildren<QWidget*>()) { |
|
|
|
|
child->deleteLater(); |
|
|
|
|
} |
|
|
|
|
foreach(QWidget* child, ui->advanceColumnContents->findChildren<QWidget*>()) { |
|
|
|
|
child->deleteLater(); |
|
|
|
|
} |
|
|
|
|
// foreach(QWidget* child, ui->sensorLayout->findChildren<QWidget*>()) {
|
|
|
|
|
// child->deleteLater();
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
foreach(QWidget* child, ui->airframeLayout->findChildren<QWidget*>()) |
|
|
|
|
{ |
|
|
|
|
child->deleteLater(); |
|
|
|
|