Files
gcs-nf/opmap/mapwidget/opmapwidget.h
T
2022-02-25 15:51:18 +08:00

691 lines
19 KiB
C++

/**
******************************************************************************
*
* @file opmapwidget.h
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012.
* @brief The Map Widget, this is the part exposed to the user
* @see The GNU Public License (GPL) Version 3
* @defgroup OPMapWidget
* @{
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef OPMAPWIDGET_H
#define OPMAPWIDGET_H
#include "mapgraphicitem.h"
#include "geodecoderstatus.h"
#include "maptype.h"
#include "languagetype.h"
#include "diagnostics.h"
#include "configuration.h"
#include <QObject>
#include <QtOpenGL/QGLWidget>
#include "waypointitem.h"
#include "QtSvg/QGraphicsSvgItem"
#include "QGraphicsView"
#include "uavitem.h"
#include "gpsitem.h"
#include "homeitem.h"
#include "mapripper.h"
#include "waypointline.h"
#include "waypointcircle.h"
#include "waypointitem.h"
#include "AltitudeItem.h"
#include "VirtualMargin.h"
#include "VirtualMarginLine.h"
#include <QJsonObject>
#include "QTextStream"
#include <QTranslator>
#include "QDir"
#include "QFileDialog"
namespace mapcontrol {
#ifdef QtopmapWidget
#include <mapwidgetglobal.h>
class OPMAPWIDGETSHARED_EXPORT UAVItem;
class OPMAPWIDGETSHARED_EXPORT GPSItem;
class OPMAPWIDGETSHARED_EXPORT HomeItem;
#else
class UAVItem;
class GPSItem;
class HomeItem;
#endif
/**
* @brief Collection of static functions to help dealing with various enums used
* Contains functions for enumToString conversio, StringToEnum, QStringList of enum values...
*
* @class Helper opmapwidget.h "opmapwidget.h"
*/
#ifdef QtopmapWidget
#include <mapwidgetglobal.h>
class OPMAPWIDGETSHARED_EXPORT Helper {
#else
class Helper {
#endif
public:
static MapType::Types MapTypeFromString(QString const & value)
{
return MapType::TypeByStr(value);
}
static QString StrFromMapType(MapType::Types const & value)
{
return MapType::StrByType(value);
}
static QStringList MapTypes()
{
return MapType::TypesList();
}
static GeoCoderStatusCode::Types GeoCoderStatusCodeFromString(QString const & value)
{
return GeoCoderStatusCode::TypeByStr(value);
}
static QString StrFromGeoCoderStatusCode(GeoCoderStatusCode::Types const & value)
{
return GeoCoderStatusCode::StrByType(value);
}
static QStringList GeoCoderTypes()
{
return GeoCoderStatusCode::TypesList();
}
static internals::MouseWheelZoomType::Types MouseWheelZoomTypeFromString(QString const & value)
{
return internals::MouseWheelZoomType::TypeByStr(value);
}
static QString StrFromMouseWheelZoomType(internals::MouseWheelZoomType::Types const & value)
{
return internals::MouseWheelZoomType::StrByType(value);
}
static QStringList MouseWheelZoomTypes()
{
return internals::MouseWheelZoomType::TypesList();
}
static core::LanguageType::Types LanguageTypeFromString(QString const & value)
{
return core::LanguageType::TypeByStr(value);
}
static QString StrFromLanguageType(core::LanguageType::Types const & value)
{
return core::LanguageType::StrByType(value);
}
static QStringList LanguageTypes()
{
return core::LanguageType::TypesList();
}
static core::AccessMode::Types AccessModeFromString(QString const & value)
{
return core::AccessMode::TypeByStr(value);
}
static QString StrFromAccessMode(core::AccessMode::Types const & value)
{
return core::AccessMode::StrByType(value);
}
static QStringList AccessModeTypes()
{
return core::AccessMode::TypesList();
}
static UAVMapFollowType::Types UAVMapFollowFromString(QString const & value)
{
return UAVMapFollowType::TypeByStr(value);
}
static QString StrFromUAVMapFollow(UAVMapFollowType::Types const & value)
{
return UAVMapFollowType::StrByType(value);
}
static QStringList UAVMapFollowTypes()
{
return UAVMapFollowType::TypesList();
}
static UAVTrailType::Types UAVTrailTypeFromString(QString const & value)
{
return UAVTrailType::TypeByStr(value);
}
static QString StrFromUAVTrailType(UAVTrailType::Types const & value)
{
return UAVTrailType::StrByType(value);
}
static QStringList UAVTrailTypes()
{
return UAVTrailType::TypesList();
}
};
#ifdef QtopmapWidget
#include <mapwidgetglobal.h>
class OPMAPWIDGETSHARED_EXPORT OPMapWidget : public QGraphicsView {
#else
class OPMapWidget : public QGraphicsView {
#endif
Q_OBJECT
// Q_PROPERTY(int MaxZoom READ MaxZoom WRITE SetMaxZoom)
Q_PROPERTY(int MinZoom READ MinZoom WRITE SetMinZoom)
Q_PROPERTY(bool ShowTileGridLines READ ShowTileGridLines WRITE SetShowTileGridLines)
Q_PROPERTY(double Zoom READ ZoomTotal WRITE SetZoom)
Q_PROPERTY(qreal Rotate READ Rotate WRITE SetRotate)
Q_ENUMS(internals::MouseWheelZoomType::Types)
Q_ENUMS(core::GeoCoderStatusCode::Types)
public:
QSize sizeHint() const;
/**
* @brief Constructor
*
* @param parent parent widget
* @param config pointer to configuration classed to be used
* @return
*/
OPMapWidget(QWidget *parent = 0, Configuration *config = new Configuration);
~OPMapWidget();
bool ShowTileGridLines() const
{
return map->showTileGridLines;
}
void SetShowTileGridLines(bool const & value)
{
map->showTileGridLines = value; map->update();
}
int MaxZoom() const
{
return map->MaxZoom();
}
// void SetMaxZoom(int const& value){map->maxZoom = value;}
int MinZoom() const
{
return map->minZoom;
}
void SetMinZoom(int const & value)
{
map->minZoom = value;
}
internals::MouseWheelZoomType::Types GetMouseWheelZoomType()
{
return map->core->GetMouseWheelZoomType();
}
void SetMouseWheelZoomType(internals::MouseWheelZoomType::Types const & value)
{
map->core->SetMouseWheelZoomType(value);
}
// void SetMouseWheelZoomTypeByStr(const QString &value){map->core->SetMouseWheelZoomType(internals::MouseWheelZoomType::TypeByStr(value));}
// QString GetMouseWheelZoomTypeStr(){return map->GetMouseWheelZoomTypeStr();}
internals::RectLatLng SelectedArea() const
{
return map->selectedArea;
}
void SetSelectedArea(internals::RectLatLng const & value)
{
map->selectedArea = value; this->update();
}
bool CanDragMap() const
{
return map->CanDragMap();
}
void SetCanDragMap(bool const & value)
{
map->SetCanDragMap(value);
}
internals::PointLatLng CurrentPosition() const
{
return map->core->CurrentPosition();
}
void SetCurrentPosition();
void SetCurrentPosition(internals::PointLatLng const & value);
double ZoomReal()
{
return map->Zoom();
}
double ZoomDigi()
{
return map->ZoomDigi();
}
double ZoomTotal()
{
return map->ZoomTotal();
}
void SetZoom(double const & value)
{
map->SetZoom(value);
}
qreal Rotate()
{
return map->rotation;
}
void SetRotate(qreal const & value);
void ReloadMap()
{
map->ReloadMap(); map->resize();
}
GeoCoderStatusCode::Types SetCurrentPositionByKeywords(QString const & keys)
{
return map->SetCurrentPositionByKeywords(keys);
}
bool UseOpenGL()
{
return useOpenGL;
}
void SetUseOpenGL(bool const & value);
MapType::Types GetMapType()
{
return map->core->GetMapType();
}
void SetMapType(MapType::Types const & value)
{
map->lastimage = QImage(); map->core->SetMapType(value);
}
bool isStarted()
{
return map->core->isStarted();
}
int getUAVCurrent(void);
Configuration *configuration;
internals::PointLatLng currentMousePosition();
void SetFollowMouse(bool const & value)
{
followmouse = value; this->setMouseTracking(followmouse);
}
bool FollowMouse()
{
return followmouse;
}
internals::PointLatLng GetFromLocalToLatLng(QPointF p)
{
return map->FromLocalToLatLng(p.x(), p.y());
}
WayPointItem *WPCreate();
void WPCreate(WayPointItem *item);
WayPointItem *WPCreate(internals::PointLatLng const & coord, int const & altitude);
WayPointItem *WPCreate(internals::PointLatLng const & coord, int const & altitude, QString const & description);
WayPointItem *WPCreate(const distBearingAltitude &relativeCoord, const QString &description);
void WPRenumber(WayPointItem *item, int const & newnumber);
void SetShowCompass(bool const & value);
void setOverlayOpacity(qreal value);
UAVItem *UAV;
GPSItem *GPS;
HomeItem *Home;
AltitudeItem *altitudeitem;
void SetShowUAV(bool const & value);
bool ShowUAV() const
{
return showuav;
}
void SetShowHome(bool const & value);
bool ShowHome() const
{
return showhome;
}
void SetShowDiagnostics(bool const & value);
void SetUavPic(QString UAVPic);
WayPointLine *WPLineCreate(WayPointItem *from, WayPointItem *to, QColor color, bool dashed = false, int width = -1);
WayPointLine *WPLineCreate(HomeItem *from, WayPointItem *to, QColor color, bool dashed = false, int width = -1);
WayPointCircle *WPCircleCreate(WayPointItem *center, double radius, bool clockwise, QColor color, bool dashed = false, int width = -1);
WayPointCircle *WPCircleCreate(HomeItem *center, double radius, bool clockwise, QColor color, bool dashed = false, int width = -1);
void deleteAllOverlays();
void WPSetVisibleAll(bool value);
WayPointItem *magicWPCreate();
bool WPPresent();
WayPointItem *WPFind(int number);
QList<WayPointItem *> WPSelected();
void setSelectedWP(QList<WayPointItem *> list);
void setSelectedWP(int number);
void setSelectedWP(WayPointItem *item);
bool WPLock() const
{
return isWPLock;
}
void setWPLock(bool const & lock);
bool WPCreate() const
{
return isWPCreate;
}
void setWPCreate(bool const & value);
void setUAVPos(int sysid,int compid,double x,double y,double z);
void setUAVHeading(int sysid,int compid,float Heading);
void DeleteTrail(void);
double TotalDistance(void)
{
return totalDistance;
}
private:
internals::Core *core;
MapGraphicItem *map;
QGraphicsScene mscene;
bool useOpenGL;
GeoCoderStatusCode x;
MapType y;
core::AccessMode xx;
internals::PointLatLng currentmouseposition;
bool followmouse;
void ConnectWP(WayPointItem *item);
QGraphicsSvgItem *compass;
bool showuav;
bool showhome;
QTimer *diagTimer;
QGraphicsTextItem *diagGraphItem;
bool showDiag;
qreal overlayOpacity;
bool isWPCreate;
bool isWPLock;
bool isLNOP = false;
QString waypointMessage;
double totalDistance = 0;
QTimer *NoOperationTimer = nullptr;
QMap<int,QMap<int,VirtualMargin *>> VirtualMarginPoints;//type index point
QMap<int,QMap<int,VirtualMarginLine *>> VirtualMarginlinemapLines;//type index line
QMap<int,VirtualMargin *> virtualmarginmap_red;
QMap<int,VirtualMarginLine *> virtualmarginlinemap_red;
QMap<int,VirtualMargin *> virtualmarginmap_orange;
QMap<int,VirtualMarginLine *> virtualmarginlinemap_orange;
QColor WarningColor = QColor("#F64034");
QColor NoticeColor = QColor("#F1B243");
QColor Drop1Color = QColor("#0000FF");
QColor Drop2Color = QColor("#0000FF");
private slots:
void diagRefresh();
// WayPointItem* item;//apagar
void NOPTimeout();
protected:
void resizeEvent(QResizeEvent *event);
void showEvent(QShowEvent *event);
void closeEvent(QCloseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseDoubleClickEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
// private slots:
signals:
void showMessage(const QString &message,int TimeOut = 0);
//map property
void MapTypes(QStringList list);
void TotalDistanceUpdate(double);
void WPNeedToUpdata(int number);
void WPChanged(int Number,double Lat,double Lng);
void EmitCurrentMousePosition(internals::PointLatLng);
void zoomChanged(double zoomt, double zoom, double zoomd);
void WPNumberChanged(int const & oldnumber, int const & newnumber, WayPointItem *waypoint);
void WPValuesChanged(WayPointItem *waypoint);
void WPReached(WayPointItem *waypoint);
void WPCreated(int const & number, WayPointItem *waypoint);
void WPInserted(int const & number, WayPointItem *waypoint);
void WPDeleted(int const & number, WayPointItem *waypoint);
void WPLocalPositionChanged(QPointF, WayPointItem *);
void WPManualCoordChange(WayPointItem *);
void UAVReachedWayPoint(int const & waypointnumber, WayPointItem *waypoint);
void UAVLeftSafetyBouble(internals::PointLatLng const & position);
void OnCurrentPositionChanged(internals::PointLatLng point);
void OnTileLoadComplete();
void OnTileLoadStart();
void OnMapDrag();
void OnMapZoomChanged();
void OnMapTypeChanged(MapType::Types type);
void OnEmptyTileError(int zoom, core::Point pos);
void OnTilesStillToLoad(int number);
void OnWayPointDoubleClicked(WayPointItem *waypoint);
void selectedWPChanged(QList<WayPointItem *>);
void MousePressEvent(QMouseEvent *event);
void MouseReleaseEvent(QMouseEvent *event);
void MouseDoubleClickEvent(QMouseEvent *event);
void PointNumber(QList<int> nums);
void setWPProperty(float param1,float param2,float param3,float param4,
int32_t x,int32_t y,float z,
uint16_t seq,
uint16_t group,
uint16_t command,
uint8_t target_system,
uint8_t target_component,
uint8_t frame,
uint8_t current,
uint8_t autocontinue,
uint8_t mission_type);
void WPProperty(float param1,float param2,float param3,float param4,
int32_t x,int32_t y,float z,
uint16_t seq,
uint16_t group,
uint16_t command,
uint8_t target_system,
uint8_t target_component,
uint8_t frame,
uint8_t current,
uint8_t autocontinue,
uint8_t mission_type);
void allPoint(QMap<int,int> list);
void signal_WPDownload(uint8_t m_sysid, uint8_t m_compid);
void signal_WPUpload(uint8_t m_sysid, uint8_t m_compid, uint32_t count);
void transmitPoint(float param1,float param2,float param3,float param4,
int32_t x,int32_t y,float z,
uint16_t seq,
uint16_t group,
uint16_t command,
uint8_t target_system,
uint8_t target_component,
uint8_t frame,
uint8_t current,
uint8_t autocontinue,
uint8_t mission_type);
void uav_selected(int sys,int comp);
void setCurrent(int seq);
public slots:
void report(QString path);
void find_PointNumber();
void updateMessage(void);
void addUAV(int sysid, int compid);
void getMapTypes(void);
void setMapTypes(QVariant value);
void AddVirtualMargin(int type, int index, double lat, double lng, double alt, QColor color);
void CloseVirtualMargin(int type);
void RemoveVirtualMargin(int type);
void FlushVirtualMargin(int type);
void ElevationChanged(int seq,double value);
void AltitudeChanged(int seq,double value);
void setCurrentPoint(int value);
void receivedPoint(float param1,float param2,float param3,float param4,
int32_t x,int32_t y,float z,
uint16_t seq,
uint16_t group,
uint16_t command,
uint8_t target_system,
uint8_t target_component,
uint8_t frame,
uint8_t current,
uint8_t autocontinue,
uint8_t mission_type);
void WPLineDelete(WayPointItem *from, WayPointItem *to);
WayPointLine *WPLineFind(WayPointItem *from, WayPointItem *to);
void WPDelete(WayPointItem *item);
void WPDelete(int number);
void WPDeleteAll();
void WPInsert(int const & position);
void WPInsert(WayPointItem *item, int const & position);
WayPointItem *WPInsert(internals::PointLatLng const & coord, int const & altitude, int const & position);
WayPointItem *WPInsert(internals::PointLatLng const & coord, int const & altitude, QString const & description, int const & position);
WayPointItem *WPInsert(const distBearingAltitude &relative, const QString &description, const int &position);
void WPLocalChanged(QPointF p, WayPointItem *w);
void WPFollowPrevious(bool flag,WayPointItem *waypoint);
void WPSetCurrent(int seq);
void WPLoad(QString path);
void WPSave(QString path);
void WPDownload(void);
void WPUpload(void);
void WPotherPoint(int number);
void WPsearchall(void);
void WPSendItemOK(uint16_t seq,bool flag);
void RipMap();
void OnSelectionChanged();
};
}
#endif // OPMAPWIDGET_H