diff --git a/ground/src/plugins/magicwaypoint/images/positionfield.svg b/ground/src/plugins/magicwaypoint/images/positionfield.svg index d68632c16..256d9bd6d 100644 --- a/ground/src/plugins/magicwaypoint/images/positionfield.svg +++ b/ground/src/plugins/magicwaypoint/images/positionfield.svg @@ -134,8 +134,8 @@ style="stroke-width:2.1899786;stroke-miterlimit:4;stroke-dasharray:none" /> + id="desiredPositionObj" + transform="translate(-5.3432485,-16.199292)"> + + diff --git a/ground/src/plugins/magicwaypoint/magicwaypointgadgetwidget.cpp b/ground/src/plugins/magicwaypoint/magicwaypointgadgetwidget.cpp index faaf349f0..e83462439 100644 --- a/ground/src/plugins/magicwaypoint/magicwaypointgadgetwidget.cpp +++ b/ground/src/plugins/magicwaypoint/magicwaypointgadgetwidget.cpp @@ -28,6 +28,7 @@ #include "ui_magicwaypoint.h" #include +#include #include #include #include @@ -47,10 +48,14 @@ MagicWaypointGadgetWidget::MagicWaypointGadgetWidget(QWidget *parent) : QLabel(p m_magicwaypoint->setupUi(this); // Connect object updated event from UAVObject to also update check boxes - connect(getPositionDesired(), SIGNAL(objectUpdated(UAVObject*)), this, SLOT(positionDesiredObjectChanged(UAVObject*))); + connect(getPositionDesired(), SIGNAL(objectUpdated(UAVObject*)), this, SLOT(positionObjectChanged(UAVObject*))); + connect(getPositionActual(), SIGNAL(objectUpdated(UAVObject*)), this, SLOT(positionObjectChanged(UAVObject*))); + // Connect updates from the position widget to this widget connect(m_magicwaypoint->widgetPosition, SIGNAL(positionClicked(double,double)), this, SLOT(positionSelected(double,double))); - connect(this, SIGNAL(positionObjectChanged(double,double)), m_magicwaypoint->widgetPosition, SLOT(updateIndicator(double,double))); + connect(this, SIGNAL(positionActualObjectChanged(double,double)), m_magicwaypoint->widgetPosition, SLOT(updateActualIndicator(double,double))); + connect(this, SIGNAL(positionDesiredObjectChanged(double,double)), m_magicwaypoint->widgetPosition, SLOT(updateDesiredIndicator(double,double))); + // Catch changes in scale for visualization connect(m_magicwaypoint->horizontalSliderScale, SIGNAL(valueChanged(int)), this, SLOT(scaleChanged(double))); } @@ -61,7 +66,7 @@ MagicWaypointGadgetWidget::~MagicWaypointGadgetWidget() } /*! - \brief Returns the ManualControlCommand UAVObject + \brief Returns the @ref PositionDesired UAVObject */ PositionDesired* MagicWaypointGadgetWidget::getPositionDesired() { @@ -71,24 +76,41 @@ PositionDesired* MagicWaypointGadgetWidget::getPositionDesired() return obj; } +/*! + \brief Returns the @ref PositionActual UAVObject + */ +PositionActual* MagicWaypointGadgetWidget::getPositionActual() +{ + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager *objManager = pm->getObject(); + PositionActual* obj = dynamic_cast( objManager->getObject(QString("PositionActual")) ); + return obj; +} + /** * Detect changes in scale and update visualization (does not change position) */ void MagicWaypointGadgetWidget::scaleChanged(int scale) { Q_UNUSED(scale); - positionDesiredObjectChanged(getPositionDesired()); + positionObjectChanged(getPositionDesired()); + positionObjectChanged(getPositionActual()); } /** - * Update displayed position when @ref PositionDesired object is changed + * Emit a position changed signal when @ref PositionDesired or @ref PositionActual object is changed */ -void MagicWaypointGadgetWidget::positionDesiredObjectChanged(UAVObject* obj) +void MagicWaypointGadgetWidget::positionObjectChanged(UAVObject* obj) { - double north = obj->getField("North")->getDouble(); - double east = obj->getField("East")->getDouble(); double scale = m_magicwaypoint->horizontalSliderScale->value(); + double north = obj->getField("North")->getDouble() / scale; + double east = obj->getField("East")->getDouble() / scale; + + if(obj->getName().compare("PositionDesired")) { + emit positionDesiredObjectChanged(north,east); + } else { + emit positionActualObjectChanged(north,east); + } - emit positionObjectChanged(north/scale,east/scale); } /** diff --git a/ground/src/plugins/magicwaypoint/magicwaypointgadgetwidget.h b/ground/src/plugins/magicwaypoint/magicwaypointgadgetwidget.h index 2b191565f..1e21d0db5 100644 --- a/ground/src/plugins/magicwaypoint/magicwaypointgadgetwidget.h +++ b/ground/src/plugins/magicwaypoint/magicwaypointgadgetwidget.h @@ -30,6 +30,7 @@ #include #include "uavobjects/positiondesired.h" +#include "uavobjects/positionactual.h" class Ui_MagicWaypoint; @@ -42,15 +43,17 @@ public: ~MagicWaypointGadgetWidget(); signals: - void positionObjectChanged(double north, double east); + void positionActualObjectChanged(double north, double east); + void positionDesiredObjectChanged(double north, double east); protected slots: void scaleChanged(int scale); - void positionDesiredObjectChanged(UAVObject *); + void positionObjectChanged(UAVObject *); void positionSelected(double north, double east); private: PositionDesired * getPositionDesired(); + PositionActual * getPositionActual(); Ui_MagicWaypoint * m_magicwaypoint; }; diff --git a/ground/src/plugins/magicwaypoint/positionfield.cpp b/ground/src/plugins/magicwaypoint/positionfield.cpp index c0e5e67cd..0863dd7d4 100644 --- a/ground/src/plugins/magicwaypoint/positionfield.cpp +++ b/ground/src/plugins/magicwaypoint/positionfield.cpp @@ -55,15 +55,21 @@ PositionField::PositionField(QWidget *parent) : m_background->setSharedRenderer(m_renderer); m_background->setElementId(QString("background")); - m_position = new QGraphicsSvgItem(); - m_position->setSharedRenderer(m_renderer); - m_position->setElementId(QString("joystickEnd")); - m_position->setPos(0,0); + m_positiondesired = new QGraphicsSvgItem(); + m_positiondesired->setSharedRenderer(m_renderer); + m_positiondesired->setElementId(QString("desiredPosition")); + m_positiondesired->setPos(0,0); + + m_positionactual = new QGraphicsSvgItem(); + m_positionactual->setSharedRenderer(m_renderer); + m_positionactual->setElementId(QString("actualPosition")); + m_positionactual->setPos(0,0); QGraphicsScene *l_scene = scene(); l_scene->clear(); // This also deletes all items contained in the scene. l_scene->addItem(m_background); - l_scene->addItem(m_position); + l_scene->addItem(m_positiondesired); + l_scene->addItem(m_positionactual); l_scene->setSceneRect(m_background->boundingRect()); } @@ -75,13 +81,19 @@ PositionField::~PositionField() /** * @brief Update aircraft position on image (values go from -1 to 1) */ -void PositionField::updateIndicator(double north, double east) +void PositionField::updateDesiredIndicator(double north, double east) { QRectF sceneSize = scene()->sceneRect(); - m_position->setPos((east+1)/2*sceneSize.width(),(-north+1)/2*sceneSize.height()); + m_positiondesired->setPos((east+1)/2*sceneSize.width(),(-north+1)/2*sceneSize.height()); } +void PositionField::updateActualIndicator(double north, double east) +{ + QRectF sceneSize = scene()->sceneRect(); + + m_positionactual->setPos((east+1)/2*sceneSize.width(),(-north+1)/2*sceneSize.height()); +} /** * @brief Redirect mouse move events to control position diff --git a/ground/src/plugins/magicwaypoint/positionfield.h b/ground/src/plugins/magicwaypoint/positionfield.h index b19b300c5..3a8b17cbf 100644 --- a/ground/src/plugins/magicwaypoint/positionfield.h +++ b/ground/src/plugins/magicwaypoint/positionfield.h @@ -57,12 +57,14 @@ signals: void positionClicked(double north, double east); public slots: - void updateIndicator(double north, double east); + void updateDesiredIndicator(double north, double east); + void updateActualIndicator(double north, double east); private: QSvgRenderer *m_renderer; QGraphicsSvgItem *m_background; - QGraphicsSvgItem *m_position; + QGraphicsSvgItem *m_positiondesired; + QGraphicsSvgItem *m_positionactual; }; #endif // POSITIONFIELD_H