MapWidget.cc 42.4 KB
Newer Older
1
/*==================================================================
pixhawk's avatar
pixhawk committed
2 3 4 5
======================================================================*/

/**
 * @file
lm's avatar
lm committed
6
 *   @brief Implementation of MapWidget
pixhawk's avatar
pixhawk committed
7 8
 *
 *   @author Lorenz Meier <mavteam@student.ethz.ch>
lm's avatar
lm committed
9
 *   @author Mariano Lizarraga
pixhawk's avatar
pixhawk committed
10 11 12
 *
 */

lm's avatar
lm committed
13 14
#include <QComboBox>
#include <QGridLayout>
15
#include <QDir>
16

17
#include "QGC.h"
pixhawk's avatar
pixhawk committed
18 19
#include "MapWidget.h"
#include "ui_MapWidget.h"
lm's avatar
lm committed
20 21
#include "UASInterface.h"
#include "UASManager.h"
22 23
#include "MAV2DIcon.h"
#include "Waypoint2DIcon.h"
24
#include "UASWaypointManager.h"
pixhawk's avatar
pixhawk committed
25

pixhawk's avatar
pixhawk committed
26 27
#include "MG.h"

28

pixhawk's avatar
pixhawk committed
29 30
MapWidget::MapWidget(QWidget *parent) :
        QWidget(parent),
31
        mc(NULL),
pixhawk's avatar
pixhawk committed
32
        zoomLevel(0),
33 34
        uasIcons(),
        uasTrails(),
35
        mav(NULL),
36
        lastUpdate(0),
37
        initialized(false),
pixhawk's avatar
pixhawk committed
38 39 40
        m_ui(new Ui::MapWidget)
{
    m_ui->setupUi(this);
lm's avatar
lm committed
41
    init();
42 43 44 45
}

void MapWidget::init()
{
lm's avatar
lm committed
46 47 48 49 50 51 52 53 54 55 56 57 58
    if (!initialized)
    {
        mc = new qmapcontrol::MapControl(this->size());
        // display the MapControl in the application
        QGridLayout* layout = new QGridLayout(this);
        layout->setMargin(0);
        layout->setSpacing(0);
        layout->addWidget(mc, 0, 0);
        setLayout(layout);

        //   VISUAL MAP STYLE
        QString buttonStyle("QAbstractButton { background-color: rgba(20, 20, 20, 45%); border-color: rgba(10, 10, 10, 50%)} QAbstractButton:checked { border: 2px solid #379AC3; }");
        mc->setPen(QGC::colorCyan.darker(400));
59

lm's avatar
lm committed
60
        waypointIsDrag = false;
61

lm's avatar
lm committed
62 63
        // Accept focus by clicking or keyboard
        this->setFocusPolicy(Qt::StrongFocus);
pixhawk's avatar
pixhawk committed
64

lm's avatar
lm committed
65 66 67 68 69 70
        // create MapControl

        mc->showScale(true);
        mc->showCoord(true);
        mc->enablePersistentCache();
        mc->setMouseTracking(true); // required to update the mouse position for diplay and capture
pixhawk's avatar
pixhawk committed
71

lm's avatar
lm committed
72 73
        // create MapAdapter to get maps from
        //TileMapAdapter* osmAdapter = new TileMapAdapter("tile.openstreetmap.org", "/%1/%2/%3.png", 256, 0, 17);
pixhawk's avatar
pixhawk committed
74

lm's avatar
lm committed
75
        qmapcontrol::MapAdapter* mapadapter_overlay = new qmapcontrol::YahooMapAdapter("us.maps3.yimg.com", "/aerial.maps.yimg.com/png?v=2.2&t=h&s=256&x=%2&y=%3&z=%1");
pixhawk's avatar
pixhawk committed
76

lm's avatar
lm committed
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
        // MAP BACKGROUND
        mapadapter = new qmapcontrol::GoogleSatMapAdapter();
        l = new qmapcontrol::MapLayer("Google Satellite", mapadapter);
        mc->addLayer(l);

        // STREET OVERLAY
        overlay = new qmapcontrol::MapLayer("Overlay", mapadapter_overlay);
        overlay->setVisible(false);
        mc->addLayer(overlay);

        // MAV FLIGHT TRACKS
        tracks = new qmapcontrol::MapLayer("Tracking", mapadapter);
        mc->addLayer(tracks);

        // WAYPOINT LAYER
        // create a layer with the mapadapter and type GeometryLayer (for waypoints)
        geomLayer = new qmapcontrol::GeometryLayer("Waypoints", mapadapter);
        mc->addLayer(geomLayer);

96 97
        homePosition = new qmapcontrol::GeometryLayer("Station", mapadapter);
        mc->addLayer(homePosition);
lm's avatar
lm committed
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187


        //
        //    Layer* gsatLayer = new Layer("Google Satellite", gsat, Layer::MapLayer);
        //    mc->addLayer(gsatLayer);


        // Zurich, ETH

        int lastZoom = 16;
        double lastLat = 47.376889;
        double lastLon = 8.548056;

        QSettings settings;
        settings.beginGroup("QGC_MAPWIDGET");
        lastLat = settings.value("LAST_LATITUDE", lastLat).toDouble();
        lastLon = settings.value("LAST_LONGITUDE", lastLon).toDouble();
        lastZoom = settings.value("LAST_ZOOM", lastZoom).toInt();
        settings.endGroup();

        // SET INITIAL POSITION AND ZOOM
        // Set default zoom level
        mc->setZoom(lastZoom);
        mc->setView(QPointF(lastLon, lastLat));

        // Veracruz Mexico
        //mc->setView(QPointF(-96.105208,19.138955));

        // Add controls to select map provider
        /////////////////////////////////////////////////
        QActionGroup* mapproviderGroup = new QActionGroup(this);
        osmAction = new QAction(QIcon(":/images/mapproviders/openstreetmap.png"), tr("OpenStreetMap"), mapproviderGroup);
        yahooActionMap = new QAction(QIcon(":/images/mapproviders/yahoo.png"), tr("Yahoo: Map"), mapproviderGroup);
        yahooActionSatellite = new QAction(QIcon(":/images/mapproviders/yahoo.png"), tr("Yahoo: Satellite"), mapproviderGroup);
        googleActionMap = new QAction(QIcon(":/images/mapproviders/google.png"), tr("Google: Map"), mapproviderGroup);
        googleSatAction = new QAction(QIcon(":/images/mapproviders/google.png"), tr("Google: Sat"), mapproviderGroup);
        osmAction->setCheckable(true);
        yahooActionMap->setCheckable(true);
        yahooActionSatellite->setCheckable(true);
        googleActionMap->setCheckable(true);
        googleSatAction->setCheckable(true);
        googleSatAction->setChecked(true);
        connect(mapproviderGroup, SIGNAL(triggered(QAction*)),
                this, SLOT(mapproviderSelected(QAction*)));

        // Overlay seems currently broken
        //    yahooActionOverlay = new QAction(tr("Yahoo: street overlay"), this);
        //    yahooActionOverlay->setCheckable(true);
        //    yahooActionOverlay->setChecked(overlay->isVisible());
        //    connect(yahooActionOverlay, SIGNAL(toggled(bool)),
        //            overlay, SLOT(setVisible(bool)));

        //    mapproviderGroup->addAction(googleSatAction);
        //    mapproviderGroup->addAction(osmAction);
        //    mapproviderGroup->addAction(yahooActionOverlay);
        //    mapproviderGroup->addAction(googleActionMap);
        //    mapproviderGroup->addAction(yahooActionMap);
        //    mapproviderGroup->addAction(yahooActionSatellite);

        // Create map provider selection menu
        mapMenu = new QMenu(this);
        mapMenu->addActions(mapproviderGroup->actions());
        mapMenu->addSeparator();
        //    mapMenu->addAction(yahooActionOverlay);

        mapButton = new QPushButton(this);
        mapButton->setText("Map Source");
        mapButton->setMenu(mapMenu);
        mapButton->setStyleSheet(buttonStyle);

        // create buttons to control the map (zoom, GPS tracking and WP capture)
        QPushButton* zoomin = new QPushButton(QIcon(":/images/actions/list-add.svg"), "", this);
        zoomin->setStyleSheet(buttonStyle);
        QPushButton* zoomout = new QPushButton(QIcon(":/images/actions/list-remove.svg"), "", this);
        zoomout->setStyleSheet(buttonStyle);
        createPath = new QPushButton(QIcon(":/images/actions/go-bottom.svg"), "", this);
        createPath->setStyleSheet(buttonStyle);
        createPath->setToolTip(tr("Start / end waypoint add mode"));
        createPath->setStatusTip(tr("Start / end waypoint add mode"));
        //    clearTracking = new QPushButton(QIcon(""), "", this);
        //    clearTracking->setStyleSheet(buttonStyle);
        followgps = new QPushButton(QIcon(":/images/actions/system-lock-screen.svg"), "", this);
        followgps->setStyleSheet(buttonStyle);
        followgps->setToolTip(tr("Follow the position of the current MAV with the map center"));
        followgps->setStatusTip(tr("Follow the position of the current MAV with the map center"));
        QPushButton* goToButton = new QPushButton(QIcon(""), "T", this);
        goToButton->setStyleSheet(buttonStyle);
        goToButton->setToolTip(tr("Enter a latitude/longitude position to move the map to"));
        goToButton->setStatusTip(tr("Enter a latitude/longitude position to move the map to"));

188 189 190 191 192
        setHome = new QPushButton(QIcon(":/images/actions/go-home.svg"), "", this);
        setHome->setStyleSheet(buttonStyle);
        setHome->setToolTip(tr("Set home"));
        setHome->setStatusTip(tr("Set home"));

lm's avatar
lm committed
193 194 195 196 197
        zoomin->setMaximumWidth(30);
        zoomout->setMaximumWidth(30);
        createPath->setMaximumWidth(30);
        //    clearTracking->setMaximumWidth(30);
        followgps->setMaximumWidth(30);
198
        setHome->setMaximumWidth(30);
lm's avatar
lm committed
199 200 201 202 203 204 205
        goToButton->setMaximumWidth(30);

        // Set checkable buttons
        // TODO: Currently checked buttons are are very difficult to distinguish when checked.
        //       create a style and the slots to change the background so it is easier to distinguish
        followgps->setCheckable(true);
        createPath->setCheckable(true);
206
        setHome->setCheckable(true);
lm's avatar
lm committed
207 208 209 210 211 212 213 214 215

        // add buttons to control the map (zoom, GPS tracking and WP capture)
        QGridLayout* innerlayout = new QGridLayout(mc);
        innerlayout->setMargin(3);
        innerlayout->setSpacing(3);
        innerlayout->addWidget(zoomin, 0, 0);
        innerlayout->addWidget(zoomout, 1, 0);
        innerlayout->addWidget(followgps, 2, 0);
        innerlayout->addWidget(createPath, 3, 0);
216
        innerlayout->addWidget(setHome, 4, 0);
lm's avatar
lm committed
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
        //innerlayout->addWidget(clearTracking, 4, 0);
        // Add spacers to compress buttons on the top left
        innerlayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 5, 0);
        innerlayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 0, 1, 0, 7);
        innerlayout->addWidget(mapButton, 0, 6);
        innerlayout->addWidget(goToButton, 0, 7);
        innerlayout->setRowStretch(0, 1);
        innerlayout->setRowStretch(1, 100);
        mc->setLayout(innerlayout);

        // Configure the WP Path's pen
        pointPen = new QPen(QColor(0, 255,0));
        pointPen->setWidth(3);
        waypointPath = new qmapcontrol::LineString (wps, "Waypoint path", pointPen);
        mc->layer("Waypoints")->addGeometry(waypointPath);

        //Camera Control
        // CAMERA INDICATOR LAYER
        // create a layer with the mapadapter and type GeometryLayer (for camera indicator)
236 237
        //camLayer = new qmapcontrol::GeometryLayer("Camera", mapadapter);
        //mc->addLayer(camLayer);
lm's avatar
lm committed
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261

        //camLine = new qmapcontrol::LineString(camPoints,"Camera Eje", camBorderPen);

        drawCamBorder = false;
        radioCamera = 10;

        // Done set state
        initialized = true;


        // Connect the required signals-slots
        connect(zoomin, SIGNAL(clicked(bool)),
                mc, SLOT(zoomIn()));

        connect(zoomout, SIGNAL(clicked(bool)),
                mc, SLOT(zoomOut()));

        connect(goToButton, SIGNAL(clicked()), this, SLOT(goTo()));

        QList<UASInterface*> systems = UASManager::instance()->getUASList();
        foreach(UASInterface* system, systems)
        {
            addUAS(system);
        }
pixhawk's avatar
pixhawk committed
262

lm's avatar
lm committed
263 264
        connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)),
                this, SLOT(addUAS(UASInterface*)));
pixhawk's avatar
pixhawk committed
265

lm's avatar
lm committed
266 267
        activeUASSet(UASManager::instance()->getActiveUAS());
        connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(activeUASSet(UASInterface*)));
pixhawk's avatar
pixhawk committed
268

lm's avatar
lm committed
269 270
        connect(mc, SIGNAL(mouseEventCoordinate(const QMouseEvent*, const QPointF)),
                this, SLOT(captureMapClick(const QMouseEvent*, const QPointF)));
pixhawk's avatar
pixhawk committed
271

lm's avatar
lm committed
272 273
        connect(createPath, SIGNAL(clicked(bool)),
                this, SLOT(createPathButtonClicked(bool)));
pixhawk's avatar
pixhawk committed
274

275 276 277 278 279 280
        connect(setHome, SIGNAL(clicked(bool)), this, SLOT(createHomePositionClick(bool)));

        connect(mc, SIGNAL(mouseEventCoordinate(const QMouseEvent*,QPointF)), this,
                SLOT(createHomePosition(const QMouseEvent*,QPointF)));
        //connect(setHome, SIGNAL(clicked(bool)), this, SLOT(createHomePosition(bool)));

lm's avatar
lm committed
281 282 283 284 285 286 287 288 289 290 291 292

        connect(geomLayer, SIGNAL(geometryClicked(Geometry*,QPoint)),
                this, SLOT(captureGeometryClick(Geometry*, QPoint)));

        connect(geomLayer, SIGNAL(geometryDragged(Geometry*, QPointF)),
                this, SLOT(captureGeometryDrag(Geometry*, QPointF)));

        connect(geomLayer, SIGNAL(geometryEndDrag(Geometry*, QPointF)),
                this, SLOT(captureGeometryEndDrag(Geometry*, QPointF)));

        qDebug() << "CHECK END";
    }
lm's avatar
lm committed
293 294
}

295 296 297
void MapWidget::goTo()
{
    bool ok;
298 299
    QString text = QInputDialog::getText(this, tr("Please enter coordinates"),
                                         tr("Coordinates (Lat,Lon):"), QLineEdit::Normal,
300
                                         QString("%1,%2").arg(mc->currentCoordinate().y()).arg(mc->currentCoordinate().x()), &ok);
301 302 303 304 305 306 307 308 309 310 311 312 313
    if (ok && !text.isEmpty())
    {
        QStringList split = text.split(",");
        if (split.length() == 2)
        {
            bool convert;
            double latitude = split.first().toDouble(&convert);
            ok &= convert;
            double longitude = split.last().toDouble(&convert);
            ok &= convert;

            if (ok)
            {
314
                mc->setView(QPointF(longitude, latitude));
315 316 317
            }
        }
    }
318 319
}

320

lm's avatar
lm committed
321 322
void MapWidget::mapproviderSelected(QAction* action)
{
lm's avatar
lm committed
323
    if (mc)
lm's avatar
lm committed
324
    {
lm's avatar
lm committed
325 326 327 328 329 330
        //delete mapadapter;
        mapButton->setText(action->text());
        if (action == osmAction)
        {
            int zoom = mapadapter->adaptedZoom();
            mc->setZoom(0);
pixhawk's avatar
pixhawk committed
331

lm's avatar
lm committed
332 333 334
            mapadapter = new qmapcontrol::OSMMapAdapter();
            l->setMapAdapter(mapadapter);
            geomLayer->setMapAdapter(mapadapter);
pixhawk's avatar
pixhawk committed
335

lm's avatar
lm committed
336 337 338 339 340
            if (isVisible()) mc->updateRequestNew();
            mc->setZoom(zoom);
            //        yahooActionOverlay->setEnabled(false);
            overlay->setVisible(false);
            //        yahooActionOverlay->setChecked(false);
pixhawk's avatar
pixhawk committed
341

lm's avatar
lm committed
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
        }
        else if (action == yahooActionMap)
        {
            int zoom = mapadapter->adaptedZoom();
            mc->setZoom(0);

            mapadapter = new qmapcontrol::YahooMapAdapter();
            l->setMapAdapter(mapadapter);
            geomLayer->setMapAdapter(mapadapter);

            if (isVisible()) mc->updateRequestNew();
            mc->setZoom(zoom);
            //        yahooActionOverlay->setEnabled(false);
            overlay->setVisible(false);
            //        yahooActionOverlay->setChecked(false);
        }
        else if (action == yahooActionSatellite)
        {
            int zoom = mapadapter->adaptedZoom();
            QPointF a = mc->currentCoordinate();
            mc->setZoom(0);

            mapadapter = new qmapcontrol::YahooMapAdapter("us.maps3.yimg.com", "/aerial.maps.yimg.com/png?v=1.7&t=a&s=256&x=%2&y=%3&z=%1");
            l->setMapAdapter(mapadapter);
            geomLayer->setMapAdapter(mapadapter);

            if (isVisible()) mc->updateRequestNew();
            mc->setZoom(zoom);
            overlay->setVisible(false);
            //        yahooActionOverlay->setEnabled(true);
        }
        else if (action == googleActionMap)
        {
            int zoom = mapadapter->adaptedZoom();
            mc->setZoom(0);
            mapadapter = new qmapcontrol::GoogleMapAdapter();
            l->setMapAdapter(mapadapter);
            geomLayer->setMapAdapter(mapadapter);

            if (isVisible()) mc->updateRequestNew();
            mc->setZoom(zoom);
            //        yahooActionOverlay->setEnabled(false);
            overlay->setVisible(false);
            //        yahooActionOverlay->setChecked(false);
        }
        else if (action == googleSatAction)
        {
            int zoom = mapadapter->adaptedZoom();
            mc->setZoom(0);
            mapadapter = new qmapcontrol::GoogleSatMapAdapter();
            l->setMapAdapter(mapadapter);
            geomLayer->setMapAdapter(mapadapter);

            if (isVisible()) mc->updateRequestNew();
            mc->setZoom(zoom);
            //        yahooActionOverlay->setEnabled(false);
            overlay->setVisible(false);
            //        yahooActionOverlay->setChecked(false);
        }
        else
        {
            mapButton->setText("Select..");
        }
lm's avatar
lm committed
405
    }
406
}
lm's avatar
lm committed
407

lm's avatar
lm committed
408

409
void MapWidget::createPathButtonClicked(bool checked)
lm's avatar
lm committed
410
{
lm's avatar
lm committed
411
    if (mc)
lm's avatar
lm committed
412
    {
lm's avatar
lm committed
413
        Q_UNUSED(checked);
pixhawk's avatar
pixhawk committed
414

lm's avatar
lm committed
415 416 417 418 419
        if (createPath->isChecked())
        {
            // change the cursor shape
            this->setCursor(Qt::PointingHandCursor);
            mc->setMouseMode(qmapcontrol::MapControl::None);
pixhawk's avatar
pixhawk committed
420 421


lm's avatar
lm committed
422 423
            // emit signal start to create a Waypoint global
            //emit createGlobalWP(true, mc->currentCoordinate());
pixhawk's avatar
pixhawk committed
424

lm's avatar
lm committed
425 426 427 428 429 430 431 432 433 434
            //        // Clear the previous WP track
            //        // TODO: Move this to an actual clear track button and add a warning dialog
            //        mc->layer("Waypoints")->clearGeometries();
            //        wps.clear();
            //        path->setPoints(wps);
            //        mc->layer("Waypoints")->addGeometry(path);
            //        wpIndex.clear();
        }
        else
        {
pixhawk's avatar
pixhawk committed
435

lm's avatar
lm committed
436 437 438 439
            this->setCursor(Qt::ArrowCursor);
            mc->setMouseMode(qmapcontrol::MapControl::Panning);
        }
    }
440
}
441

442 443 444 445 446 447 448
/**
 * Captures a click on the map and if in create WP path mode, it adds the WP on MouseButtonRelease
 *
 * @param event The mouse event
 * @param coordinate The coordinate in which it occured the mouse event
 * @note  This slot is connected to the mouseEventCoordinate of the QMapControl object
 */
449 450
void MapWidget::captureMapClick(const QMouseEvent* event, const QPointF coordinate)
{
451
    if (QEvent::MouseButtonRelease == event->type() && createPath->isChecked())
452
    {
453 454
        // Create waypoint name
        QString str;
pixhawk's avatar
pixhawk committed
455

456 457
        // create the WP and set everything in the LineString to display the path
        Waypoint2DIcon* tempCirclePoint;
pixhawk's avatar
pixhawk committed
458

459 460
        if (mav)
        {
461 462 463 464 465 466 467 468 469
            double altitude = 0.0;
            double yaw = 0.0;
            int wpListCount = mav->getWaypointManager()->getWaypointList().count();
            if (wpListCount > 0)
            {
                altitude = mav->getWaypointManager()->getWaypointList().at(wpListCount-1)->getAltitude();
                yaw = mav->getWaypointManager()->getWaypointList().at(wpListCount-1)->getYaw();
            }
            mav->getWaypointManager()->addWaypoint(new Waypoint(wpListCount, coordinate.y(), coordinate.x(), altitude, yaw, true));
470 471 472
        }
        else
        {
473
            str = QString("%1").arg(waypointPath->numberOfPoints());
474
            tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle);
475
            wpIcons.append(tempCirclePoint);
pixhawk's avatar
pixhawk committed
476

477
            mc->layer("Waypoints")->addGeometry(tempCirclePoint);
pixhawk's avatar
pixhawk committed
478

479 480 481 482 483
            qmapcontrol::Point* tempPoint = new qmapcontrol::Point(coordinate.x(), coordinate.y(),str);
            wps.append(tempPoint);
            waypointPath->addPoint(tempPoint);

            // Refresh the screen
484
            if (isVisible()) mc->updateRequest(tempPoint->boundingBox().toRect());
485
        }
486
        // emit signal mouse was clicked
487 488 489 490 491 492
        //emit captureMapCoordinateClick(coordinate);
    }
}

void MapWidget::updateWaypoint(int uas, Waypoint* wp)
{
493
    // Update waypoint list and redraw map (last parameter)
494 495 496
    updateWaypoint(uas, wp, true);
}

497 498 499 500
/**
 * This function is called if a a single waypoint is updated and
 * also if the whole list changes.
 */
501 502
void MapWidget::updateWaypoint(int uas, Waypoint* wp, bool updateView)
{
lm's avatar
lm committed
503
    if (mc)
504
    {
lm's avatar
lm committed
505 506
        // Make sure this is the right UAS
        if (uas == this->mav->getUASID())
507
        {
lm's avatar
lm committed
508 509 510 511
            // Only accept waypoints in global coordinate frame
            if (wp->getFrame() == MAV_FRAME_GLOBAL)
            {
                // We're good, this is a global waypoint
512

lm's avatar
lm committed
513 514 515 516 517 518
                // Get the index of this waypoint
                // note the call to getGlobalFrameIndexOf()
                // as we're only handling global waypoints
                int wpindex = UASManager::instance()->getUASForId(uas)->getWaypointManager()->getGlobalFrameIndexOf(wp);
                // If not found, return (this should never happen, but helps safety)
                if (wpindex == -1) return;
519

lm's avatar
lm committed
520 521
                // Check if wp exists yet in map
                if (!(wpIcons.count() > wpindex))
522
                {
lm's avatar
lm committed
523
                    // Waypoint is new, a new icon is created
524
                    QPointF coordinate;
525 526
                    coordinate.setX(wp->getLongitude());
                    coordinate.setY(wp->getLatitude());
lm's avatar
lm committed
527 528 529 530 531 532 533
                    createWaypointGraphAtMap(wpindex, coordinate);
                }
                else
                {
                    // Waypoint exists, update it if we're not
                    // currently dragging it with the mouse
                    if(!waypointIsDrag)
534
                    {
lm's avatar
lm committed
535 536 537 538 539 540 541
                        QPointF coordinate;
                        coordinate.setX(wp->getLongitude());
                        coordinate.setY(wp->getLatitude());

                        Point* waypoint;
                        waypoint = wps.at(wpindex);
                        if (waypoint)
542
                        {
lm's avatar
lm committed
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564
                            // First set waypoint coordinate
                            waypoint->setCoordinate(coordinate);
                            // Now update icon position
                            wpIcons.at(wpindex)->setCoordinate(coordinate);
                            // Update pen
                            wpIcons.at(wpindex)->setPen(mavPens.value(uas));
                            // Then waypoint line coordinate
                            Point* linesegment = NULL;
                            // If the line segment already exists, just update it
                            // else create a new one
                            if (waypointPath->points().size() > wpindex)
                            {
                                linesegment = waypointPath->points().at(wpindex);
                                if (linesegment) linesegment->setCoordinate(coordinate);
                            }
                            else
                            {
                                waypointPath->addPoint(waypoint);
                            }

                            // Update view
                            if (updateView) if (isVisible()) mc->updateRequest(waypoint->boundingBox().toRect());
565
                        }
566 567 568
                    }
                }
            }
lm's avatar
lm committed
569
            else
570
            {
lm's avatar
lm committed
571 572 573 574 575 576 577 578
                // Check if the index of this waypoint is larger than the global
                // waypoint list. This implies that the coordinate frame of this
                // waypoint was changed and the list containing only global
                // waypoints was shortened. Thus update the whole list
                if (waypointPath->points().count() > UASManager::instance()->getUASForId(uas)->getWaypointManager()->getGlobalFrameCount())
                {
                    updateWaypointList(uas);
                }
579
            }
580
        }
581
    }
pixhawk's avatar
pixhawk committed
582 583
}

584
void MapWidget::createWaypointGraphAtMap(int id, const QPointF coordinate)
585
{
586
    //if (!wpExists(coordinate))
587
    {
588 589
        // Create waypoint name
        QString str;
pixhawk's avatar
pixhawk committed
590

591 592 593
        // create the WP and set everything in the LineString to display the path
        //CirclePoint* tempCirclePoint = new CirclePoint(coordinate.x(), coordinate.y(), 10, str);
        Waypoint2DIcon* tempCirclePoint;
pixhawk's avatar
pixhawk committed
594

595 596
        if (mav)
        {
597
            int uas = mav->getUASID();
598
            str = QString("%1").arg(id);
599 600
            qDebug() << "Waypoint list count:" << str;
            tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle, mavPens.value(uas));
601 602 603
        }
        else
        {
604
            str = QString("%1").arg(id);
605 606
            tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle);
        }
pixhawk's avatar
pixhawk committed
607 608


609
        mc->layer("Waypoints")->addGeometry(tempCirclePoint);
pixhawk's avatar
pixhawk committed
610
        wpIcons.append(tempCirclePoint);
pixhawk's avatar
pixhawk committed
611

612 613
        Point* tempPoint = new Point(coordinate.x(), coordinate.y(),str);
        wps.append(tempPoint);
614
        waypointPath->addPoint(tempPoint);
pixhawk's avatar
pixhawk committed
615

616
        //wpIndex.insert(str,tempPoint);
tecnosapiens's avatar
tecnosapiens committed
617
        qDebug()<<"Funcion createWaypointGraphAtMap WP= "<<str<<" -> x= "<<tempPoint->latitude()<<" y= "<<tempPoint->longitude();
pixhawk's avatar
pixhawk committed
618

tecnosapiens's avatar
tecnosapiens committed
619
        // Refresh the screen
620
        if (isVisible()) if (isVisible()) mc->updateRequest(tempPoint->boundingBox().toRect());
621
    }
pixhawk's avatar
pixhawk committed
622

623 624
    ////    // emit signal mouse was clicked
    //    emit captureMapCoordinateClick(coordinate);
625 626
}

627 628
int MapWidget::wpExists(const QPointF coordinate)
{
lm's avatar
lm committed
629 630 631 632 633 634 635 636
    if (mc)
    {
        for (int i = 0; i < wps.size(); i++){
            if (wps.at(i)->latitude() == coordinate.y() &&
                wps.at(i)->longitude()== coordinate.x())
            {
                return 1;
            }
637
        }
638
    }
639
    return 0;
640 641
}

642

643 644
void MapWidget::captureGeometryClick(Geometry* geom, QPoint point)
{
645 646
    Q_UNUSED(geom);
    Q_UNUSED(point);
pixhawk's avatar
pixhawk committed
647

lm's avatar
lm committed
648
    if (mc) mc->setMouseMode(qmapcontrol::MapControl::None);
649 650
}

651 652
void MapWidget::captureGeometryDrag(Geometry* geom, QPointF coordinate)
{
653
    waypointIsDrag = true;
pixhawk's avatar
pixhawk committed
654

655
    // Refresh the screen
656
    if (isVisible()) mc->updateRequest(geom->boundingBox().toRect());
pixhawk's avatar
pixhawk committed
657

658
    int temp = 0;
659 660 661 662 663

    // Get waypoint index in list
    bool wpIndexOk;
    int index = geom->name().toInt(&wpIndexOk);

664
    Waypoint2DIcon* point2Find = dynamic_cast <Waypoint2DIcon*> (geom);
pixhawk's avatar
pixhawk committed
665

666
    if (wpIndexOk && point2Find && wps.count() > index)
667
    {
668
        // Update visual
669
        point2Find->setCoordinate(coordinate);
670 671
        waypointPath->points().at(index)->setCoordinate(coordinate);
        if (isVisible()) mc->updateRequest(waypointPath->boundingBox().toRect());
pixhawk's avatar
pixhawk committed
672

673 674
        // Update waypoint data storage
        if (mav)
675
        {
676
            QVector<Waypoint*> wps = mav->getWaypointManager()->getGlobalFrameWaypointList();
pixhawk's avatar
pixhawk committed
677

678
            if (wps.size() > index)
679
            {
680
                Waypoint* wp = wps.at(index);
681 682
                wp->setLatitude(coordinate.y());
                wp->setLongitude(coordinate.x());
683
                mav->getWaypointManager()->notifyOfChange(wp);
684
            }
685
        }
686 687 688 689 690

        // qDebug() << geom->name();
        temp = geom->get_myIndex();
        //qDebug() << temp;
        emit sendGeometryEndDrag(coordinate,temp);
691
    }
pixhawk's avatar
pixhawk committed
692

693
    waypointIsDrag = false;
694 695
}

696
void MapWidget::captureGeometryEndDrag(Geometry* geom, QPointF coordinate)
697
{
698 699 700
    Q_UNUSED(geom);
    Q_UNUSED(coordinate);
    // TODO: Investigate why when creating the waypoint path this slot is being called
pixhawk's avatar
pixhawk committed
701

702 703 704 705 706 707
    // Only change the mouse mode back to panning when not creating a WP path
    if (!createPath->isChecked())
    {
        waypointIsDrag = false;
        mc->setMouseMode(qmapcontrol::MapControl::Panning);
    }
pixhawk's avatar
pixhawk committed
708

709 710
}

pixhawk's avatar
pixhawk committed
711 712
MapWidget::~MapWidget()
{
lm's avatar
lm committed
713
    delete mc;
pixhawk's avatar
pixhawk committed
714 715
    delete m_ui;
}
Alejandro's avatar
Alejandro committed
716

lm's avatar
lm committed
717 718 719 720 721 722
/**
 *
 * @param uas the UAS/MAV to monitor/display with the HUD
 */
void MapWidget::addUAS(UASInterface* uas)
{
723
    connect(uas, SIGNAL(globalPositionChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateGlobalPosition(UASInterface*,double,double,double,quint64)));
724
    connect(uas, SIGNAL(attitudeChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateAttitude(UASInterface*,double,double,double,quint64)));
725
    connect(uas, SIGNAL(systemSpecsChanged(int)), this, SLOT(updateSystemSpecs(int)));
726 727
}

728 729 730 731 732
/**
 * Update the whole list of waypoints. This is e.g. necessary if the list order changed.
 * The UAS manager will emit the appropriate signal whenever updating the list
 * is necessary.
 */
733 734
void MapWidget::updateWaypointList(int uas)
{
lm's avatar
lm committed
735
    if (mc)
736
    {
lm's avatar
lm committed
737 738 739 740 741 742 743
        // Get already existing waypoints
        UASInterface* uasInstance = UASManager::instance()->getUASForId(uas);
        if (uasInstance)
        {
            // Get update rect of old content, this is what will be redrawn
            // in the last step
            QRect updateRect = waypointPath->boundingBox().toRect();
744

lm's avatar
lm committed
745 746
            // Get all waypoints, including non-global waypoints
            QVector<Waypoint*> wpList = uasInstance->getWaypointManager()->getWaypointList();
747

lm's avatar
lm committed
748 749 750 751 752 753
            // Clear if necessary
            if (wpList.count() == 0)
            {
                clearWaypoints(uas);
                return;
            }
754

lm's avatar
lm committed
755 756 757
            // Trim internal list to number of global waypoints in the waypoint manager list
            int overSize = waypointPath->points().count() - uasInstance->getWaypointManager()->getGlobalFrameCount();
            if (overSize > 0)
758
            {
lm's avatar
lm committed
759 760 761 762 763 764 765 766 767 768
                // Remove n waypoints at the end of the list
                // the remaining waypoints will be updated
                // in the next step
                for (int i = 0; i < overSize; ++i)
                {
                    wps.removeLast();
                    mc->layer("Waypoints")->removeGeometry(wpIcons.last());
                    wpIcons.removeLast();
                    waypointPath->points().removeLast();
                }
769
            }
pixhawk's avatar
pixhawk committed
770

lm's avatar
lm committed
771 772 773 774 775 776 777 778
            // Load all existing waypoints into map view
            foreach (Waypoint* wp, wpList)
            {
                // Block map draw updates, since we update everything in the next step
                // but update internal data structures.
                // Please note that updateWaypoint() ignores non-global waypoints
                updateWaypoint(mav->getUASID(), wp, false);
            }
779

lm's avatar
lm committed
780 781 782
            // Update view
            if (isVisible()) mc->updateRequest(updateRect);
        }
783 784 785 786 787 788 789 790 791 792 793 794
    }
}

void MapWidget::redoWaypoints(int uas)
{
    //    QObject* sender = QObject::sender();
    //    UASWaypointManager* manager = dynamic_cast<UASWaypointManager*>(sender);
    //    if (sender)
    //    {
    // Get waypoint list for this MAV

    // Clear all waypoints
795
    //clearWaypoints();
796 797 798 799 800
    // Re-add the updated waypoints

    //    }

    updateWaypointList(uas);
lm's avatar
lm committed
801 802
}

803 804
void MapWidget::activeUASSet(UASInterface* uas)
{
805 806 807
    // Disconnect old MAV
    if (mav)
    {
808
        // Disconnect the waypoint manager / data storage from the UI
809
        disconnect(mav->getWaypointManager(), SIGNAL(waypointListChanged(int)), this, SLOT(updateWaypointList(int)));
810
        disconnect(mav->getWaypointManager(), SIGNAL(waypointChanged(int, Waypoint*)), this, SLOT(updateWaypoint(int,Waypoint*)));
811 812 813
        disconnect(this, SIGNAL(waypointCreated(Waypoint*)), mav->getWaypointManager(), SLOT(addWaypoint(Waypoint*)));
    }

lm's avatar
lm committed
814
    if (uas && mc)
815 816
    {
        mav = uas;
817 818
        QColor color = mav->getColor();
        color.setAlphaF(0.9);
819
        QPen* pen = new QPen(color);
820
        pen->setWidth(3.0);
821 822 823 824
        mavPens.insert(mav->getUASID(), pen);
        // FIXME Remove after refactoring
        waypointPath->setPen(pen);

825
        // Delete all waypoints and add waypoint from new system
826 827
        //redoWaypoints();
        updateWaypointList(uas->getUASID());
828

829
        // Connect the waypoint manager / data storage to the UI
830
        connect(mav->getWaypointManager(), SIGNAL(waypointListChanged(int)), this, SLOT(updateWaypointList(int)));
831
        connect(mav->getWaypointManager(), SIGNAL(waypointChanged(int, Waypoint*)), this, SLOT(updateWaypoint(int,Waypoint*)));
832
        connect(this, SIGNAL(waypointCreated(Waypoint*)), mav->getWaypointManager(), SLOT(addWaypoint(Waypoint*)));
833

834
        updateSystemSpecs(mav->getUASID());
835
        updateSelectedSystem(mav->getUASID());
836
        mc->updateRequest(waypointPath->boundingBox().toRect());
837 838 839
    }
}

840 841
void MapWidget::updateSystemSpecs(int uas)
{
lm's avatar
lm committed
842
    if (mc)
843
    {
lm's avatar
lm committed
844
        foreach (qmapcontrol::Point* p, uasIcons.values())
845
        {
lm's avatar
lm committed
846 847 848 849 850 851 852
            MAV2DIcon* icon = dynamic_cast<MAV2DIcon*>(p);
            if (icon && icon->getUASId() == uas)
            {
                // Set new airframe
                icon->setAirframe(UASManager::instance()->getUASForId(uas)->getAirframe());
                icon->drawIcon();
            }
853 854 855 856
        }
    }
}

857 858
void MapWidget::updateSelectedSystem(int uas)
{
lm's avatar
lm committed
859
    if (mc)
860
    {
lm's avatar
lm committed
861
        foreach (qmapcontrol::Point* p, uasIcons.values())
862
        {
lm's avatar
lm committed
863 864 865 866 867 868
            MAV2DIcon* icon = dynamic_cast<MAV2DIcon*>(p);
            if (icon)
            {
                // Set as selected if ids match
                icon->setSelectedUAS((icon->getUASId() == uas));
            }
869
        }
870 871 872
    }
}

873 874 875 876 877
void MapWidget::updateAttitude(UASInterface* uas, double roll, double pitch, double yaw, quint64 usec)
{
    Q_UNUSED(roll);
    Q_UNUSED(pitch);
    Q_UNUSED(usec);
lm's avatar
lm committed
878
    if (mc)
879
    {
lm's avatar
lm committed
880 881

        if (uas)
882
        {
lm's avatar
lm committed
883 884 885 886 887
            MAV2DIcon* icon = dynamic_cast<MAV2DIcon*>(uasIcons.value(uas->getUASID(), NULL));
            if (icon)
            {
                icon->setYaw(yaw);
            }
888 889 890 891
        }
    }
}

lm's avatar
lm committed
892 893 894 895 896 897 898 899 900
/**
 * Updates the global position of one MAV and append the last movement to the trail
 *
 * @param uas The unmanned air system
 * @param lat Latitude in WGS84 ellipsoid
 * @param lon Longitutde in WGS84 ellipsoid
 * @param alt Altitude over mean sea level
 * @param usec Timestamp of the position message in milliseconds FIXME will move to microseconds
 */
lm's avatar
lm committed
901 902 903
void MapWidget::updateGlobalPosition(UASInterface* uas, double lat, double lon, double alt, quint64 usec)
{
    Q_UNUSED(usec);
904
    Q_UNUSED(alt); // FIXME Use altitude
lm's avatar
lm committed
905
    if (mc)
906
    {
lm's avatar
lm committed
907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957
        // create a LineString
        //QList<Point*> points;
        // Points with a circle
        // A QPen can be used to customize the
        //pointpen->setWidth(3);
        //points.append(new CirclePoint(lat, lon, 10, uas->getUASName(), Point::Middle, pointpen));

        qmapcontrol::Point* p;
        QPointF coordinate;
        coordinate.setX(lon);
        coordinate.setY(lat);

        if (!uasIcons.contains(uas->getUASID()))
        {
            // Get the UAS color
            QColor uasColor = uas->getColor();

            // Icon
            //QPen* pointpen = new QPen(uasColor);
            qDebug() << "2D MAP: ADDING" << uas->getUASName() << __FILE__ << __LINE__;
            p = new MAV2DIcon(uas, 68, uas->getSystemType(), uas->getColor(), QString("%1").arg(uas->getUASID()), qmapcontrol::Point::Middle);
            uasIcons.insert(uas->getUASID(), p);
            mc->layer("Waypoints")->addGeometry(p);

            // Line
            // A QPen also can use transparency

            //        QList<qmapcontrol::Point*> points;
            //        points.append(new qmapcontrol::Point(coordinate.x(), coordinate.y()));
            //        QPen* linepen = new QPen(uasColor.darker());
            //        linepen->setWidth(2);

            //        // Create tracking line string
            //        qmapcontrol::LineString* ls = new qmapcontrol::LineString(points, QString("%1").arg(uas->getUASID()), linepen);
            //        uasTrails.insert(uas->getUASID(), ls);

            //        // Add the LineString to the layer
            //        mc->layer("Waypoints")->addGeometry(ls);
        }
        else
        {
            //        p = dynamic_cast<MAV2DIcon*>(uasIcons.value(uas->getUASID()));
            //        if (p)
            //        {
            p = uasIcons.value(uas->getUASID());
            p->setCoordinate(QPointF(lon, lat));
            //p->setYaw(uas->getYaw());
            //        }
            // Extend trail
            //        uasTrails.value(uas->getUASID())->addPoint(new qmapcontrol::Point(coordinate.x(), coordinate.y()));
        }
958

lm's avatar
lm committed
959
        if (isVisible()) mc->updateRequest(p->boundingBox().toRect());
960

lm's avatar
lm committed
961
        //if (isVisible()) mc->updateRequestNew();//(uasTrails.value(uas->getUASID())->boundingBox().toRect());
962

lm's avatar
lm committed
963
        if (this->mav && uas->getUASID() == this->mav->getUASID())
964
        {
lm's avatar
lm committed
965 966 967
            // Limit the position update rate
            quint64 currTime = MG::TIME::getGroundTimeNow();
            if (currTime - lastUpdate > 120)
968
            {
lm's avatar
lm committed
969 970 971 972 973 974 975 976 977 978 979
                lastUpdate = currTime;
                // Sets the view to the interesting area
                if (followgps->isChecked())
                {
                    updatePosition(0, lon, lat);
                }
                else
                {
                    // Refresh the screen
                    //if (isVisible()) mc->updateRequestNew();
                }
980
            }
981
        }
pixhawk's avatar
pixhawk committed
982 983
    }
}
pixhawk's avatar
pixhawk committed
984

lm's avatar
lm committed
985 986 987
/**
 * Center the view on this position
 */
lm's avatar
lm committed
988
void MapWidget::updatePosition(float time, double lat, double lon)
pixhawk's avatar
pixhawk committed
989
{
lm's avatar
lm committed
990
    Q_UNUSED(time);
991
    //gpsposition->setText(QString::number(time) + " / " + QString::number(lat) + " / " + QString::number(lon));
lm's avatar
lm committed
992
    if (followgps->isChecked() && isVisible() && mc)
pixhawk's avatar
pixhawk committed
993
    {
994
        if (mc) mc->setView(QPointF(lat, lon));
pixhawk's avatar
pixhawk committed
995 996 997 998 999
    }
}

void MapWidget::wheelEvent(QWheelEvent *event)
{
lm's avatar
lm committed
1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014
    if (mc)
    {
        int numDegrees = event->delta() / 8;
        int numSteps = numDegrees / 15;
        // Calculate new zoom level
        int newZoom = mc->currentZoom()+numSteps;
        // Set new zoom level, level is bounded by map control
        mc->setZoom(newZoom);
        // Detail zoom level is the number of steps zoomed in further
        // after the bounding has taken effect
        detailZoom = qAbs(qMin(0, mc->currentZoom()-newZoom));

        // visual field of camera
        updateCameraPosition(20*newZoom,0,"no");
    }
pixhawk's avatar
pixhawk committed
1015 1016 1017 1018
}

void MapWidget::keyPressEvent(QKeyEvent *event)
{
lm's avatar
lm committed
1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042
    if (mc)
    {
        switch (event->key()) {
        case Qt::Key_Plus:
            mc->zoomIn();
            break;
        case Qt::Key_Minus:
            mc->zoomOut();
            break;
        case Qt::Key_Left:
            mc->scrollLeft(this->width()/scrollStep);
            break;
        case Qt::Key_Right:
            mc->scrollRight(this->width()/scrollStep);
            break;
        case Qt::Key_Down:
            mc->scrollDown(this->width()/scrollStep);
            break;
        case Qt::Key_Up:
            mc->scrollUp(this->width()/scrollStep);
            break;
        default:
            QWidget::keyPressEvent(event);
        }
pixhawk's avatar
pixhawk committed
1043 1044 1045
    }
}

1046
void MapWidget::resizeEvent(QResizeEvent* event )
pixhawk's avatar
pixhawk committed
1047
{
1048
    Q_UNUSED(event);
lm's avatar
lm committed
1049 1050 1051 1052
        if (!initialized)
        {
            init();
        }
1053
    if (mc) mc->resize(this->size());
pixhawk's avatar
pixhawk committed
1054 1055
}

1056 1057 1058
void MapWidget::showEvent(QShowEvent* event)
{
    Q_UNUSED(event);
lm's avatar
lm committed
1059 1060 1061 1062 1063 1064 1065
//    if (isVisible())
//    {
//	if (!initialized)
//	{
//            init();
//	}
//    }
1066 1067 1068 1069 1070
}

void MapWidget::hideEvent(QHideEvent* event)
{
    Q_UNUSED(event);
lm's avatar
lm committed
1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081
    if (mc)
    {
        QSettings settings;
        settings.beginGroup("QGC_MAPWIDGET");
        QPointF currentPos = mc->currentCoordinate();
        settings.setValue("LAST_LATITUDE", currentPos.y());
        settings.setValue("LAST_LONGITUDE", currentPos.x());
        settings.setValue("LAST_ZOOM", mc->currentZoom());
        settings.endGroup();
        settings.sync();
    }
1082 1083
}

pixhawk's avatar
pixhawk committed
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095

void MapWidget::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        m_ui->retranslateUi(this);
        break;
    default:
        break;
    }
}
1096

1097
void MapWidget::clearWaypoints(int uas)
1098
{
lm's avatar
lm committed
1099
    if (mc)
1100
    {
lm's avatar
lm committed
1101 1102
        Q_UNUSED(uas);
        // Clear the previous WP track
1103

lm's avatar
lm committed
1104 1105 1106 1107 1108 1109 1110
        //mc->layer("Waypoints")->clearGeometries();
        wps.clear();
        foreach (Point* p, wpIcons)
        {
            mc->layer("Waypoints")->removeGeometry(p);
        }
        wpIcons.clear();
1111

lm's avatar
lm committed
1112 1113
        // Get bounding box of this object BEFORE deleting the content
        QRect box = waypointPath->boundingBox().toRect();
1114

lm's avatar
lm committed
1115 1116
        // Delete the content
        waypointPath->points().clear();
pixhawk's avatar
pixhawk committed
1117

lm's avatar
lm committed
1118 1119 1120 1121 1122
        //delete waypointPath;
        //waypointPath = new
        //mc->layer("Waypoints")->addGeometry(waypointPath);
        //wpIndex.clear();
        if (isVisible()) mc->updateRequest(box);//(waypointPath->boundingBox().toRect());
1123

lm's avatar
lm committed
1124 1125 1126 1127 1128
        if(createPath->isChecked())
        {
            createPath->click();
        }
    }
1129
}
pixhawk's avatar
pixhawk committed
1130

1131
void MapWidget::clearPath(int uas)
1132
{
pixhawk's avatar
pixhawk committed
1133
    Q_UNUSED(uas);
lm's avatar
lm committed
1134
    if (mc)
1135
    {
lm's avatar
lm committed
1136 1137 1138 1139 1140 1141 1142 1143 1144 1145
        mc->layer("Tracking")->clearGeometries();
        foreach (qmapcontrol::LineString* ls, uasTrails)
        {
            QPen* linepen = ls->pen();
            delete ls;
            qmapcontrol::LineString* lsNew = new qmapcontrol::LineString(QList<qmapcontrol::Point*>(), "", linepen);
            mc->layer("Tracking")->addGeometry(lsNew);
        }
        // FIXME update this with update request only for bounding box of trails
        if (isVisible()) mc->updateRequestNew();//(QRect(0, 0, width(), height()));
1146
    }
1147
}
1148

1149 1150
void MapWidget::updateCameraPosition(double radio, double bearing, QString dir)
{
pixhawk's avatar
pixhawk committed
1151 1152
    Q_UNUSED(dir);
    Q_UNUSED(bearing);
lm's avatar
lm committed
1153 1154 1155 1156 1157 1158
    if (mc)
    {
        // FIXME Mariano
        //camPoints.clear();
        QPointF currentPos = mc->currentCoordinate();
        //    QPointF actualPos = getPointxBearing_Range(currentPos.y(),currentPos.x(),bearing,distance);
pixhawk's avatar
pixhawk committed
1159

lm's avatar
lm committed
1160 1161
        //    qmapcontrol::Point* tempPoint1 = new qmapcontrol::Point(currentPos.x(), currentPos.y(),"inicial",qmapcontrol::Point::Middle);
        //    qmapcontrol::Point* tempPoint2 = new qmapcontrol::Point(actualPos.x(), actualPos.y(),"final",qmapcontrol::Point::Middle);
pixhawk's avatar
pixhawk committed
1162

lm's avatar
lm committed
1163 1164
        //    camPoints.append(tempPoint1);
        //    camPoints.append(tempPoint2);
pixhawk's avatar
pixhawk committed
1165

lm's avatar
lm committed
1166
        //    camLine->setPoints(camPoints);
pixhawk's avatar
pixhawk committed
1167

lm's avatar
lm committed
1168 1169
        QPen* camBorderPen = new QPen(QColor(255,0,0));
        camBorderPen->setWidth(2);
pixhawk's avatar
pixhawk committed
1170

lm's avatar
lm committed
1171
        //radio = mc->currentZoom()
pixhawk's avatar
pixhawk committed
1172

lm's avatar
lm committed
1173 1174 1175 1176
        if(drawCamBorder)
        {
            //clear camera borders
            mc->layer("Camera")->clearGeometries();
pixhawk's avatar
pixhawk committed
1177

lm's avatar
lm committed
1178 1179
            //create a camera borders
            qmapcontrol::CirclePoint* camBorder = new qmapcontrol::CirclePoint(currentPos.x(), currentPos.y(), radio, "camBorder", qmapcontrol::Point::Middle, camBorderPen);
pixhawk's avatar
pixhawk committed
1180

lm's avatar
lm committed
1181
            //camBorder->setCoordinate(currentPos);
pixhawk's avatar
pixhawk committed
1182

lm's avatar
lm committed
1183 1184 1185
            mc->layer("Camera")->addGeometry(camBorder);
            // mc->layer("Camera")->addGeometry(camLine);
            if (isVisible()) mc->updateRequestNew();
pixhawk's avatar
pixhawk committed
1186

lm's avatar
lm committed
1187 1188 1189 1190 1191 1192
        }
        else
        {
            //clear camera borders
            mc->layer("Camera")->clearGeometries();
            if (isVisible()) mc->updateRequestNew();
pixhawk's avatar
pixhawk committed
1193

lm's avatar
lm committed
1194
        }
1195
    }
1196 1197 1198 1199 1200 1201
}

void MapWidget::drawBorderCamAtMap(bool status)
{
    drawCamBorder = status;
    updateCameraPosition(20,0,"no");
pixhawk's avatar
pixhawk committed
1202

1203 1204 1205 1206 1207
}

QPointF MapWidget::getPointxBearing_Range(double lat1, double lon1, double bearing, double distance)
{
    QPointF temp;
pixhawk's avatar
pixhawk committed
1208

1209
    double rad = M_PI/180;
pixhawk's avatar
pixhawk committed
1210

1211 1212 1213
    bearing = bearing*rad;
    temp.setX((lon1 + ((distance/60) * (sin(bearing)))));
    temp.setY((lat1 + ((distance/60) * (cos(bearing)))));
pixhawk's avatar
pixhawk committed
1214

1215 1216 1217
    return temp;
}

1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260
void MapWidget::createHomePosition(const QMouseEvent *event, const QPointF coordinate)
{
    if (QEvent::MouseButtonRelease == event->type() && setHome->isChecked())
    {
        homeCoordinate= coordinate;
        Waypoint2DIcon* tempCirclePoint;

        double latitud = homeCoordinate.x();
        double longitud = homeCoordinate.y();

        tempCirclePoint = new Waypoint2DIcon(
                 latitud,
                 longitud,
                 20, "g", qmapcontrol::Point::Middle);

        QPen* pencil = new QPen(Qt::blue);
        tempCirclePoint->setPen(pencil);

        mc->layer("Station")->clearGeometries();
        mc->layer("Station")->addGeometry(tempCirclePoint);

        qmapcontrol::Point* tempPoint = new qmapcontrol::Point(latitud, longitud,"g");

        if (isVisible())
        {
            mc->updateRequest(tempPoint->boundingBox().toRect());
        }
    }
}

void MapWidget::createHomePositionClick(bool click)
{
    Q_UNUSED(click);

    if (!setHome->isChecked())
    {
        UASManager::instance()->setHomePosition(
                    static_cast<double>(homeCoordinate.x()),
                    static_cast<double>(homeCoordinate.y()), 0);

        qDebug()<<"Set home position "<<homeCoordinate.x()<<" "<<homeCoordinate.y();
    }
}