MapWidget.cc 36.2 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 31
MapWidget::MapWidget(QWidget *parent) :
        QWidget(parent),
        zoomLevel(0),
32 33
        uasIcons(),
        uasTrails(),
34
        mav(NULL),
35
        lastUpdate(0),
pixhawk's avatar
pixhawk committed
36 37 38
        m_ui(new Ui::MapWidget)
{
    m_ui->setupUi(this);
39
    mc = new qmapcontrol::MapControl(this->size());
40 41

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

45 46 47 48 49 50 51 52








53
    waypointIsDrag = false;
pixhawk's avatar
pixhawk committed
54

pixhawk's avatar
pixhawk committed
55 56
    // Accept focus by clicking or keyboard
    this->setFocusPolicy(Qt::StrongFocus);
pixhawk's avatar
pixhawk committed
57

pixhawk's avatar
pixhawk committed
58
    // create MapControl
59

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

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

68
    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
69

lm's avatar
lm committed
70
    // MAP BACKGROUND
71 72
    mapadapter = new qmapcontrol::GoogleSatMapAdapter();
    l = new qmapcontrol::MapLayer("Google Satellite", mapadapter);
lm's avatar
lm committed
73
    mc->addLayer(l);
pixhawk's avatar
pixhawk committed
74

lm's avatar
lm committed
75
    // STREET OVERLAY
76
    overlay = new qmapcontrol::MapLayer("Overlay", mapadapter_overlay);
lm's avatar
lm committed
77 78
    overlay->setVisible(false);
    mc->addLayer(overlay);
pixhawk's avatar
pixhawk committed
79

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

lm's avatar
lm committed
84 85
    // WAYPOINT LAYER
    // create a layer with the mapadapter and type GeometryLayer (for waypoints)
86
    geomLayer = new qmapcontrol::GeometryLayer("Waypoints", mapadapter);
87
    mc->addLayer(geomLayer);
pixhawk's avatar
pixhawk committed
88 89 90



91 92 93
    //
    //    Layer* gsatLayer = new Layer("Google Satellite", gsat, Layer::MapLayer);
    //    mc->addLayer(gsatLayer);
pixhawk's avatar
pixhawk committed
94

lm's avatar
lm committed
95 96
    // SET INITIAL POSITION AND ZOOM
    // Set default zoom level
pixhawk's avatar
pixhawk committed
97
    mc->setZoom(16);
lm's avatar
lm committed
98
    // Zurich, ETH
pixhawk's avatar
pixhawk committed
99
    mc->setView(QPointF(8.548056,47.376889));
pixhawk's avatar
pixhawk committed
100

101 102
    // Veracruz Mexico
    //mc->setView(QPointF(-96.105208,19.138955));
pixhawk's avatar
pixhawk committed
103

lm's avatar
lm committed
104 105 106
    // Add controls to select map provider
    /////////////////////////////////////////////////
    QActionGroup* mapproviderGroup = new QActionGroup(this);
107 108 109 110 111
    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);
lm's avatar
lm committed
112 113 114 115 116 117 118 119
    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*)));
pixhawk's avatar
pixhawk committed
120

lm's avatar
lm committed
121
    // Overlay seems currently broken
122 123 124 125 126
    //    yahooActionOverlay = new QAction(tr("Yahoo: street overlay"), this);
    //    yahooActionOverlay->setCheckable(true);
    //    yahooActionOverlay->setChecked(overlay->isVisible());
    //    connect(yahooActionOverlay, SIGNAL(toggled(bool)),
    //            overlay, SLOT(setVisible(bool)));
pixhawk's avatar
pixhawk committed
127

128 129 130 131 132 133
    //    mapproviderGroup->addAction(googleSatAction);
    //    mapproviderGroup->addAction(osmAction);
    //    mapproviderGroup->addAction(yahooActionOverlay);
    //    mapproviderGroup->addAction(googleActionMap);
    //    mapproviderGroup->addAction(yahooActionMap);
    //    mapproviderGroup->addAction(yahooActionSatellite);
pixhawk's avatar
pixhawk committed
134

lm's avatar
lm committed
135 136 137 138
    // Create map provider selection menu
    mapMenu = new QMenu(this);
    mapMenu->addActions(mapproviderGroup->actions());
    mapMenu->addSeparator();
139
    //    mapMenu->addAction(yahooActionOverlay);
pixhawk's avatar
pixhawk committed
140

lm's avatar
lm committed
141 142 143
    mapButton = new QPushButton(this);
    mapButton->setText("Map Source");
    mapButton->setMenu(mapMenu);
144
    mapButton->setStyleSheet(buttonStyle);
pixhawk's avatar
pixhawk committed
145

pixhawk's avatar
pixhawk committed
146
    // display the MapControl in the application
lm's avatar
lm committed
147
    QGridLayout* layout = new QGridLayout(this);
pixhawk's avatar
pixhawk committed
148
    layout->setMargin(0);
149 150
    layout->setSpacing(0);
    layout->addWidget(mc, 0, 0);
pixhawk's avatar
pixhawk committed
151
    setLayout(layout);
pixhawk's avatar
pixhawk committed
152

153
    // create buttons to control the map (zoom, GPS tracking and WP capture)
pixhawk's avatar
pixhawk committed
154
    QPushButton* zoomin = new QPushButton(QIcon(":/images/actions/list-add.svg"), "", this);
155
    zoomin->setStyleSheet(buttonStyle);
pixhawk's avatar
pixhawk committed
156
    QPushButton* zoomout = new QPushButton(QIcon(":/images/actions/list-remove.svg"), "", this);
157
    zoomout->setStyleSheet(buttonStyle);
158
    createPath = new QPushButton(QIcon(":/images/actions/go-bottom.svg"), "", this);
159
    createPath->setStyleSheet(buttonStyle);
160 161
    createPath->setToolTip(tr("Start / end waypoint add mode"));
    createPath->setStatusTip(tr("Start / end waypoint add mode"));
162 163
//    clearTracking = new QPushButton(QIcon(""), "", this);
//    clearTracking->setStyleSheet(buttonStyle);
pixhawk's avatar
pixhawk committed
164
    followgps = new QPushButton(QIcon(":/images/actions/system-lock-screen.svg"), "", this);
165
    followgps->setStyleSheet(buttonStyle);
166 167
    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"));
168 169
    QPushButton* goToButton = new QPushButton(QIcon(""), "T", this);
    goToButton->setStyleSheet(buttonStyle);
170 171
    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"));
pixhawk's avatar
pixhawk committed
172

173 174 175
    zoomin->setMaximumWidth(30);
    zoomout->setMaximumWidth(30);
    createPath->setMaximumWidth(30);
176
//    clearTracking->setMaximumWidth(30);
177
    followgps->setMaximumWidth(30);
178
    goToButton->setMaximumWidth(30);
pixhawk's avatar
pixhawk committed
179

180 181 182 183 184
    // 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);
pixhawk's avatar
pixhawk committed
185

186
    // add buttons to control the map (zoom, GPS tracking and WP capture)
lm's avatar
lm committed
187
    QGridLayout* innerlayout = new QGridLayout(mc);
188 189
    innerlayout->setMargin(3);
    innerlayout->setSpacing(3);
lm's avatar
lm committed
190 191 192 193
    innerlayout->addWidget(zoomin, 0, 0);
    innerlayout->addWidget(zoomout, 1, 0);
    innerlayout->addWidget(followgps, 2, 0);
    innerlayout->addWidget(createPath, 3, 0);
194
    //innerlayout->addWidget(clearTracking, 4, 0);
lm's avatar
lm committed
195
    // Add spacers to compress buttons on the top left
196
    innerlayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 5, 0);
197
    innerlayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 0, 1, 0, 7);
198 199
    innerlayout->addWidget(mapButton, 0, 6);
    innerlayout->addWidget(goToButton, 0, 7);
lm's avatar
lm committed
200 201
    innerlayout->setRowStretch(0, 1);
    innerlayout->setRowStretch(1, 100);
pixhawk's avatar
pixhawk committed
202
    mc->setLayout(innerlayout);
pixhawk's avatar
pixhawk committed
203 204


205
    // Connect the required signals-slots
206 207
    connect(zoomin, SIGNAL(clicked(bool)),
            mc, SLOT(zoomIn()));
pixhawk's avatar
pixhawk committed
208

209 210
    connect(zoomout, SIGNAL(clicked(bool)),
            mc, SLOT(zoomOut()));
pixhawk's avatar
pixhawk committed
211

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

pixhawk's avatar
pixhawk committed
214 215 216 217 218 219
    QList<UASInterface*> systems = UASManager::instance()->getUASList();
    foreach(UASInterface* system, systems)
    {
        addUAS(system);
    }

220 221
    connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)),
            this, SLOT(addUAS(UASInterface*)));
pixhawk's avatar
pixhawk committed
222 223

    activeUASSet(UASManager::instance()->getActiveUAS());
224
    connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(activeUASSet(UASInterface*)));
pixhawk's avatar
pixhawk committed
225

226 227
    connect(mc, SIGNAL(mouseEventCoordinate(const QMouseEvent*, const QPointF)),
            this, SLOT(captureMapClick(const QMouseEvent*, const QPointF)));
pixhawk's avatar
pixhawk committed
228

229
    connect(createPath, SIGNAL(clicked(bool)),
230
            this, SLOT(createPathButtonClicked(bool)));
pixhawk's avatar
pixhawk committed
231 232


233 234
    connect(geomLayer, SIGNAL(geometryClicked(Geometry*,QPoint)),
            this, SLOT(captureGeometryClick(Geometry*, QPoint)));
pixhawk's avatar
pixhawk committed
235

236 237
    connect(geomLayer, SIGNAL(geometryDragged(Geometry*, QPointF)),
            this, SLOT(captureGeometryDrag(Geometry*, QPointF)));
pixhawk's avatar
pixhawk committed
238

239 240
    connect(geomLayer, SIGNAL(geometryEndDrag(Geometry*, QPointF)),
            this, SLOT(captureGeometryEndDrag(Geometry*, QPointF)));
pixhawk's avatar
pixhawk committed
241

242 243 244
    // Configure the WP Path's pen
    pointPen = new QPen(QColor(0, 255,0));
    pointPen->setWidth(3);
245 246
    waypointPath = new qmapcontrol::LineString (wps, "Waypoint path", pointPen);
    mc->layer("Waypoints")->addGeometry(waypointPath);
pixhawk's avatar
pixhawk committed
247

248 249 250 251 252
    //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);
pixhawk's avatar
pixhawk committed
253

254
    //camLine = new qmapcontrol::LineString(camPoints,"Camera Eje", camBorderPen);
pixhawk's avatar
pixhawk committed
255

256 257
    drawCamBorder = false;
    radioCamera = 10;
lm's avatar
lm committed
258 259
}

260 261 262
void MapWidget::goTo()
{
    bool ok;
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
    QString text = QInputDialog::getText(this, tr("Please enter coordinates"),
                                         tr("Coordinates (Lat,Lon):"), QLineEdit::Normal,
                                         QString("%1,%2").arg(mc->currentCoordinate().x()).arg(mc->currentCoordinate().y()), &ok);
    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)
            {
                mc->setView(QPointF(latitude, longitude));
            }
        }
    }
283 284
}

285

lm's avatar
lm committed
286 287 288 289 290 291 292 293
void MapWidget::mapproviderSelected(QAction* action)
{
    //delete mapadapter;
    mapButton->setText(action->text());
    if (action == osmAction)
    {
        int zoom = mapadapter->adaptedZoom();
        mc->setZoom(0);
pixhawk's avatar
pixhawk committed
294

295
        mapadapter = new qmapcontrol::OSMMapAdapter();
lm's avatar
lm committed
296 297
        l->setMapAdapter(mapadapter);
        geomLayer->setMapAdapter(mapadapter);
pixhawk's avatar
pixhawk committed
298

299
        if (isVisible()) mc->updateRequestNew();
lm's avatar
lm committed
300
        mc->setZoom(zoom);
301
        //        yahooActionOverlay->setEnabled(false);
lm's avatar
lm committed
302
        overlay->setVisible(false);
303
        //        yahooActionOverlay->setChecked(false);
pixhawk's avatar
pixhawk committed
304

lm's avatar
lm committed
305 306 307 308 309
    }
    else if (action == yahooActionMap)
    {
        int zoom = mapadapter->adaptedZoom();
        mc->setZoom(0);
pixhawk's avatar
pixhawk committed
310

311
        mapadapter = new qmapcontrol::YahooMapAdapter();
lm's avatar
lm committed
312 313
        l->setMapAdapter(mapadapter);
        geomLayer->setMapAdapter(mapadapter);
pixhawk's avatar
pixhawk committed
314

315
        if (isVisible()) mc->updateRequestNew();
lm's avatar
lm committed
316
        mc->setZoom(zoom);
317
        //        yahooActionOverlay->setEnabled(false);
lm's avatar
lm committed
318
        overlay->setVisible(false);
319
        //        yahooActionOverlay->setChecked(false);
lm's avatar
lm committed
320 321 322 323 324 325
    }
    else if (action == yahooActionSatellite)
    {
        int zoom = mapadapter->adaptedZoom();
        QPointF a = mc->currentCoordinate();
        mc->setZoom(0);
pixhawk's avatar
pixhawk committed
326

327
        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");
lm's avatar
lm committed
328
        l->setMapAdapter(mapadapter);
pixhawk's avatar
pixhawk committed
329

330
        if (isVisible()) mc->updateRequestNew();
lm's avatar
lm committed
331
        mc->setZoom(zoom);
332
        //        yahooActionOverlay->setEnabled(true);
lm's avatar
lm committed
333 334 335 336 337
    }
    else if (action == googleActionMap)
    {
        int zoom = mapadapter->adaptedZoom();
        mc->setZoom(0);
338
        mapadapter = new qmapcontrol::GoogleMapAdapter();
lm's avatar
lm committed
339 340
        l->setMapAdapter(mapadapter);
        geomLayer->setMapAdapter(mapadapter);
pixhawk's avatar
pixhawk committed
341

342
        if (isVisible()) mc->updateRequestNew();
lm's avatar
lm committed
343
        mc->setZoom(zoom);
344
        //        yahooActionOverlay->setEnabled(false);
lm's avatar
lm committed
345
        overlay->setVisible(false);
346
        //        yahooActionOverlay->setChecked(false);
lm's avatar
lm committed
347 348 349 350 351
    }
    else if (action == googleSatAction)
    {
        int zoom = mapadapter->adaptedZoom();
        mc->setZoom(0);
352
        mapadapter = new qmapcontrol::GoogleSatMapAdapter();
lm's avatar
lm committed
353 354
        l->setMapAdapter(mapadapter);
        geomLayer->setMapAdapter(mapadapter); 
pixhawk's avatar
pixhawk committed
355

356
        if (isVisible()) mc->updateRequestNew();
lm's avatar
lm committed
357
        mc->setZoom(zoom);
358
        //        yahooActionOverlay->setEnabled(false);
lm's avatar
lm committed
359
        overlay->setVisible(false);
360
        //        yahooActionOverlay->setChecked(false);
lm's avatar
lm committed
361 362 363 364 365
    }
    else
    {
        mapButton->setText("Select..");
    }
366
}
lm's avatar
lm committed
367

lm's avatar
lm committed
368

369
void MapWidget::createPathButtonClicked(bool checked)
lm's avatar
lm committed
370
{
371
    Q_UNUSED(checked);
pixhawk's avatar
pixhawk committed
372

lm's avatar
lm committed
373 374 375 376
    if (createPath->isChecked())
    {
        // change the cursor shape
        this->setCursor(Qt::PointingHandCursor);
377
        mc->setMouseMode(qmapcontrol::MapControl::None);
pixhawk's avatar
pixhawk committed
378 379


380
        // emit signal start to create a Waypoint global
381
        //emit createGlobalWP(true, mc->currentCoordinate());
pixhawk's avatar
pixhawk committed
382

383 384 385 386 387 388 389
        //        // 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();
390 391 392
    }
    else
    {
pixhawk's avatar
pixhawk committed
393

lm's avatar
lm committed
394
        this->setCursor(Qt::ArrowCursor);
395
        mc->setMouseMode(qmapcontrol::MapControl::Panning);
lm's avatar
lm committed
396
    }
pixhawk's avatar
pixhawk committed
397

398
}
399

400 401 402 403 404 405 406
/**
 * 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
 */
407

408 409
void MapWidget::captureMapClick(const QMouseEvent* event, const QPointF coordinate)
{
410
    if (QEvent::MouseButtonRelease == event->type() && createPath->isChecked())
411
    {
412 413
        // Create waypoint name
        QString str;
pixhawk's avatar
pixhawk committed
414

415 416
        // create the WP and set everything in the LineString to display the path
        Waypoint2DIcon* tempCirclePoint;
pixhawk's avatar
pixhawk committed
417

418 419
        if (mav)
        {
pixhawk's avatar
pixhawk committed
420
            mav->getWaypointManager()->addWaypoint(new Waypoint(mav->getWaypointManager()->getWaypointList().count(), coordinate.x(), coordinate.y(), 0.0f, 0.0f, true));
421 422 423
        }
        else
        {
424
            str = QString("%1").arg(waypointPath->numberOfPoints());
425
            tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle);
426
            wpIcons.append(tempCirclePoint);
pixhawk's avatar
pixhawk committed
427

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

430 431 432 433 434
            qmapcontrol::Point* tempPoint = new qmapcontrol::Point(coordinate.x(), coordinate.y(),str);
            wps.append(tempPoint);
            waypointPath->addPoint(tempPoint);

            // Refresh the screen
435
            if (isVisible()) mc->updateRequest(tempPoint->boundingBox().toRect());
436
        }
pixhawk's avatar
pixhawk committed
437

438
        // emit signal mouse was clicked
439 440 441 442 443 444
        //emit captureMapCoordinateClick(coordinate);
    }
}

void MapWidget::updateWaypoint(int uas, Waypoint* wp)
{
445
    // Update waypoint list and redraw map (last parameter)
446 447 448
    updateWaypoint(uas, wp, true);
}

449 450 451 452
/**
 * This function is called if a a single waypoint is updated and
 * also if the whole list changes.
 */
453 454
void MapWidget::updateWaypoint(int uas, Waypoint* wp, bool updateView)
{
455
    // Make sure this is the right UAS
456 457
    if (uas == this->mav->getUASID())
    {
458
        // Only accept waypoints in global coordinate frame
459
        if (wp->getFrame() == MAV_FRAME_GLOBAL)
460 461 462
        {
            // We're good, this is a global waypoint

463 464 465
            // Get the index of this waypoint
            // note the call to getGlobalFrameIndexOf()
            // as we're only handling global waypoints
466
            int wpindex = UASManager::instance()->getUASForId(uas)->getWaypointManager()->getGlobalFrameIndexOf(wp);
467
            // If not found, return (this should never happen, but helps safety)
468
            if (wpindex == -1) return;
469 470

            // Check if wp exists yet in map
471
            if (!(wpIcons.count() > wpindex))
472
            {
473
                // Waypoint is new, a new icon is created
474 475 476
                QPointF coordinate;
                coordinate.setX(wp->getX());
                coordinate.setY(wp->getY());
477 478 479 480
                createWaypointGraphAtMap(wpindex, coordinate);
            }
            else
            {
481 482
                // Waypoint exists, update it if we're not
                // currently dragging it with the mouse
483
                if(!waypointIsDrag)
484
                {
485 486 487
                    QPointF coordinate;
                    coordinate.setX(wp->getX());
                    coordinate.setY(wp->getY());
488

489
                    Point* waypoint;
490
                    waypoint = wps.at(wpindex);
491
                    if (waypoint)
492
                    {
493 494 495 496
                        // First set waypoint coordinate
                        waypoint->setCoordinate(coordinate);
                        // Now update icon position
                        wpIcons.at(wpindex)->setCoordinate(coordinate);
497
                        // Update pen
498 499 500
                        wpIcons.at(wpindex)->setPen(mavPens.value(uas));
                        // Then waypoint line coordinate
                        Point* linesegment = NULL;
501 502
                        // If the line segment already exists, just update it
                        // else create a new one
503 504 505
                        if (waypointPath->points().size() > wpindex)
                        {
                            linesegment = waypointPath->points().at(wpindex);
506
                            if (linesegment) linesegment->setCoordinate(coordinate);
507 508 509 510 511 512
                        }
                        else
                        {
                            waypointPath->addPoint(waypoint);
                        }

513
                        // Update view
514
                        if (updateView) if (isVisible()) mc->updateRequest(waypoint->boundingBox().toRect());
515 516 517 518
                    }
                }
            }
        }
519 520
        else
        {
521 522 523 524
            // 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
525 526 527 528
            if (waypointPath->points().count() > UASManager::instance()->getUASForId(uas)->getWaypointManager()->getGlobalFrameCount())
            {
                updateWaypointList(uas);
            }
529
        }
530
    }
pixhawk's avatar
pixhawk committed
531 532
}

533
void MapWidget::createWaypointGraphAtMap(int id, const QPointF coordinate)
534
{
535
    //if (!wpExists(coordinate))
536
    {
537 538
        // Create waypoint name
        QString str;
pixhawk's avatar
pixhawk committed
539

540 541 542
        // 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
543

544 545
        if (mav)
        {
546
            int uas = mav->getUASID();
547
            str = QString("%1").arg(id);
548 549
            qDebug() << "Waypoint list count:" << str;
            tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle, mavPens.value(uas));
550 551 552
        }
        else
        {
553
            str = QString("%1").arg(id);
554 555
            tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle);
        }
pixhawk's avatar
pixhawk committed
556 557


558
        mc->layer("Waypoints")->addGeometry(tempCirclePoint);
pixhawk's avatar
pixhawk committed
559
        wpIcons.append(tempCirclePoint);
pixhawk's avatar
pixhawk committed
560

561 562
        Point* tempPoint = new Point(coordinate.x(), coordinate.y(),str);
        wps.append(tempPoint);
563
        waypointPath->addPoint(tempPoint);
pixhawk's avatar
pixhawk committed
564

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

tecnosapiens's avatar
tecnosapiens committed
568
        // Refresh the screen
569
        if (isVisible()) if (isVisible()) mc->updateRequest(tempPoint->boundingBox().toRect());
570
    }
pixhawk's avatar
pixhawk committed
571

572 573
    ////    // emit signal mouse was clicked
    //    emit captureMapCoordinateClick(coordinate);
574 575
}

576 577
int MapWidget::wpExists(const QPointF coordinate)
{
578 579
    for (int i = 0; i < wps.size(); i++){
        if (wps.at(i)->latitude() == coordinate.y() &&
580 581
            wps.at(i)->longitude()== coordinate.x())
        {
582 583
            return 1;
        }
584
    }
585
    return 0;
586 587
}

588

589 590
void MapWidget::captureGeometryClick(Geometry* geom, QPoint point)
{
591 592
    Q_UNUSED(geom);
    Q_UNUSED(point);
pixhawk's avatar
pixhawk committed
593

594
    mc->setMouseMode(qmapcontrol::MapControl::None);
595 596
}

597 598
void MapWidget::captureGeometryDrag(Geometry* geom, QPointF coordinate)
{
599
    waypointIsDrag = true;
pixhawk's avatar
pixhawk committed
600

601
    // Refresh the screen
602
    if (isVisible()) mc->updateRequest(geom->boundingBox().toRect());
pixhawk's avatar
pixhawk committed
603

604
    int temp = 0;
605 606 607 608 609

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

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

612
    if (wpIndexOk && point2Find && wps.count() > index)
613
    {
614
        // Update visual
615
        point2Find->setCoordinate(coordinate);
616 617
        waypointPath->points().at(index)->setCoordinate(coordinate);
        if (isVisible()) mc->updateRequest(waypointPath->boundingBox().toRect());
pixhawk's avatar
pixhawk committed
618

619 620
        // Update waypoint data storage
        if (mav)
621
        {
622
            QVector<Waypoint*> wps = mav->getWaypointManager()->getGlobalFrameWaypointList();
pixhawk's avatar
pixhawk committed
623

624
            if (wps.size() > index)
625
            {
626 627 628 629
                Waypoint* wp = wps.at(index);
                wp->setX(coordinate.x());
                wp->setY(coordinate.y());
                mav->getWaypointManager()->notifyOfChange(wp);
630
            }
631
        }
632 633 634 635 636

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

639
    waypointIsDrag = false;
640 641
}

642
void MapWidget::captureGeometryEndDrag(Geometry* geom, QPointF coordinate)
643
{
644 645 646
    Q_UNUSED(geom);
    Q_UNUSED(coordinate);
    // TODO: Investigate why when creating the waypoint path this slot is being called
pixhawk's avatar
pixhawk committed
647

648 649 650 651 652 653
    // 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
654

655 656
}

pixhawk's avatar
pixhawk committed
657 658 659 660
MapWidget::~MapWidget()
{
    delete m_ui;
}
lm's avatar
lm committed
661 662 663 664 665 666
/**
 *
 * @param uas the UAS/MAV to monitor/display with the HUD
 */
void MapWidget::addUAS(UASInterface* uas)
{
667
    connect(uas, SIGNAL(globalPositionChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateGlobalPosition(UASInterface*,double,double,double,quint64)));
668
    connect(uas, SIGNAL(attitudeChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateAttitude(UASInterface*,double,double,double,quint64)));
669
    connect(uas, SIGNAL(systemSpecsChanged(int)), this, SLOT(updateSystemSpecs(int)));
670 671
}

672 673 674 675 676
/**
 * 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.
 */
677 678 679 680 681 682
void MapWidget::updateWaypointList(int uas)
{
    // Get already existing waypoints
    UASInterface* uasInstance = UASManager::instance()->getUASForId(uas);
    if (uasInstance)
    {
683 684
        // Get update rect of old content, this is what will be redrawn
        // in the last step
685 686
        QRect updateRect = waypointPath->boundingBox().toRect();

687
        // Get all waypoints, including non-global waypoints
688 689 690 691 692 693 694 695 696
        QVector<Waypoint*> wpList = uasInstance->getWaypointManager()->getWaypointList();

        // Clear if necessary
        if (wpList.count() == 0)
        {
            clearWaypoints(uas);
            return;
        }

697
        // Trim internal list to number of global waypoints in the waypoint manager list
698 699
        int overSize = waypointPath->points().count() - uasInstance->getWaypointManager()->getGlobalFrameCount();
        if (overSize > 0)
700
        {
701 702 703
            // Remove n waypoints at the end of the list
            // the remaining waypoints will be updated
            // in the next step
704
            for (int i = 0; i < overSize; ++i)
705
            {
706 707 708 709
                wps.removeLast();
                mc->layer("Waypoints")->removeGeometry(wpIcons.last());
                wpIcons.removeLast();
                waypointPath->points().removeLast();
710 711
            }
        }
pixhawk's avatar
pixhawk committed
712

713 714 715
        // Load all existing waypoints into map view
        foreach (Waypoint* wp, wpList)
        {
716 717 718
            // 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
719 720 721
            updateWaypoint(mav->getUASID(), wp, false);
        }

722
        // Update view
723
        if (isVisible()) mc->updateRequest(updateRect);
724 725 726 727 728 729 730 731 732 733 734 735
    }
}

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
736
    //clearWaypoints();
737 738 739 740 741
    // Re-add the updated waypoints

    //    }

    updateWaypointList(uas);
lm's avatar
lm committed
742 743
}

744 745
void MapWidget::activeUASSet(UASInterface* uas)
{
746 747 748
    // Disconnect old MAV
    if (mav)
    {
749
        // Disconnect the waypoint manager / data storage from the UI
750
        disconnect(mav->getWaypointManager(), SIGNAL(waypointListChanged(int)), this, SLOT(updateWaypointList(int)));
751
        disconnect(mav->getWaypointManager(), SIGNAL(waypointChanged(int, Waypoint*)), this, SLOT(updateWaypoint(int,Waypoint*)));
752 753 754
        disconnect(this, SIGNAL(waypointCreated(Waypoint*)), mav->getWaypointManager(), SLOT(addWaypoint(Waypoint*)));
    }

755 756 757
    if (uas)
    {
        mav = uas;
758 759
        QColor color = mav->getColor();
        color.setAlphaF(0.9);
760
        QPen* pen = new QPen(color);
761
        pen->setWidth(3.0);
762 763 764 765
        mavPens.insert(mav->getUASID(), pen);
        // FIXME Remove after refactoring
        waypointPath->setPen(pen);

766
        // Delete all waypoints and add waypoint from new system
767 768
        //redoWaypoints();
        updateWaypointList(uas->getUASID());
769

770
        // Connect the waypoint manager / data storage to the UI
771
        connect(mav->getWaypointManager(), SIGNAL(waypointListChanged(int)), this, SLOT(updateWaypointList(int)));
772
        connect(mav->getWaypointManager(), SIGNAL(waypointChanged(int, Waypoint*)), this, SLOT(updateWaypoint(int,Waypoint*)));
773
        connect(this, SIGNAL(waypointCreated(Waypoint*)), mav->getWaypointManager(), SLOT(addWaypoint(Waypoint*)));
774

775
        updateSystemSpecs(mav->getUASID());
776
        updateSelectedSystem(mav->getUASID());
777
        mc->updateRequest(waypointPath->boundingBox().toRect());
778 779 780
    }
}

781 782 783 784 785 786 787 788 789 790 791 792 793 794
void MapWidget::updateSystemSpecs(int uas)
{
    foreach (qmapcontrol::Point* p, uasIcons.values())
    {
        MAV2DIcon* icon = dynamic_cast<MAV2DIcon*>(p);
        if (icon && icon->getUASId() == uas)
        {
            // Set new airframe
            icon->setAirframe(UASManager::instance()->getUASForId(uas)->getAirframe());
            icon->drawIcon();
        }
    }
}

795 796 797 798 799 800 801 802 803 804
void MapWidget::updateSelectedSystem(int uas)
{
    foreach (qmapcontrol::Point* p, uasIcons.values())
    {
        MAV2DIcon* icon = dynamic_cast<MAV2DIcon*>(p);
        if (icon)
        {
            // Set as selected if ids match
            icon->setSelectedUAS((icon->getUASId() == uas));
        }
805 806 807
    }
}

808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823
void MapWidget::updateAttitude(UASInterface* uas, double roll, double pitch, double yaw, quint64 usec)
{
    Q_UNUSED(roll);
    Q_UNUSED(pitch);
    Q_UNUSED(usec);

    if (uas)
    {
        MAV2DIcon* icon = dynamic_cast<MAV2DIcon*>(uasIcons.value(uas->getUASID(), NULL));
        if (icon)
        {
            icon->setYaw(yaw);
        }
    }
}

lm's avatar
lm committed
824 825 826 827 828 829 830 831 832
/**
 * 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
833 834 835
void MapWidget::updateGlobalPosition(UASInterface* uas, double lat, double lon, double alt, quint64 usec)
{
    Q_UNUSED(usec);
836
    Q_UNUSED(alt); // FIXME Use altitude
837 838 839 840 841 842 843 844

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

845 846 847 848
    qmapcontrol::Point* p;
    QPointF coordinate;
    coordinate.setX(lat);
    coordinate.setY(lon);
849 850 851 852 853 854 855

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

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

        // Line
        // A QPen also can use transparency

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

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

874 875
        //        // Add the LineString to the layer
        //        mc->layer("Waypoints")->addGeometry(ls);
876 877 878
    }
    else
    {
879 880 881 882 883 884 885
        //        p = dynamic_cast<MAV2DIcon*>(uasIcons.value(uas->getUASID()));
        //        if (p)
        //        {
        p = uasIcons.value(uas->getUASID());
        p->setCoordinate(QPointF(lat, lon));
        //p->setYaw(uas->getYaw());
        //        }
886
        // Extend trail
887
        //        uasTrails.value(uas->getUASID())->addPoint(new qmapcontrol::Point(coordinate.x(), coordinate.y()));
888 889
    }

890
    if (isVisible()) mc->updateRequest(p->boundingBox().toRect());
891

892
    //if (isVisible()) mc->updateRequestNew();//(uasTrails.value(uas->getUASID())->boundingBox().toRect());
893

894
    if (this->mav && uas->getUASID() == this->mav->getUASID())
pixhawk's avatar
pixhawk committed
895
    {
896 897 898
        // Limit the position update rate
        quint64 currTime = MG::TIME::getGroundTimeNow();
        if (currTime - lastUpdate > 120)
899
        {
900 901 902 903 904 905 906 907 908 909 910
            lastUpdate = currTime;
            // Sets the view to the interesting area
            if (followgps->isChecked())
            {
                updatePosition(0, lat, lon);
            }
            else
            {
                // Refresh the screen
                //if (isVisible()) mc->updateRequestNew();
            }
911
        }
pixhawk's avatar
pixhawk committed
912 913
    }
}
pixhawk's avatar
pixhawk committed
914

lm's avatar
lm committed
915 916 917
/**
 * Center the view on this position
 */
lm's avatar
lm committed
918
void MapWidget::updatePosition(float time, double lat, double lon)
pixhawk's avatar
pixhawk committed
919
{
lm's avatar
lm committed
920
    Q_UNUSED(time);
921
    //gpsposition->setText(QString::number(time) + " / " + QString::number(lat) + " / " + QString::number(lon));
922
    if (followgps->isChecked() && isVisible())
pixhawk's avatar
pixhawk committed
923
    {
lm's avatar
lm committed
924
        mc->setView(QPointF(lat, lon));
pixhawk's avatar
pixhawk committed
925 926 927 928 929 930 931 932 933 934 935 936 937 938
    }
}

void MapWidget::wheelEvent(QWheelEvent *event)
{
    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));
pixhawk's avatar
pixhawk committed
939

940
    // visual field of camera
941
    updateCameraPosition(20*newZoom,0,"no");
pixhawk's avatar
pixhawk committed
942

pixhawk's avatar
pixhawk committed
943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970
}

void MapWidget::keyPressEvent(QKeyEvent *event)
{
    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);
    }
}

971
void MapWidget::resizeEvent(QResizeEvent* event )
pixhawk's avatar
pixhawk committed
972
{
973 974
    Q_UNUSED(event);
    mc->resize(this->size());
pixhawk's avatar
pixhawk committed
975 976
}

977 978 979 980 981 982 983 984 985 986
void MapWidget::showEvent(QShowEvent* event)
{
    Q_UNUSED(event);
}

void MapWidget::hideEvent(QHideEvent* event)
{
    Q_UNUSED(event);
}

pixhawk's avatar
pixhawk committed
987 988 989 990 991 992 993 994 995 996 997 998

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

1000
void MapWidget::clearWaypoints(int uas)
1001
{
pixhawk's avatar
pixhawk committed
1002
    Q_UNUSED(uas);
1003
    // Clear the previous WP track
pixhawk's avatar
pixhawk committed
1004

1005
    //mc->layer("Waypoints")->clearGeometries();
1006
    wps.clear();
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016
    foreach (Point* p, wpIcons)
    {
        mc->layer("Waypoints")->removeGeometry(p);
    }
    wpIcons.clear();

    // Get bounding box of this object BEFORE deleting the content
    QRect box = waypointPath->boundingBox().toRect();

    // Delete the content
1017
    waypointPath->points().clear();
1018

1019 1020
    //delete waypointPath;
    //waypointPath = new
1021
    //mc->layer("Waypoints")->addGeometry(waypointPath);
1022
    //wpIndex.clear();
1023
    if (isVisible()) mc->updateRequest(box);//(waypointPath->boundingBox().toRect());
pixhawk's avatar
pixhawk committed
1024

1025 1026 1027 1028
    if(createPath->isChecked())
    {
        createPath->click();
    }
1029 1030

    qDebug() << "CLEARING WAYPOINTS";
1031
}
pixhawk's avatar
pixhawk committed
1032

1033
void MapWidget::clearPath(int uas)
1034
{
pixhawk's avatar
pixhawk committed
1035
    Q_UNUSED(uas);
1036 1037 1038 1039 1040 1041 1042 1043 1044
    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
1045
    if (isVisible()) mc->updateRequestNew();//(QRect(0, 0, width(), height()));
1046
}
1047

1048 1049
void MapWidget::updateCameraPosition(double radio, double bearing, QString dir)
{
pixhawk's avatar
pixhawk committed
1050 1051
    Q_UNUSED(dir);
    Q_UNUSED(bearing);
1052
    // FIXME Mariano
1053 1054
    //camPoints.clear();
    QPointF currentPos = mc->currentCoordinate();
1055
    //    QPointF actualPos = getPointxBearing_Range(currentPos.y(),currentPos.x(),bearing,distance);
pixhawk's avatar
pixhawk committed
1056

1057 1058
    //    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
1059

1060 1061
    //    camPoints.append(tempPoint1);
    //    camPoints.append(tempPoint2);
pixhawk's avatar
pixhawk committed
1062

1063
    //    camLine->setPoints(camPoints);
pixhawk's avatar
pixhawk committed
1064

1065
    QPen* camBorderPen = new QPen(QColor(255,0,0));
1066
    camBorderPen->setWidth(2);
pixhawk's avatar
pixhawk committed
1067

1068
    //radio = mc->currentZoom()
pixhawk's avatar
pixhawk committed
1069

1070 1071 1072 1073
    if(drawCamBorder)
    {
        //clear camera borders
        mc->layer("Camera")->clearGeometries();
pixhawk's avatar
pixhawk committed
1074

1075 1076
        //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
1077

1078
        //camBorder->setCoordinate(currentPos);
pixhawk's avatar
pixhawk committed
1079

1080
        mc->layer("Camera")->addGeometry(camBorder);
1081
        // mc->layer("Camera")->addGeometry(camLine);
1082
        if (isVisible()) mc->updateRequestNew();
pixhawk's avatar
pixhawk committed
1083

1084
    }
1085 1086 1087 1088
    else
    {
        //clear camera borders
        mc->layer("Camera")->clearGeometries();
1089
        if (isVisible()) mc->updateRequestNew();
pixhawk's avatar
pixhawk committed
1090

1091
    }
pixhawk's avatar
pixhawk committed
1092 1093


1094 1095 1096 1097 1098 1099
}

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

1101 1102 1103 1104 1105
}

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

1107
    double rad = M_PI/180;
pixhawk's avatar
pixhawk committed
1108

1109 1110 1111
    bearing = bearing*rad;
    temp.setX((lon1 + ((distance/60) * (sin(bearing)))));
    temp.setY((lat1 + ((distance/60) * (cos(bearing)))));
pixhawk's avatar
pixhawk committed
1112

1113 1114 1115
    return temp;
}