Skip to content
Snippets Groups Projects
MapWidget.cc 24.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*==================================================================
    
    pixhawk's avatar
    pixhawk committed
    ======================================================================*/
    
    /**
     * @file
    
    lm's avatar
    lm committed
     *   @brief Implementation of MapWidget
    
    pixhawk's avatar
    pixhawk committed
     *
     *   @author Lorenz Meier <mavteam@student.ethz.ch>
    
    lm's avatar
    lm committed
     *   @author Mariano Lizarraga
    
    pixhawk's avatar
    pixhawk committed
     *
     */
    
    
    lm's avatar
    lm committed
    #include <QComboBox>
    #include <QGridLayout>
    
    pixhawk's avatar
    pixhawk committed
    #include <QDir>
    
    pixhawk's avatar
    pixhawk committed
    #include "MapWidget.h"
    #include "ui_MapWidget.h"
    
    lm's avatar
    lm committed
    #include "UASInterface.h"
    #include "UASManager.h"
    
    #include "MAV2DIcon.h"
    #include "Waypoint2DIcon.h"
    
    pixhawk's avatar
    pixhawk committed
    
    
    pixhawk's avatar
    pixhawk committed
    #include "MG.h"
    
    
    pixhawk's avatar
    pixhawk committed
    MapWidget::MapWidget(QWidget *parent) :
            QWidget(parent),
            zoomLevel(0),
    
            uasIcons(),
            uasTrails(),
    
    pixhawk's avatar
    pixhawk committed
            m_ui(new Ui::MapWidget)
    {
        m_ui->setupUi(this);
    
    pixhawk's avatar
    pixhawk committed
    
    
    pixhawk's avatar
    pixhawk committed
    
    
    pixhawk's avatar
    pixhawk committed
        // Accept focus by clicking or keyboard
        this->setFocusPolicy(Qt::StrongFocus);
    
    pixhawk's avatar
    pixhawk committed
    
    
    pixhawk's avatar
    pixhawk committed
        // create MapControl
    
        mc = new qmapcontrol::MapControl(QSize(320, 240));
    
    pixhawk's avatar
    pixhawk committed
        mc->showScale(true);
    
    pixhawk's avatar
    pixhawk committed
        mc->enablePersistentCache();
    
        mc->setMouseTracking(true); // required to update the mouse position for diplay and capture
    
    pixhawk's avatar
    pixhawk committed
    
    
    pixhawk's avatar
    pixhawk committed
        // create MapAdapter to get maps from
    
    lm's avatar
    lm committed
        //TileMapAdapter* osmAdapter = new TileMapAdapter("tile.openstreetmap.org", "/%1/%2/%3.png", 256, 0, 17);
    
    pixhawk's avatar
    pixhawk committed
    
    
        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
    
    
    lm's avatar
    lm committed
        // MAP BACKGROUND
    
        mapadapter = new qmapcontrol::GoogleSatMapAdapter();
        l = new qmapcontrol::MapLayer("Google Satellite", mapadapter);
    
    lm's avatar
    lm committed
        mc->addLayer(l);
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
        // STREET OVERLAY
    
        overlay = new qmapcontrol::MapLayer("Overlay", mapadapter_overlay);
    
    lm's avatar
    lm committed
        overlay->setVisible(false);
        mc->addLayer(overlay);
    
    pixhawk's avatar
    pixhawk committed
    
    
        // MAV FLIGHT TRACKS
        tracks = new qmapcontrol::MapLayer("Tracking", mapadapter);
        mc->addLayer(tracks);
    
    
    lm's avatar
    lm committed
        // WAYPOINT LAYER
        // create a layer with the mapadapter and type GeometryLayer (for waypoints)
    
        geomLayer = new qmapcontrol::GeometryLayer("Waypoints", mapadapter);
    
        //
        //    Layer* gsatLayer = new Layer("Google Satellite", gsat, Layer::MapLayer);
        //    mc->addLayer(gsatLayer);
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
        // SET INITIAL POSITION AND ZOOM
        // Set default zoom level
        mc->setZoom(16);
        // Zurich, ETH
    
    pixhawk's avatar
    pixhawk committed
        mc->setView(QPointF(8.548056,47.376389));
    
    pixhawk's avatar
    pixhawk committed
    
    
    pixhawk's avatar
    pixhawk committed
        // Veracruz Mexico
        //mc->setView(QPointF(-96.105208,19.138955));
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
        // Add controls to select map provider
        /////////////////////////////////////////////////
        QActionGroup* mapproviderGroup = new QActionGroup(this);
    
        osmAction = new QAction(QIcon(":/images/mapproviders/openstreetmap.png"), tr("OpenStreetMap"), mapproviderGroup);
        yahooActionMap = new QAction(QIcon(":/images/mapproviders/yahoo.png"), tr("Yahoo: Map"), mapproviderGroup);
        yahooActionSatellite = new QAction(QIcon(":/images/mapproviders/yahoo.png"), tr("Yahoo: Satellite"), mapproviderGroup);
        googleActionMap = new QAction(QIcon(":/images/mapproviders/google.png"), tr("Google: Map"), mapproviderGroup);
        googleSatAction = new QAction(QIcon(":/images/mapproviders/google.png"), tr("Google: Sat"), mapproviderGroup);
    
    lm's avatar
    lm committed
        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
    
    
    lm's avatar
    lm committed
        // Overlay seems currently broken
    
        //    yahooActionOverlay = new QAction(tr("Yahoo: street overlay"), this);
        //    yahooActionOverlay->setCheckable(true);
        //    yahooActionOverlay->setChecked(overlay->isVisible());
        //    connect(yahooActionOverlay, SIGNAL(toggled(bool)),
        //            overlay, SLOT(setVisible(bool)));
    
    pixhawk's avatar
    pixhawk committed
    
    
        //    mapproviderGroup->addAction(googleSatAction);
        //    mapproviderGroup->addAction(osmAction);
        //    mapproviderGroup->addAction(yahooActionOverlay);
        //    mapproviderGroup->addAction(googleActionMap);
        //    mapproviderGroup->addAction(yahooActionMap);
        //    mapproviderGroup->addAction(yahooActionSatellite);
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
        // Create map provider selection menu
        mapMenu = new QMenu(this);
        mapMenu->addActions(mapproviderGroup->actions());
        mapMenu->addSeparator();
    
        //    mapMenu->addAction(yahooActionOverlay);
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
        mapButton = new QPushButton(this);
        mapButton->setText("Map Source");
        mapButton->setMenu(mapMenu);
    
    pixhawk's avatar
    pixhawk committed
    
    
    pixhawk's avatar
    pixhawk committed
        // display the MapControl in the application
    
    lm's avatar
    lm committed
        QGridLayout* layout = new QGridLayout(this);
    
    pixhawk's avatar
    pixhawk committed
        layout->setMargin(0);
    
    lm's avatar
    lm committed
        layout->setSpacing(2);
        layout->addWidget(mc, 0, 0, 1, 2);
        layout->addWidget(mapButton, 1, 0);
        layout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 1, 1);
        layout->setRowStretch(0, 100);
        layout->setRowStretch(1, 1);
        layout->setColumnStretch(0, 1);
        layout->setColumnStretch(1, 50);
    
    pixhawk's avatar
    pixhawk committed
        setLayout(layout);
    
    pixhawk's avatar
    pixhawk committed
    
    
        // create buttons to control the map (zoom, GPS tracking and WP capture)
    
    pixhawk's avatar
    pixhawk committed
        QPushButton* zoomin = new QPushButton(QIcon(":/images/actions/list-add.svg"), "", this);
        QPushButton* zoomout = new QPushButton(QIcon(":/images/actions/list-remove.svg"), "", this);
    
        createPath = new QPushButton(QIcon(":/images/actions/go-bottom.svg"), "", this);
    
        clearTracking = new QPushButton(QIcon(""), "", this);
    
    pixhawk's avatar
    pixhawk committed
        followgps = new QPushButton(QIcon(":/images/actions/system-lock-screen.svg"), "", this);
    
    pixhawk's avatar
    pixhawk committed
    
    
        zoomin->setMaximumWidth(30);
        zoomout->setMaximumWidth(30);
        createPath->setMaximumWidth(30);
        clearTracking->setMaximumWidth(30);
        followgps->setMaximumWidth(30);
    
    pixhawk's avatar
    pixhawk committed
    
    
        // 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
    
    
        // add buttons to control the map (zoom, GPS tracking and WP capture)
    
    lm's avatar
    lm committed
        QGridLayout* innerlayout = new QGridLayout(mc);
        innerlayout->setMargin(5);
        innerlayout->setSpacing(5);
        innerlayout->addWidget(zoomin, 0, 0);
        innerlayout->addWidget(zoomout, 1, 0);
        innerlayout->addWidget(followgps, 2, 0);
        innerlayout->addWidget(createPath, 3, 0);
    
        innerlayout->addWidget(clearTracking, 4, 0);
    
    lm's avatar
    lm committed
        // Add spacers to compress buttons on the top left
    
        innerlayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 5, 0);
        innerlayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 0, 1, 0, 6);
    
    lm's avatar
    lm committed
        innerlayout->setRowStretch(0, 1);
        innerlayout->setRowStretch(1, 100);
    
    pixhawk's avatar
    pixhawk committed
        mc->setLayout(innerlayout);
    
        connect(zoomin, SIGNAL(clicked(bool)),
                mc, SLOT(zoomIn()));
    
    pixhawk's avatar
    pixhawk committed
    
    
        connect(zoomout, SIGNAL(clicked(bool)),
                mc, SLOT(zoomOut()));
    
    pixhawk's avatar
    pixhawk committed
    
        QList<UASInterface*> systems = UASManager::instance()->getUASList();
        foreach(UASInterface* system, systems)
        {
            addUAS(system);
        }
    
    
        connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)),
                this, SLOT(addUAS(UASInterface*)));
    
    pixhawk's avatar
    pixhawk committed
    
        activeUASSet(UASManager::instance()->getActiveUAS());
    
        connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(activeUASSet(UASInterface*)));
    
    pixhawk's avatar
    pixhawk committed
    
    
        connect(mc, SIGNAL(mouseEventCoordinate(const QMouseEvent*, const QPointF)),
                this, SLOT(captureMapClick(const QMouseEvent*, const QPointF)));
    
    pixhawk's avatar
    pixhawk committed
    
    
                this, SLOT(createPathButtonClicked(bool)));
    
        connect(geomLayer, SIGNAL(geometryClicked(Geometry*,QPoint)),
                this, SLOT(captureGeometryClick(Geometry*, QPoint)));
    
    pixhawk's avatar
    pixhawk committed
    
    
        connect(geomLayer, SIGNAL(geometryDragged(Geometry*, QPointF)),
                this, SLOT(captureGeometryDrag(Geometry*, QPointF)));
    
    pixhawk's avatar
    pixhawk committed
    
    
        connect(geomLayer, SIGNAL(geometryEndDrag(Geometry*, QPointF)),
                this, SLOT(captureGeometryEndDrag(Geometry*, QPointF)));
    
    pixhawk's avatar
    pixhawk committed
    
    
        // Configure the WP Path's pen
        pointPen = new QPen(QColor(0, 255,0));
        pointPen->setWidth(3);
    
        waypointPath = new qmapcontrol::LineString (wps, "Waypoint path", pointPen);
        mc->layer("Waypoints")->addGeometry(waypointPath);
    
    pixhawk's avatar
    pixhawk committed
    
    
        //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
    
    
        //camLine = new qmapcontrol::LineString(camPoints,"Camera Eje", camBorderPen);
    
    pixhawk's avatar
    pixhawk committed
    
    
        drawCamBorder = false;
        radioCamera = 10;
    
    lm's avatar
    lm committed
    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
    
    
            mapadapter = new qmapcontrol::OSMMapAdapter();
    
    lm's avatar
    lm committed
            l->setMapAdapter(mapadapter);
            geomLayer->setMapAdapter(mapadapter);
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
            mc->updateRequestNew();
            mc->setZoom(zoom);
    
            //        yahooActionOverlay->setEnabled(false);
    
    lm's avatar
    lm committed
            overlay->setVisible(false);
    
            //        yahooActionOverlay->setChecked(false);
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
        }
        else if (action == yahooActionMap)
        {
            int zoom = mapadapter->adaptedZoom();
            mc->setZoom(0);
    
    pixhawk's avatar
    pixhawk committed
    
    
            mapadapter = new qmapcontrol::YahooMapAdapter();
    
    lm's avatar
    lm committed
            l->setMapAdapter(mapadapter);
            geomLayer->setMapAdapter(mapadapter);
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
            mc->updateRequestNew();
            mc->setZoom(zoom);
    
            //        yahooActionOverlay->setEnabled(false);
    
    lm's avatar
    lm committed
            overlay->setVisible(false);
    
            //        yahooActionOverlay->setChecked(false);
    
    lm's avatar
    lm committed
        }
        else if (action == yahooActionSatellite)
        {
            int zoom = mapadapter->adaptedZoom();
            QPointF a = mc->currentCoordinate();
            mc->setZoom(0);
    
    pixhawk's avatar
    pixhawk committed
    
    
            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
            l->setMapAdapter(mapadapter);
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
            mc->updateRequestNew();
            mc->setZoom(zoom);
    
            //        yahooActionOverlay->setEnabled(true);
    
    lm's avatar
    lm committed
        }
        else if (action == googleActionMap)
        {
            int zoom = mapadapter->adaptedZoom();
            mc->setZoom(0);
    
            mapadapter = new qmapcontrol::GoogleMapAdapter();
    
    lm's avatar
    lm committed
            l->setMapAdapter(mapadapter);
            geomLayer->setMapAdapter(mapadapter);
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
            mc->updateRequestNew();
            mc->setZoom(zoom);
    
            //        yahooActionOverlay->setEnabled(false);
    
    lm's avatar
    lm committed
            overlay->setVisible(false);
    
            //        yahooActionOverlay->setChecked(false);
    
    lm's avatar
    lm committed
        }
        else if (action == googleSatAction)
        {
            int zoom = mapadapter->adaptedZoom();
            mc->setZoom(0);
    
            mapadapter = new qmapcontrol::GoogleSatMapAdapter();
    
    lm's avatar
    lm committed
            l->setMapAdapter(mapadapter);
            geomLayer->setMapAdapter(mapadapter); 
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
            mc->updateRequestNew();
            mc->setZoom(zoom);
    
            //        yahooActionOverlay->setEnabled(false);
    
    lm's avatar
    lm committed
            overlay->setVisible(false);
    
            //        yahooActionOverlay->setChecked(false);
    
    lm's avatar
    lm committed
        }
        else
        {
            mapButton->setText("Select..");
        }
    
    void MapWidget::createPathButtonClicked(bool checked)
    
        Q_UNUSED(checked);
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
        if (createPath->isChecked())
        {
            // change the cursor shape
            this->setCursor(Qt::PointingHandCursor);
    
            mc->setMouseMode(qmapcontrol::MapControl::None);
    
            // emit signal start to create a Waypoint global
    
            emit createGlobalWP(true, mc->currentCoordinate());
    
    pixhawk's avatar
    pixhawk committed
    
    
            //        // 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();
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
            this->setCursor(Qt::ArrowCursor);
    
            mc->setMouseMode(qmapcontrol::MapControl::Panning);
    
    pixhawk's avatar
    pixhawk committed
    
    
    /**
     * 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
     */
    
    void MapWidget::captureMapClick(const QMouseEvent* event, const QPointF coordinate)
    {
    
        //qDebug() << mc->mouseMode();
    
        if (QEvent::MouseButtonRelease == event->type() && createPath->isChecked())
    
            // Create waypoint name
            QString str;
    
    pixhawk's avatar
    pixhawk committed
    
    
            str = QString("%1").arg(waypointPath->numberOfPoints());
    
    pixhawk's avatar
    pixhawk committed
    
    
            // create the WP and set everything in the LineString to display the path
            Waypoint2DIcon* tempCirclePoint;
    
    pixhawk's avatar
    pixhawk committed
    
    
            if (mav)
            {
                tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle, new QPen(mav->getColor()));
            }
            else
            {
                tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle);
            }
            mc->layer("Waypoints")->addGeometry(tempCirclePoint);
    
    pixhawk's avatar
    pixhawk committed
    
    
            qmapcontrol::Point* tempPoint = new qmapcontrol::Point(coordinate.x(), coordinate.y(),str);
            wps.append(tempPoint);
    
            waypointPath->addPoint(tempPoint);
    
    pixhawk's avatar
    pixhawk committed
    
    
            wpIndex.insert(str,tempPoint);
    
    pixhawk's avatar
    pixhawk committed
    
    
            // Refresh the screen
    
            mc->updateRequest(tempPoint->boundingBox().toRect());
    
    pixhawk's avatar
    pixhawk committed
    
    
            // emit signal mouse was clicked
            emit captureMapCoordinateClick(coordinate);
    
    pixhawk's avatar
    pixhawk committed
    }
    
    
    void MapWidget::createWaypointGraphAtMap(const QPointF coordinate)
    {
    
        if (!wpExists(coordinate))
        {
    
            // Create waypoint name
            QString str;
    
            str = QString("%1").arg(waypointPath->numberOfPoints());
    
    pixhawk's avatar
    pixhawk committed
    
    
            // 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
    
    
            if (mav)
            {
                tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle, new QPen(mav->getColor()));
            }
            else
            {
                tempCirclePoint = new Waypoint2DIcon(coordinate.x(), coordinate.y(), 20, str, qmapcontrol::Point::Middle);
            }
    
            mc->layer("Waypoints")->addGeometry(tempCirclePoint);
    
    pixhawk's avatar
    pixhawk committed
    
    
            Point* tempPoint = new Point(coordinate.x(), coordinate.y(),str);
            wps.append(tempPoint);
    
            waypointPath->addPoint(tempPoint);
    
    pixhawk's avatar
    pixhawk committed
    
    
            wpIndex.insert(str,tempPoint);
    
    tecnosapiens's avatar
    tecnosapiens committed
            qDebug()<<"Funcion createWaypointGraphAtMap WP= "<<str<<" -> x= "<<tempPoint->latitude()<<" y= "<<tempPoint->longitude();
    
    pixhawk's avatar
    pixhawk committed
    
    
    tecnosapiens's avatar
    tecnosapiens committed
            // Refresh the screen
    
            mc->updateRequest(tempPoint->boundingBox().toRect());
    
    pixhawk's avatar
    pixhawk committed
    
    
        ////    // emit signal mouse was clicked
        //    emit captureMapCoordinateClick(coordinate);
    
    int MapWidget::wpExists(const QPointF coordinate){
    
        for (int i = 0; i < wps.size(); i++){
            if (wps.at(i)->latitude() == coordinate.y() &&
                wps.at(i)->longitude()== coordinate.x()){
                return 1;
            }
    
        return 0;
    
    void MapWidget::captureGeometryClick(Geometry* geom, QPoint point)
    {
    
        Q_UNUSED(geom);
        Q_UNUSED(point);
    
    pixhawk's avatar
    pixhawk committed
    
    
        mc->setMouseMode(qmapcontrol::MapControl::None);
    
    pixhawk's avatar
    pixhawk committed
    
    
    void MapWidget::captureGeometryDrag(Geometry* geom, QPointF coordinate)
    {
    
        waypointIsDrag = true;
    
    pixhawk's avatar
    pixhawk committed
    
    
        // Refresh the screen
    
        mc->updateRequest(geom->boundingBox().toRect());
    
    pixhawk's avatar
    pixhawk committed
    
    
        int temp = 0;
        qmapcontrol::Point* point2Find;
        point2Find = wpIndex[geom->name()];
    
    pixhawk's avatar
    pixhawk committed
    
    
        if (point2Find)
        {
            point2Find->setCoordinate(coordinate);
    
    pixhawk's avatar
    pixhawk committed
    
    
            point2Find = dynamic_cast <qmapcontrol::Point*> (geom);
            if (point2Find)
            {
                point2Find->setCoordinate(coordinate);
    
    pixhawk's avatar
    pixhawk committed
    
    
                // qDebug() << geom->name();
                temp = geom->get_myIndex();
                //qDebug() << temp;
                emit sendGeometryEndDrag(coordinate,temp);
            }
        }
    
    pixhawk's avatar
    pixhawk committed
    
    
    void MapWidget::captureGeometryEndDrag(Geometry* geom, QPointF coordinate)
    
        Q_UNUSED(geom);
        Q_UNUSED(coordinate);
        // TODO: Investigate why when creating the waypoint path this slot is being called
    
    pixhawk's avatar
    pixhawk committed
    
    
        // 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
    
    
    pixhawk's avatar
    pixhawk committed
    MapWidget::~MapWidget()
    {
        delete m_ui;
    }
    
    lm's avatar
    lm committed
    /**
     *
     * @param uas the UAS/MAV to monitor/display with the HUD
     */
    void MapWidget::addUAS(UASInterface* uas)
    {
    
        connect(uas, SIGNAL(globalPositionChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateGlobalPosition(UASInterface*,double,double,double,quint64)));
    
    void MapWidget::activeUASSet(UASInterface* uas)
    {
        if (uas)
        {
            mav = uas;
    
            QColor color = mav->getColor();
            color.setAlphaF(0.6);
            QPen* pen = new QPen(color);
            pen->setWidth(3.0);
            // FIXME Load waypoints of this system
    
    lm's avatar
    lm committed
    /**
     * 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
    void MapWidget::updateGlobalPosition(UASInterface* uas, double lat, double lon, double alt, quint64 usec)
    {
        Q_UNUSED(usec);
    
        Q_UNUSED(alt); // FIXME Use altitude
    
    
        // 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));
    
        MAV2DIcon* p;
    
        if (!uasIcons.contains(uas->getUASID()))
        {
            // Get the UAS color
            QColor uasColor = uas->getColor();
    
            // Icon
            QPen* pointpen = new QPen(uasColor);
            qDebug() << uas->getUASName();
            p = new MAV2DIcon(lat, lon, 20, uas->getUASName(), qmapcontrol::Point::Middle, pointpen);
            uasIcons.insert(uas->getUASID(), p);
            tracks->addGeometry(p);
    
            // Line
            // A QPen also can use transparency
    
            QList<qmapcontrol::Point*> points;
            points.append(new qmapcontrol::Point(lat, lon, ""));
            QPen* linepen = new QPen(uasColor.darker());
            linepen->setWidth(2);
    
            // Create tracking line string
            qmapcontrol::LineString* ls = new qmapcontrol::LineString(points, uas->getUASName(), linepen);
            uasTrails.insert(uas->getUASID(), ls);
    
            // Add the LineString to the layer
            mc->layer("Tracking")->addGeometry(ls);
        }
        else
        {
            p = dynamic_cast<MAV2DIcon*>(uasIcons.value(uas->getUASID()));
            if (p)
            {
                p->setCoordinate(QPointF(lat, lon));
                p->setYaw(uas->getYaw());
            }
            // Extend trail
            uasTrails.value(uas->getUASID())->addPoint(new qmapcontrol::Point(lat, lon, ""));
        }
    
        //mc->updateRequestNew();//(uasTrails.value(uas->getUASID())->boundingBox().toRect());
    
    
        // Limit the position update rate
    
    pixhawk's avatar
    pixhawk committed
        quint64 currTime = MG::TIME::getGroundTimeNow();
    
        if (currTime - lastUpdate > 120)
    
    pixhawk's avatar
    pixhawk committed
        {
            lastUpdate = currTime;
    
            // Sets the view to the interesting area
            if (followgps->isChecked())
    
                updatePosition(0, lat, lon);
    
                // Refresh the screen
                //mc->updateRequestNew();
    
    pixhawk's avatar
    pixhawk committed
        }
    }
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
    /**
     * Center the view on this position
     */
    
    lm's avatar
    lm committed
    void MapWidget::updatePosition(float time, double lat, double lon)
    
    pixhawk's avatar
    pixhawk committed
    {
    
    lm's avatar
    lm committed
        Q_UNUSED(time);
    
        //gpsposition->setText(QString::number(time) + " / " + QString::number(lat) + " / " + QString::number(lon));
    
    pixhawk's avatar
    pixhawk committed
        if (followgps->isChecked() && isVisible())
    
    pixhawk's avatar
    pixhawk committed
        {
    
    lm's avatar
    lm committed
            mc->setView(QPointF(lat, lon));
    
    pixhawk's avatar
    pixhawk committed
        }
    }
    
    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
    
    
        // visual field of camera
    
        updateCameraPosition(20*newZoom,0,"no");
    
    pixhawk's avatar
    pixhawk committed
    
    
    pixhawk's avatar
    pixhawk committed
    }
    
    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);
        }
    }
    
    
    void MapWidget::resizeEvent(QResizeEvent* event )
    
    pixhawk's avatar
    pixhawk committed
    {
    
        Q_UNUSED(event);
        mc->resize(this->size());
    
    pixhawk's avatar
    pixhawk committed
    }
    
    
    pixhawk's avatar
    pixhawk committed
    void MapWidget::showEvent(QShowEvent* event)
    {
        Q_UNUSED(event);
    }
    
    void MapWidget::hideEvent(QHideEvent* event)
    {
        Q_UNUSED(event);
    }
    
    
    pixhawk's avatar
    pixhawk committed
    
    void MapWidget::changeEvent(QEvent *e)
    {
        QWidget::changeEvent(e);
        switch (e->type()) {
        case QEvent::LanguageChange:
            m_ui->retranslateUi(this);
            break;
        default:
            break;
        }
    }
    
    
    void MapWidget::clearWaypoints()
    
    pixhawk's avatar
    pixhawk committed
    
    
        mc->layer("Waypoints")->clearGeometries();
        wps.clear();
    
        waypointPath->setPoints(wps);
        mc->layer("Waypoints")->addGeometry(waypointPath);
    
        mc->updateRequest(waypointPath->boundingBox().toRect());
    
    pixhawk's avatar
    pixhawk committed
    
    
        if(createPath->isChecked())
        {
            createPath->click();
        }
    
    pixhawk's avatar
    pixhawk committed
    
    
    void MapWidget::clearPath()
    {
        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
        mc->updateRequest(QRect(0, 0, width(), height()));
    
    
    void MapWidget::changeGlobalWaypointPositionBySpinBox(int index, float lat, float lon)
    {
        if(!waypointIsDrag)
        {
            qDebug() <<"indice WP= "<<index <<"\n";
    
    pixhawk's avatar
    pixhawk committed
    
    
            QPointF coordinate;
            coordinate.setX(lon);
            coordinate.setY(lat);
    
    pixhawk's avatar
    pixhawk committed
    
    
            Point* point2Find;
            point2Find = wpIndex[QString::number(index)];
            point2Find->setCoordinate(coordinate);
    
    pixhawk's avatar
    pixhawk committed
    
    
            point2Find = dynamic_cast <Point*> (mc->layer("Waypoints")->get_Geometry(index));
            point2Find->setCoordinate(coordinate);
    
    pixhawk's avatar
    pixhawk committed
    
    
            mc->updateRequest(point2Find->boundingBox().toRect());
    
    void MapWidget::updateCameraPosition(double radio, double bearing, QString dir)
    {
    
    pixhawk's avatar
    pixhawk committed
        // FIXME Mariano
    
        //camPoints.clear();
        QPointF currentPos = mc->currentCoordinate();
    
        //    QPointF actualPos = getPointxBearing_Range(currentPos.y(),currentPos.x(),bearing,distance);
    
    pixhawk's avatar
    pixhawk committed
    
    
        //    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
    
    
        //    camPoints.append(tempPoint1);
        //    camPoints.append(tempPoint2);
    
    pixhawk's avatar
    pixhawk committed
    
    
        //    camLine->setPoints(camPoints);
    
    pixhawk's avatar
    pixhawk committed
    
    
        QPen* camBorderPen = new QPen(QColor(255,0,0));
    
        camBorderPen->setWidth(2);
    
    pixhawk's avatar
    pixhawk committed
    
    
        //radio = mc->currentZoom()
    
    pixhawk's avatar
    pixhawk committed
    
    
        if(drawCamBorder)
        {
            //clear camera borders
            mc->layer("Camera")->clearGeometries();
    
    pixhawk's avatar
    pixhawk committed
    
    
            //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
    
    
            //camBorder->setCoordinate(currentPos);
    
    pixhawk's avatar
    pixhawk committed
    
    
            mc->layer("Camera")->addGeometry(camBorder);
    
            // mc->layer("Camera")->addGeometry(camLine);
    
            mc->updateRequestNew();
    
    pixhawk's avatar
    pixhawk committed
    
    
        else
        {
            //clear camera borders
            mc->layer("Camera")->clearGeometries();
            mc->updateRequestNew();
    
    pixhawk's avatar
    pixhawk committed
    
    
    }
    
    void MapWidget::drawBorderCamAtMap(bool status)
    {
        drawCamBorder = status;
        updateCameraPosition(20,0,"no");
    
    pixhawk's avatar
    pixhawk committed
    
    
    }
    
    QPointF MapWidget::getPointxBearing_Range(double lat1, double lon1, double bearing, double distance)
    {
        QPointF temp;
    
    pixhawk's avatar
    pixhawk committed
    
    
        double rad = M_PI/180;
    
    pixhawk's avatar
    pixhawk committed
    
    
        bearing = bearing*rad;
        temp.setX((lon1 + ((distance/60) * (sin(bearing)))));
        temp.setY((lat1 + ((distance/60) * (cos(bearing)))));
    
    pixhawk's avatar
    pixhawk committed