From 55ae8c09607b01a7c3d0338d29cde8e7c03975d2 Mon Sep 17 00:00:00 2001 From: pixhawk Date: Thu, 17 Jun 2010 15:40:17 +0200 Subject: [PATCH] waypoints working --- src/uas/UAS.cc | 16 +++++-- src/uas/UASWaypointManager.cc | 86 ++++++++++++++++++++++++++++++----- src/uas/UASWaypointManager.h | 42 +++++++++++++++-- src/ui/WaypointList.cc | 85 ++++++++++------------------------ src/ui/WaypointList.h | 18 +++----- src/ui/WaypointView.cc | 45 +++++++++++++----- src/ui/WaypointView.h | 14 +++--- src/ui/WaypointView.ui | 64 ++++++++++++++++++++++++-- 8 files changed, 255 insertions(+), 115 deletions(-) diff --git a/src/uas/UAS.cc b/src/uas/UAS.cc index e74501028..230a2b5d3 100644 --- a/src/uas/UAS.cc +++ b/src/uas/UAS.cc @@ -449,11 +449,20 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message) case MAVLINK_MSG_ID_WAYPOINT_REACHED: { -// mavlink_waypoint_reached_t wp; -// mavlink_msg_waypoint_reached_decode(&message, &wp); -// emit waypointReached(this, wp.id); + mavlink_waypoint_reached_t wpr; + mavlink_msg_waypoint_reached_decode(&message, &wpr); + waypointManager.handleWaypointReached(message.sysid, message.compid, &wpr); } break; + + case MAVLINK_MSG_ID_WAYPOINT_SET_CURRENT: + { + mavlink_waypoint_set_current_t wpsc; + mavlink_msg_waypoint_set_current_decode(&message, &wpsc); + waypointManager.handleWaypointSetCurrent(message.sysid, message.compid, &wpsc); + } + break; + case MAVLINK_MSG_ID_LOCAL_POSITION_SETPOINT: { mavlink_local_position_setpoint_t p; @@ -461,6 +470,7 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message) emit positionSetPointsChanged(uasId, p.x, p.y, p.z, p.yaw, QGC::groundTimeUsecs()); } break; + case MAVLINK_MSG_ID_STATUSTEXT: { QByteArray b; diff --git a/src/uas/UASWaypointManager.cc b/src/uas/UASWaypointManager.cc index 03ad97fd8..4f5b9d94f 100644 --- a/src/uas/UASWaypointManager.cc +++ b/src/uas/UASWaypointManager.cc @@ -1,18 +1,70 @@ +/*===================================================================== + +PIXHAWK Micro Air Vehicle Flying Robotics Toolkit + +(c) 2009, 2010 PIXHAWK PROJECT + +This file is part of the PIXHAWK project + + PIXHAWK is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + PIXHAWK is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with PIXHAWK. If not, see . + +======================================================================*/ + +/** + * @file + * @brief Implementation of the waypoint protocol handler + * + * @author Petri Tanskanen + * + */ + #include "UASWaypointManager.h" #include "UAS.h" +#define PROTOCOL_TIMEOUT_MS 2000 + UASWaypointManager::UASWaypointManager(UAS &_uas) : uas(_uas), current_wp_id(0), current_count(0), current_state(WP_IDLE), current_partner_systemid(0), - current_partner_compid(0) + current_partner_compid(0), + protocol_timer(this) +{ + connect(&protocol_timer, SIGNAL(timeout()), this, SLOT(timeout())); +} + +void UASWaypointManager::timeout() { + protocol_timer.stop(); + + qDebug() << "Waypoint transaction (state=" << current_state << ") timed out going to state WP_IDLE"; + + emit updateStatusString("Operation timed out."); + + current_state = WP_IDLE; + current_count = 0; + current_wp_id = 0; + current_partner_systemid = 0; + current_partner_compid = 0; } void UASWaypointManager::handleWaypointCount(quint8 systemId, quint8 compId, quint16 count) { + protocol_timer.start(PROTOCOL_TIMEOUT_MS); + if (current_state == WP_GETLIST && systemId == current_partner_systemid && compId == current_partner_compid) { qDebug() << "got waypoint count (" << count << ") from ID " << systemId; @@ -35,6 +87,8 @@ void UASWaypointManager::handleWaypointCount(quint8 systemId, quint8 compId, qui void UASWaypointManager::handleWaypoint(quint8 systemId, quint8 compId, mavlink_waypoint_t *wp) { + protocol_timer.start(PROTOCOL_TIMEOUT_MS); + if (systemId == current_partner_systemid && compId == current_partner_compid && current_state == WP_GETLIST_GETWPS && wp->seq == current_wp_id) { if(wp->seq == current_wp_id) @@ -58,6 +112,7 @@ void UASWaypointManager::handleWaypoint(quint8 systemId, quint8 compId, mavlink_ current_partner_systemid = 0; current_partner_compid = 0; + protocol_timer.stop(); emit updateStatusString("done."); qDebug() << "got all waypoints from ID " << systemId; @@ -72,6 +127,8 @@ void UASWaypointManager::handleWaypoint(quint8 systemId, quint8 compId, mavlink_ void UASWaypointManager::handleWaypointRequest(quint8 systemId, quint8 compId, mavlink_waypoint_request_t *wpr) { + protocol_timer.start(PROTOCOL_TIMEOUT_MS); + if (systemId == current_partner_systemid && compId == current_partner_compid && ((current_state == WP_SENDLIST && wpr->seq == 0) || (current_state == WP_SENDLIST_SENDWPS && (wpr->seq == current_wp_id || wpr->seq == current_wp_id + 1)) || (current_state == WP_IDLE && wpr->seq == current_count-1))) { qDebug() << "handleWaypointRequest"; @@ -87,6 +144,7 @@ void UASWaypointManager::handleWaypointRequest(quint8 systemId, quint8 compId, m //all waypoints sent, but we still have to wait for a possible rerequest of the last waypoint current_state = WP_IDLE; + protocol_timer.stop(); emit updateStatusString("done."); qDebug() << "send all waypoints to ID " << systemId; @@ -99,17 +157,24 @@ void UASWaypointManager::handleWaypointRequest(quint8 systemId, quint8 compId, m } } -void UASWaypointManager::clearWaypointList() +void UASWaypointManager::handleWaypointReached(quint8 systemId, quint8 compId, mavlink_waypoint_reached_t *wpr) { - + if (systemId == uas.getUASID() && compId == MAV_COMP_ID_WAYPOINTPLANNER) + { + emit updateStatusString(QString("Reached waypoint %1").arg(wpr->seq)); + } } -void UASWaypointManager::currentWaypointChanged(quint16) +void UASWaypointManager::handleWaypointSetCurrent(quint8 systemId, quint8 compId, mavlink_waypoint_set_current_t *wpr) { - + if (systemId == uas.getUASID() && compId == MAV_COMP_ID_WAYPOINTPLANNER) + { + qDebug() << "new current waypoint" << wpr->seq; + emit currentWaypointChanged(wpr->seq); + } } -void UASWaypointManager::removeWaypointId(quint16) +void UASWaypointManager::clearWaypointList() { } @@ -118,6 +183,8 @@ void UASWaypointManager::requestWaypoints() { if(current_state == WP_IDLE) { + protocol_timer.start(PROTOCOL_TIMEOUT_MS); + mavlink_message_t message; mavlink_waypoint_request_list_t wprl; @@ -145,6 +212,8 @@ void UASWaypointManager::sendWaypoints(const QVector &list) { if (list.count() > 0) { + protocol_timer.start(PROTOCOL_TIMEOUT_MS); + current_count = list.count(); current_state = WP_SENDLIST; current_wp_id = 0; @@ -240,8 +309,3 @@ void UASWaypointManager::sendWaypoint(quint16 seq) qDebug() << "sent waypoint (" << wp->seq << ") to ID " << wp->target_system; } } - -void UASWaypointManager::waypointChanged(Waypoint*) -{ - -} diff --git a/src/uas/UASWaypointManager.h b/src/uas/UASWaypointManager.h index b5cad1706..247feacc1 100644 --- a/src/uas/UASWaypointManager.h +++ b/src/uas/UASWaypointManager.h @@ -1,8 +1,40 @@ +/*===================================================================== + +PIXHAWK Micro Air Vehicle Flying Robotics Toolkit + +(c) 2009, 2010 PIXHAWK PROJECT + +This file is part of the PIXHAWK project + + PIXHAWK is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + PIXHAWK is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with PIXHAWK. If not, see . + +======================================================================*/ + +/** + * @file + * @brief Definition of the waypoint protocol handler + * + * @author Petri Tanskanen + * + */ + #ifndef UASWAYPOINTMANAGER_H #define UASWAYPOINTMANAGER_H #include #include +#include #include "Waypoint.h" #include class UAS; @@ -25,22 +57,23 @@ public: void handleWaypointCount(quint8 systemId, quint8 compId, quint16 count); void handleWaypoint(quint8 systemId, quint8 compId, mavlink_waypoint_t *wp); void handleWaypointRequest(quint8 systemId, quint8 compId, mavlink_waypoint_request_t *wpr); + void handleWaypointReached(quint8 systemId, quint8 compId, mavlink_waypoint_reached_t *wpr); + void handleWaypointSetCurrent(quint8 systemId, quint8 compId, mavlink_waypoint_set_current_t *wpr); private: void sendWaypointRequest(quint16 seq); void sendWaypoint(quint16 seq); public slots: + void timeout(); void clearWaypointList(); - void currentWaypointChanged(quint16); - void removeWaypointId(quint16); void requestWaypoints(); void sendWaypoints(const QVector &list); - void waypointChanged(Waypoint*); signals: void waypointUpdated(int,quint16,double,double,double,double,bool,bool); ///< Adds a waypoint to the waypoint list widget - void updateStatusString(const QString &); ///< updates the current status string + void currentWaypointChanged(quint16); ///< emits the new current waypoint sequence number + void updateStatusString(const QString &); ///< emits the current status string private: UAS &uas; ///< Reference to the corresponding UAS @@ -51,6 +84,7 @@ private: quint8 current_partner_compid; ///< The current protocol communication target component QVector waypoint_buffer; ///< communication buffer for waypoints + QTimer protocol_timer; ///< Timer to catch timeouts }; #endif // UASWAYPOINTMANAGER_H diff --git a/src/ui/WaypointList.cc b/src/ui/WaypointList.cc index eef95b089..89bde86c2 100644 --- a/src/ui/WaypointList.cc +++ b/src/ui/WaypointList.cc @@ -45,8 +45,6 @@ WaypointList::WaypointList(QWidget *parent, UASInterface* uas) : { m_ui->setupUi(this); - transmitDelay = new QTimer(this); - listLayout = new QVBoxLayout(m_ui->listWidget); listLayout->setSpacing(6); listLayout->setMargin(0); @@ -73,7 +71,6 @@ WaypointList::WaypointList(QWidget *parent, UASInterface* uas) : connect(m_ui->loadButton, SIGNAL(clicked()), this, SLOT(loadWaypoints())); connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(setUAS(UASInterface*))); - connect(transmitDelay, SIGNAL(timeout()), this, SLOT(reenableTransmit())); // STATUS LABEL updateStatusLabel(""); @@ -97,14 +94,14 @@ void WaypointList::setUAS(UASInterface* uas) if (this->uas == NULL && uas != NULL) { this->uas = uas; + + connect(&uas->getWaypointManager(), SIGNAL(updateStatusString(const QString &)), this, SLOT(updateStatusLabel(const QString &))); connect(&uas->getWaypointManager(), SIGNAL(waypointUpdated(int,quint16,double,double,double,double,bool,bool)), this, SLOT(setWaypoint(int,quint16,double,double,double,double,bool,bool))); - //connect(this, SIGNAL(waypointChanged(Waypoint*)), &uas->getWaypointManager(), SLOT(setWaypoint(Waypoint*))); - //connect(this, SIGNAL(currentWaypointChanged(int)), &uas->getWaypointManager(), SLOT(setWaypointActive(quint16))); + connect(&uas->getWaypointManager(), SIGNAL(currentWaypointChanged(quint16)), this, SLOT(currentWaypointChanged(quint16))); + connect(this, SIGNAL(sendWaypoints(const QVector &)), &uas->getWaypointManager(), SLOT(sendWaypoints(const QVector &))); connect(this, SIGNAL(requestWaypoints()), &uas->getWaypointManager(), SLOT(requestWaypoints())); connect(this, SIGNAL(clearWaypointList()), &uas->getWaypointManager(), SLOT(clearWaypointList())); - - connect(&uas->getWaypointManager(), SIGNAL(updateStatusString(const QString &)), this, SLOT(updateStatusLabel(const QString &))); } } @@ -112,7 +109,6 @@ void WaypointList::setWaypoint(int uasId, quint16 id, double x, double y, double { if (uasId == this->uas->getUASID()) { - transmitDelay->start(1000); Waypoint* wp = new Waypoint(id, x, y, z, yaw, autocontinue, current); addWaypoint(wp); } @@ -123,34 +119,30 @@ void WaypointList::waypointReached(UASInterface* uas, quint16 waypointId) Q_UNUSED(uas); qDebug() << "Waypoint reached: " << waypointId; - /*if (waypoints.size() > waypointId) + updateStatusLabel(QString("Waypoint %1 reached.").arg(waypointId)); +} + +void WaypointList::currentWaypointChanged(quint16 seq) +{ + if (seq < waypoints.size()) { - if (waypoints[waypointId]->autocontinue == true) + for(int i = 0; i < waypoints.size(); i++) { + WaypointView* widget = wpViews.find(waypoints[i]).value(); - for(int i = 0; i < waypoints.size(); i++) + if (waypoints[i]->getId() == seq) { - if (i == waypointId+1) - { - waypoints[i]->current = true; - WaypointView* widget = wpViews.find(waypoints[i]).value(); - widget->setCurrent(); - } - else - { - if (waypoints[i]->current) - { - waypoints[i]->current = false; - WaypointView* widget = wpViews.find(waypoints[i]).value(); - widget->removeCurrentCheck(); - } - } + waypoints[i]->setCurrent(true); + widget->setCurrent(true); + } + else + { + waypoints[i]->setCurrent(false); + widget->setCurrent(false); } - redrawList(); - - qDebug() << "NEW WAYPOINT SET"; } - }*/ + redrawList(); + } } void WaypointList::read() @@ -165,9 +157,6 @@ void WaypointList::read() void WaypointList::transmit() { - transmitDelay->start(1000); - m_ui->transmitButton->setEnabled(false); - emit sendWaypoints(waypoints); //emit requestWaypoints(); FIXME } @@ -199,8 +188,7 @@ void WaypointList::addWaypoint(Waypoint* wp) connect(wpview, SIGNAL(moveDownWaypoint(Waypoint*)), this, SLOT(moveDown(Waypoint*))); connect(wpview, SIGNAL(moveUpWaypoint(Waypoint*)), this, SLOT(moveUp(Waypoint*))); connect(wpview, SIGNAL(removeWaypoint(Waypoint*)), this, SLOT(removeWaypoint(Waypoint*))); - connect(wpview, SIGNAL(setCurrentWaypoint(Waypoint*)), this, SLOT(setCurrentWaypoint(Waypoint*))); - //connect(wpview, SIGNAL(waypointUpdated(Waypoint*)), this, SIGNAL(waypointChanged(Waypoint*))); + connect(wpview, SIGNAL(currentWaypointChanged(quint16)), this, SLOT(currentWaypointChanged(quint16))); } } @@ -292,28 +280,6 @@ void WaypointList::removeWaypoint(Waypoint* wp) } } -void WaypointList::setCurrentWaypoint(Waypoint* wp) -{ - for(int i = 0; i < waypoints.size(); i++) - { - if (waypoints[i] == wp) - { - waypoints[i]->setCurrent(true); - // Retransmit waypoint - //uas->getWaypointManager().setWaypointActive(i); - } - else - { - if (waypoints[i]->getCurrent()) - { - waypoints[i]->setCurrent(false); - WaypointView* widget = wpViews.find(waypoints[i]).value(); - widget->removeCurrentCheck(); - } - } - } -} - void WaypointList::changeEvent(QEvent *e) { switch (e->type()) { @@ -325,11 +291,6 @@ void WaypointList::changeEvent(QEvent *e) } } -void WaypointList::reenableTransmit() -{ - m_ui->transmitButton->setEnabled(true); -} - void WaypointList::saveWaypoints() { QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "./waypoints.txt", tr("Waypoint File (*.txt)")); diff --git a/src/ui/WaypointList.h b/src/ui/WaypointList.h index 8aeef71a7..fecd118e9 100644 --- a/src/ui/WaypointList.h +++ b/src/ui/WaypointList.h @@ -56,7 +56,6 @@ class WaypointList : public QWidget { public slots: void setUAS(UASInterface* uas); void redrawList(); - void reenableTransmit(); //UI Buttons void saveWaypoints(); @@ -66,36 +65,33 @@ public slots: void add(); void moveUp(Waypoint* wp); void moveDown(Waypoint* wp); - void setCurrentWaypoint(Waypoint* wp); /** @brief sets statusLabel string */ void updateStatusLabel(const QString &string); + void currentWaypointChanged(quint16 seq); + //To be moved to UASWaypointManager (?) void setWaypoint(int uasId, quint16 id, double x, double y, double z, double yaw, bool autocontinue, bool current); void addWaypoint(Waypoint* wp); void removeWaypoint(Waypoint* wp); void waypointReached(UASInterface* uas, quint16 waypointId); +signals: + void sendWaypoints(const QVector &); + void requestWaypoints(); + void clearWaypointList(); + protected: virtual void changeEvent(QEvent *e); QVector waypoints; QMap wpViews; QVBoxLayout* listLayout; - QTimer* transmitDelay; UASInterface* uas; private: Ui::WaypointList *m_ui; - -signals: - //void waypointChanged(Waypoint*); - //void currentWaypointChanged(int); - //void removeWaypointId(int); - void sendWaypoints(const QVector &); - void requestWaypoints(); - void clearWaypointList(); }; #endif // WAYPOINTLIST_H diff --git a/src/ui/WaypointView.cc b/src/ui/WaypointView.cc index 36acc291c..17e091970 100644 --- a/src/ui/WaypointView.cc +++ b/src/ui/WaypointView.cc @@ -34,6 +34,8 @@ This file is part of the PIXHAWK project #include #include +#include //M_PI + #include "WaypointView.h" #include "ui_WaypointView.h" @@ -49,7 +51,7 @@ WaypointView::WaypointView(Waypoint* wp, QWidget* parent) : m_ui->xSpinBox->setValue(wp->getX()); m_ui->ySpinBox->setValue(wp->getY()); m_ui->zSpinBox->setValue(wp->getZ()); - m_ui->yawSpinBox->setValue(wp->getYaw()); + m_ui->yawSpinBox->setValue(wp->getYaw()/M_PI*180.); m_ui->selectedBox->setChecked(wp->getCurrent()); m_ui->autoContinue->setChecked(wp->getAutoContinue()); m_ui->idLabel->setText(QString("%1").arg(wp->getId())); @@ -57,14 +59,22 @@ WaypointView::WaypointView(Waypoint* wp, QWidget* parent) : connect(m_ui->xSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setX(double))); connect(m_ui->ySpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setY(double))); connect(m_ui->zSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setZ(double))); - connect(m_ui->yawSpinBox, SIGNAL(valueChanged(double)), wp, SLOT(setYaw(double))); + + //hidden degree to radian conversion of the yaw angle + connect(m_ui->yawSpinBox, SIGNAL(valueChanged(int)), this, SLOT(setYaw(int))); + connect(this, SIGNAL(setYaw(double)), wp, SLOT(setYaw(double))); connect(m_ui->upButton, SIGNAL(clicked()), this, SLOT(moveUp())); connect(m_ui->downButton, SIGNAL(clicked()), this, SLOT(moveDown())); connect(m_ui->removeButton, SIGNAL(clicked()), this, SLOT(remove())); - connect(m_ui->autoContinue, SIGNAL(stateChanged(int)), this, SLOT(setAutoContinue(int))); - connect(m_ui->selectedBox, SIGNAL(clicked()), this, SLOT(setCurrent())); + connect(m_ui->autoContinue, SIGNAL(stateChanged(int)), this, SLOT(changedAutoContinue(int))); + connect(m_ui->selectedBox, SIGNAL(stateChanged(int)), this, SLOT(changedCurrent(int))); +} + +void WaypointView::setYaw(int yawDegree) +{ + emit setYaw((double)yawDegree*M_PI/180.); } void WaypointView::moveUp() @@ -83,26 +93,37 @@ void WaypointView::remove() delete this; } -void WaypointView::setAutoContinue(int state) +void WaypointView::changedAutoContinue(int state) { if (state == 0) wp->setAutocontinue(false); else wp->setAutocontinue(true); - emit waypointUpdated(wp); } -void WaypointView::removeCurrentCheck() +void WaypointView::changedCurrent(int state) { - m_ui->selectedBox->setCheckState(Qt::Unchecked); + if (state == 0) + { + wp->setCurrent(false); + } + else + { + wp->setCurrent(true); + emit currentWaypointChanged(wp->getId()); //the slot currentWayppointChanged() in WaypointList sets all other current flags to false + } } -void WaypointView::setCurrent() +void WaypointView::setCurrent(bool state) { - if (m_ui->selectedBox->isChecked()) - emit setCurrentWaypoint(wp); - else + if (state) + { m_ui->selectedBox->setCheckState(Qt::Checked); + } + else + { + m_ui->selectedBox->setCheckState(Qt::Unchecked); + } } WaypointView::~WaypointView() diff --git a/src/ui/WaypointView.h b/src/ui/WaypointView.h index d10f8d1e5..bf4fb1bee 100644 --- a/src/ui/WaypointView.h +++ b/src/ui/WaypointView.h @@ -49,15 +49,16 @@ class WaypointView : public QWidget { virtual ~WaypointView(); public: - void removeCurrentCheck(); + void setCurrent(bool state); public slots: void moveUp(); void moveDown(); void remove(); - void setAutoContinue(int); - void setCurrent(); - //void setText(); + void changedAutoContinue(int); + void changedCurrent(int); + + void setYaw(int); //hidden degree to radian conversion protected: virtual void changeEvent(QEvent *e); @@ -70,9 +71,8 @@ signals: void moveUpWaypoint(Waypoint*); void moveDownWaypoint(Waypoint*); void removeWaypoint(Waypoint*); - void setCurrentWaypoint(Waypoint*); - void setWaypointText(Waypoint*, QString); - void waypointUpdated(Waypoint*); + void currentWaypointChanged(quint16); + void setYaw(double); }; #endif // WAYPOINTVIEW_H diff --git a/src/ui/WaypointView.ui b/src/ui/WaypointView.ui index 32d847b8c..e344c5682 100644 --- a/src/ui/WaypointView.ui +++ b/src/ui/WaypointView.ui @@ -180,9 +180,21 @@ QProgressBar::chunk#thrustBar { + + + 15 + 0 + + + + Waypoint Sequence Number + TextLabel + + Qt::AlignCenter + @@ -200,22 +212,40 @@ QProgressBar::chunk#thrustBar { + + Position X coordinate + + + m + -100000.000000000000000 100000.000000000000000 + + 0.050000000000000 + + + Position Y coordinate + + + m + -100000.000000000000000 100000.000000000000000 + + 0.050000000000000 + 0.000000000000000 @@ -223,21 +253,36 @@ QProgressBar::chunk#thrustBar { + + Position Z coordinate + + + m + -100000.000000000000000 - 100000.000000000000000 + 0.000000000000000 + + + 0.050000000000000 - - - 0.000000000000000 + + + Yaw angle + + + true + + + ° - 360.000000000000000 + 359 @@ -259,6 +304,9 @@ QProgressBar::chunk#thrustBar { 22 + + Move Up + @@ -276,6 +324,9 @@ QProgressBar::chunk#thrustBar { 22 + + Move Down + @@ -293,6 +344,9 @@ QProgressBar::chunk#thrustBar { 22 + + Delete + -- 2.22.0