diff --git a/images/earth.html b/images/earth.html index 363e97d22dd3c8c6b256d944d019a602a27bd757..7666c68aa52ade4dbf6c3dd75d6c3030461dbcd2 100644 --- a/images/earth.html +++ b/images/earth.html @@ -683,11 +683,17 @@ function updateFollowAircraft() if (viewMode != 3) // VIEW_MODE_CHASE_FREE { - currView.setTilt(currFollowTilt); - currView.setHeading(currFollowHeading); + ge.getView().setAbstractView(currView); + var camera = ge.getView().copyAsCamera(ge.ALTITUDE_ABSOLUTE); + camera.setTilt(currFollowTilt); + camera.setRoll(0); + camera.setHeading(currFollowHeading); + ge.getView().setAbstractView(camera); + } + else + { + ge.getView().setAbstractView(currView); } - - ge.getView().setAbstractView(currView); } function failureCallback(object) diff --git a/src/comm/MAVLinkProtocol.cc b/src/comm/MAVLinkProtocol.cc index c975182b0a5a950be412b97d1a0b4ade5b577597..f970c493d41edd96b8af568116a02ffd0734f64d 100644 --- a/src/comm/MAVLinkProtocol.cc +++ b/src/comm/MAVLinkProtocol.cc @@ -147,13 +147,6 @@ MAVLinkProtocol::~MAVLinkProtocol() } } - - -void MAVLinkProtocol::run() -{ - exec(); -} - QString MAVLinkProtocol::getLogfileName() { if (m_logfile) { @@ -173,7 +166,7 @@ QString MAVLinkProtocol::getLogfileName() **/ void MAVLinkProtocol::receiveBytes(LinkInterface* link, QByteArray b) { - receiveMutex.lock(); +// receiveMutex.lock(); mavlink_message_t message; mavlink_status_t status; for (int position = 0; position < b.size(); position++) { @@ -330,7 +323,7 @@ void MAVLinkProtocol::receiveBytes(LinkInterface* link, QByteArray b) } } } - receiveMutex.unlock(); +// receiveMutex.unlock(); } /** diff --git a/src/comm/MAVLinkProtocol.h b/src/comm/MAVLinkProtocol.h index b0749856dc9fc79cb1b40d583471cf3fa8a78412..57e80c86614acf30a1b3f2add002afa53587d3cf 100644 --- a/src/comm/MAVLinkProtocol.h +++ b/src/comm/MAVLinkProtocol.h @@ -57,7 +57,6 @@ public: MAVLinkProtocol(); ~MAVLinkProtocol(); - void run(); /** @brief Get the human-friendly name of this protocol */ QString getName(); /** @brief Get the system id of this application */ diff --git a/src/comm/ProtocolInterface.h b/src/comm/ProtocolInterface.h index 070c6755ef9eb54bd67005a4a189c4cfff407f4d..6f0e5839d86949900690d48948caeb98f258f5e7 100644 --- a/src/comm/ProtocolInterface.h +++ b/src/comm/ProtocolInterface.h @@ -46,7 +46,7 @@ This file is part of the PIXHAWK project * @see LinkManager. * **/ -class ProtocolInterface : public QThread +class ProtocolInterface : public QObject { Q_OBJECT public: diff --git a/src/uas/UAS.cc b/src/uas/UAS.cc index 5429ae6b7bd4cf681382c6bda75280f854d1796d..3979f7156d82933d5bdb44d2a8f5b52cc0e8ce66 100644 --- a/src/uas/UAS.cc +++ b/src/uas/UAS.cc @@ -1733,6 +1733,20 @@ void UAS::setParameter(const int component, const QString& id, const QVariant& v } } +void UAS::requestParameter(int component, int id) +{ + // Request parameter, use parameter name to request it + mavlink_message_t msg; + mavlink_param_request_read_t read; + read.param_index = id; + read.param_id[0] = '\0'; // Enforce null termination + read.target_system = uasId; + read.target_component = component; + mavlink_msg_param_request_read_encode(mavlink->getSystemId(), mavlink->getComponentId(), &msg, &read); + sendMessage(msg); + qDebug() << __FILE__ << __LINE__ << "REQUESTING PARAM RETRANSMISSION FROM COMPONENT" << component << "FOR PARAM ID" << id; +} + void UAS::requestParameter(int component, const QString& parameter) { // Request parameter, use parameter name to request it @@ -1750,7 +1764,7 @@ void UAS::requestParameter(int component, const QString& parameter) read.target_component = component; mavlink_msg_param_request_read_encode(mavlink->getSystemId(), mavlink->getComponentId(), &msg, &read); sendMessage(msg); - qDebug() << __FILE__ << __LINE__ << "REQUESTING PARAM RETRANSMISSION FROM COMPONENT" << component << "FOR PARAM ID" << parameter; + qDebug() << __FILE__ << __LINE__ << "REQUESTING PARAM RETRANSMISSION FROM COMPONENT" << component << "FOR PARAM NAME" << parameter; } void UAS::setSystemType(int systemType) @@ -1840,13 +1854,9 @@ void UAS::executeCommand(MAV_CMD command, int confirmation, float param1, float **/ void UAS::launch() { - // FIXME MAVLINKV10PORTINGNEEDED -// mavlink_message_t msg; -// // TODO Replace MG System ID with static function call and allow to change ID in GUI -// mavlink_msg_action_pack(mavlink->getSystemId(), mavlink->getComponentId(), &msg, this->getUASID(), MAV_COMP_ID_IMU, (uint8_t)MAV_ACTION_TAKEOFF); -// // Send message twice to increase chance of reception -// sendMessage(msg); -// sendMessage(msg); + mavlink_message_t msg; + mavlink_msg_command_short_pack(mavlink->getSystemId(), mavlink->getComponentId(), &msg, this->getUASID(), 0, MAV_CMD_NAV_TAKEOFF, 1, 0, 0, 0, 0); + sendMessage(msg); } /** diff --git a/src/uas/UAS.h b/src/uas/UAS.h index e9b082357f31945bafc90b11dbdd680def479cf9..ad263b857a0238064bfa41cb3705e0a77b137b70 100644 --- a/src/uas/UAS.h +++ b/src/uas/UAS.h @@ -465,8 +465,10 @@ public slots: /** @brief Request all parameters */ void requestParameters(); - /** @brief Request a single parameter by index */ + /** @brief Request a single parameter by name */ void requestParameter(int component, const QString& parameter); + /** @brief Request a single parameter by index */ + void requestParameter(int component, int id); /** @brief Set a system parameter */ void setParameter(const int component, const QString& id, const QVariant& value); diff --git a/src/uas/UASManager.cc b/src/uas/UASManager.cc index 64a83a445baa9cbb14ae1bf6a391405f2f2c8b94..36b4eeac470bd0f79f88a0c9a4a49525c5edfb8e 100644 --- a/src/uas/UASManager.cc +++ b/src/uas/UASManager.cc @@ -216,7 +216,6 @@ UASManager::UASManager() : homeLon(8.549444), homeAlt(470.0) { - start(QThread::LowPriority); loadSettings(); setLocalNEDSafetyBorders(1, -1, 0, -1, 1, -1); } @@ -230,16 +229,6 @@ UASManager::~UASManager() } } - -void UASManager::run() -{ - // forever - // { - // QGC::SLEEP::msleep(5000); - // } - exec(); -} - void UASManager::addUAS(UASInterface* uas) { // WARNING: The active uas is set here diff --git a/src/uas/UASManager.h b/src/uas/UASManager.h index c19732767a820d1b0a0f00067a61cf55453d2ccc..6407e83fe2ba1597575a20906d5c6ca6299587e8 100644 --- a/src/uas/UASManager.h +++ b/src/uas/UASManager.h @@ -44,7 +44,7 @@ This file is part of the QGROUNDCONTROL project * This class keeps a list of all connected / configured UASs. It also stores which * UAS is currently select with respect to user input or manual controls. **/ -class UASManager : public QThread +class UASManager : public QObject { Q_OBJECT @@ -52,7 +52,6 @@ public: static UASManager* instance(); ~UASManager(); - void run(); /** * @brief Get the currently selected UAS * diff --git a/src/ui/HDDisplay.cc b/src/ui/HDDisplay.cc index 8ee4b3c37964098253fc034ed07eaa3f7be7bf7f..c786af608f4e99d858b1351426ed591284370c12 100644 --- a/src/ui/HDDisplay.cc +++ b/src/ui/HDDisplay.cc @@ -50,7 +50,8 @@ HDDisplay::HDDisplay(QStringList* plotList, QString title, QWidget *parent) : acceptUnitList(new QStringList()), lastPaintTime(0), columns(3), - m_ui(new Ui::HDDisplay) + valuesChanged(true)/*, + m_ui(new Ui::HDDisplay)*/ { setWindowTitle(title); //m_ui->setupUi(this); @@ -65,9 +66,6 @@ HDDisplay::HDDisplay(QStringList* plotList, QString title, QWidget *parent) : } restoreState(); - - // Set minimum size - setMinimumSize(60, 60); // Set preferred size setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); @@ -109,6 +107,7 @@ HDDisplay::HDDisplay(QStringList* plotList, QString title, QWidget *parent) : // setCursor(Qt::OpenHandCursor); + // Set minimum size this->setMinimumHeight(125); this->setMinimumWidth(100); @@ -231,6 +230,8 @@ void HDDisplay::restoreState() QSettings settings; settings.sync(); + acceptList->clear(); + QStringList instruments = settings.value(windowTitle()+"_gauges").toString().split('|'); for (int i = 0; i < instruments.count(); i++) { addGauge(instruments.at(i)); @@ -385,6 +386,8 @@ void HDDisplay::setTitle() void HDDisplay::renderOverlay() { + if (!valuesChanged || !isVisible()) return; + #if (QGC_EVENTLOOP_DEBUG) qDebug() << "EVENTLOOP:" << __FILE__ << __LINE__; #endif @@ -666,7 +669,7 @@ void HDDisplay::drawSystemIndicator(float xRef, float yRef, int maxNum, float ma // x speed: 2.54 // One column per value - QMapIterator value(values); + QMapIterator value(values); float x = xRef; float y = yRef; @@ -820,6 +823,7 @@ void HDDisplay::updateValue(const int uasId, const QString& name, const QString& valuesMean.insert(name, (oldMean * meanCount + value) / (meanCount + 1)); valuesCount.insert(name, meanCount + 1); valuesDot.insert(name, (value - values.value(name, 0.0f)) / ((msec - lastUpdate.value(name, 0))/1000.0f)); + if (values.value(name, 0.0) != value) valuesChanged = true; values.insert(name, value); units.insert(name, unit); lastUpdate.insert(name, msec); diff --git a/src/ui/HDDisplay.h b/src/ui/HDDisplay.h index 4c2c430f552bd857eeb983fd585d94d00cb22ac9..15a2240d195cf42031d843d53abd38012867fe42 100644 --- a/src/ui/HDDisplay.h +++ b/src/ui/HDDisplay.h @@ -139,7 +139,7 @@ protected: // virtual void resizeEvent(QResizeEvent* event); UASInterface* uas; ///< The uas currently monitored - QMap values; ///< The variables this HUD displays + QMap values; ///< The variables this HUD displays QMap units; ///< The units QMap valuesDot; ///< First derivative of the variable QMap valuesMean; ///< Mean since system startup for this variable @@ -172,7 +172,7 @@ protected: int warningBlinkRate; ///< Blink rate of warning messages, will be rounded to the refresh rate QTimer* refreshTimer; ///< The main timer, controls the update rate - static const int updateInterval = 120; ///< Update interval in milliseconds + static const int updateInterval = 300; ///< Update interval in milliseconds QPainter* hudPainter; QFont font; ///< The HUD font, per default the free Bitstream Vera SANS, which is very close to actual HUD fonts QFontDatabase fontDatabase;///< Font database, only used to load the TrueType font file (the HUD font is directly loaded from file rather than from the system) @@ -191,6 +191,7 @@ protected: QAction* addGaugeAction; ///< Action adding a gauge QAction* setTitleAction; ///< Action setting the title QAction* setColumnsAction; ///< Action setting the number of columns + bool valuesChanged; private: Ui::HDDisplay *m_ui; diff --git a/src/ui/HSIDisplay.cc b/src/ui/HSIDisplay.cc index d397b51f2607ffa6926b43397ade03a6da58edce..ad6907e6e8ab0e9b372693155cde30d88bc979d7 100644 --- a/src/ui/HSIDisplay.cc +++ b/src/ui/HSIDisplay.cc @@ -179,6 +179,7 @@ void HSIDisplay::paintEvent(QPaintEvent * event) void HSIDisplay::renderOverlay() { + if (!isVisible()) return; #if (QGC_EVENTLOOP_DEBUG) qDebug() << "EVENTLOOP:" << __FILE__ << __LINE__; #endif diff --git a/src/ui/HSIDisplay.h b/src/ui/HSIDisplay.h index 82ab7821352baaf43737f3b3a9ca9ea57b0c8e8c..320b577d300b555481841f82b03b045f1ee1f2a0 100644 --- a/src/ui/HSIDisplay.h +++ b/src/ui/HSIDisplay.h @@ -79,6 +79,7 @@ public slots: /** @brief Ultrasound/Infrared localization changed */ void updateInfraredUltrasoundLocalization(UASInterface* uas, int fix); + /** @brief Repaint the widget */ void paintEvent(QPaintEvent * event); /** @brief Update state from joystick */ void updateJoystick(double roll, double pitch, double yaw, double thrust, int xHat, int yHat); diff --git a/src/ui/MAVLinkDecoder.cc b/src/ui/MAVLinkDecoder.cc index 57fa86546babac9015ef33b73b039e25e9d8e717..51862e7250fac5a892eb8d5360668b5b4de2585f 100644 --- a/src/ui/MAVLinkDecoder.cc +++ b/src/ui/MAVLinkDecoder.cc @@ -21,6 +21,11 @@ MAVLinkDecoder::MAVLinkDecoder(MAVLinkProtocol* protocol, QObject *parent) : messageFilter.insert(MAVLINK_MSG_ID_MISSION_COUNT, false); messageFilter.insert(MAVLINK_MSG_ID_MISSION_ACK, false); + textMessageFilter.insert(MAVLINK_MSG_ID_DEBUG, false); + textMessageFilter.insert(MAVLINK_MSG_ID_DEBUG_VECT, false); + textMessageFilter.insert(MAVLINK_MSG_ID_NAMED_VALUE_FLOAT, false); + textMessageFilter.insert(MAVLINK_MSG_ID_NAMED_VALUE_INT, false); + connect(protocol, SIGNAL(messageReceived(LinkInterface*,mavlink_message_t)), this, SLOT(receiveMessage(LinkInterface*,mavlink_message_t))); } @@ -81,7 +86,7 @@ void MAVLinkDecoder::emitFieldValue(mavlink_message_t* msg, int fieldid, quint64 // Enforce null termination str[messageInfo[msgid].fields[fieldid].array_length-1] = '\0'; QString string(name + ": " + str); - emit textMessageReceived(msg->sysid, msg->compid, 0, string); + if (!textMessageFilter.contains(msgid)) emit textMessageReceived(msg->sysid, msg->compid, 0, string); } else { diff --git a/src/ui/MAVLinkDecoder.h b/src/ui/MAVLinkDecoder.h index 4e55eb4579122c627ed0899a5d467ceb0ad16975..54f989430c937cb6a4f1d4c60bb7b2b2b48ee3f6 100644 --- a/src/ui/MAVLinkDecoder.h +++ b/src/ui/MAVLinkDecoder.h @@ -29,6 +29,7 @@ protected: mavlink_message_t receivedMessages[256]; ///< Available / known messages mavlink_message_info_t messageInfo[256]; ///< Message information QMap messageFilter; ///< Message/field names not to emit + QMap textMessageFilter; ///< Message/field names not to emit in text mode }; diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index 124b0e11d0cc7948ba60a7a40c43963744c33eee..72b3161d43363d1b57fed48f4121693dce7354f7 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -1249,11 +1249,8 @@ void MainWindow::UASCreated(UASInterface* uas) if (!ui.menuConnected_Systems->isEnabled()) ui.menuConnected_Systems->setEnabled(true); -// // Restore the mainwindow size -// if (settings.contains(getWindowGeometryKey())) -// { -// restoreGeometry(settings.value(getWindowGeometryKey()).toByteArray()); -// } + // Reload view state in case new widgets were added + loadViewState(); } /** diff --git a/src/ui/QGCParamWidget.cc b/src/ui/QGCParamWidget.cc index 4b02cdb9995212980bf2eba6490eb5c641e5f4f6..997d63d9f428aae7266830cedc6b2a0f1fe51af8 100644 --- a/src/ui/QGCParamWidget.cc +++ b/src/ui/QGCParamWidget.cc @@ -131,6 +131,7 @@ QGCParamWidget::QGCParamWidget(UASInterface* uas, QWidget *parent) : connect(uas, SIGNAL(parameterChanged(int,int,int,int,QString,QVariant)), this, SLOT(addParameter(int,int,int,int,QString,QVariant))); // Connect retransmission guard + connect(this, SIGNAL(requestParameter(int,QString)), uas, SLOT(requestParameter(int,QString))); connect(this, SIGNAL(requestParameter(int,int)), uas, SLOT(requestParameter(int,int))); connect(&retransmissionTimer, SIGNAL(timeout()), this, SLOT(retransmissionGuardTick())); } @@ -474,7 +475,7 @@ void QGCParamWidget::addParameter(int uas, int component, QString parameterName, // componentName = tr("Component #").arg(component); // break; // } - QString componentName = tr("Component #").arg(component); + QString componentName = tr("Component #%1").arg(component); addComponent(uas, component, componentName); } diff --git a/src/ui/QGCParamWidget.h b/src/ui/QGCParamWidget.h index 3d9bcf6bcf935501eaa23174f5d831ae09baa35c..13c2009c65a1459b7f7ea4ddf6ea09a73447e0ab 100644 --- a/src/ui/QGCParamWidget.h +++ b/src/ui/QGCParamWidget.h @@ -53,8 +53,10 @@ public: signals: /** @brief A parameter was changed in the widget, NOT onboard */ void parameterChanged(int component, QString parametername, QVariant value); - /** @brief Request a single parameter */ + /** @brief Request a single parameter by index */ void requestParameter(int component, int parameter); + /** @brief Request a single parameter by name */ + void requestParameter(int component, const QString& parameter); public slots: /** @brief Add a component to the list */ void addComponent(int uas, int component, QString componentName); diff --git a/src/ui/QGCToolBar.cc b/src/ui/QGCToolBar.cc index f9641ab947afc3b9cdd8e847954bbeb245617023..7797526eb59486faeaa5a15a5a0c2ba4050d5992 100644 --- a/src/ui/QGCToolBar.cc +++ b/src/ui/QGCToolBar.cc @@ -214,7 +214,7 @@ void QGCToolBar::setActiveUAS(UASInterface* active) disconnect(mav, SIGNAL(batteryChanged(UASInterface*,double,double,int)), this, SLOT(updateBatteryRemaining(UASInterface*,double,double,int))); if (mav->getWaypointManager()) { - disconnect(mav->getWaypointManager(), SIGNAL(currentWaypointChanged(int)), this, SLOT(updateCurrentWaypoint(int))); + disconnect(mav->getWaypointManager(), SIGNAL(currentWaypointChanged(quint16)), this, SLOT(updateCurrentWaypoint(quint16))); disconnect(mav->getWaypointManager(), SIGNAL(waypointDistanceChanged(double)), this, SLOT(updateWaypointDistance(double))); } } @@ -234,6 +234,7 @@ void QGCToolBar::setActiveUAS(UASInterface* active) } // Update all values once + systemName = mav->getUASName(); toolBarNameLabel->setText(mav->getUASName()); toolBarNameLabel->setStyleSheet(QString("QLabel { font: bold 16px; color: %1; }").arg(mav->getColor().name())); symbolButton->setStyleSheet(QString("QWidget { background-color: %1; color: #DDDDDF; background-clip: border; } QToolButton { font-weight: bold; font-size: 12px; border: 0px solid #999999; border-radius: 5px; min-width:22px; max-width: 22px; min-height: 22px; max-height: 22px; padding: 0px; margin: 0px 4px 0px 20px; background-color: none; }").arg(mav->getColor().name())); diff --git a/src/ui/designer/QGCCommandButton.cc b/src/ui/designer/QGCCommandButton.cc index d4cebf61174de4150b8e1343587ac64b0d6a1931..8f09ad0f65bea95ce95907c1785c6f4188d72041 100644 --- a/src/ui/designer/QGCCommandButton.cc +++ b/src/ui/designer/QGCCommandButton.cc @@ -170,12 +170,15 @@ void QGCCommandButton::readSettings(const QSettings& settings) } ui->editParamsVisibleCheckBox->setChecked(settings.value("QGC_COMMAND_BUTTON_PARAMS_VISIBLE").toBool()); - if (ui->editParamsVisibleCheckBox->isChecked()) { + if (ui->editParamsVisibleCheckBox->isChecked()) + { ui->editParam1SpinBox->show(); ui->editParam2SpinBox->show(); ui->editParam3SpinBox->show(); ui->editParam4SpinBox->show(); - } else { + } + else + { ui->editParam1SpinBox->hide(); ui->editParam2SpinBox->hide(); ui->editParam3SpinBox->hide(); diff --git a/src/ui/designer/QGCParamSlider.cc b/src/ui/designer/QGCParamSlider.cc index c1651e3b6ab2a3731083370e36e97d57323ccf47..1f85dc2ad5b068d31c8f7a4f39ff31a1c3d83013 100644 --- a/src/ui/designer/QGCParamSlider.cc +++ b/src/ui/designer/QGCParamSlider.cc @@ -20,6 +20,7 @@ QGCParamSlider::QGCParamSlider(QWidget *parent) : ui(new Ui::QGCParamSlider) { ui->setupUi(this); + ui->intValueSpinBox->hide(); uas = NULL; scaledInt = ui->valueSlider->maximum() - ui->valueSlider->minimum(); @@ -45,12 +46,14 @@ QGCParamSlider::QGCParamSlider(QWidget *parent) : connect(ui->editSelectComponentComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectComponent(int))); connect(ui->editSelectParamComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectParameter(int))); connect(ui->valueSlider, SIGNAL(valueChanged(int)), this, SLOT(setSliderValue(int))); - connect(ui->valueSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setParamValue(double))); + connect(ui->doubleValueSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setParamValue(double))); + connect(ui->intValueSpinBox, SIGNAL(valueChanged(int)), this, SLOT(setParamValue(int))); connect(ui->editNameLabel, SIGNAL(textChanged(QString)), ui->nameLabel, SLOT(setText(QString))); connect(ui->readButton, SIGNAL(clicked()), this, SLOT(requestParameter())); connect(ui->editRefreshParamsButton, SIGNAL(clicked()), this, SLOT(refreshParamList())); // Set the current UAS if present + connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(setActiveUAS(UASInterface*))); setActiveUAS(UASManager::instance()->getActiveUAS()); // Get param value @@ -66,21 +69,26 @@ void QGCParamSlider::refreshParamList() { ui->editSelectParamComboBox->setEnabled(true); ui->editSelectComponentComboBox->setEnabled(true); - if (uas) { + if (uas) + { uas->getParamManager()->requestParameterList(); } } void QGCParamSlider::setActiveUAS(UASInterface* activeUas) { - if (activeUas) { - if (uas) { - disconnect(uas, SIGNAL(parameterChanged(int,int,int,int,QString,float)), this, SLOT(setParameterValue(int,int,int,int,QString,float))); + if (activeUas) + { + if (uas) + { + disconnect(uas, SIGNAL(parameterChanged(int,int,int,int,QString,QVariant)), this, SLOT(setParameterValue(int,int,int,int,QString,QVariant))); } // Connect buttons and signals - connect(activeUas, SIGNAL(parameterChanged(int,int,int,int,QString,float)), this, SLOT(setParameterValue(int,int,int,int,QString,float)), Qt::UniqueConnection); + connect(activeUas, SIGNAL(parameterChanged(int,int,int,int,QString,QVariant)), this, SLOT(setParameterValue(int,int,int,int,QString,QVariant)), Qt::UniqueConnection); uas = activeUas; + // Update current param value + requestParameter(); } } @@ -98,6 +106,12 @@ void QGCParamSlider::setParamValue(double value) ui->valueSlider->setValue(floatToScaledInt(value)); } +void QGCParamSlider::setParamValue(int value) +{ + parameterValue = value; + ui->valueSlider->setValue(floatToScaledInt(value)); +} + void QGCParamSlider::selectComponent(int componentIndex) { this->component = ui->editSelectComponentComboBox->itemData(componentIndex).toInt(); @@ -111,7 +125,8 @@ void QGCParamSlider::selectParameter(int paramIndex) void QGCParamSlider::startEditMode() { ui->valueSlider->hide(); - ui->valueSpinBox->hide(); + ui->doubleValueSpinBox->hide(); + ui->intValueSpinBox->hide(); ui->nameLabel->hide(); ui->writeButton->hide(); ui->readButton->hide(); @@ -156,7 +171,21 @@ void QGCParamSlider::endEditMode() ui->writeButton->show(); ui->readButton->show(); ui->valueSlider->show(); - ui->valueSpinBox->show(); + switch (parameterValue.type()) + { + case QVariant::Int: + ui->intValueSpinBox->show(); + break; + case QVariant::UInt: + ui->intValueSpinBox->show(); + break; + case QMetaType::Float: + ui->doubleValueSpinBox->show(); + break; + default: + qCritical() << "ERROR: NO VALID PARAM TYPE"; + return; + } ui->nameLabel->show(); isInEditMode = false; emit editingFinished(); @@ -164,10 +193,20 @@ void QGCParamSlider::endEditMode() void QGCParamSlider::sendParameter() { - if (uas) { + if (uas) + { // Set value, param manager handles retransmission - uas->getParamManager()->setParameter(component, parameterName, parameterValue); - } else { + if (uas->getParamManager()) + { + uas->getParamManager()->setParameter(component, parameterName, parameterValue); + } + else + { + qDebug() << "UAS HAS NO PARAM MANAGER, DOING NOTHING"; + } + } + else + { qDebug() << __FILE__ << __LINE__ << "NO UAS SET, DOING NOTHING"; } } @@ -175,9 +214,21 @@ void QGCParamSlider::sendParameter() void QGCParamSlider::setSliderValue(int sliderValue) { parameterValue = scaledIntToFloat(sliderValue); - ui->valueSpinBox->setValue(parameterValue); -// QString unit(""); -// ui->valueLabel->setText(QString("%1 %2").arg(parameterValue, 6, 'f', 6, ' ').arg(unit)); + switch (parameterValue.type()) + { + case QVariant::Int: + ui->intValueSpinBox->setValue(parameterValue.toInt()); + break; + case QVariant::UInt: + ui->intValueSpinBox->setValue(parameterValue.toUInt()); + break; + case QMetaType::Float: + ui->doubleValueSpinBox->setValue(parameterValue.toFloat()); + break; + default: + qCritical() << "ERROR: NO VALID PARAM TYPE"; + return; + } } /** @@ -186,38 +237,67 @@ void QGCParamSlider::setSliderValue(int sliderValue) * @brief parameterName Key/name of the parameter * @brief value Value of the parameter */ -void QGCParamSlider::setParameterValue(int uas, int component, int paramCount, int paramIndex, QString parameterName, float value) +void QGCParamSlider::setParameterValue(int uas, int component, int paramCount, int paramIndex, QString parameterName, QVariant value) { Q_UNUSED(paramCount); // Check if this component and parameter are part of the list bool found = false; - for (int i = 0; i< ui->editSelectComponentComboBox->count(); ++i) { - if (component == ui->editSelectComponentComboBox->itemData(i).toInt()) { + for (int i = 0; i< ui->editSelectComponentComboBox->count(); ++i) + { + if (component == ui->editSelectComponentComboBox->itemData(i).toInt()) + { found = true; } } - if (!found) { + if (!found) + { ui->editSelectComponentComboBox->addItem(tr("Component #%1").arg(component), component); } // Parameter checking found = false; - for (int i = 0; i < ui->editSelectParamComboBox->count(); ++i) { - if (parameterName == ui->editSelectParamComboBox->itemText(i)) { + for (int i = 0; i < ui->editSelectParamComboBox->count(); ++i) + { + if (parameterName == ui->editSelectParamComboBox->itemText(i)) + { found = true; } } - if (!found) { + if (!found) + { ui->editSelectParamComboBox->addItem(parameterName, paramIndex); } Q_UNUSED(uas); - if (component == this->component && parameterName == this->parameterName) { + if (component == this->component && parameterName == this->parameterName) + { parameterValue = value; - ui->valueSpinBox->setValue(value); - ui->valueSlider->setValue(floatToScaledInt(value)); + switch (value.type()) + { + case QVariant::Int: + ui->intValueSpinBox->show(); + ui->doubleValueSpinBox->hide(); + ui->intValueSpinBox->setValue(value.toDouble()); + ui->intValueSpinBox->setMinimum(-ui->intValueSpinBox->maximum()); + break; + case QVariant::UInt: + ui->intValueSpinBox->show(); + ui->doubleValueSpinBox->hide(); + ui->intValueSpinBox->setValue(value.toDouble()); + ui->intValueSpinBox->setMinimum(0); + break; + case QMetaType::Float: + ui->doubleValueSpinBox->setValue(value.toDouble()); + ui->doubleValueSpinBox->show(); + ui->intValueSpinBox->hide(); + break; + default: + qCritical() << "ERROR: NO VALID PARAM TYPE"; + return; + } + ui->valueSlider->setValue(floatToScaledInt(value.toDouble())); } } diff --git a/src/ui/designer/QGCParamSlider.h b/src/ui/designer/QGCParamSlider.h index 94783c549cb5778e175459d7a6cd92769880e08a..6e9612d6842be4d4d59797b7c439329ec2b4c6d8 100644 --- a/src/ui/designer/QGCParamSlider.h +++ b/src/ui/designer/QGCParamSlider.h @@ -28,14 +28,17 @@ public slots: /** @brief Set the slider value as parameter value */ void setSliderValue(int sliderValue); /** @brief Update the UI with the new parameter value */ - void setParameterValue(int uas, int component, int paramCount, int paramIndex, QString parameterName, float value); + void setParameterValue(int uas, int component, int paramCount, int paramIndex, QString parameterName, const QVariant value); void writeSettings(QSettings& settings); void readSettings(const QSettings& settings); void refreshParamList(); void setActiveUAS(UASInterface *uas); void selectComponent(int componentIndex); void selectParameter(int paramIndex); + /** @brief Set a double parameter value */ void setParamValue(double value); + /** @brief Set an integer parameter value */ + void setParamValue(int value); protected slots: /** @brief Request the parameter of this widget from the MAV */ @@ -43,7 +46,7 @@ protected slots: protected: QString parameterName; ///< Key/Name of the parameter - float parameterValue; ///< Value of the parameter + QVariant parameterValue; ///< Value of the parameter double parameterScalingFactor; ///< Factor to scale the parameter between slider and true value float parameterMin; float parameterMax; diff --git a/src/ui/designer/QGCParamSlider.ui b/src/ui/designer/QGCParamSlider.ui index f3509675ed412e6354e0569854ef796be802993e..488be8f12d8db70894033a85228bb0cee159b260 100644 --- a/src/ui/designer/QGCParamSlider.ui +++ b/src/ui/designer/QGCParamSlider.ui @@ -7,7 +7,7 @@ 0 0 789 - 155 + 158 @@ -147,7 +147,7 @@ - + -999999999.000000000000000 @@ -246,6 +246,16 @@ + + + + -999999999 + + + 999999999 + + + diff --git a/src/ui/designer/QGCToolWidget.cc b/src/ui/designer/QGCToolWidget.cc index b83437b4b2e52fdfaf06b6319dcd8d2863b8c858..b3baa6487231847fdad3efd0b6287186ec7a1197 100644 --- a/src/ui/designer/QGCToolWidget.cc +++ b/src/ui/designer/QGCToolWidget.cc @@ -47,7 +47,6 @@ QGCToolWidget::QGCToolWidget(const QString& title, QWidget *parent) : } this->setWindowTitle(title); - //setObjectName(title+"WIDGET"); QList systems = UASManager::instance()->getUASList(); foreach (UASInterface* uas, systems) @@ -64,8 +63,8 @@ QGCToolWidget::QGCToolWidget(const QString& title, QWidget *parent) : QGCToolWidget::~QGCToolWidget() { - if (mainMenuAction) delete mainMenuAction; - QGCToolWidget::instances()->remove(widgetTitle); + if (mainMenuAction) mainMenuAction->deleteLater(); + if (QGCToolWidget::instances()) QGCToolWidget::instances()->remove(widgetTitle); delete ui; } @@ -99,6 +98,7 @@ QList QGCToolWidget::createWidgetsFromSettings(QWidget* parent, else { settings = new QSettings(); + qDebug() << "LOADING SETTINGS FROM DEFAULT" << settings->fileName(); } QList newWidgets; @@ -206,10 +206,12 @@ void QGCToolWidget::storeWidgetsToSettings(QString settingsFile) if (!settingsFile.isEmpty()) { settings = new QSettings(settingsFile, QSettings::IniFormat); + qDebug() << "STORING SETTINGS TO" << settings->fileName(); } else { settings = new QSettings(); + qDebug() << "STORING SETTINGS TO DEFAULT" << settings->fileName(); } settings->beginWriteArray("QGC_TOOL_WIDGET_NAMES"); @@ -228,6 +230,12 @@ void QGCToolWidget::storeWidgetsToSettings(QString settingsFile) delete settings; } +void QGCToolWidget::storeSettings() +{ + QSettings settings; + storeSettings(settings); +} + void QGCToolWidget::storeSettings(const QString& settingsFile) { QSettings settings(settingsFile, QSettings::IniFormat); @@ -271,6 +279,7 @@ void QGCToolWidget::contextMenuEvent (QContextMenuEvent* event) QMenu menu(this); menu.addAction(addParamAction); menu.addAction(addCommandAction); + menu.addSeparator(); menu.addAction(setTitleAction); menu.addAction(exportAction); menu.addAction(importAction); @@ -281,7 +290,6 @@ void QGCToolWidget::contextMenuEvent (QContextMenuEvent* event) void QGCToolWidget::hideEvent(QHideEvent* event) { // Store settings - storeWidgetsToSettings(); QWidget::hideEvent(event); } @@ -340,6 +348,7 @@ QList* QGCToolWidget::itemList() void QGCToolWidget::addParam() { QGCParamSlider* slider = new QGCParamSlider(this); + connect(slider, SIGNAL(destroyed()), this, SLOT(storeSettings())); if (ui->hintLabel) { ui->hintLabel->deleteLater(); @@ -352,6 +361,7 @@ void QGCToolWidget::addParam() void QGCToolWidget::addCommand() { QGCCommandButton* button = new QGCCommandButton(this); + connect(button, SIGNAL(destroyed()), this, SLOT(storeSettings())); if (ui->hintLabel) { ui->hintLabel->deleteLater(); @@ -368,6 +378,7 @@ void QGCToolWidget::addToolWidget(QGCToolWidgetItem* widget) ui->hintLabel->deleteLater(); ui->hintLabel = NULL; } + connect(widget, SIGNAL(destroyed()), this, SLOT(storeSettings())); toolLayout->addWidget(widget); } @@ -436,7 +447,6 @@ void QGCToolWidget::setTitle(QString title) QWidget::setWindowTitle(title); if (parent) parent->setWindowTitle(title); - storeWidgetsToSettings(); emit titleChanged(title); if (mainMenuAction) mainMenuAction->setText(title); } diff --git a/src/ui/designer/QGCToolWidget.h b/src/ui/designer/QGCToolWidget.h index 8747689cc814272f48688d1e64f37551c1c68e20..80ab4fc75c7ead553577250ff29e1ae191debad3 100644 --- a/src/ui/designer/QGCToolWidget.h +++ b/src/ui/designer/QGCToolWidget.h @@ -53,6 +53,8 @@ public slots: void storeSettings(QSettings& settings); /** @brief Store this widget to a settings file */ void storeSettings(const QString& settingsFile); + /** @brief Store this widget to a settings file */ + void storeSettings(); /** @brief Store the view id and dock widget area */ void setViewVisibilityAndDockWidgetArea(int view, bool visible, Qt::DockWidgetArea area); diff --git a/src/ui/map3D/QGCGoogleEarthView.cc b/src/ui/map3D/QGCGoogleEarthView.cc index 67550c75581a6c31a2e4b78d65f7bc3c5fbe604c..8900ff587fe15f3cf46af9e13ce8720f9d953330 100644 --- a/src/ui/map3D/QGCGoogleEarthView.cc +++ b/src/ui/map3D/QGCGoogleEarthView.cc @@ -610,7 +610,8 @@ void QGCGoogleEarthView::updateState() // Update all MAVs QList mavs = UASManager::instance()->getUASList(); - foreach (UASInterface* currMav, mavs) { + foreach (UASInterface* currMav, mavs) + { uasId = currMav->getUASID(); lat = currMav->getLatitude(); lon = currMav->getLongitude(); @@ -637,9 +638,9 @@ void QGCGoogleEarthView::updateState() // Microsoft API available in Qt - improvements wanted // First check if a new WP should be created -// bool newWaypointPending = .to bool newWaypointPending = documentElement("newWaypointPending").toBool(); - if (newWaypointPending) { + if (newWaypointPending) + { bool coordsOk = true; bool ok; double latitude = documentElement("newWaypointLatitude").toDouble(&ok); @@ -648,15 +649,14 @@ void QGCGoogleEarthView::updateState() coordsOk &= ok; double altitude = documentElement("newWaypointAltitude").toDouble(&ok); coordsOk &= ok; - if (coordsOk) { + if (coordsOk) + { // Add new waypoint - if (mav) { + if (mav) + { int nextIndex = mav->getWaypointManager()->getWaypointList().count(); Waypoint* wp = new Waypoint(nextIndex, latitude, longitude, altitude, true); wp->setFrame(MAV_FRAME_GLOBAL); -// wp.setLatitude(latitude); -// wp.setLongitude(longitude); -// wp.setAltitude(altitude); mav->getWaypointManager()->addWaypoint(wp); } } @@ -666,7 +666,8 @@ void QGCGoogleEarthView::updateState() // Check if a waypoint should be moved bool dragWaypointPending = documentElement("dragWaypointPending").toBool(); - if (dragWaypointPending) { + if (dragWaypointPending) + { bool coordsOk = true; bool ok; double latitude = documentElement("dragWaypointLatitude").toDouble(&ok); @@ -677,21 +678,27 @@ void QGCGoogleEarthView::updateState() coordsOk &= ok; // UPDATE WAYPOINTS, HOME LOCATION AND OTHER LOCATIONS - if (coordsOk) { + if (coordsOk) + { QString idText = documentElement("dragWaypointIndex").toString(); - if (idText == "HOME") { + if (idText == "HOME") + { qDebug() << "HOME UPDATED!"; UASManager::instance()->setHomePosition(latitude, longitude, altitude); ui->setHomeButton->setChecked(false); - } else { + } + else + { // Update waypoint or symbol - if (mav) { + if (mav) + { QVector wps = mav->getWaypointManager()->getGlobalFrameAndNavTypeWaypointList(); bool ok; int index = idText.toInt(&ok); - if (ok && index >= 0 && index < wps.count()) { + if (ok && index >= 0 && index < wps.count()) + { Waypoint* wp = wps.at(index); wp->setLatitude(latitude); wp->setLongitude(longitude); @@ -700,7 +707,9 @@ void QGCGoogleEarthView::updateState() } } } - } else { + } + else + { // If coords were not ok, move the view in google earth back // to last acceptable location updateWaypointList(mav->getUASID()); diff --git a/src/ui/uas/UASView.cc b/src/ui/uas/UASView.cc index d9d15c5d4f078385e7adad25ab236eea50cb8484..74dae8c9b2f45fe5390f5bb061a008972ab23208 100644 --- a/src/ui/uas/UASView.cc +++ b/src/ui/uas/UASView.cc @@ -71,7 +71,7 @@ UASView::UASView(UASInterface* uas, QWidget *parent) : hilAction(new QAction("Enable Hardware-in-the-Loop Simulation", this )), selectAirframeAction(new QAction("Choose Airframe", this)), setBatterySpecsAction(new QAction("Set Battery Options", this)), - lowPowerModeEnabled(false), + lowPowerModeEnabled(true), m_ui(new Ui::UASView) { // FIXME XXX @@ -140,7 +140,7 @@ UASView::UASView(UASInterface* uas, QWidget *parent) : connect(refreshTimer, SIGNAL(timeout()), this, SLOT(refresh())); if (lowPowerModeEnabled) { - refreshTimer->start(updateInterval*10); + refreshTimer->start(updateInterval*3); } else { refreshTimer->start(updateInterval); }