MapWidget.cc 40.5 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 96 97 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 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
        // 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);



        //
        //    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"));

        zoomin->setMaximumWidth(30);
        zoomout->setMaximumWidth(30);
        createPath->setMaximumWidth(30);
        //    clearTracking->setMaximumWidth(30);
        followgps->setMaximumWidth(30);
        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);

        // 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);
        //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)
        camLayer = new qmapcontrol::GeometryLayer("Camera", mapadapter);
        mc->addLayer(camLayer);

        //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
252

lm's avatar
lm committed
253 254
        connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)),
                this, SLOT(addUAS(UASInterface*)));
pixhawk's avatar
pixhawk committed
255

lm's avatar
lm committed
256 257
        activeUASSet(UASManager::instance()->getActiveUAS());
        connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(activeUASSet(UASInterface*)));
pixhawk's avatar
pixhawk committed
258

lm's avatar
lm committed
259 260
        connect(mc, SIGNAL(mouseEventCoordinate(const QMouseEvent*, const QPointF)),
                this, SLOT(captureMapClick(const QMouseEvent*, const QPointF)));
pixhawk's avatar
pixhawk committed
261

lm's avatar
lm committed
262 263
        connect(createPath, SIGNAL(clicked(bool)),
                this, SLOT(createPathButtonClicked(bool)));
pixhawk's avatar
pixhawk committed
264

lm's avatar
lm committed
265 266 267 268 269 270 271 272 273 274 275 276

        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
277 278
}

279 280 281
void MapWidget::goTo()
{
    bool ok;
282 283
    QString text = QInputDialog::getText(this, tr("Please enter coordinates"),
                                         tr("Coordinates (Lat,Lon):"), QLineEdit::Normal,
284
                                         QString("%1,%2").arg(mc->currentCoordinate().y()).arg(mc->currentCoordinate().x()), &ok);
285 286 287 288 289 290 291 292 293 294 295 296 297
    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)
            {
298
                mc->setView(QPointF(longitude, latitude));
299 300 301
            }
        }
    }
302 303
}

304

lm's avatar
lm committed
305 306
void MapWidget::mapproviderSelected(QAction* action)
{
lm's avatar
lm committed
307
    if (mc)
lm's avatar
lm committed
308
    {
lm's avatar
lm committed
309 310 311 312 313 314
        //delete mapadapter;
        mapButton->setText(action->text());
        if (action == osmAction)
        {
            int zoom = mapadapter->adaptedZoom();
            mc->setZoom(0);
pixhawk's avatar
pixhawk committed
315

lm's avatar
lm committed
316 317 318
            mapadapter = new qmapcontrol::OSMMapAdapter();
            l->setMapAdapter(mapadapter);
            geomLayer->setMapAdapter(mapadapter);
pixhawk's avatar
pixhawk committed
319

lm's avatar
lm committed
320 321 322 323 324
            if (isVisible()) mc->updateRequestNew();
            mc->setZoom(zoom);
            //        yahooActionOverlay->setEnabled(false);
            overlay->setVisible(false);
            //        yahooActionOverlay->setChecked(false);
pixhawk's avatar
pixhawk committed
325

lm's avatar
lm committed
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 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
        }
        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
389
    }
390
}
lm's avatar
lm committed
391

lm's avatar
lm committed
392

393
void MapWidget::createPathButtonClicked(bool checked)
lm's avatar
lm committed
394
{
lm's avatar
lm committed
395
    if (mc)
lm's avatar
lm committed
396
    {
lm's avatar
lm committed
397
        Q_UNUSED(checked);
pixhawk's avatar
pixhawk committed
398

lm's avatar
lm committed
399 400 401 402 403
        if (createPath->isChecked())
        {
            // change the cursor shape
            this->setCursor(Qt::PointingHandCursor);
            mc->setMouseMode(qmapcontrol::MapControl::None);
pixhawk's avatar
pixhawk committed
404 405


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

lm's avatar
lm committed
409 410 411 412 413 414 415 416 417 418
            //        // 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
419

lm's avatar
lm committed
420 421 422 423
            this->setCursor(Qt::ArrowCursor);
            mc->setMouseMode(qmapcontrol::MapControl::Panning);
        }
    }
424
}
425

426 427 428 429 430 431 432
/**
 * 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
 */
433

434 435
void MapWidget::captureMapClick(const QMouseEvent* event, const QPointF coordinate)
{
436
    if (QEvent::MouseButtonRelease == event->type() && createPath->isChecked())
437
    {
438 439
        // Create waypoint name
        QString str;
pixhawk's avatar
pixhawk committed
440

441 442
        // create the WP and set everything in the LineString to display the path
        Waypoint2DIcon* tempCirclePoint;
pixhawk's avatar
pixhawk committed
443

444 445
        if (mav)
        {
446 447 448 449 450 451 452 453 454
            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));
455 456 457
        }
        else
        {
458
            str = QString("%1").arg(waypointPath->numberOfPoints());
459
            tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle);
460
            wpIcons.append(tempCirclePoint);
pixhawk's avatar
pixhawk committed
461

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

464 465 466 467 468
            qmapcontrol::Point* tempPoint = new qmapcontrol::Point(coordinate.x(), coordinate.y(),str);
            wps.append(tempPoint);
            waypointPath->addPoint(tempPoint);

            // Refresh the screen
469
            if (isVisible()) mc->updateRequest(tempPoint->boundingBox().toRect());
470
        }
pixhawk's avatar
pixhawk committed
471

472
        // emit signal mouse was clicked
473 474 475 476 477 478
        //emit captureMapCoordinateClick(coordinate);
    }
}

void MapWidget::updateWaypoint(int uas, Waypoint* wp)
{
479
    // Update waypoint list and redraw map (last parameter)
480 481 482
    updateWaypoint(uas, wp, true);
}

483 484 485 486
/**
 * This function is called if a a single waypoint is updated and
 * also if the whole list changes.
 */
487 488
void MapWidget::updateWaypoint(int uas, Waypoint* wp, bool updateView)
{
lm's avatar
lm committed
489
    if (mc)
490
    {
lm's avatar
lm committed
491 492
        // Make sure this is the right UAS
        if (uas == this->mav->getUASID())
493
        {
lm's avatar
lm committed
494
            // Only accept waypoints in global coordinate frame
lm's avatar
lm committed
495
            if (wp->getFrame() == MAV_FRAME_GLOBAL && wp->isNavigationType())
lm's avatar
lm committed
496 497
            {
                // We're good, this is a global waypoint
498

lm's avatar
lm committed
499
                // Get the index of this waypoint
lm's avatar
lm committed
500
                // note the call to getGlobalFrameAndNavTypeIndexOf()
lm's avatar
lm committed
501
                // as we're only handling global waypoints
lm's avatar
lm committed
502
                int wpindex = UASManager::instance()->getUASForId(uas)->getWaypointManager()->getGlobalFrameAndNavTypeIndexOf(wp);
lm's avatar
lm committed
503 504
                // If not found, return (this should never happen, but helps safety)
                if (wpindex == -1) return;
505

lm's avatar
lm committed
506 507
                // Check if wp exists yet in map
                if (!(wpIcons.count() > wpindex))
508
                {
lm's avatar
lm committed
509
                    // Waypoint is new, a new icon is created
510
                    QPointF coordinate;
511 512
                    coordinate.setX(wp->getLongitude());
                    coordinate.setY(wp->getLatitude());
lm's avatar
lm committed
513 514 515 516 517 518 519
                    createWaypointGraphAtMap(wpindex, coordinate);
                }
                else
                {
                    // Waypoint exists, update it if we're not
                    // currently dragging it with the mouse
                    if(!waypointIsDrag)
520
                    {
lm's avatar
lm committed
521 522 523 524 525 526 527
                        QPointF coordinate;
                        coordinate.setX(wp->getLongitude());
                        coordinate.setY(wp->getLatitude());

                        Point* waypoint;
                        waypoint = wps.at(wpindex);
                        if (waypoint)
528
                        {
lm's avatar
lm committed
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550
                            // 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());
551
                        }
552 553 554
                    }
                }
            }
lm's avatar
lm committed
555
            else
556
            {
lm's avatar
lm committed
557 558 559 560
                // 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
lm's avatar
lm committed
561
                if (waypointPath->points().count() > UASManager::instance()->getUASForId(uas)->getWaypointManager()->getGlobalFrameAndNavTypeCount())
lm's avatar
lm committed
562 563 564
                {
                    updateWaypointList(uas);
                }
565
            }
566
        }
567
    }
pixhawk's avatar
pixhawk committed
568 569
}

570
void MapWidget::createWaypointGraphAtMap(int id, const QPointF coordinate)
571
{
572
    //if (!wpExists(coordinate))
573
    {
574 575
        // Create waypoint name
        QString str;
pixhawk's avatar
pixhawk committed
576

577 578 579
        // 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
580

581 582
        if (mav)
        {
583
            int uas = mav->getUASID();
584
            str = QString("%1").arg(id);
585 586
            qDebug() << "Waypoint list count:" << str;
            tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle, mavPens.value(uas));
587 588 589
        }
        else
        {
590
            str = QString("%1").arg(id);
591 592
            tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle);
        }
pixhawk's avatar
pixhawk committed
593 594


595
        mc->layer("Waypoints")->addGeometry(tempCirclePoint);
pixhawk's avatar
pixhawk committed
596
        wpIcons.append(tempCirclePoint);
pixhawk's avatar
pixhawk committed
597

598 599
        Point* tempPoint = new Point(coordinate.x(), coordinate.y(),str);
        wps.append(tempPoint);
600
        waypointPath->addPoint(tempPoint);
pixhawk's avatar
pixhawk committed
601

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

tecnosapiens's avatar
tecnosapiens committed
605
        // Refresh the screen
606
        if (isVisible()) if (isVisible()) mc->updateRequest(tempPoint->boundingBox().toRect());
607
    }
pixhawk's avatar
pixhawk committed
608

609 610
    ////    // emit signal mouse was clicked
    //    emit captureMapCoordinateClick(coordinate);
611 612
}

613 614
int MapWidget::wpExists(const QPointF coordinate)
{
lm's avatar
lm committed
615 616 617 618 619 620 621 622
    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;
            }
623
        }
624
    }
625
    return 0;
626 627
}

628

629 630
void MapWidget::captureGeometryClick(Geometry* geom, QPoint point)
{
631 632
    Q_UNUSED(geom);
    Q_UNUSED(point);
pixhawk's avatar
pixhawk committed
633

lm's avatar
lm committed
634
    if (mc) mc->setMouseMode(qmapcontrol::MapControl::None);
635 636
}

637 638
void MapWidget::captureGeometryDrag(Geometry* geom, QPointF coordinate)
{
639
    waypointIsDrag = true;
pixhawk's avatar
pixhawk committed
640

641
    // Refresh the screen
642
    if (isVisible()) mc->updateRequest(geom->boundingBox().toRect());
pixhawk's avatar
pixhawk committed
643

644
    int temp = 0;
645 646 647 648 649

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

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

652
    if (wpIndexOk && point2Find && wps.count() > index)
653
    {
654
        // Update visual
655
        point2Find->setCoordinate(coordinate);
656 657
        waypointPath->points().at(index)->setCoordinate(coordinate);
        if (isVisible()) mc->updateRequest(waypointPath->boundingBox().toRect());
pixhawk's avatar
pixhawk committed
658

659 660
        // Update waypoint data storage
        if (mav)
661
        {
lm's avatar
lm committed
662
            QVector<Waypoint*> wps = mav->getWaypointManager()->getGlobalFrameAndNavTypeWaypointList();
pixhawk's avatar
pixhawk committed
663

664
            if (wps.size() > index)
665
            {
666
                Waypoint* wp = wps.at(index);
667 668
                wp->setLatitude(coordinate.y());
                wp->setLongitude(coordinate.x());
669
                mav->getWaypointManager()->notifyOfChange(wp);
670
            }
671
        }
672 673 674 675 676

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

679
    waypointIsDrag = false;
680 681
}

682
void MapWidget::captureGeometryEndDrag(Geometry* geom, QPointF coordinate)
683
{
684 685 686
    Q_UNUSED(geom);
    Q_UNUSED(coordinate);
    // TODO: Investigate why when creating the waypoint path this slot is being called
pixhawk's avatar
pixhawk committed
687

688 689 690 691 692 693
    // 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
694

695 696
}

pixhawk's avatar
pixhawk committed
697 698
MapWidget::~MapWidget()
{
lm's avatar
lm committed
699
    delete mc;
pixhawk's avatar
pixhawk committed
700 701
    delete m_ui;
}
lm's avatar
lm committed
702 703 704 705 706 707
/**
 *
 * @param uas the UAS/MAV to monitor/display with the HUD
 */
void MapWidget::addUAS(UASInterface* uas)
{
708
    connect(uas, SIGNAL(globalPositionChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateGlobalPosition(UASInterface*,double,double,double,quint64)));
709
    connect(uas, SIGNAL(attitudeChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateAttitude(UASInterface*,double,double,double,quint64)));
710
    connect(uas, SIGNAL(systemSpecsChanged(int)), this, SLOT(updateSystemSpecs(int)));
711 712
}

713 714 715 716 717
/**
 * 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.
 */
718 719
void MapWidget::updateWaypointList(int uas)
{
lm's avatar
lm committed
720
    if (mc)
721
    {
lm's avatar
lm committed
722 723 724 725 726 727 728
        // 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();
729

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

lm's avatar
lm committed
733 734 735 736 737 738
            // Clear if necessary
            if (wpList.count() == 0)
            {
                clearWaypoints(uas);
                return;
            }
739

lm's avatar
lm committed
740
            // Trim internal list to number of global waypoints in the waypoint manager list
lm's avatar
lm committed
741
            int overSize = waypointPath->points().count() - uasInstance->getWaypointManager()->getGlobalFrameAndNavTypeCount();
lm's avatar
lm committed
742
            if (overSize > 0)
743
            {
lm's avatar
lm committed
744 745 746 747 748 749 750 751 752 753
                // 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();
                }
754
            }
pixhawk's avatar
pixhawk committed
755

lm's avatar
lm committed
756 757 758 759 760 761 762 763
            // 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);
            }
764

lm's avatar
lm committed
765 766 767
            // Update view
            if (isVisible()) mc->updateRequest(updateRect);
        }
768 769 770 771 772 773 774 775 776 777 778 779
    }
}

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
780
    //clearWaypoints();
781 782 783 784 785
    // Re-add the updated waypoints

    //    }

    updateWaypointList(uas);
lm's avatar
lm committed
786 787
}

788 789
void MapWidget::activeUASSet(UASInterface* uas)
{
790 791 792
    // Disconnect old MAV
    if (mav)
    {
793
        // Disconnect the waypoint manager / data storage from the UI
794
        disconnect(mav->getWaypointManager(), SIGNAL(waypointListChanged(int)), this, SLOT(updateWaypointList(int)));
795
        disconnect(mav->getWaypointManager(), SIGNAL(waypointChanged(int, Waypoint*)), this, SLOT(updateWaypoint(int,Waypoint*)));
796 797 798
        disconnect(this, SIGNAL(waypointCreated(Waypoint*)), mav->getWaypointManager(), SLOT(addWaypoint(Waypoint*)));
    }

lm's avatar
lm committed
799
    if (uas && mc)
800 801
    {
        mav = uas;
802 803
        QColor color = mav->getColor();
        color.setAlphaF(0.9);
804
        QPen* pen = new QPen(color);
805
        pen->setWidth(3.0);
806 807 808 809
        mavPens.insert(mav->getUASID(), pen);
        // FIXME Remove after refactoring
        waypointPath->setPen(pen);

810
        // Delete all waypoints and add waypoint from new system
811 812
        //redoWaypoints();
        updateWaypointList(uas->getUASID());
813

814
        // Connect the waypoint manager / data storage to the UI
815
        connect(mav->getWaypointManager(), SIGNAL(waypointListChanged(int)), this, SLOT(updateWaypointList(int)));
816
        connect(mav->getWaypointManager(), SIGNAL(waypointChanged(int, Waypoint*)), this, SLOT(updateWaypoint(int,Waypoint*)));
817
        connect(this, SIGNAL(waypointCreated(Waypoint*)), mav->getWaypointManager(), SLOT(addWaypoint(Waypoint*)));
818

819
        updateSystemSpecs(mav->getUASID());
820
        updateSelectedSystem(mav->getUASID());
821
        mc->updateRequest(waypointPath->boundingBox().toRect());
822 823 824
    }
}

825 826
void MapWidget::updateSystemSpecs(int uas)
{
lm's avatar
lm committed
827
    if (mc)
828
    {
lm's avatar
lm committed
829
        foreach (qmapcontrol::Point* p, uasIcons.values())
830
        {
lm's avatar
lm committed
831 832 833 834 835 836 837
            MAV2DIcon* icon = dynamic_cast<MAV2DIcon*>(p);
            if (icon && icon->getUASId() == uas)
            {
                // Set new airframe
                icon->setAirframe(UASManager::instance()->getUASForId(uas)->getAirframe());
                icon->drawIcon();
            }
838 839 840 841
        }
    }
}

842 843
void MapWidget::updateSelectedSystem(int uas)
{
lm's avatar
lm committed
844
    if (mc)
845
    {
lm's avatar
lm committed
846
        foreach (qmapcontrol::Point* p, uasIcons.values())
847
        {
lm's avatar
lm committed
848 849 850 851 852 853
            MAV2DIcon* icon = dynamic_cast<MAV2DIcon*>(p);
            if (icon)
            {
                // Set as selected if ids match
                icon->setSelectedUAS((icon->getUASId() == uas));
            }
854
        }
855 856 857
    }
}

858 859 860 861 862
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
863
    if (mc)
864
    {
lm's avatar
lm committed
865 866

        if (uas)
867
        {
lm's avatar
lm committed
868 869 870 871 872
            MAV2DIcon* icon = dynamic_cast<MAV2DIcon*>(uasIcons.value(uas->getUASID(), NULL));
            if (icon)
            {
                icon->setYaw(yaw);
            }
873 874 875 876
        }
    }
}

lm's avatar
lm committed
877 878 879 880 881 882 883 884 885
/**
 * 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
886 887 888
void MapWidget::updateGlobalPosition(UASInterface* uas, double lat, double lon, double alt, quint64 usec)
{
    Q_UNUSED(usec);
889
    Q_UNUSED(alt); // FIXME Use altitude
lm's avatar
lm committed
890
    if (mc)
891
    {
lm's avatar
lm committed
892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 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
        // 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()));
        }
943

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

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

lm's avatar
lm committed
948
        if (this->mav && uas->getUASID() == this->mav->getUASID())
949
        {
lm's avatar
lm committed
950 951 952
            // Limit the position update rate
            quint64 currTime = MG::TIME::getGroundTimeNow();
            if (currTime - lastUpdate > 120)
953
            {
lm's avatar
lm committed
954 955 956 957 958 959 960 961 962 963 964
                lastUpdate = currTime;
                // Sets the view to the interesting area
                if (followgps->isChecked())
                {
                    updatePosition(0, lon, lat);
                }
                else
                {
                    // Refresh the screen
                    //if (isVisible()) mc->updateRequestNew();
                }
965
            }
966
        }
pixhawk's avatar
pixhawk committed
967 968
    }
}
pixhawk's avatar
pixhawk committed
969

lm's avatar
lm committed
970 971 972
/**
 * Center the view on this position
 */
lm's avatar
lm committed
973
void MapWidget::updatePosition(float time, double lat, double lon)
pixhawk's avatar
pixhawk committed
974
{
lm's avatar
lm committed
975
    Q_UNUSED(time);
976
    //gpsposition->setText(QString::number(time) + " / " + QString::number(lat) + " / " + QString::number(lon));
lm's avatar
lm committed
977
    if (followgps->isChecked() && isVisible() && mc)
pixhawk's avatar
pixhawk committed
978
    {
979
        if (mc) mc->setView(QPointF(lat, lon));
pixhawk's avatar
pixhawk committed
980 981 982 983 984
    }
}

void MapWidget::wheelEvent(QWheelEvent *event)
{
lm's avatar
lm committed
985 986 987 988 989 990 991 992 993 994 995 996 997 998 999
    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
1000 1001 1002 1003
}

void MapWidget::keyPressEvent(QKeyEvent *event)
{
lm's avatar
lm committed
1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027
    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
1028 1029 1030
    }
}

1031
void MapWidget::resizeEvent(QResizeEvent* event )
pixhawk's avatar
pixhawk committed
1032
{
1033
    Q_UNUSED(event);
lm's avatar
lm committed
1034 1035 1036 1037
        if (!initialized)
        {
            init();
        }
1038
    if (mc) mc->resize(this->size());
pixhawk's avatar
pixhawk committed
1039 1040
}

1041 1042 1043
void MapWidget::showEvent(QShowEvent* event)
{
    Q_UNUSED(event);
lm's avatar
lm committed
1044 1045 1046 1047 1048 1049 1050
//    if (isVisible())
//    {
//	if (!initialized)
//	{
//            init();
//	}
//    }
1051 1052 1053 1054 1055
}

void MapWidget::hideEvent(QHideEvent* event)
{
    Q_UNUSED(event);
lm's avatar
lm committed
1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066
    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();
    }
1067 1068
}

pixhawk's avatar
pixhawk committed
1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080

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

1082
void MapWidget::clearWaypoints(int uas)
1083
{
lm's avatar
lm committed
1084
    if (mc)
1085
    {
lm's avatar
lm committed
1086 1087
        Q_UNUSED(uas);
        // Clear the previous WP track
1088

lm's avatar
lm committed
1089 1090 1091 1092 1093 1094 1095
        //mc->layer("Waypoints")->clearGeometries();
        wps.clear();
        foreach (Point* p, wpIcons)
        {
            mc->layer("Waypoints")->removeGeometry(p);
        }
        wpIcons.clear();
1096

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

lm's avatar
lm committed
1100 1101
        // Delete the content
        waypointPath->points().clear();
pixhawk's avatar
pixhawk committed
1102

lm's avatar
lm committed
1103 1104 1105 1106 1107
        //delete waypointPath;
        //waypointPath = new
        //mc->layer("Waypoints")->addGeometry(waypointPath);
        //wpIndex.clear();
        if (isVisible()) mc->updateRequest(box);//(waypointPath->boundingBox().toRect());
1108

lm's avatar
lm committed
1109 1110 1111 1112 1113
        if(createPath->isChecked())
        {
            createPath->click();
        }
    }
1114
}
pixhawk's avatar
pixhawk committed
1115

1116
void MapWidget::clearPath(int uas)
1117
{
pixhawk's avatar
pixhawk committed
1118
    Q_UNUSED(uas);
lm's avatar
lm committed
1119
    if (mc)
1120
    {
lm's avatar
lm committed
1121 1122 1123 1124 1125 1126 1127 1128 1129 1130
        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()));
1131
    }
1132
}
1133

1134 1135
void MapWidget::updateCameraPosition(double radio, double bearing, QString dir)
{
pixhawk's avatar
pixhawk committed
1136 1137
    Q_UNUSED(dir);
    Q_UNUSED(bearing);
lm's avatar
lm committed
1138 1139 1140 1141 1142 1143
    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
1144

lm's avatar
lm committed
1145 1146
        //    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
1147

lm's avatar
lm committed
1148 1149
        //    camPoints.append(tempPoint1);
        //    camPoints.append(tempPoint2);
pixhawk's avatar
pixhawk committed
1150

lm's avatar
lm committed
1151
        //    camLine->setPoints(camPoints);
pixhawk's avatar
pixhawk committed
1152

lm's avatar
lm committed
1153 1154
        QPen* camBorderPen = new QPen(QColor(255,0,0));
        camBorderPen->setWidth(2);
pixhawk's avatar
pixhawk committed
1155

lm's avatar
lm committed
1156
        //radio = mc->currentZoom()
pixhawk's avatar
pixhawk committed
1157

lm's avatar
lm committed
1158 1159 1160 1161
        if(drawCamBorder)
        {
            //clear camera borders
            mc->layer("Camera")->clearGeometries();
pixhawk's avatar
pixhawk committed
1162

lm's avatar
lm committed
1163 1164
            //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
1165

lm's avatar
lm committed
1166
            //camBorder->setCoordinate(currentPos);
pixhawk's avatar
pixhawk committed
1167

lm's avatar
lm committed
1168 1169 1170
            mc->layer("Camera")->addGeometry(camBorder);
            // mc->layer("Camera")->addGeometry(camLine);
            if (isVisible()) mc->updateRequestNew();
pixhawk's avatar
pixhawk committed
1171

lm's avatar
lm committed
1172 1173 1174 1175 1176 1177
        }
        else
        {
            //clear camera borders
            mc->layer("Camera")->clearGeometries();
            if (isVisible()) mc->updateRequestNew();
pixhawk's avatar
pixhawk committed
1178

lm's avatar
lm committed
1179
        }
1180
    }
1181 1182 1183 1184 1185 1186
}

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

1188 1189 1190 1191 1192
}

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

1194
    double rad = M_PI/180;
pixhawk's avatar
pixhawk committed
1195

1196 1197 1198
    bearing = bearing*rad;
    temp.setX((lon1 + ((distance/60) * (sin(bearing)))));
    temp.setY((lat1 + ((distance/60) * (cos(bearing)))));
pixhawk's avatar
pixhawk committed
1199

1200 1201 1202
    return temp;
}