From 5d0095f00dccd4e9fa4670794f7074b901a55dcf Mon Sep 17 00:00:00 2001 From: zedamota Date: Thu, 4 Aug 2011 16:58:41 +0100 Subject: [PATCH] Started working on the multi receiver support --- .../src/plugins/config/config.pro | 9 +- .../src/plugins/config/configinputwidget.cpp | 691 +------------ .../src/plugins/config/configinputwidget.h | 32 +- .../src/plugins/config/configtaskwidget.cpp | 41 +- .../src/plugins/config/configtaskwidget.h | 7 +- .../openpilotgcs/src/plugins/config/input.ui | 908 +----------------- .../src/plugins/config/inputchannelform.cpp | 29 + .../src/plugins/config/inputchannelform.h | 23 + .../src/plugins/config/inputchannelform.ui | 119 +++ .../src/plugins/config/smartsavebutton.cpp | 2 + 10 files changed, 260 insertions(+), 1601 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/config/inputchannelform.cpp create mode 100644 ground/openpilotgcs/src/plugins/config/inputchannelform.h create mode 100644 ground/openpilotgcs/src/plugins/config/inputchannelform.ui diff --git a/ground/openpilotgcs/src/plugins/config/config.pro b/ground/openpilotgcs/src/plugins/config/config.pro index 79ddea046..62bdc327e 100644 --- a/ground/openpilotgcs/src/plugins/config/config.pro +++ b/ground/openpilotgcs/src/plugins/config/config.pro @@ -37,7 +37,8 @@ HEADERS += configplugin.h \ calibration.h \ defaultattitudewidget.h \ smartsavebutton.h \ - defaulthwsettingswidget.h + defaulthwsettingswidget.h \ + inputchannelform.h SOURCES += configplugin.cpp \ configgadgetconfiguration.cpp \ @@ -65,7 +66,8 @@ SOURCES += configplugin.cpp \ alignment-calibration.cpp \ defaultattitudewidget.cpp \ smartsavebutton.cpp \ - defaulthwsettingswidget.cpp + defaulthwsettingswidget.cpp \ + inputchannelform.cpp FORMS += \ airframe.ui \ @@ -78,6 +80,7 @@ FORMS += \ output.ui \ ccattitude.ui \ defaultattitude.ui \ - defaulthwsettings.ui + defaulthwsettings.ui \ + inputchannelform.ui RESOURCES += configgadget.qrc diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index 83e1a02ac..18841b9df 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -46,606 +46,53 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : ConfigTaskWidget(parent) m_config = new Ui_InputWidget(); m_config->setupUi(this); + setupButtons(m_config->saveRCInputToRAM,m_config->saveRCInputToSD); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); UAVObjectManager *objManager = pm->getObject(); - - // First of all, put all the channel widgets into lists, so that we can - // manipulate those: - - - inMaxLabels << m_config->ch0Max - << m_config->ch1Max - << m_config->ch2Max - << m_config->ch3Max - << m_config->ch4Max - << m_config->ch5Max - << m_config->ch6Max - << m_config->ch7Max; - - inMinLabels << m_config->ch0Min - << m_config->ch1Min - << m_config->ch2Min - << m_config->ch3Min - << m_config->ch4Min - << m_config->ch5Min - << m_config->ch6Min - << m_config->ch7Min; - - inSliders << m_config->inSlider0 - << m_config->inSlider1 - << m_config->inSlider2 - << m_config->inSlider3 - << m_config->inSlider4 - << m_config->inSlider5 - << m_config->inSlider6 - << m_config->inSlider7; - - inRevCheckboxes << m_config->ch0Rev - << m_config->ch1Rev - << m_config->ch2Rev - << m_config->ch3Rev - << m_config->ch4Rev - << m_config->ch5Rev - << m_config->ch6Rev - << m_config->ch7Rev; - - inChannelAssign << m_config->ch0Assign - << m_config->ch1Assign - << m_config->ch2Assign - << m_config->ch3Assign - << m_config->ch4Assign - << m_config->ch5Assign - << m_config->ch6Assign - << m_config->ch7Assign; - - // Now connect the widget to the ManualControlCommand / Channel UAVObject - UAVDataObject* obj = dynamic_cast(objManager->getObject(QString("ManualControlCommand"))); - connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(updateChannels(UAVObject*))); - - // Register for ManualControlSettings changes: - obj = dynamic_cast(objManager->getObject(QString("ManualControlSettings"))); - connect(obj,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(refreshValues())); - - - // Get the receiver types supported by OpenPilot and fill the corresponding - // dropdown menu: - obj = dynamic_cast(objManager->getObject(QString("ManualControlSettings"))); - UAVObjectField * field; - // Fill in the dropdown menus for the channel RC Input assignement. - QStringList channelsList; - channelsList << "None"; - QList fieldList = obj->getFields(); - foreach (UAVObjectField* field, fieldList) { - if (field->getUnits().contains("channel")) { - channelsList.append(field->getName()); - } + UAVDataObject * obj = dynamic_cast(objManager->getObject(QString("ManualControlSettings"))); + UAVObjectField * field = obj->getField(QString("ChannelGroups")); + int index=0; + foreach(QString name,field->getElementNames()) + { + inputChannelForm * inp=new inputChannelForm(this,index==0); + m_config->advancedPage->layout()->addWidget(inp); + inp->ui->channelName->setText(name); + addUAVObjectToWidgetRelation("ManualControlSettings","ChannelGroups",inp->ui->channelGroup,index); + addUAVObjectToWidgetRelation("ManualControlSettings","ChannelNumber",inp->ui->channelNumber,index); + addUAVObjectToWidgetRelation("ManualControlSettings","ChannelMin",inp->ui->channelMin,index); + addUAVObjectToWidgetRelation("ManualControlSettings","ChannelNeutral",inp->ui->channelNeutral,index); + addUAVObjectToWidgetRelation("ManualControlSettings","ChannelMax",inp->ui->channelMax,index); + ++index; } - m_config->ch0Assign->addItems(channelsList); - m_config->ch1Assign->addItems(channelsList); - m_config->ch2Assign->addItems(channelsList); - m_config->ch3Assign->addItems(channelsList); - m_config->ch4Assign->addItems(channelsList); - m_config->ch5Assign->addItems(channelsList); - m_config->ch6Assign->addItems(channelsList); - m_config->ch7Assign->addItems(channelsList); + addUAVObjectToWidgetRelation("ManualControlSettings","FlightModePosition",m_config->fmsModePos1,0); + addUAVObjectToWidgetRelation("ManualControlSettings","FlightModePosition",m_config->fmsModePos2,1); + addUAVObjectToWidgetRelation("ManualControlSettings","FlightModePosition",m_config->fmsModePos3,2); - // And the flight mode settings: - field = obj->getField(QString("FlightModePosition")); - m_config->fmsModePos1->addItems(field->getOptions()); - m_config->fmsModePos2->addItems(field->getOptions()); - m_config->fmsModePos3->addItems(field->getOptions()); - field = obj->getField(QString("Stabilization1Settings")); - channelsList.clear(); - channelsList.append(field->getOptions()); - m_config->fmsSsPos1Roll->addItems(channelsList); - m_config->fmsSsPos1Pitch->addItems(channelsList); - m_config->fmsSsPos1Yaw->addItems(channelsList); - m_config->fmsSsPos2Roll->addItems(channelsList); - m_config->fmsSsPos2Pitch->addItems(channelsList); - m_config->fmsSsPos2Yaw->addItems(channelsList); - m_config->fmsSsPos3Roll->addItems(channelsList); - m_config->fmsSsPos3Pitch->addItems(channelsList); - m_config->fmsSsPos3Yaw->addItems(channelsList); + addUAVObjectToWidgetRelation("ManualControlSettings","Stabilization1Settings",m_config->fmsSsPos1Roll,"Roll"); + addUAVObjectToWidgetRelation("ManualControlSettings","Stabilization2Settings",m_config->fmsSsPos2Roll,"Roll"); + addUAVObjectToWidgetRelation("ManualControlSettings","Stabilization3Settings",m_config->fmsSsPos3Roll,"Roll"); + addUAVObjectToWidgetRelation("ManualControlSettings","Stabilization1Settings",m_config->fmsSsPos1Pitch,"Pitch"); + addUAVObjectToWidgetRelation("ManualControlSettings","Stabilization2Settings",m_config->fmsSsPos2Pitch,"Pitch"); + addUAVObjectToWidgetRelation("ManualControlSettings","Stabilization3Settings",m_config->fmsSsPos3Pitch,"Pitch"); + addUAVObjectToWidgetRelation("ManualControlSettings","Stabilization1Settings",m_config->fmsSsPos1Yaw,"Yaw"); + addUAVObjectToWidgetRelation("ManualControlSettings","Stabilization2Settings",m_config->fmsSsPos2Yaw,"Yaw"); + addUAVObjectToWidgetRelation("ManualControlSettings","Stabilization3Settings",m_config->fmsSsPos3Yaw,"Yaw"); - // And the Armin configurations: - field = obj->getField(QString("Arming")); - m_config->armControl->clear(); - m_config->armControl->addItems(field->getOptions()); - - - connect(m_config->saveRCInputToSD, SIGNAL(clicked()), this, SLOT(saveRCInputObject())); - connect(m_config->saveRCInputToRAM, SIGNAL(clicked()), this, SLOT(sendRCInputUpdate())); - - enableControls(false); - refreshValues(); - connect(parent, SIGNAL(autopilotConnected()),this, SLOT(onAutopilotConnect())); - connect(parent, SIGNAL(autopilotDisconnected()), this, SLOT(onAutopilotDisconnect())); - - connect(m_config->ch0Rev, SIGNAL(toggled(bool)), this, SLOT(reverseCheckboxClicked(bool))); - connect(m_config->ch1Rev, SIGNAL(toggled(bool)), this, SLOT(reverseCheckboxClicked(bool))); - connect(m_config->ch2Rev, SIGNAL(toggled(bool)), this, SLOT(reverseCheckboxClicked(bool))); - connect(m_config->ch3Rev, SIGNAL(toggled(bool)), this, SLOT(reverseCheckboxClicked(bool))); - connect(m_config->ch4Rev, SIGNAL(toggled(bool)), this, SLOT(reverseCheckboxClicked(bool))); - connect(m_config->ch5Rev, SIGNAL(toggled(bool)), this, SLOT(reverseCheckboxClicked(bool))); - connect(m_config->ch6Rev, SIGNAL(toggled(bool)), this, SLOT(reverseCheckboxClicked(bool))); - connect(m_config->ch7Rev, SIGNAL(toggled(bool)), this, SLOT(reverseCheckboxClicked(bool))); - connect(m_config->doRCInputCalibration,SIGNAL(stateChanged(int)),this,SLOT(updateTips(int))); - firstUpdate = true; + addUAVObjectToWidgetRelation("ManualControlSettings","Arming",m_config->armControl); + addUAVObjectToWidgetRelation("ManualControlSettings","armTimeout",m_config->armTimeout,0,1000); + populateWidgets(); + refreshWidgetsValues(); // Connect the help button connect(m_config->inputHelp, SIGNAL(clicked()), this, SLOT(openHelp())); - updateTips(Qt::Unchecked); } ConfigInputWidget::~ConfigInputWidget() { - // Do nothing -} - -/** - Slot called whenever we revert a signal - */ -void ConfigInputWidget::reverseCheckboxClicked(bool state) -{ - QObject* obj = sender(); - int i = inRevCheckboxes.indexOf((QCheckBox*)obj); - - inSliders[i]->setInvertedAppearance(state); - int max = inMaxLabels[i]->text().toInt(); - int min = inMinLabels[i]->text().toInt(); - if ((state && (max>min)) || - (!state && (max < min))) { - inMaxLabels[i]->setText(QString::number(min)); - inMinLabels[i]->setText(QString::number(max)); - } -} - - -// ************************************ - -/* - Enable or disable some controls depending on whether we are connected - or not to the board. Actually, this i mostly useless IMHO, I don't - know who added this into the code (Ed's note) - */ -void ConfigInputWidget::enableControls(bool enable) -{ - //m_config->saveRCInputToRAM->setEnabled(enable); - m_config->saveRCInputToSD->setEnabled(enable); - m_config->doRCInputCalibration->setEnabled(enable); -} - - -/******************************** - * Input settings - *******************************/ - -/** - Request the current config from the board - */ -void ConfigInputWidget::refreshValues() -{ - UAVDataObject* obj = dynamic_cast(getObjectManager()->getObject(QString("ManualControlSettings"))); - Q_ASSERT(obj); - //obj->requestUpdate(); - UAVObjectField *field; - - // Now update all the slider values: - - UAVObjectField *field_max = obj->getField(QString("ChannelMax")); - UAVObjectField *field_min = obj->getField(QString("ChannelMin")); - UAVObjectField *field_neu = obj->getField(QString("ChannelNeutral")); - Q_ASSERT(field_max); - Q_ASSERT(field_min); - Q_ASSERT(field_neu); - for (int i = 0; i < 8; i++) { - QVariant max = field_max->getValue(i); - QVariant min = field_min->getValue(i); - QVariant neutral = field_neu->getValue(i); - inMaxLabels[i]->setText(max.toString()); - inMinLabels[i]->setText(min.toString()); - if (max.toInt()> min.toInt()) { - inRevCheckboxes[i]->setChecked(false); - inSliders[i]->setMaximum(max.toInt()); - inSliders[i]->setMinimum(min.toInt()); - } else { - inRevCheckboxes[i]->setChecked(true); - inSliders[i]->setMaximum(min.toInt()); - inSliders[i]->setMinimum(max.toInt()); - } - inSliders[i]->setValue(neutral.toInt()); - } - - // Update receiver type - field = obj->getField(QString("InputMode")); - m_config->receiverType->setText(field->getValue().toString()); - - // Reset all channel assignement dropdowns: - foreach (QComboBox *combo, inChannelAssign) { - combo->setCurrentIndex(0); - } - - // Update all channels assignements - QList fieldList = obj->getFields(); - foreach (UAVObjectField *field, fieldList) { - if (field->getUnits().contains("channel")) - assignChannel(obj, field->getName()); - } - - // Update all the flight mode settingsin the relevant tab - field = obj->getField(QString("FlightModePosition")); - m_config->fmsModePos1->setCurrentIndex((m_config->fmsModePos1->findText(field->getValue(0).toString()))); - m_config->fmsModePos2->setCurrentIndex((m_config->fmsModePos2->findText(field->getValue(1).toString()))); - m_config->fmsModePos3->setCurrentIndex((m_config->fmsModePos3->findText(field->getValue(2).toString()))); - - field = obj->getField(QString("Stabilization1Settings")); - m_config->fmsSsPos1Roll->setCurrentIndex(m_config->fmsSsPos1Roll->findText(field->getValue(field->getElementNames().indexOf("Roll")).toString())); - m_config->fmsSsPos1Pitch->setCurrentIndex(m_config->fmsSsPos1Pitch->findText(field->getValue(field->getElementNames().indexOf("Pitch")).toString())); - m_config->fmsSsPos1Yaw->setCurrentIndex(m_config->fmsSsPos1Yaw->findText(field->getValue(field->getElementNames().indexOf("Yaw")).toString())); - field = obj->getField(QString("Stabilization2Settings")); - m_config->fmsSsPos2Roll->setCurrentIndex(m_config->fmsSsPos2Roll->findText(field->getValue(field->getElementNames().indexOf("Roll")).toString())); - m_config->fmsSsPos2Pitch->setCurrentIndex(m_config->fmsSsPos2Pitch->findText(field->getValue(field->getElementNames().indexOf("Pitch")).toString())); - m_config->fmsSsPos2Yaw->setCurrentIndex(m_config->fmsSsPos2Yaw->findText(field->getValue(field->getElementNames().indexOf("Yaw")).toString())); - field = obj->getField(QString("Stabilization3Settings")); - m_config->fmsSsPos3Roll->setCurrentIndex(m_config->fmsSsPos3Roll->findText(field->getValue(field->getElementNames().indexOf("Roll")).toString())); - m_config->fmsSsPos3Pitch->setCurrentIndex(m_config->fmsSsPos3Pitch->findText(field->getValue(field->getElementNames().indexOf("Pitch")).toString())); - m_config->fmsSsPos3Yaw->setCurrentIndex(m_config->fmsSsPos3Yaw->findText(field->getValue(field->getElementNames().indexOf("Yaw")).toString())); - - // Load the arming settings - field = obj->getField(QString("Arming")); - m_config->armControl->setCurrentIndex(m_config->armControl->findText(field->getValue().toString())); - field = obj->getField(QString("ArmedTimeout")); - m_config->armTimeout->setValue(field->getValue().toInt()/1000); -} - - -/** - * Sends the config to the board, without saving to the SD card - */ -void ConfigInputWidget::sendRCInputUpdate() -{ - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); - UAVDataObject* obj = dynamic_cast(objManager->getObject(QString("ManualControlSettings"))); - Q_ASSERT(obj); - // Now update all fields from the sliders: - QString fieldName = QString("ChannelMax"); - UAVObjectField * field = obj->getField(fieldName); - for (int i = 0; i < 8; i++) { - field->setValue(inMaxLabels[i]->text().toInt(), i); - } - - fieldName = QString("ChannelMin"); - field = obj->getField(fieldName); - for (int i = 0; i < 8; i++) { - field->setValue(inMinLabels[i]->text().toInt(), i); - } - - fieldName = QString("ChannelNeutral"); - field = obj->getField(fieldName); - for (int i = 0; i < 8; i++) - field->setValue(inSliders[i]->value(), i); - - // Set Roll/Pitch/Yaw/Etc assignement: - // Rule: if two channels have the same setting (which is wrong!) the higher channel - // will get the setting. - - // First, reset all channel assignements: - QList fieldList = obj->getFields(); - foreach (UAVObjectField* field, fieldList) { - if (field->getUnits().contains("channel")) { - field->setValue(field->getOptions().last()); - } - } - - // Then assign according to current GUI state: - if (m_config->ch0Assign->currentIndex() != 0) { - field = obj->getField(m_config->ch0Assign->currentText()); - field->setValue(field->getOptions().at(0)); // -> This way we don't depend on channel naming convention - } - if (m_config->ch1Assign->currentIndex() != 0) { - field = obj->getField(m_config->ch1Assign->currentText()); - field->setValue(field->getOptions().at(1)); - } - if (m_config->ch2Assign->currentIndex() != 0) { - field = obj->getField(m_config->ch2Assign->currentText()); - field->setValue(field->getOptions().at(2)); - } - if (m_config->ch3Assign->currentIndex() != 0) { - field = obj->getField(m_config->ch3Assign->currentText()); - field->setValue(field->getOptions().at(3)); - } - if (m_config->ch4Assign->currentIndex() != 0) { - field = obj->getField(m_config->ch4Assign->currentText()); - field->setValue(field->getOptions().at(4)); - } - if (m_config->ch5Assign->currentIndex() != 0) { - field = obj->getField(m_config->ch5Assign->currentText()); - field->setValue(field->getOptions().at(5)); - } - if (m_config->ch6Assign->currentIndex() != 0) { - field = obj->getField(m_config->ch6Assign->currentText()); - field->setValue(field->getOptions().at(6)); - } - if (m_config->ch7Assign->currentIndex() != 0) { - field = obj->getField(m_config->ch7Assign->currentText()); - field->setValue(field->getOptions().at(7)); - } - - // Send all the flight mode settings - field = obj->getField(QString("FlightModePosition")); - field->setValue(m_config->fmsModePos1->currentText(),0); - field->setValue(m_config->fmsModePos2->currentText(),1); - field->setValue(m_config->fmsModePos3->currentText(),2); - - field = obj->getField(QString("Stabilization1Settings")); - field->setValue(m_config->fmsSsPos1Roll->currentText(), field->getElementNames().indexOf("Roll")); - field->setValue(m_config->fmsSsPos1Pitch->currentText(), field->getElementNames().indexOf("Pitch")); - field->setValue(m_config->fmsSsPos1Yaw->currentText(), field->getElementNames().indexOf("Yaw")); - field = obj->getField(QString("Stabilization2Settings")); - field->setValue(m_config->fmsSsPos2Roll->currentText(), field->getElementNames().indexOf("Roll")); - field->setValue(m_config->fmsSsPos2Pitch->currentText(), field->getElementNames().indexOf("Pitch")); - field->setValue(m_config->fmsSsPos2Yaw->currentText(), field->getElementNames().indexOf("Yaw")); - field = obj->getField(QString("Stabilization3Settings")); - field->setValue(m_config->fmsSsPos3Roll->currentText(), field->getElementNames().indexOf("Roll")); - field->setValue(m_config->fmsSsPos3Pitch->currentText(), field->getElementNames().indexOf("Pitch")); - field->setValue(m_config->fmsSsPos3Yaw->currentText(), field->getElementNames().indexOf("Yaw")); - - // Save the arming settings - field = obj->getField(QString("Arming")); - field->setValue(m_config->armControl->currentText()); - field = obj->getField(QString("ArmedTimeout")); - field->setValue(m_config->armTimeout->value()*1000); - - // ... and send to the OP Board - obj->updated(); - -} - -/** - Sends the config to the board and request saving into the SD card - */ -void ConfigInputWidget::saveRCInputObject() -{ - // Send update so that the latest value is saved - sendRCInputUpdate(); - UAVDataObject* obj = dynamic_cast(getObjectManager()->getObject(QString("ManualControlSettings"))); - Q_ASSERT(obj); - saveObjectToSD(obj); -} - - -/** - * Set the dropdown option for a channel Input assignement - */ -void ConfigInputWidget::assignChannel(UAVDataObject *obj, QString str) -{ - UAVObjectField* field = obj->getField(str); - QStringList options = field->getOptions(); - switch (options.indexOf(field->getValue().toString())) { - case 0: - m_config->ch0Assign->setCurrentIndex(m_config->ch0Assign->findText(str)); - break; - case 1: - m_config->ch1Assign->setCurrentIndex(m_config->ch0Assign->findText(str)); - break; - case 2: - m_config->ch2Assign->setCurrentIndex(m_config->ch0Assign->findText(str)); - break; - case 3: - m_config->ch3Assign->setCurrentIndex(m_config->ch0Assign->findText(str)); - break; - case 4: - m_config->ch4Assign->setCurrentIndex(m_config->ch0Assign->findText(str)); - break; - case 5: - m_config->ch5Assign->setCurrentIndex(m_config->ch0Assign->findText(str)); - break; - case 6: - m_config->ch6Assign->setCurrentIndex(m_config->ch0Assign->findText(str)); - break; - case 7: - m_config->ch7Assign->setCurrentIndex(m_config->ch0Assign->findText(str)); - break; - } -} - -/** - * Updates the slider positions and min/max values - * - */ -void ConfigInputWidget::updateChannels(UAVObject* controlCommand) -{ - - QString fieldName = QString("Connected"); - UAVObjectField *field = controlCommand->getField(fieldName); - if (field->getValue().toBool()) - { - m_config->RCInputConnected->setText("RC Receiver connected"); - m_config->lblMissingInputs->setText(""); - } - else - { - m_config->RCInputConnected->setText("RC Receiver not connected or invalid input configuration (missing channels)"); - receiverHelp(); - } - if (m_config->doRCInputCalibration->isChecked()) { - if (firstUpdate) { - // Increase the data rate from the board so that the sliders - // move faster - UAVObject::Metadata mdata = controlCommand->getMetadata(); - mdata.flightTelemetryUpdateMode = UAVObject::UPDATEMODE_PERIODIC; - mccDataRate = mdata.flightTelemetryUpdatePeriod; - mdata.flightTelemetryUpdatePeriod = 150; - controlCommand->setMetadata(mdata); - - // Also protect the user by setting all values to zero - // and making the ActuatorCommand object readonly - UAVDataObject* obj = dynamic_cast(getObjectManager()->getObject(QString("ActuatorCommand"))); - mdata = obj->getMetadata(); - mdata.flightAccess = UAVObject::ACCESS_READONLY; - obj->setMetadata(mdata); - UAVObjectField *field = obj->getField("Channel"); - for (uint i=0; i< field->getNumElements(); i++) { - field->setValue(0,i); - } - obj->updated(); - - // OP-534: make sure the airframe can NEVER arm - obj = dynamic_cast(getObjectManager()->getObject(QString("ManualControlSettings"))); - field = obj->getField("Arming"); - field->setValue("Always Disarmed"); - obj->updated(); - - // Last, make sure the user won't apply/save during calibration - m_config->saveRCInputToRAM->setEnabled(false); - m_config->saveRCInputToSD->setEnabled(false); - - // Reset all slider values to zero - field = controlCommand->getField(QString("Channel")); - for (int i = 0; i < 8; i++) - updateChannelInSlider(inSliders[i], inMinLabels[i], inMaxLabels[i], field->getValue(i).toInt(),inRevCheckboxes[i]->isChecked()); - firstUpdate = false; - // Tell a few things to the user: - QMessageBox msgBox; - msgBox.setText(tr("Arming Settings are now set to Always Disarmed for your safety.")); - msgBox.setDetailedText(tr("You will have to reconfigure arming settings yourself afterwards.")); - msgBox.setStandardButtons(QMessageBox::Ok); - msgBox.setDefaultButton(QMessageBox::Ok); - msgBox.exec(); - - } - - field = controlCommand->getField(QString("Channel")); - for (int i = 0; i < 8; i++) - updateChannelInSlider(inSliders[i], inMinLabels[i], inMaxLabels[i], field->getValue(i).toInt(),inRevCheckboxes[i]->isChecked()); - } - else { - if (!firstUpdate) { - // Restore original data rate from the board: - UAVObject::Metadata mdata = controlCommand->getMetadata(); - mdata.flightTelemetryUpdateMode = UAVObject::UPDATEMODE_PERIODIC; - mdata.flightTelemetryUpdatePeriod = mccDataRate; - controlCommand->setMetadata(mdata); - - UAVDataObject* obj = dynamic_cast(getObjectManager()->getObject(QString("ActuatorCommand"))); - mdata = obj->getMetadata(); - mdata.flightAccess = UAVObject::ACCESS_READWRITE; - obj->setMetadata(mdata); - - // Set some slider values to better defaults - // Find some channels first - int throttleChannel = -1; - int fmChannel = -1; - for (int i=0; i < inChannelAssign.length(); i++) { - if (inChannelAssign.at(i)->currentText() == "Throttle") { - // TODO: this is very ugly, because this relies on the name of the - // channel input, everywhere else in the gadget we don't rely on the - // naming... - throttleChannel = i; - } - if (inChannelAssign.at(i)->currentText() == "FlightMode") { - // TODO: this is very ugly, because this relies on the name of the - // channel input, everywhere else in the gadget we don't rely on the - // naming... - fmChannel = i; - } - } - - // Throttle neutral defaults to 2% of range - if (throttleChannel > -1) { - inSliders.at(throttleChannel)->setValue( - inSliders.at(throttleChannel)->minimum() + - (inSliders.at(throttleChannel)->maximum()- - inSliders.at(throttleChannel)->minimum())*0.02); - } - - // Flight mode at 50% of range: - if (fmChannel > -1) { - inSliders.at(fmChannel)->setValue( - inSliders.at(fmChannel)->minimum()+ - (inSliders.at(fmChannel)->maximum()- - inSliders.at(fmChannel)->minimum())*0.5); - } - - m_config->saveRCInputToRAM->setEnabled(true); - m_config->saveRCInputToSD->setEnabled(true); - } - firstUpdate = true; - } - - //Update the Flight mode channel slider - ManualControlSettings * manualSettings = ManualControlSettings::GetInstance(getObjectManager()); - ManualControlSettings::DataFields manualSettingsData = manualSettings->getData(); - uint chIndex = manualSettingsData.FlightMode; - if (chIndex < manualSettings->FLIGHTMODE_NONE) { - float valueScaled; - - int chMin = manualSettingsData.ChannelMin[chIndex]; - int chMax = manualSettingsData.ChannelMax[chIndex]; - int chNeutral = manualSettingsData.ChannelNeutral[chIndex]; - - int value = controlCommand->getField("Channel")->getValue(chIndex).toInt(); - if ((chMax > chMin && value >= chNeutral) || (chMin > chMax && value <= chNeutral)) - { - if (chMax != chNeutral) - valueScaled = (float)(value - chNeutral) / (float)(chMax - chNeutral); - else - valueScaled = 0; - } - else - { - if (chMin != chNeutral) - valueScaled = (float)(value - chNeutral) / (float)(chNeutral - chMin); - else - valueScaled = 0; - } - - if(valueScaled < -(1.0 / 3.0)) - m_config->fmsSlider->setValue(-100); - else if (valueScaled > (1.0/3.0)) - m_config->fmsSlider->setValue(100); - else - m_config->fmsSlider->setValue(0); - - } -} - -void ConfigInputWidget::updateChannelInSlider(QSlider *slider, QLabel *min, QLabel *max, int value, bool reversed) -{ - if (!slider || !min || !max) - return; - - if (firstUpdate) { - // Reset all the min/max values of the progress bar since we are starting the calibration. - slider->setMaximum(value); - slider->setMinimum(value); - slider->setValue(value); - max->setText(QString::number(value)); - min->setText(QString::number(value)); - return; - } - - if (value > 0) { - // avoids glitches... - if (value > slider->maximum()) { - slider->setMaximum(value); - if (reversed) - min->setText(QString::number(value)); - else - max->setText(QString::number(value)); - } - if (value < slider->minimum()) { - slider->setMinimum(value); - if (reversed) - max->setText(QString::number(value)); - else - min->setText(QString::number(value)); - } - slider->setValue(value); - } + // Do nothing } void ConfigInputWidget::openHelp() @@ -653,77 +100,5 @@ void ConfigInputWidget::openHelp() QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/Input+Configuration", QUrl::StrictMode) ); } -void ConfigInputWidget::receiverHelp() -{ - QString unassigned; - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); - UAVDataObject* controlCommand = dynamic_cast(objManager->getObject(QString("ManualControlSettings"))); - UAVObjectField *field; - field= controlCommand->getField("Roll"); - if(field->getValue().toString()=="None") - unassigned.append("Roll"); - - field =controlCommand->getField("Pitch"); - if(field->getValue().toString()=="None") - { - if(unassigned.length()>0) - unassigned.append(", "); - unassigned.append("Pitch"); - } - - field =controlCommand->getField("Yaw"); - if(field->getValue().toString()=="None") - { - if(unassigned.length()>0) - unassigned.append(", "); - unassigned.append("Yaw"); - } - - field =controlCommand->getField("Throttle"); - if(field->getValue().toString()=="None") - { - if(unassigned.length()>0) - unassigned.append(", "); - unassigned.append("Throttle"); - } - - field =controlCommand->getField("FlightMode"); - if(field->getValue().toString()=="None") - { - if(unassigned.length()>0) - unassigned.append(", "); - unassigned.append("FlightMode"); - } - if(unassigned.length()>0) - m_config->lblMissingInputs->setText(QString("Channels left to assign: ")+unassigned); - else - m_config->lblMissingInputs->setText(""); -} -void ConfigInputWidget::updateTips(int value) -{ - if(value==Qt::Checked) - { - m_config->ch0Cur->setToolTip("Current channel value"); - m_config->ch1Cur->setToolTip("Current channel value"); - m_config->ch2Cur->setToolTip("Current channel value"); - m_config->ch3Cur->setToolTip("Current channel value"); - m_config->ch4Cur->setToolTip("Current channel value"); - m_config->ch5Cur->setToolTip("Current channel value"); - m_config->ch6Cur->setToolTip("Current channel value"); - m_config->ch7Cur->setToolTip("Current channel value"); - } - else - { - m_config->ch0Cur->setToolTip("Channel neutral point"); - m_config->ch1Cur->setToolTip("Channel neutral point"); - m_config->ch2Cur->setToolTip("Channel neutral point"); - m_config->ch3Cur->setToolTip("Channel neutral point"); - m_config->ch4Cur->setToolTip("Channel neutral point"); - m_config->ch5Cur->setToolTip("Channel neutral point"); - m_config->ch6Cur->setToolTip("Channel neutral point"); - m_config->ch7Cur->setToolTip("Channel neutral point"); - } -} diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.h b/ground/openpilotgcs/src/plugins/config/configinputwidget.h index 75f47cc8d..5897a6f05 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.h +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.h @@ -34,7 +34,8 @@ #include "uavobject.h" #include #include - +#include "inputchannelform.h" +#include "ui_inputchannelform.h" class Ui_InputWidget; class ConfigInputWidget: public ConfigTaskWidget @@ -50,36 +51,9 @@ public slots: private: Ui_InputWidget *m_config; - QList sliders; - - void updateChannelInSlider(QSlider *slider, QLabel *min, QLabel *max, int value, bool reversed); - - void assignChannel(UAVDataObject *obj, QString str); - void assignOutputChannel(UAVDataObject *obj, QString str); - - int mccDataRate; - - UAVObject::Metadata accInitialData; - - QList inSliders; - QList inMaxLabels; - QList inMinLabels; - QList inNeuLabels; - QList inRevCheckboxes; - QList inChannelAssign; - - bool firstUpdate; - - virtual void enableControls(bool enable); - void receiverHelp(); private slots: - void updateChannels(UAVObject* obj); - virtual void refreshValues(); - void sendRCInputUpdate(); - void saveRCInputObject(); - void reverseCheckboxClicked(bool state); + void openHelp(); - void updateTips(int); }; #endif diff --git a/ground/openpilotgcs/src/plugins/config/configtaskwidget.cpp b/ground/openpilotgcs/src/plugins/config/configtaskwidget.cpp index 87309ca63..90d21e494 100644 --- a/ground/openpilotgcs/src/plugins/config/configtaskwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configtaskwidget.cpp @@ -43,13 +43,24 @@ void ConfigTaskWidget::addUAVObject(QString objectName) { addUAVObjectToWidgetRelation(objectName,"",NULL); } -void ConfigTaskWidget::addUAVObjectToWidgetRelation(QString object, QString field, QWidget * widget) +void ConfigTaskWidget::addUAVObjectToWidgetRelation(QString object, QString field, QWidget * widget, QString index) +{ + UAVObject *obj=NULL; + UAVObjectField *_field=NULL; + obj = objManager->getObject(QString(object)); + _field = obj->getField(QString(field)); + addUAVObjectToWidgetRelation(object,field,widget,_field->getElementNames().indexOf(index)); +} + +void ConfigTaskWidget::addUAVObjectToWidgetRelation(QString object, QString field, QWidget * widget, int index,int scale) { UAVObject *obj=NULL; UAVObjectField *_field=NULL; if(!object.isEmpty()) + { obj = objManager->getObject(QString(object)); - connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(refreshWidgetsValues())); + connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(refreshWidgetsValues())); + } //smartsave->addObject(obj); if(!field.isEmpty() && obj) _field = obj->getField(QString(field)); @@ -57,6 +68,8 @@ void ConfigTaskWidget::addUAVObjectToWidgetRelation(QString object, QString fiel ow->field=_field; ow->object=obj; ow->widget=widget; + ow->index=index; + ow->scale=scale; objOfInterest.append(ow); if(obj) smartsave->addObject(obj); @@ -156,11 +169,15 @@ void ConfigTaskWidget::populateWidgets() else if(QComboBox * cb=qobject_cast(ow->widget)) { cb->addItems(ow->field->getOptions()); - cb->setCurrentIndex(cb->findText(ow->field->getValue().toString())); + cb->setCurrentIndex(cb->findText(ow->field->getValue(ow->index).toString())); } else if(QLabel * cb=qobject_cast(ow->widget)) { - cb->setText(ow->field->getValue().toString()); + cb->setText(ow->field->getValue(ow->index).toString()); + } + else if(QSpinBox * cb=qobject_cast(ow->widget)) + { + cb->setValue(ow->field->getValue(ow->index).toInt()/ow->scale); } } setDirty(dirtyBack); @@ -177,11 +194,15 @@ void ConfigTaskWidget::refreshWidgetsValues() } else if(QComboBox * cb=qobject_cast(ow->widget)) { - cb->setCurrentIndex(cb->findText(ow->field->getValue().toString())); + cb->setCurrentIndex(cb->findText(ow->field->getValue(ow->index).toString())); } else if(QLabel * cb=qobject_cast(ow->widget)) { - cb->setText(ow->field->getValue().toString()); + cb->setText(ow->field->getValue(ow->index).toString()); + } + else if(QSpinBox * cb=qobject_cast(ow->widget)) + { + cb->setValue(ow->field->getValue(ow->index).toInt()/ow->scale); } } setDirty(dirtyBack); @@ -197,11 +218,15 @@ void ConfigTaskWidget::updateObjectsFromWidgets() } else if(QComboBox * cb=qobject_cast(ow->widget)) { - ow->field->setValue(cb->currentText()); + ow->field->setValue(cb->currentText(),ow->index); } else if(QLabel * cb=qobject_cast(ow->widget)) { - ow->field->setValue(cb->text()); + ow->field->setValue(cb->text(),ow->index); + } + else if(QSpinBox * cb=qobject_cast(ow->widget)) + { + ow->field->setValue(cb->value()* ow->scale,ow->index); } } } diff --git a/ground/openpilotgcs/src/plugins/config/configtaskwidget.h b/ground/openpilotgcs/src/plugins/config/configtaskwidget.h index f5de26ed2..1db0dde9c 100644 --- a/ground/openpilotgcs/src/plugins/config/configtaskwidget.h +++ b/ground/openpilotgcs/src/plugins/config/configtaskwidget.h @@ -54,6 +54,8 @@ public: UAVObject * object; UAVObjectField * field; QWidget * widget; + int index; + int scale; }; ConfigTaskWidget(QWidget *parent = 0); @@ -63,10 +65,12 @@ public: static double listMean(QList list); void addUAVObject(QString objectName); void addWidget(QWidget * widget); - void addUAVObjectToWidgetRelation(QString object,QString field,QWidget * widget); + void addUAVObjectToWidgetRelation(QString object,QString field,QWidget * widget,int index=0,int scale=1); + void setupButtons(QPushButton * update,QPushButton * save); bool isDirty(); void setDirty(bool value); + void addUAVObjectToWidgetRelation(QString object, QString field, QWidget *widget, QString index); public slots: void onAutopilotDisconnect(); void onAutopilotConnect(); @@ -75,6 +79,7 @@ private slots: virtual void refreshValues(); virtual void updateObjectsFromWidgets(); private: + QStringList objectsList; QList objOfInterest; ExtensionSystem::PluginManager *pm; UAVObjectManager *objManager; diff --git a/ground/openpilotgcs/src/plugins/config/input.ui b/ground/openpilotgcs/src/plugins/config/input.ui index e1eb0b435..065967c26 100644 --- a/ground/openpilotgcs/src/plugins/config/input.ui +++ b/ground/openpilotgcs/src/plugins/config/input.ui @@ -25,770 +25,11 @@ - - - - 75 - true - - - - Receiver Type: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - 234 - 54 - - - - - 75 - true - - - - Indicates whether OpenPilot is getting a signal from the RC receiver. - - - RC Receiver not connected or invalid input configuration (missing channels) - - - true - - - - - - - - - Rev. - - - Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft - - - - - - - - 16 - 16 - - - - true - - - - - - - true - - - 1000 - - - 2000 - - - 1500 - - - Qt::Horizontal - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 2000 - - - - - - - Check this to reverse the channel. -(Useful for transmitters without channel -reversal capabilities). - - - - - - - - - - - - - true - - - 1000 - - - 2000 - - - 1500 - - - Qt::Horizontal - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 2000 - - - - - - - Check this to reverse the channel. -(Useful for transmitters without channel -reversal capabilities). - - - - - - - - - - - - - true - - - 1000 - - - 2000 - - - 1500 - - - Qt::Horizontal - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 2000 - - - - - - - Check this to reverse the channel. -(Useful for transmitters without channel -reversal capabilities). - - - - - - - - - - - - - true - - - 1000 - - - 2000 - - - 1500 - - - Qt::Horizontal - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 2000 - - - - - - - Check this to reverse the channel. -(Useful for transmitters without channel -reversal capabilities). - - - - - - - - - - - - - true - - - 1000 - - - 2000 - - - 1500 - - - Qt::Horizontal - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 2000 - - - - - - - Check this to reverse the channel. -(Useful for transmitters without channel -reversal capabilities). - - - - - - - - - - - - - true - - - 1000 - - - 2000 - - - 1500 - - - Qt::Horizontal - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 2000 - - - - - - - Check this to reverse the channel. -(Useful for transmitters without channel -reversal capabilities). - - - - - - - - - - - - - true - - - 1000 - - - 2000 - - - 1500 - - - Qt::Horizontal - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 2000 - - - - - - - Check this to reverse the channel. -(Useful for transmitters without channel -reversal capabilities). - - - - - - - - - - - - - true - - - 1000 - - - 2000 - - - 1500 - - - Qt::Horizontal - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 2000 - - - - - - - Check this to reverse the channel. -(Useful for transmitters without channel -reversal capabilities). - - - - - - - - - - - 75 - true - - - - BEWARE: make sure your engines are not connected when running calibration! - - - - - - - - - 75 - true - - - - - - - - - - - - 50 - false - - - - Start calibrating the RC Inputs. -Uncheck/Check to restart calibration. -During calibration: move your RC controls over their whole range, -then leave them on Neutral, uncheck calibration and save. -Neutral should be put at the bottom of the slider for the throttle. - - - Run Calibration - - - - - - - - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Minimum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 1000 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Minimum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 1000 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Minimum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 1000 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Minimum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 1000 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Minimum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 1000 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Minimum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 1000 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Minimum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 1000 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Minimum channel pulse width</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(microseconds)</p></body></html> - - - 1000 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Current channel value.</span></p></body></html> - - - 1500 - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Current channel value.</span></p></body></html> - - - 1500 - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Current channel value.</span></p></body></html> - - - 1500 - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Current channel value.</span></p></body></html> - - - 1500 - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Current channel value.</span></p></body></html> - - - 1500 - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Current channel value.</span></p></body></html> - - - 1500 - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Current channel value.</span></p></body></html> - - - 1500 - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'FreeSans'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt;">Current channel value.</span></p></body></html> - - - 1500 - + + + + + @@ -1243,14 +484,6 @@ Applies and Saves all settings to SD - ch0Assign - ch1Assign - ch2Assign - ch3Assign - ch4Assign - ch5Assign - ch6Assign - ch7Assign fmsSlider fmsModePos3 fmsSsPos3Roll @@ -1268,134 +501,5 @@ Applies and Saves all settings to SD - - - inSlider0 - valueChanged(int) - ch0Cur - setNum(int) - - - 291 - 93 - - - 150 - 104 - - - - - inSlider1 - valueChanged(int) - ch1Cur - setNum(int) - - - 283 - 137 - - - 160 - 138 - - - - - inSlider2 - valueChanged(int) - ch2Cur - setNum(int) - - - 341 - 163 - - - 156 - 167 - - - - - inSlider3 - valueChanged(int) - ch3Cur - setNum(int) - - - 283 - 211 - - - 159 - 210 - - - - - inSlider4 - valueChanged(int) - ch4Cur - setNum(int) - - - 287 - 239 - - - 156 - 242 - - - - - inSlider5 - valueChanged(int) - ch5Cur - setNum(int) - - - 309 - 272 - - - 164 - 276 - - - - - inSlider6 - valueChanged(int) - ch6Cur - setNum(int) - - - 282 - 300 - - - 144 - 311 - - - - - inSlider7 - valueChanged(int) - ch7Cur - setNum(int) - - - 278 - 339 - - - 168 - 340 - - - - + diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp b/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp new file mode 100644 index 000000000..904918a8e --- /dev/null +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp @@ -0,0 +1,29 @@ +#include "inputchannelform.h" +#include "ui_inputchannelform.h" + +inputChannelForm::inputChannelForm(QWidget *parent,bool showlegend) : + QWidget(parent), + ui(new Ui::inputChannelForm) +{ + ui->setupUi(this); + if(!showlegend) + { + layout()->removeWidget(ui->legend0); + layout()->removeWidget(ui->legend1); + layout()->removeWidget(ui->legend2); + layout()->removeWidget(ui->legend3); + layout()->removeWidget(ui->legend4); + layout()->removeWidget(ui->legend5); + delete ui->legend0; + delete ui->legend1; + delete ui->legend2; + delete ui->legend3; + delete ui->legend4; + delete ui->legend5; + } +} + +inputChannelForm::~inputChannelForm() +{ + delete ui; +} diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.h b/ground/openpilotgcs/src/plugins/config/inputchannelform.h new file mode 100644 index 000000000..50615cb2c --- /dev/null +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.h @@ -0,0 +1,23 @@ +#ifndef INPUTCHANNELFORM_H +#define INPUTCHANNELFORM_H + +#include +#include "configinputwidget.h" +namespace Ui { + class inputChannelForm; +} + +class inputChannelForm : public QWidget +{ + Q_OBJECT + +public: + explicit inputChannelForm(QWidget *parent = 0,bool showlegend=false); + ~inputChannelForm(); + friend class ConfigInputWidget; + +private: + Ui::inputChannelForm *ui; +}; + +#endif // INPUTCHANNELFORM_H diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.ui b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui new file mode 100644 index 000000000..0c602a21b --- /dev/null +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui @@ -0,0 +1,119 @@ + + + inputChannelForm + + + + 0 + 0 + 389 + 57 + + + + Form + + + + + + true + + + Number + + + + + + + true + + + Min + + + + + + + true + + + Function + + + + + + + true + + + Group + + + + + + + TextLabel + + + + + + + + + + 255 + + + + + + + true + + + Neutral + + + + + + + 9999 + + + + + + + 9999 + + + + + + + true + + + Max + + + + + + + 9999 + + + + + + + + diff --git a/ground/openpilotgcs/src/plugins/config/smartsavebutton.cpp b/ground/openpilotgcs/src/plugins/config/smartsavebutton.cpp index 708c1b5c1..dff4e409e 100644 --- a/ground/openpilotgcs/src/plugins/config/smartsavebutton.cpp +++ b/ground/openpilotgcs/src/plugins/config/smartsavebutton.cpp @@ -35,7 +35,9 @@ void smartSaveButton::processClick() connect(&timer,SIGNAL(timeout()),&loop,SLOT(quit())); obj->updated(); timer.start(1000); + qDebug()<<"begin loop"; loop.exec(); + qDebug()<<"end loop"; timer.stop(); disconnect(obj,SIGNAL(transactionCompleted(UAVObject*,bool)),this,SLOT(transaction_finished(UAVObject*, bool))); disconnect(&timer,SIGNAL(timeout()),&loop,SLOT(quit()));