MapWidget.cc 37.3 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

95 96 97 98 99 100 101 102 103 104 105 106 107 108

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

lm's avatar
lm committed
109 110
    // SET INITIAL POSITION AND ZOOM
    // Set default zoom level
111 112
    mc->setZoom(lastZoom);
    mc->setView(QPointF(lastLon, lastLat));
pixhawk's avatar
pixhawk committed
113

114 115
    // Veracruz Mexico
    //mc->setView(QPointF(-96.105208,19.138955));
pixhawk's avatar
pixhawk committed
116

lm's avatar
lm committed
117 118 119
    // Add controls to select map provider
    /////////////////////////////////////////////////
    QActionGroup* mapproviderGroup = new QActionGroup(this);
120 121 122 123 124
    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
125 126 127 128 129 130 131 132
    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
133

lm's avatar
lm committed
134
    // Overlay seems currently broken
135 136 137 138 139
    //    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
140

141 142 143 144 145 146
    //    mapproviderGroup->addAction(googleSatAction);
    //    mapproviderGroup->addAction(osmAction);
    //    mapproviderGroup->addAction(yahooActionOverlay);
    //    mapproviderGroup->addAction(googleActionMap);
    //    mapproviderGroup->addAction(yahooActionMap);
    //    mapproviderGroup->addAction(yahooActionSatellite);
pixhawk's avatar
pixhawk committed
147

lm's avatar
lm committed
148 149 150 151
    // Create map provider selection menu
    mapMenu = new QMenu(this);
    mapMenu->addActions(mapproviderGroup->actions());
    mapMenu->addSeparator();
152
    //    mapMenu->addAction(yahooActionOverlay);
pixhawk's avatar
pixhawk committed
153

lm's avatar
lm committed
154 155 156
    mapButton = new QPushButton(this);
    mapButton->setText("Map Source");
    mapButton->setMenu(mapMenu);
157
    mapButton->setStyleSheet(buttonStyle);
pixhawk's avatar
pixhawk committed
158

pixhawk's avatar
pixhawk committed
159
    // display the MapControl in the application
lm's avatar
lm committed
160
    QGridLayout* layout = new QGridLayout(this);
pixhawk's avatar
pixhawk committed
161
    layout->setMargin(0);
162 163
    layout->setSpacing(0);
    layout->addWidget(mc, 0, 0);
pixhawk's avatar
pixhawk committed
164
    setLayout(layout);
pixhawk's avatar
pixhawk committed
165

166
    // create buttons to control the map (zoom, GPS tracking and WP capture)
pixhawk's avatar
pixhawk committed
167
    QPushButton* zoomin = new QPushButton(QIcon(":/images/actions/list-add.svg"), "", this);
168
    zoomin->setStyleSheet(buttonStyle);
pixhawk's avatar
pixhawk committed
169
    QPushButton* zoomout = new QPushButton(QIcon(":/images/actions/list-remove.svg"), "", this);
170
    zoomout->setStyleSheet(buttonStyle);
171
    createPath = new QPushButton(QIcon(":/images/actions/go-bottom.svg"), "", this);
172
    createPath->setStyleSheet(buttonStyle);
173 174
    createPath->setToolTip(tr("Start / end waypoint add mode"));
    createPath->setStatusTip(tr("Start / end waypoint add mode"));
175 176
//    clearTracking = new QPushButton(QIcon(""), "", this);
//    clearTracking->setStyleSheet(buttonStyle);
pixhawk's avatar
pixhawk committed
177
    followgps = new QPushButton(QIcon(":/images/actions/system-lock-screen.svg"), "", this);
178
    followgps->setStyleSheet(buttonStyle);
179 180
    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"));
181 182
    QPushButton* goToButton = new QPushButton(QIcon(""), "T", this);
    goToButton->setStyleSheet(buttonStyle);
183 184
    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
185

186 187 188
    zoomin->setMaximumWidth(30);
    zoomout->setMaximumWidth(30);
    createPath->setMaximumWidth(30);
189
//    clearTracking->setMaximumWidth(30);
190
    followgps->setMaximumWidth(30);
191
    goToButton->setMaximumWidth(30);
pixhawk's avatar
pixhawk committed
192

193 194 195 196 197
    // 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
198

199
    // add buttons to control the map (zoom, GPS tracking and WP capture)
lm's avatar
lm committed
200
    QGridLayout* innerlayout = new QGridLayout(mc);
201 202
    innerlayout->setMargin(3);
    innerlayout->setSpacing(3);
lm's avatar
lm committed
203 204 205 206
    innerlayout->addWidget(zoomin, 0, 0);
    innerlayout->addWidget(zoomout, 1, 0);
    innerlayout->addWidget(followgps, 2, 0);
    innerlayout->addWidget(createPath, 3, 0);
207
    //innerlayout->addWidget(clearTracking, 4, 0);
lm's avatar
lm committed
208
    // Add spacers to compress buttons on the top left
209
    innerlayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 5, 0);
210
    innerlayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 0, 1, 0, 7);
211 212
    innerlayout->addWidget(mapButton, 0, 6);
    innerlayout->addWidget(goToButton, 0, 7);
lm's avatar
lm committed
213 214
    innerlayout->setRowStretch(0, 1);
    innerlayout->setRowStretch(1, 100);
pixhawk's avatar
pixhawk committed
215
    mc->setLayout(innerlayout);
pixhawk's avatar
pixhawk committed
216 217


218
    // Connect the required signals-slots
219 220
    connect(zoomin, SIGNAL(clicked(bool)),
            mc, SLOT(zoomIn()));
pixhawk's avatar
pixhawk committed
221

222 223
    connect(zoomout, SIGNAL(clicked(bool)),
            mc, SLOT(zoomOut()));
pixhawk's avatar
pixhawk committed
224

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

pixhawk's avatar
pixhawk committed
227 228 229 230 231 232
    QList<UASInterface*> systems = UASManager::instance()->getUASList();
    foreach(UASInterface* system, systems)
    {
        addUAS(system);
    }

233 234
    connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)),
            this, SLOT(addUAS(UASInterface*)));
pixhawk's avatar
pixhawk committed
235 236

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

239 240
    connect(mc, SIGNAL(mouseEventCoordinate(const QMouseEvent*, const QPointF)),
            this, SLOT(captureMapClick(const QMouseEvent*, const QPointF)));
pixhawk's avatar
pixhawk committed
241

242
    connect(createPath, SIGNAL(clicked(bool)),
243
            this, SLOT(createPathButtonClicked(bool)));
pixhawk's avatar
pixhawk committed
244 245


246 247
    connect(geomLayer, SIGNAL(geometryClicked(Geometry*,QPoint)),
            this, SLOT(captureGeometryClick(Geometry*, QPoint)));
pixhawk's avatar
pixhawk committed
248

249 250
    connect(geomLayer, SIGNAL(geometryDragged(Geometry*, QPointF)),
            this, SLOT(captureGeometryDrag(Geometry*, QPointF)));
pixhawk's avatar
pixhawk committed
251

252 253
    connect(geomLayer, SIGNAL(geometryEndDrag(Geometry*, QPointF)),
            this, SLOT(captureGeometryEndDrag(Geometry*, QPointF)));
pixhawk's avatar
pixhawk committed
254

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

261 262 263 264 265
    //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
266

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

269 270
    drawCamBorder = false;
    radioCamera = 10;
lm's avatar
lm committed
271 272
}

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

298

lm's avatar
lm committed
299 300 301 302 303 304 305 306
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
307

308
        mapadapter = new qmapcontrol::OSMMapAdapter();
lm's avatar
lm committed
309 310
        l->setMapAdapter(mapadapter);
        geomLayer->setMapAdapter(mapadapter);
pixhawk's avatar
pixhawk committed
311

312
        if (isVisible()) mc->updateRequestNew();
lm's avatar
lm committed
313
        mc->setZoom(zoom);
314
        //        yahooActionOverlay->setEnabled(false);
lm's avatar
lm committed
315
        overlay->setVisible(false);
316
        //        yahooActionOverlay->setChecked(false);
pixhawk's avatar
pixhawk committed
317

lm's avatar
lm committed
318 319 320 321 322
    }
    else if (action == yahooActionMap)
    {
        int zoom = mapadapter->adaptedZoom();
        mc->setZoom(0);
pixhawk's avatar
pixhawk committed
323

324
        mapadapter = new qmapcontrol::YahooMapAdapter();
lm's avatar
lm committed
325 326
        l->setMapAdapter(mapadapter);
        geomLayer->setMapAdapter(mapadapter);
pixhawk's avatar
pixhawk committed
327

328
        if (isVisible()) mc->updateRequestNew();
lm's avatar
lm committed
329
        mc->setZoom(zoom);
330
        //        yahooActionOverlay->setEnabled(false);
lm's avatar
lm committed
331
        overlay->setVisible(false);
332
        //        yahooActionOverlay->setChecked(false);
lm's avatar
lm committed
333 334 335 336 337 338
    }
    else if (action == yahooActionSatellite)
    {
        int zoom = mapadapter->adaptedZoom();
        QPointF a = mc->currentCoordinate();
        mc->setZoom(0);
pixhawk's avatar
pixhawk committed
339

340
        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
341
        l->setMapAdapter(mapadapter);
pixhawk's avatar
pixhawk committed
342

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

355
        if (isVisible()) mc->updateRequestNew();
lm's avatar
lm committed
356
        mc->setZoom(zoom);
357
        //        yahooActionOverlay->setEnabled(false);
lm's avatar
lm committed
358
        overlay->setVisible(false);
359
        //        yahooActionOverlay->setChecked(false);
lm's avatar
lm committed
360 361 362 363 364
    }
    else if (action == googleSatAction)
    {
        int zoom = mapadapter->adaptedZoom();
        mc->setZoom(0);
365
        mapadapter = new qmapcontrol::GoogleSatMapAdapter();
lm's avatar
lm committed
366 367
        l->setMapAdapter(mapadapter);
        geomLayer->setMapAdapter(mapadapter); 
pixhawk's avatar
pixhawk committed
368

369
        if (isVisible()) mc->updateRequestNew();
lm's avatar
lm committed
370
        mc->setZoom(zoom);
371
        //        yahooActionOverlay->setEnabled(false);
lm's avatar
lm committed
372
        overlay->setVisible(false);
373
        //        yahooActionOverlay->setChecked(false);
lm's avatar
lm committed
374 375 376 377 378
    }
    else
    {
        mapButton->setText("Select..");
    }
379
}
lm's avatar
lm committed
380

lm's avatar
lm committed
381

382
void MapWidget::createPathButtonClicked(bool checked)
lm's avatar
lm committed
383
{
384
    Q_UNUSED(checked);
pixhawk's avatar
pixhawk committed
385

lm's avatar
lm committed
386 387 388 389
    if (createPath->isChecked())
    {
        // change the cursor shape
        this->setCursor(Qt::PointingHandCursor);
390
        mc->setMouseMode(qmapcontrol::MapControl::None);
pixhawk's avatar
pixhawk committed
391 392


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

396 397 398 399 400 401 402
        //        // 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();
403 404 405
    }
    else
    {
pixhawk's avatar
pixhawk committed
406

lm's avatar
lm committed
407
        this->setCursor(Qt::ArrowCursor);
408
        mc->setMouseMode(qmapcontrol::MapControl::Panning);
lm's avatar
lm committed
409
    }
pixhawk's avatar
pixhawk committed
410

411
}
412

413 414 415 416 417 418 419
/**
 * 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
 */
420

421 422
void MapWidget::captureMapClick(const QMouseEvent* event, const QPointF coordinate)
{
423
    if (QEvent::MouseButtonRelease == event->type() && createPath->isChecked())
424
    {
425 426
        // Create waypoint name
        QString str;
pixhawk's avatar
pixhawk committed
427

428 429
        // create the WP and set everything in the LineString to display the path
        Waypoint2DIcon* tempCirclePoint;
pixhawk's avatar
pixhawk committed
430

431 432
        if (mav)
        {
433 434 435 436 437 438 439 440 441
            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));
442 443 444
        }
        else
        {
445
            str = QString("%1").arg(waypointPath->numberOfPoints());
446
            tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle);
447
            wpIcons.append(tempCirclePoint);
pixhawk's avatar
pixhawk committed
448

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

451 452 453 454 455
            qmapcontrol::Point* tempPoint = new qmapcontrol::Point(coordinate.x(), coordinate.y(),str);
            wps.append(tempPoint);
            waypointPath->addPoint(tempPoint);

            // Refresh the screen
456
            if (isVisible()) mc->updateRequest(tempPoint->boundingBox().toRect());
457
        }
pixhawk's avatar
pixhawk committed
458

459
        // emit signal mouse was clicked
460 461 462 463 464 465
        //emit captureMapCoordinateClick(coordinate);
    }
}

void MapWidget::updateWaypoint(int uas, Waypoint* wp)
{
466
    // Update waypoint list and redraw map (last parameter)
467 468 469
    updateWaypoint(uas, wp, true);
}

470 471 472 473
/**
 * This function is called if a a single waypoint is updated and
 * also if the whole list changes.
 */
474 475
void MapWidget::updateWaypoint(int uas, Waypoint* wp, bool updateView)
{
476
    // Make sure this is the right UAS
477 478
    if (uas == this->mav->getUASID())
    {
479
        // Only accept waypoints in global coordinate frame
480
        if (wp->getFrame() == MAV_FRAME_GLOBAL)
481 482 483
        {
            // We're good, this is a global waypoint

484 485 486
            // Get the index of this waypoint
            // note the call to getGlobalFrameIndexOf()
            // as we're only handling global waypoints
487
            int wpindex = UASManager::instance()->getUASForId(uas)->getWaypointManager()->getGlobalFrameIndexOf(wp);
488
            // If not found, return (this should never happen, but helps safety)
489
            if (wpindex == -1) return;
490 491

            // Check if wp exists yet in map
492
            if (!(wpIcons.count() > wpindex))
493
            {
494
                // Waypoint is new, a new icon is created
495
                QPointF coordinate;
496 497
                coordinate.setX(wp->getLongitude());
                coordinate.setY(wp->getLatitude());
498 499 500 501
                createWaypointGraphAtMap(wpindex, coordinate);
            }
            else
            {
502 503
                // Waypoint exists, update it if we're not
                // currently dragging it with the mouse
504
                if(!waypointIsDrag)
505
                {
506
                    QPointF coordinate;
507 508
                    coordinate.setX(wp->getLongitude());
                    coordinate.setY(wp->getLatitude());
509

510
                    Point* waypoint;
511
                    waypoint = wps.at(wpindex);
512
                    if (waypoint)
513
                    {
514 515 516 517
                        // First set waypoint coordinate
                        waypoint->setCoordinate(coordinate);
                        // Now update icon position
                        wpIcons.at(wpindex)->setCoordinate(coordinate);
518
                        // Update pen
519 520 521
                        wpIcons.at(wpindex)->setPen(mavPens.value(uas));
                        // Then waypoint line coordinate
                        Point* linesegment = NULL;
522 523
                        // If the line segment already exists, just update it
                        // else create a new one
524 525 526
                        if (waypointPath->points().size() > wpindex)
                        {
                            linesegment = waypointPath->points().at(wpindex);
527
                            if (linesegment) linesegment->setCoordinate(coordinate);
528 529 530 531 532 533
                        }
                        else
                        {
                            waypointPath->addPoint(waypoint);
                        }

534
                        // Update view
535
                        if (updateView) if (isVisible()) mc->updateRequest(waypoint->boundingBox().toRect());
536 537 538 539
                    }
                }
            }
        }
540 541
        else
        {
542 543 544 545
            // 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
546 547 548 549
            if (waypointPath->points().count() > UASManager::instance()->getUASForId(uas)->getWaypointManager()->getGlobalFrameCount())
            {
                updateWaypointList(uas);
            }
550
        }
551
    }
pixhawk's avatar
pixhawk committed
552 553
}

554
void MapWidget::createWaypointGraphAtMap(int id, const QPointF coordinate)
555
{
556
    //if (!wpExists(coordinate))
557
    {
558 559
        // Create waypoint name
        QString str;
pixhawk's avatar
pixhawk committed
560

561 562 563
        // 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
564

565 566
        if (mav)
        {
567
            int uas = mav->getUASID();
568
            str = QString("%1").arg(id);
569 570
            qDebug() << "Waypoint list count:" << str;
            tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle, mavPens.value(uas));
571 572 573
        }
        else
        {
574
            str = QString("%1").arg(id);
575 576
            tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle);
        }
pixhawk's avatar
pixhawk committed
577 578


579
        mc->layer("Waypoints")->addGeometry(tempCirclePoint);
pixhawk's avatar
pixhawk committed
580
        wpIcons.append(tempCirclePoint);
pixhawk's avatar
pixhawk committed
581

582 583
        Point* tempPoint = new Point(coordinate.x(), coordinate.y(),str);
        wps.append(tempPoint);
584
        waypointPath->addPoint(tempPoint);
pixhawk's avatar
pixhawk committed
585

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

tecnosapiens's avatar
tecnosapiens committed
589
        // Refresh the screen
590
        if (isVisible()) if (isVisible()) mc->updateRequest(tempPoint->boundingBox().toRect());
591
    }
pixhawk's avatar
pixhawk committed
592

593 594
    ////    // emit signal mouse was clicked
    //    emit captureMapCoordinateClick(coordinate);
595 596
}

597 598
int MapWidget::wpExists(const QPointF coordinate)
{
599 600
    for (int i = 0; i < wps.size(); i++){
        if (wps.at(i)->latitude() == coordinate.y() &&
601 602
            wps.at(i)->longitude()== coordinate.x())
        {
603 604
            return 1;
        }
605
    }
606
    return 0;
607 608
}

609

610 611
void MapWidget::captureGeometryClick(Geometry* geom, QPoint point)
{
612 613
    Q_UNUSED(geom);
    Q_UNUSED(point);
pixhawk's avatar
pixhawk committed
614

615
    mc->setMouseMode(qmapcontrol::MapControl::None);
616 617
}

618 619
void MapWidget::captureGeometryDrag(Geometry* geom, QPointF coordinate)
{
620
    waypointIsDrag = true;
pixhawk's avatar
pixhawk committed
621

622
    // Refresh the screen
623
    if (isVisible()) mc->updateRequest(geom->boundingBox().toRect());
pixhawk's avatar
pixhawk committed
624

625
    int temp = 0;
626 627 628 629 630

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

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

633
    if (wpIndexOk && point2Find && wps.count() > index)
634
    {
635
        // Update visual
636
        point2Find->setCoordinate(coordinate);
637 638
        waypointPath->points().at(index)->setCoordinate(coordinate);
        if (isVisible()) mc->updateRequest(waypointPath->boundingBox().toRect());
pixhawk's avatar
pixhawk committed
639

640 641
        // Update waypoint data storage
        if (mav)
642
        {
643
            QVector<Waypoint*> wps = mav->getWaypointManager()->getGlobalFrameWaypointList();
pixhawk's avatar
pixhawk committed
644

645
            if (wps.size() > index)
646
            {
647
                Waypoint* wp = wps.at(index);
648 649
                wp->setLatitude(coordinate.y());
                wp->setLongitude(coordinate.x());
650
                mav->getWaypointManager()->notifyOfChange(wp);
651
            }
652
        }
653 654 655 656 657

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

660
    waypointIsDrag = false;
661 662
}

663
void MapWidget::captureGeometryEndDrag(Geometry* geom, QPointF coordinate)
664
{
665 666 667
    Q_UNUSED(geom);
    Q_UNUSED(coordinate);
    // TODO: Investigate why when creating the waypoint path this slot is being called
pixhawk's avatar
pixhawk committed
668

669 670 671 672 673 674
    // 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
675

676 677
}

pixhawk's avatar
pixhawk committed
678 679 680 681
MapWidget::~MapWidget()
{
    delete m_ui;
}
lm's avatar
lm committed
682 683 684 685 686 687
/**
 *
 * @param uas the UAS/MAV to monitor/display with the HUD
 */
void MapWidget::addUAS(UASInterface* uas)
{
688
    connect(uas, SIGNAL(globalPositionChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateGlobalPosition(UASInterface*,double,double,double,quint64)));
689
    connect(uas, SIGNAL(attitudeChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateAttitude(UASInterface*,double,double,double,quint64)));
690
    connect(uas, SIGNAL(systemSpecsChanged(int)), this, SLOT(updateSystemSpecs(int)));
691 692
}

693 694 695 696 697
/**
 * 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.
 */
698 699 700 701 702 703
void MapWidget::updateWaypointList(int uas)
{
    // Get already existing waypoints
    UASInterface* uasInstance = UASManager::instance()->getUASForId(uas);
    if (uasInstance)
    {
704 705
        // Get update rect of old content, this is what will be redrawn
        // in the last step
706 707
        QRect updateRect = waypointPath->boundingBox().toRect();

708
        // Get all waypoints, including non-global waypoints
709 710 711 712 713 714 715 716 717
        QVector<Waypoint*> wpList = uasInstance->getWaypointManager()->getWaypointList();

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

718
        // Trim internal list to number of global waypoints in the waypoint manager list
719 720
        int overSize = waypointPath->points().count() - uasInstance->getWaypointManager()->getGlobalFrameCount();
        if (overSize > 0)
721
        {
722 723 724
            // Remove n waypoints at the end of the list
            // the remaining waypoints will be updated
            // in the next step
725
            for (int i = 0; i < overSize; ++i)
726
            {
727 728 729 730
                wps.removeLast();
                mc->layer("Waypoints")->removeGeometry(wpIcons.last());
                wpIcons.removeLast();
                waypointPath->points().removeLast();
731 732
            }
        }
pixhawk's avatar
pixhawk committed
733

734 735 736
        // Load all existing waypoints into map view
        foreach (Waypoint* wp, wpList)
        {
737 738 739
            // 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
740 741 742
            updateWaypoint(mav->getUASID(), wp, false);
        }

743
        // Update view
744
        if (isVisible()) mc->updateRequest(updateRect);
745 746 747 748 749 750 751 752 753 754 755 756
    }
}

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
757
    //clearWaypoints();
758 759 760 761 762
    // Re-add the updated waypoints

    //    }

    updateWaypointList(uas);
lm's avatar
lm committed
763 764
}

765 766
void MapWidget::activeUASSet(UASInterface* uas)
{
767 768 769
    // Disconnect old MAV
    if (mav)
    {
770
        // Disconnect the waypoint manager / data storage from the UI
771
        disconnect(mav->getWaypointManager(), SIGNAL(waypointListChanged(int)), this, SLOT(updateWaypointList(int)));
772
        disconnect(mav->getWaypointManager(), SIGNAL(waypointChanged(int, Waypoint*)), this, SLOT(updateWaypoint(int,Waypoint*)));
773 774 775
        disconnect(this, SIGNAL(waypointCreated(Waypoint*)), mav->getWaypointManager(), SLOT(addWaypoint(Waypoint*)));
    }

776 777 778
    if (uas)
    {
        mav = uas;
779 780
        QColor color = mav->getColor();
        color.setAlphaF(0.9);
781
        QPen* pen = new QPen(color);
782
        pen->setWidth(3.0);
783 784 785 786
        mavPens.insert(mav->getUASID(), pen);
        // FIXME Remove after refactoring
        waypointPath->setPen(pen);

787
        // Delete all waypoints and add waypoint from new system
788 789
        //redoWaypoints();
        updateWaypointList(uas->getUASID());
790

791
        // Connect the waypoint manager / data storage to the UI
792
        connect(mav->getWaypointManager(), SIGNAL(waypointListChanged(int)), this, SLOT(updateWaypointList(int)));
793
        connect(mav->getWaypointManager(), SIGNAL(waypointChanged(int, Waypoint*)), this, SLOT(updateWaypoint(int,Waypoint*)));
794
        connect(this, SIGNAL(waypointCreated(Waypoint*)), mav->getWaypointManager(), SLOT(addWaypoint(Waypoint*)));
795

796
        updateSystemSpecs(mav->getUASID());
797
        updateSelectedSystem(mav->getUASID());
798
        mc->updateRequest(waypointPath->boundingBox().toRect());
799 800 801
    }
}

802 803 804 805 806 807 808 809 810 811 812 813 814 815
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();
        }
    }
}

816 817 818 819 820 821 822 823 824 825
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));
        }
826 827 828
    }
}

829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844
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
845 846 847 848 849 850 851 852 853
/**
 * 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
854 855 856
void MapWidget::updateGlobalPosition(UASInterface* uas, double lat, double lon, double alt, quint64 usec)
{
    Q_UNUSED(usec);
857
    Q_UNUSED(alt); // FIXME Use altitude
858 859 860 861 862 863 864 865

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

866 867
    qmapcontrol::Point* p;
    QPointF coordinate;
868 869
    coordinate.setX(lon);
    coordinate.setY(lat);
870 871 872 873 874 875 876

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

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

        // Line
        // A QPen also can use transparency

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

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

895 896
        //        // Add the LineString to the layer
        //        mc->layer("Waypoints")->addGeometry(ls);
897 898 899
    }
    else
    {
900 901 902 903
        //        p = dynamic_cast<MAV2DIcon*>(uasIcons.value(uas->getUASID()));
        //        if (p)
        //        {
        p = uasIcons.value(uas->getUASID());
904
        p->setCoordinate(QPointF(lon, lat));
905 906
        //p->setYaw(uas->getYaw());
        //        }
907
        // Extend trail
908
        //        uasTrails.value(uas->getUASID())->addPoint(new qmapcontrol::Point(coordinate.x(), coordinate.y()));
909 910
    }

911
    if (isVisible()) mc->updateRequest(p->boundingBox().toRect());
912

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

915
    if (this->mav && uas->getUASID() == this->mav->getUASID())
pixhawk's avatar
pixhawk committed
916
    {
917 918 919
        // Limit the position update rate
        quint64 currTime = MG::TIME::getGroundTimeNow();
        if (currTime - lastUpdate > 120)
920
        {
921 922 923 924
            lastUpdate = currTime;
            // Sets the view to the interesting area
            if (followgps->isChecked())
            {
925
                updatePosition(0, lon, lat);
926 927 928 929 930 931
            }
            else
            {
                // Refresh the screen
                //if (isVisible()) mc->updateRequestNew();
            }
932
        }
pixhawk's avatar
pixhawk committed
933 934
    }
}
pixhawk's avatar
pixhawk committed
935

lm's avatar
lm committed
936 937 938
/**
 * Center the view on this position
 */
lm's avatar
lm committed
939
void MapWidget::updatePosition(float time, double lat, double lon)
pixhawk's avatar
pixhawk committed
940
{
lm's avatar
lm committed
941
    Q_UNUSED(time);
942
    //gpsposition->setText(QString::number(time) + " / " + QString::number(lat) + " / " + QString::number(lon));
943
    if (followgps->isChecked() && isVisible())
pixhawk's avatar
pixhawk committed
944
    {
lm's avatar
lm committed
945
        mc->setView(QPointF(lat, lon));
pixhawk's avatar
pixhawk committed
946 947 948 949 950 951 952 953 954 955 956 957 958 959
    }
}

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
960

961
    // visual field of camera
962
    updateCameraPosition(20*newZoom,0,"no");
pixhawk's avatar
pixhawk committed
963

pixhawk's avatar
pixhawk committed
964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991
}

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

992
void MapWidget::resizeEvent(QResizeEvent* event )
pixhawk's avatar
pixhawk committed
993
{
994 995
    Q_UNUSED(event);
    mc->resize(this->size());
pixhawk's avatar
pixhawk committed
996 997
}

998 999 1000 1001 1002 1003 1004 1005
void MapWidget::showEvent(QShowEvent* event)
{
    Q_UNUSED(event);
}

void MapWidget::hideEvent(QHideEvent* event)
{
    Q_UNUSED(event);
1006 1007 1008 1009 1010 1011 1012 1013
    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();
1014 1015
}

pixhawk's avatar
pixhawk committed
1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027

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

1029
void MapWidget::clearWaypoints(int uas)
1030
{
pixhawk's avatar
pixhawk committed
1031
    Q_UNUSED(uas);
1032
    // Clear the previous WP track
pixhawk's avatar
pixhawk committed
1033

1034
    //mc->layer("Waypoints")->clearGeometries();
1035
    wps.clear();
1036 1037 1038 1039 1040 1041 1042 1043 1044 1045
    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
1046
    waypointPath->points().clear();
1047

1048 1049
    //delete waypointPath;
    //waypointPath = new
1050
    //mc->layer("Waypoints")->addGeometry(waypointPath);
1051
    //wpIndex.clear();
1052
    if (isVisible()) mc->updateRequest(box);//(waypointPath->boundingBox().toRect());
pixhawk's avatar
pixhawk committed
1053

1054 1055 1056 1057
    if(createPath->isChecked())
    {
        createPath->click();
    }
1058 1059

    qDebug() << "CLEARING WAYPOINTS";
1060
}
pixhawk's avatar
pixhawk committed
1061

1062
void MapWidget::clearPath(int uas)
1063
{
pixhawk's avatar
pixhawk committed
1064
    Q_UNUSED(uas);
1065 1066 1067 1068 1069 1070 1071 1072 1073
    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
1074
    if (isVisible()) mc->updateRequestNew();//(QRect(0, 0, width(), height()));
1075
}
1076

1077 1078
void MapWidget::updateCameraPosition(double radio, double bearing, QString dir)
{
pixhawk's avatar
pixhawk committed
1079 1080
    Q_UNUSED(dir);
    Q_UNUSED(bearing);
1081
    // FIXME Mariano
1082 1083
    //camPoints.clear();
    QPointF currentPos = mc->currentCoordinate();
1084
    //    QPointF actualPos = getPointxBearing_Range(currentPos.y(),currentPos.x(),bearing,distance);
pixhawk's avatar
pixhawk committed
1085

1086 1087
    //    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
1088

1089 1090
    //    camPoints.append(tempPoint1);
    //    camPoints.append(tempPoint2);
pixhawk's avatar
pixhawk committed
1091

1092
    //    camLine->setPoints(camPoints);
pixhawk's avatar
pixhawk committed
1093

1094
    QPen* camBorderPen = new QPen(QColor(255,0,0));
1095
    camBorderPen->setWidth(2);
pixhawk's avatar
pixhawk committed
1096

1097
    //radio = mc->currentZoom()
pixhawk's avatar
pixhawk committed
1098

1099 1100 1101 1102
    if(drawCamBorder)
    {
        //clear camera borders
        mc->layer("Camera")->clearGeometries();
pixhawk's avatar
pixhawk committed
1103

1104 1105
        //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
1106

1107
        //camBorder->setCoordinate(currentPos);
pixhawk's avatar
pixhawk committed
1108

1109
        mc->layer("Camera")->addGeometry(camBorder);
1110
        // mc->layer("Camera")->addGeometry(camLine);
1111
        if (isVisible()) mc->updateRequestNew();
pixhawk's avatar
pixhawk committed
1112

1113
    }
1114 1115 1116 1117
    else
    {
        //clear camera borders
        mc->layer("Camera")->clearGeometries();
1118
        if (isVisible()) mc->updateRequestNew();
pixhawk's avatar
pixhawk committed
1119

1120
    }
pixhawk's avatar
pixhawk committed
1121 1122


1123 1124 1125 1126 1127 1128
}

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

1130 1131 1132 1133 1134
}

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

1136
    double rad = M_PI/180;
pixhawk's avatar
pixhawk committed
1137

1138 1139 1140
    bearing = bearing*rad;
    temp.setX((lon1 + ((distance/60) * (sin(bearing)))));
    temp.setY((lat1 + ((distance/60) * (cos(bearing)))));
pixhawk's avatar
pixhawk committed
1141

1142 1143 1144
    return temp;
}