2011-05-14 14:47:49 +02:00
/**
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* @ file opmapgadgetwidget . cpp
2012-06-02 21:29:22 +02:00
* @ author The OpenPilot Team , http : //www.openpilot.org Copyright (C) 2012.
2011-05-14 14:47:49 +02:00
* @ addtogroup GCSPlugins GCS Plugins
* @ {
* @ addtogroup OPMapPlugin OpenPilot Map Plugin
* @ {
2012-05-12 02:20:35 +02:00
* @ brief The OpenPilot Map plugin
2011-05-14 14:47:49 +02:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* 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
*/
# include "opmapgadgetwidget.h"
# include "ui_opmap_widget.h"
# include <QtGui/QApplication>
# include <QtGui/QHBoxLayout>
# include <QtGui/QVBoxLayout>
# include <QtGui/QClipboard>
# include <QtGui/QMenu>
# include <QStringList>
# include <QDir>
# include <QFile>
# include <QDateTime>
2012-03-03 19:37:01 +01:00
# include "homelocation.h"
# include "positionactual.h"
2012-06-02 19:43:41 +02:00
# include <pathcompiler.h>
2011-05-14 14:47:49 +02:00
# include <math.h>
# include "utils/stylehelper.h"
# include "utils/homelocationutil.h"
# include "utils/worldmagmodel.h"
# include "uavtalk/telemetrymanager.h"
2012-08-02 10:58:55 +02:00
# include "uavobject.h"
2011-05-14 14:47:49 +02:00
# include "positionactual.h"
# include "homelocation.h"
2012-08-02 10:58:55 +02:00
# include "gpsposition.h"
# include "gyros.h"
2012-08-17 17:26:15 +02:00
# include "attitudeactual.h"
2012-08-02 10:58:55 +02:00
# include "positionactual.h"
# include "velocityactual.h"
2011-05-14 14:47:49 +02:00
# define allow_manual_home_location_move
// *************************************************************************************
# define deg_to_rad ((double)M_PI / 180.0)
# define rad_to_deg (180.0 / (double)M_PI)
# define earth_mean_radius 6371 // kilometers
# define max_digital_zoom 3 // maximum allowed digital zoom level
const int safe_area_radius_list [ ] = { 5 , 10 , 20 , 50 , 100 , 200 , 500 , 1000 , 2000 , 5000 } ; // meters
const int uav_trail_time_list [ ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ; // seconds
const int uav_trail_distance_list [ ] = { 1 , 2 , 5 , 10 , 20 , 50 , 100 , 200 , 500 } ; // meters
const int max_update_rate_list [ ] = { 100 , 200 , 500 , 1000 , 2000 , 5000 } ; // milliseconds
// *************************************************************************************
// constructor
OPMapGadgetWidget : : OPMapGadgetWidget ( QWidget * parent ) : QWidget ( parent )
{
// **************
m_widget = NULL ;
m_map = NULL ;
findPlaceCompleter = NULL ;
m_mouse_waypoint = NULL ;
2012-05-12 02:20:35 +02:00
pm = NULL ;
obm = NULL ;
obum = NULL ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
m_prev_tile_number = 0 ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
m_min_zoom = m_max_zoom = 0 ;
2011-05-14 14:47:49 +02:00
m_map_mode = Normal_MapMode ;
2012-05-12 02:20:35 +02:00
m_maxUpdateRate = max_update_rate_list [ 4 ] ; // 2 seconds
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
m_telemetry_connected = false ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
m_context_menu_lat_lon = m_mouse_lat_lon = internals : : PointLatLng ( 0 , 0 ) ;
2011-05-14 14:47:49 +02:00
setMouseTracking ( true ) ;
2012-05-12 02:20:35 +02:00
pm = ExtensionSystem : : PluginManager : : instance ( ) ;
if ( pm )
{
obm = pm - > getObject < UAVObjectManager > ( ) ;
obum = pm - > getObject < UAVObjectUtilManager > ( ) ;
}
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
// **************
2011-05-14 14:47:49 +02:00
// get current location
double latitude = 0 ;
double longitude = 0 ;
double altitude = 0 ;
2012-05-12 02:20:35 +02:00
// current position
getUAVPosition ( latitude , longitude , altitude ) ;
2011-05-14 14:47:49 +02:00
internals : : PointLatLng pos_lat_lon = internals : : PointLatLng ( latitude , longitude ) ;
// **************
// default home position
2012-05-12 02:20:35 +02:00
m_home_position . coord = pos_lat_lon ;
m_home_position . altitude = altitude ;
m_home_position . locked = false ;
2011-05-14 14:47:49 +02:00
// **************
// create the widget that holds the user controls and the map
m_widget = new Ui : : OPMap_Widget ( ) ;
m_widget - > setupUi ( this ) ;
// **************
// create the central map widget
m_map = new mapcontrol : : OPMapWidget ( ) ; // create the map object
m_map - > setFrameStyle ( QFrame : : NoFrame ) ; // no border frame
m_map - > setBackgroundBrush ( QBrush ( Utils : : StyleHelper : : baseColor ( ) ) ) ; // tile background
m_map - > configuration - > DragButton = Qt : : LeftButton ; // use the left mouse button for map dragging
m_widget - > horizontalSliderZoom - > setMinimum ( m_map - > MinZoom ( ) ) ; //
m_widget - > horizontalSliderZoom - > setMaximum ( m_map - > MaxZoom ( ) + max_digital_zoom ) ; //
2012-05-12 02:20:35 +02:00
m_min_zoom = m_widget - > horizontalSliderZoom - > minimum ( ) ; // minimum zoom we can accept
m_max_zoom = m_widget - > horizontalSliderZoom - > maximum ( ) ; // maximum zoom we can accept
2011-05-14 14:47:49 +02:00
m_map - > SetMouseWheelZoomType ( internals : : MouseWheelZoomType : : MousePositionWithoutCenter ) ; // set how the mouse wheel zoom functions
m_map - > SetFollowMouse ( true ) ; // we want a contiuous mouse position reading
m_map - > SetShowHome ( true ) ; // display the HOME position on the map
m_map - > SetShowUAV ( true ) ; // display the UAV position on the map
2012-05-12 02:20:35 +02:00
m_map - > Home - > SetSafeArea ( safe_area_radius_list [ 0 ] ) ; // set radius (meters)
2011-05-14 14:47:49 +02:00
m_map - > Home - > SetShowSafeArea ( true ) ; // show the safe area
2012-08-18 09:28:30 +02:00
m_map - > Home - > SetToggleRefresh ( true ) ;
2011-05-14 14:47:49 +02:00
2012-06-24 21:05:27 +02:00
if ( m_map - > Home )
connect ( m_map - > Home , SIGNAL ( homedoubleclick ( HomeItem * ) ) , this , SLOT ( onHomeDoubleClick ( HomeItem * ) ) ) ;
2011-05-14 14:47:49 +02:00
m_map - > UAV - > SetTrailTime ( uav_trail_time_list [ 0 ] ) ; // seconds
m_map - > UAV - > SetTrailDistance ( uav_trail_distance_list [ 1 ] ) ; // meters
m_map - > UAV - > SetTrailType ( UAVTrailType : : ByTimeElapsed ) ;
2012-05-17 18:27:08 +02:00
if ( m_map - > GPS )
{
m_map - > GPS - > SetTrailTime ( uav_trail_time_list [ 0 ] ) ; // seconds
m_map - > GPS - > SetTrailDistance ( uav_trail_distance_list [ 1 ] ) ; // meters
2011-05-14 14:47:49 +02:00
2012-05-17 18:27:08 +02:00
m_map - > GPS - > SetTrailType ( UAVTrailType : : ByTimeElapsed ) ;
}
2011-05-14 14:47:49 +02:00
// **************
setSizePolicy ( QSizePolicy : : MinimumExpanding , QSizePolicy : : MinimumExpanding ) ;
QVBoxLayout * layout = new QVBoxLayout ;
layout - > setSpacing ( 0 ) ;
layout - > setContentsMargins ( 0 , 0 , 0 , 0 ) ;
layout - > addWidget ( m_map ) ;
m_widget - > mapWidget - > setLayout ( layout ) ;
switch ( m_map_mode )
{
2012-05-12 02:20:35 +02:00
case Normal_MapMode :
m_widget - > toolButtonMagicWaypointMapMode - > setChecked ( false ) ;
m_widget - > toolButtonNormalMapMode - > setChecked ( true ) ;
hideMagicWaypointControls ( ) ;
break ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
case MagicWaypoint_MapMode :
m_widget - > toolButtonNormalMapMode - > setChecked ( false ) ;
m_widget - > toolButtonMagicWaypointMapMode - > setChecked ( true ) ;
showMagicWaypointControls ( ) ;
break ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
default :
m_map_mode = Normal_MapMode ;
m_widget - > toolButtonMagicWaypointMapMode - > setChecked ( false ) ;
m_widget - > toolButtonNormalMapMode - > setChecked ( true ) ;
hideMagicWaypointControls ( ) ;
break ;
2011-05-14 14:47:49 +02:00
}
m_widget - > labelUAVPos - > setText ( " --- " ) ;
m_widget - > labelMapPos - > setText ( " --- " ) ;
m_widget - > labelMousePos - > setText ( " --- " ) ;
m_widget - > labelMapZoom - > setText ( " --- " ) ;
m_widget - > progressBarMap - > setMaximum ( 1 ) ;
connect ( m_map , SIGNAL ( zoomChanged ( double , double , double ) ) , this , SLOT ( zoomChanged ( double , double , double ) ) ) ; // map zoom change signals
connect ( m_map , SIGNAL ( OnCurrentPositionChanged ( internals : : PointLatLng ) ) , this , SLOT ( OnCurrentPositionChanged ( internals : : PointLatLng ) ) ) ; // map poisition change signals
connect ( m_map , SIGNAL ( OnTileLoadComplete ( ) ) , this , SLOT ( OnTileLoadComplete ( ) ) ) ; // tile loading stop signals
connect ( m_map , SIGNAL ( OnTileLoadStart ( ) ) , this , SLOT ( OnTileLoadStart ( ) ) ) ; // tile loading start signals
connect ( m_map , SIGNAL ( OnTilesStillToLoad ( int ) ) , this , SLOT ( OnTilesStillToLoad ( int ) ) ) ; // tile loading signals
2012-05-30 17:19:36 +02:00
connect ( m_map , SIGNAL ( OnWayPointDoubleClicked ( WayPointItem * ) ) , this , SLOT ( wpDoubleClickEvent ( WayPointItem * ) ) ) ;
2011-05-14 14:47:49 +02:00
m_map - > SetCurrentPosition ( m_home_position . coord ) ; // set the map position
m_map - > Home - > SetCoord ( m_home_position . coord ) ; // set the HOME position
m_map - > UAV - > SetUAVPos ( m_home_position . coord , 0.0 ) ; // set the UAV position
2012-08-19 02:40:05 +02:00
m_map - > UAV - > update ( ) ;
2012-05-17 18:27:08 +02:00
if ( m_map - > GPS )
2012-08-02 19:13:54 +02:00
m_map - > GPS - > SetUAVPos ( m_home_position . coord , 0.0 ) ; // set the GPS position
2012-06-03 20:19:00 +02:00
magicWayPoint = m_map - > magicWPCreate ( ) ;
magicWayPoint - > setVisible ( false ) ;
2011-05-14 14:47:49 +02:00
2012-06-29 02:20:38 +02:00
m_map - > setOverlayOpacity ( 0.5 ) ;
2011-05-14 14:47:49 +02:00
2012-09-01 23:18:03 +02:00
// create various context menu (mouse right click menu) actions
2011-05-14 14:47:49 +02:00
createActions ( ) ;
2012-05-12 02:31:01 +02:00
Q_ASSERT ( pm ) ;
Q_ASSERT ( obm ) ;
// Register for Home Location state changes
HomeLocation * obj = HomeLocation : : GetInstance ( obm ) ;
Q_ASSERT ( obj ! = NULL ) ;
connect ( obj , SIGNAL ( objectUpdated ( UAVObject * ) ) , this , SLOT ( homePositionUpdated ( UAVObject * ) ) ) ;
// Listen to telemetry connection events
TelemetryManager * telMngr = pm - > getObject < TelemetryManager > ( ) ;
Q_ASSERT ( telMngr ) ;
connect ( telMngr , SIGNAL ( connected ( ) ) , this , SLOT ( onTelemetryConnect ( ) ) ) ;
connect ( telMngr , SIGNAL ( disconnected ( ) ) , this , SLOT ( onTelemetryDisconnect ( ) ) ) ;
2011-05-14 14:47:49 +02:00
// create the desired timers
m_updateTimer = new QTimer ( ) ;
2012-05-12 02:20:35 +02:00
m_updateTimer - > setInterval ( m_maxUpdateRate ) ;
2011-05-14 14:47:49 +02:00
connect ( m_updateTimer , SIGNAL ( timeout ( ) ) , this , SLOT ( updatePosition ( ) ) ) ;
m_updateTimer - > start ( ) ;
m_statusUpdateTimer = new QTimer ( ) ;
m_statusUpdateTimer - > setInterval ( 200 ) ;
connect ( m_statusUpdateTimer , SIGNAL ( timeout ( ) ) , this , SLOT ( updateMousePos ( ) ) ) ;
m_statusUpdateTimer - > start ( ) ;
m_map - > setFocus ( ) ;
2012-09-01 23:49:15 +02:00
// Create the path compiler and connect the signals to it
pathCompiler = new PathCompiler ( this ) ;
connect ( pathCompiler , SIGNAL ( visualizationChanged ( QList < PathCompiler : : waypoint > ) ) ,
this , SLOT ( doVisualizationChanged ( QList < PathCompiler : : waypoint > ) ) ) ;
2011-05-14 14:47:49 +02:00
}
// destructor
OPMapGadgetWidget : : ~ OPMapGadgetWidget ( )
{
if ( m_map )
{
disconnect ( m_map , 0 , 0 , 0 ) ;
m_map - > SetShowHome ( false ) ; // doing this appears to stop the map lib crashing on exit
m_map - > SetShowUAV ( false ) ; // " "
}
2012-05-12 03:29:53 +02:00
2011-05-14 14:47:49 +02:00
if ( m_map )
{
delete m_map ;
m_map = NULL ;
}
}
// *************************************************************************************
// widget signals .. the mouseMoveEvent does not get called - don't yet know why
void OPMapGadgetWidget : : resizeEvent ( QResizeEvent * event )
{
QWidget : : resizeEvent ( event ) ;
}
2012-05-30 17:19:36 +02:00
void OPMapGadgetWidget : : wpDoubleClickEvent ( WayPointItem * wp )
2011-05-14 14:47:49 +02:00
{
2012-05-30 17:19:36 +02:00
m_mouse_waypoint = wp ;
onEditWayPointAct_triggered ( ) ;
2011-05-14 14:47:49 +02:00
}
void OPMapGadgetWidget : : contextMenuEvent ( QContextMenuEvent * event )
{ // the user has right clicked on the map - create the pop-up context menu and display it
QString s ;
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
if ( event - > reason ( ) ! = QContextMenuEvent : : Mouse )
return ; // not a mouse click event
// current mouse position
QPoint p = m_map - > mapFromGlobal ( event - > globalPos ( ) ) ;
2012-05-12 02:20:35 +02:00
m_context_menu_lat_lon = m_map - > GetFromLocalToLatLng ( p ) ;
2011-05-14 14:47:49 +02:00
if ( ! m_map - > contentsRect ( ) . contains ( p ) )
return ; // the mouse click was not on the map
// show the mouse position
2012-05-12 02:20:35 +02:00
s = QString : : number ( m_context_menu_lat_lon . Lat ( ) , ' f ' , 7 ) + " " + QString : : number ( m_context_menu_lat_lon . Lng ( ) , ' f ' , 7 ) ;
2011-05-14 14:47:49 +02:00
m_widget - > labelMousePos - > setText ( s ) ;
// find out if we have a waypoint under the mouse cursor
QGraphicsItem * item = m_map - > itemAt ( p ) ;
m_mouse_waypoint = qgraphicsitem_cast < mapcontrol : : WayPointItem * > ( item ) ;
// find out if the waypoint is locked (or not)
bool waypoint_locked = false ;
if ( m_mouse_waypoint )
waypoint_locked = ( m_mouse_waypoint - > flags ( ) & QGraphicsItem : : ItemIsMovable ) = = 0 ;
// ****************
// Dynamically create the popup menu
2012-06-03 20:19:00 +02:00
contextMenu . addAction ( closeAct1 ) ;
contextMenu . addSeparator ( ) ;
contextMenu . addAction ( reloadAct ) ;
contextMenu . addSeparator ( ) ;
contextMenu . addAction ( ripAct ) ;
contextMenu . addSeparator ( ) ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
QMenu maxUpdateRateSubMenu ( tr ( " &Max Update Rate " ) + " ( " + QString : : number ( m_maxUpdateRate ) + " ms) " , this ) ;
for ( int i = 0 ; i < maxUpdateRateAct . count ( ) ; i + + )
maxUpdateRateSubMenu . addAction ( maxUpdateRateAct . at ( i ) ) ;
2012-06-03 20:19:00 +02:00
contextMenu . addMenu ( & maxUpdateRateSubMenu ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . addSeparator ( ) ;
2011-05-14 14:47:49 +02:00
switch ( m_map_mode )
{
2012-05-12 02:20:35 +02:00
case Normal_MapMode : s = tr ( " (Normal) " ) ; break ;
case MagicWaypoint_MapMode : s = tr ( " (Magic Waypoint) " ) ; break ;
default : s = tr ( " (Unknown) " ) ; break ;
2011-05-14 14:47:49 +02:00
}
for ( int i = 0 ; i < mapModeAct . count ( ) ; i + + )
{ // set the menu to checked (or not)
QAction * act = mapModeAct . at ( i ) ;
if ( ! act ) continue ;
if ( act - > data ( ) . toInt ( ) = = ( int ) m_map_mode )
act - > setChecked ( true ) ;
}
QMenu mapModeSubMenu ( tr ( " Map mode " ) + s , this ) ;
for ( int i = 0 ; i < mapModeAct . count ( ) ; i + + )
mapModeSubMenu . addAction ( mapModeAct . at ( i ) ) ;
2012-06-03 20:19:00 +02:00
contextMenu . addMenu ( & mapModeSubMenu ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . addSeparator ( ) ;
2011-05-14 14:47:49 +02:00
QMenu copySubMenu ( tr ( " Copy " ) , this ) ;
copySubMenu . addAction ( copyMouseLatLonToClipAct ) ;
copySubMenu . addAction ( copyMouseLatToClipAct ) ;
copySubMenu . addAction ( copyMouseLonToClipAct ) ;
2012-06-03 20:19:00 +02:00
contextMenu . addMenu ( & copySubMenu ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . addSeparator ( ) ;
contextMenu . addAction ( changeDefaultLocalAndZoom ) ;
contextMenu . addSeparator ( ) ;
2012-05-12 03:29:53 +02:00
2012-04-30 15:57:06 +02:00
QMenu safeArea ( " Safety Area definitions " ) ;
2011-05-14 14:47:49 +02:00
QMenu safeAreaSubMenu ( tr ( " Safe Area Radius " ) + " ( " + QString : : number ( m_map - > Home - > SafeArea ( ) ) + " m) " , this ) ;
for ( int i = 0 ; i < safeAreaAct . count ( ) ; i + + )
safeAreaSubMenu . addAction ( safeAreaAct . at ( i ) ) ;
2012-04-30 15:57:06 +02:00
safeArea . addMenu ( & safeAreaSubMenu ) ;
safeArea . addAction ( showSafeAreaAct ) ;
2012-06-03 20:19:00 +02:00
contextMenu . addMenu ( & safeArea ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . addSeparator ( ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . addAction ( showCompassAct ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . addAction ( showDiagnostics ) ;
2011-05-14 14:47:49 +02:00
2012-08-02 19:13:54 +02:00
contextMenu . addAction ( showUAVInfo ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . addSeparator ( ) - > setText ( tr ( " Zoom " ) ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . addAction ( zoomInAct ) ;
contextMenu . addAction ( zoomOutAct ) ;
2011-05-14 14:47:49 +02:00
QMenu zoomSubMenu ( tr ( " &Zoom " ) + " ( " + QString : : number ( m_map - > ZoomTotal ( ) ) + " ) " , this ) ;
for ( int i = 0 ; i < zoomAct . count ( ) ; i + + )
zoomSubMenu . addAction ( zoomAct . at ( i ) ) ;
2012-06-03 20:19:00 +02:00
contextMenu . addMenu ( & zoomSubMenu ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . addSeparator ( ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . addAction ( goMouseClickAct ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . addSeparator ( ) - > setText ( tr ( " HOME " ) ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . addAction ( setHomeAct ) ;
contextMenu . addAction ( showHomeAct ) ;
contextMenu . addAction ( goHomeAct ) ;
2011-05-14 14:47:49 +02:00
// ****
// uav trails
2012-06-03 20:19:00 +02:00
QMenu uav_menu ( tr ( " UAV " ) ) ;
uav_menu . addSeparator ( ) - > setText ( tr ( " UAV Trail " ) ) ;
contextMenu . addMenu ( & uav_menu ) ;
2011-05-14 14:47:49 +02:00
QMenu uavTrailTypeSubMenu ( tr ( " UAV trail type " ) + " ( " + mapcontrol : : Helper : : StrFromUAVTrailType ( m_map - > UAV - > GetTrailType ( ) ) + " ) " , this ) ;
for ( int i = 0 ; i < uavTrailTypeAct . count ( ) ; i + + )
uavTrailTypeSubMenu . addAction ( uavTrailTypeAct . at ( i ) ) ;
2012-06-03 20:19:00 +02:00
uav_menu . addMenu ( & uavTrailTypeSubMenu ) ;
2011-05-14 14:47:49 +02:00
QMenu uavTrailTimeSubMenu ( tr ( " UAV trail time " ) + " ( " + QString : : number ( m_map - > UAV - > TrailTime ( ) ) + " sec) " , this ) ;
for ( int i = 0 ; i < uavTrailTimeAct . count ( ) ; i + + )
uavTrailTimeSubMenu . addAction ( uavTrailTimeAct . at ( i ) ) ;
2012-06-03 20:19:00 +02:00
uav_menu . addMenu ( & uavTrailTimeSubMenu ) ;
2011-05-14 14:47:49 +02:00
QMenu uavTrailDistanceSubMenu ( tr ( " UAV trail distance " ) + " ( " + QString : : number ( m_map - > UAV - > TrailDistance ( ) ) + " meters) " , this ) ;
for ( int i = 0 ; i < uavTrailDistanceAct . count ( ) ; i + + )
uavTrailDistanceSubMenu . addAction ( uavTrailDistanceAct . at ( i ) ) ;
2012-06-07 16:51:11 +02:00
2012-09-01 23:18:03 +02:00
// QMenu gpsTrailSubMenu(tr("GPS Trail"), this);
2012-06-07 16:51:11 +02:00
2012-09-01 23:18:03 +02:00
// QMenu gpsTrailTypeSubMenu(tr("GPS trail type") + " (" + mapcontrol::Helper::StrFromUAVTrailType(m_map->GPS->GetTrailType()) + ")", this);
// for (int i = 0; i < gpsTrailTypeAct.count(); i++)
// gpsTrailTypeSubMenu.addAction(gpsTrailTypeAct.at(i));
// gpsTrailSubMenu.addMenu(&gpsTrailTypeSubMenu);
2012-06-07 16:51:11 +02:00
2012-09-01 23:18:03 +02:00
// QMenu gpsTrailTimeSubMenu(tr("GPS trail time") + " (" + QString::number(m_map->GPS->TrailTime()) + " sec)", this);
// for (int i = 0; i < gpsTrailTimeAct.count(); i++)
// gpsTrailTimeSubMenu.addAction(gpsTrailTimeAct.at(i));
// gpsTrailSubMenu.addMenu(&gpsTrailTimeSubMenu);
2012-06-07 16:51:11 +02:00
2012-09-01 23:18:03 +02:00
// QMenu gpsTrailDistanceSubMenu(tr("GPS trail distance") + " (" + QString::number(m_map->GPS->TrailDistance()) + " meters)", this);
// for (int i = 0; i < gpsTrailDistanceAct.count(); i++)
// gpsTrailDistanceSubMenu.addAction(gpsTrailDistanceAct.at(i));
// gpsTrailSubMenu.addMenu(&gpsTrailDistanceSubMenu);
2012-06-07 16:51:11 +02:00
2012-09-01 23:18:03 +02:00
// gpsTrailSubMenu.addAction(showGPStrailAct);
2011-05-14 14:47:49 +02:00
2012-09-01 23:18:03 +02:00
// gpsTrailSubMenu.addAction(showGPStrailLineAct);
2011-05-14 14:47:49 +02:00
2012-09-01 23:18:03 +02:00
// gpsTrailSubMenu.addAction(clearGPStrailAct);
// menu.addMenu(&gpsTrailSubMenu);
2011-05-14 14:47:49 +02:00
2012-09-01 23:18:03 +02:00
uav_menu . addMenu ( & uavTrailDistanceSubMenu ) ;
//uav_menu.addAction(showTrailAct);
//uav_menu.addAction(showTrailLineAct);
uav_menu . addAction ( showGPSAct ) ;
uav_menu . addAction ( clearUAVtrailAct ) ;
2012-06-03 20:19:00 +02:00
uav_menu . addSeparator ( ) - > setText ( tr ( " UAV " ) ) ;
2012-06-07 16:51:11 +02:00
2012-06-03 20:19:00 +02:00
uav_menu . addAction ( showUAVAct ) ;
uav_menu . addAction ( followUAVpositionAct ) ;
uav_menu . addAction ( followUAVheadingAct ) ;
uav_menu . addAction ( goUAVAct ) ;
2011-05-14 14:47:49 +02:00
// *********
switch ( m_map_mode )
{
2012-05-12 02:20:35 +02:00
case Normal_MapMode :
2011-05-14 14:47:49 +02:00
2012-09-01 23:18:03 +02:00
contextMenu . addSeparator ( ) - > setText ( tr ( " Waypoints " ) ) ;
2011-05-14 14:47:49 +02:00
2012-09-01 23:18:03 +02:00
contextMenu . addAction ( addWayPointAct ) ;
2011-05-14 14:47:49 +02:00
2012-05-12 03:29:53 +02:00
if ( m_mouse_waypoint )
{ // we have a waypoint under the mouse
lockWayPointAct - > setChecked ( waypoint_locked ) ;
2012-09-01 23:18:03 +02:00
contextMenu . addAction ( lockWayPointAct ) ;
2011-05-14 14:47:49 +02:00
2012-05-12 03:29:53 +02:00
if ( ! waypoint_locked )
2012-09-01 23:18:03 +02:00
contextMenu . addAction ( deleteWayPointAct ) ;
2012-05-12 03:29:53 +02:00
}
2011-05-14 14:47:49 +02:00
2012-09-01 23:18:03 +02:00
contextMenu . addAction ( clearWayPointsAct ) ; // we have waypoints
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
break ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
case MagicWaypoint_MapMode :
2012-09-01 23:18:03 +02:00
contextMenu . addSeparator ( ) - > setText ( tr ( " Waypoints " ) ) ;
contextMenu . addAction ( homeMagicWaypointAct ) ;
2012-05-12 02:20:35 +02:00
break ;
2011-05-14 14:47:49 +02:00
}
2012-06-29 02:20:38 +02:00
QMenu overlaySubMenu ( tr ( " &Overlay Opacity " ) , this ) ;
for ( int i = 0 ; i < overlayOpacityAct . count ( ) ; i + + )
overlaySubMenu . addAction ( overlayOpacityAct . at ( i ) ) ;
contextMenu . addMenu ( & overlaySubMenu ) ;
2012-06-03 20:19:00 +02:00
contextMenu . addSeparator ( ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . addAction ( closeAct2 ) ;
2011-05-14 14:47:49 +02:00
2012-06-03 20:19:00 +02:00
contextMenu . exec ( event - > globalPos ( ) ) ; // popup the menu
2011-05-14 14:47:49 +02:00
}
2012-06-24 21:05:27 +02:00
void OPMapGadgetWidget : : closeEvent ( QCloseEvent * event )
2011-05-14 14:47:49 +02:00
{
2012-06-24 21:05:27 +02:00
QWidget : : closeEvent ( event ) ;
2011-05-14 14:47:49 +02:00
}
// *************************************************************************************
// timer signals
/**
2012-08-18 09:28:30 +02:00
Updates the UAV position on the map . It is called at a user - defined frequency ,
as set inside the map widget .
2012-06-03 20:19:00 +02:00
*/
2011-05-14 14:47:49 +02:00
void OPMapGadgetWidget : : updatePosition ( )
{
2012-05-12 02:20:35 +02:00
double uav_latitude , uav_longitude , uav_altitude , uav_yaw ;
double gps_latitude , gps_longitude , gps_altitude , gps_heading ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
internals : : PointLatLng uav_pos ;
internals : : PointLatLng gps_pos ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
QMutexLocker locker ( & m_map_mutex ) ;
// get current UAV position
2012-05-12 02:20:35 +02:00
if ( ! getUAVPosition ( uav_latitude , uav_longitude , uav_altitude ) )
2011-05-14 14:47:49 +02:00
return ;
// get current UAV heading
2012-05-12 02:20:35 +02:00
uav_yaw = getUAV_Yaw ( ) ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
uav_pos = internals : : PointLatLng ( uav_latitude , uav_longitude ) ;
2011-05-14 14:47:49 +02:00
// *************
2012-08-02 10:58:55 +02:00
// get the current GPS position and heading
GPSPosition * gpsPositionObj = GPSPosition : : GetInstance ( obm ) ;
Q_ASSERT ( gpsPositionObj ) ;
2011-05-14 14:47:49 +02:00
2012-08-02 10:58:55 +02:00
GPSPosition : : DataFields gpsPositionData = gpsPositionObj - > getData ( ) ;
2011-05-14 14:47:49 +02:00
2012-08-02 10:58:55 +02:00
gps_heading = gpsPositionData . Heading ;
gps_latitude = gpsPositionData . Latitude ;
gps_longitude = gpsPositionData . Longitude ;
gps_altitude = gpsPositionData . Altitude ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
gps_pos = internals : : PointLatLng ( gps_latitude , gps_longitude ) ;
2011-05-14 14:47:49 +02:00
2012-08-02 10:58:55 +02:00
//**********************
// get the current position and heading estimates
2012-08-17 17:26:15 +02:00
AttitudeActual * attitudeActualObj = AttitudeActual : : GetInstance ( obm ) ;
2012-08-02 10:58:55 +02:00
PositionActual * positionActualObj = PositionActual : : GetInstance ( obm ) ;
VelocityActual * velocityActualObj = VelocityActual : : GetInstance ( obm ) ;
Gyros * gyrosObj = Gyros : : GetInstance ( obm ) ;
2012-09-27 11:45:59 +02:00
Q_ASSERT ( attitudeActualObj ) ;
2012-08-02 10:58:55 +02:00
Q_ASSERT ( positionActualObj ) ;
Q_ASSERT ( velocityActualObj ) ;
Q_ASSERT ( gyrosObj ) ;
2012-08-17 17:26:15 +02:00
AttitudeActual : : DataFields attitudeActualData = attitudeActualObj - > getData ( ) ;
2012-08-02 10:58:55 +02:00
PositionActual : : DataFields positionActualData = positionActualObj - > getData ( ) ;
VelocityActual : : DataFields velocityActualData = velocityActualObj - > getData ( ) ;
Gyros : : DataFields gyrosData = gyrosObj - > getData ( ) ;
double NED [ 3 ] = { positionActualData . North , positionActualData . East , positionActualData . Down } ;
double vNED [ 3 ] = { velocityActualData . North , velocityActualData . East , velocityActualData . Down } ;
//Set the position and heading estimates in the painter module
m_map - > UAV - > SetNED ( NED ) ;
2012-08-18 09:19:59 +02:00
m_map - > UAV - > SetGroundspeed ( vNED , m_maxUpdateRate ) ;
2012-08-17 17:26:15 +02:00
//Convert angular velocities into a rotationg rate around the world-frame yaw axis. This is found by simply taking the dot product of the angular Euler-rate matrix with the angular rates.
float psiRate_dps = 0 * gyrosData . z + sin ( attitudeActualData . Roll * deg_to_rad ) / cos ( attitudeActualData . Pitch * deg_to_rad ) * gyrosData . y + cos ( attitudeActualData . Roll * deg_to_rad ) / cos ( attitudeActualData . Pitch * deg_to_rad ) * gyrosData . z ;
2011-05-14 14:47:49 +02:00
2012-08-17 17:26:15 +02:00
//Set the angular rate in the painter module
m_map - > UAV - > SetYawRate ( psiRate_dps ) ; //Not correct, but I'm being lazy right now.
2012-08-02 10:58:55 +02:00
// *************
2011-05-14 14:47:49 +02:00
// display the UAV position
QString str =
" lat: " + QString : : number ( uav_pos . Lat ( ) , ' f ' , 7 ) +
" lon: " + QString : : number ( uav_pos . Lng ( ) , ' f ' , 7 ) +
2012-05-12 02:20:35 +02:00
" " + QString : : number ( uav_yaw , ' f ' , 1 ) + " deg " +
" " + QString : : number ( uav_altitude , ' f ' , 1 ) + " m " ;
2011-05-14 14:47:49 +02:00
m_widget - > labelUAVPos - > setText ( str ) ;
2012-05-12 02:20:35 +02:00
// *************
// set the UAV icon position on the map
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
m_map - > UAV - > SetUAVPos ( uav_pos , uav_altitude ) ; // set the maps UAV position
m_map - > UAV - > SetUAVHeading ( uav_yaw ) ; // set the maps UAV heading
2011-05-14 14:47:49 +02:00
// *************
// set the GPS icon position on the map
2012-05-17 18:27:08 +02:00
if ( m_map - > GPS )
{
m_map - > GPS - > SetUAVPos ( gps_pos , gps_altitude ) ; // set the maps GPS position
m_map - > GPS - > SetUAVHeading ( gps_heading ) ; // set the maps GPS heading
}
2012-08-19 02:40:05 +02:00
m_map - > UAV - > updateTextOverlay ( ) ;
m_map - > UAV - > update ( ) ;
2011-05-14 14:47:49 +02:00
// *************
}
/**
Update plugin behaviour based on mouse position ; Called every few ms by a
timer .
*/
void OPMapGadgetWidget : : updateMousePos ( )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
QMutexLocker locker ( & m_map_mutex ) ;
QPoint p = m_map - > mapFromGlobal ( QCursor : : pos ( ) ) ;
internals : : PointLatLng lat_lon = m_map - > GetFromLocalToLatLng ( p ) ; // fetch the current lat/lon mouse position
2012-06-03 20:19:00 +02:00
lastLatLngMouse = lat_lon ;
2011-05-14 14:47:49 +02:00
if ( ! m_map - > contentsRect ( ) . contains ( p ) )
return ; // the mouse is not on the map
2012-05-12 02:20:35 +02:00
// internals::PointLatLng lat_lon = m_map->currentMousePosition(); // fetch the current lat/lon mouse position
2011-05-14 14:47:49 +02:00
QGraphicsItem * item = m_map - > itemAt ( p ) ;
// find out if we are over the home position
mapcontrol : : HomeItem * home = qgraphicsitem_cast < mapcontrol : : HomeItem * > ( item ) ;
// find out if we have a waypoint under the mouse cursor
mapcontrol : : WayPointItem * wp = qgraphicsitem_cast < mapcontrol : : WayPointItem * > ( item ) ;
2012-05-12 02:20:35 +02:00
if ( m_mouse_lat_lon = = lat_lon )
2011-05-14 14:47:49 +02:00
return ; // the mouse has not moved
2012-05-12 02:20:35 +02:00
m_mouse_lat_lon = lat_lon ; // yes it has!
2011-05-14 14:47:49 +02:00
internals : : PointLatLng home_lat_lon = m_map - > Home - > Coord ( ) ;
2012-05-12 02:20:35 +02:00
QString s = QString : : number ( m_mouse_lat_lon . Lat ( ) , ' f ' , 7 ) + " " + QString : : number ( m_mouse_lat_lon . Lng ( ) , ' f ' , 7 ) ;
2011-05-14 14:47:49 +02:00
if ( wp )
{
2012-07-06 22:57:43 +02:00
s + = " wp[ " + QString : : number ( wp - > numberAdjusted ( ) ) + " ] " ;
2011-05-14 14:47:49 +02:00
double dist = distance ( home_lat_lon , wp - > Coord ( ) ) ;
double bear = bearing ( home_lat_lon , wp - > Coord ( ) ) ;
s + = " " + QString : : number ( dist * 1000 , ' f ' , 1 ) + " m " ;
s + = " " + QString : : number ( bear , ' f ' , 1 ) + " deg " ;
}
2012-09-01 23:18:03 +02:00
else if ( home )
2011-05-14 14:47:49 +02:00
{
s + = " home " ;
double dist = distance ( home_lat_lon , m_mouse_lat_lon ) ;
double bear = bearing ( home_lat_lon , m_mouse_lat_lon ) ;
s + = " " + QString : : number ( dist * 1000 , ' f ' , 1 ) + " m " ;
s + = " " + QString : : number ( bear , ' f ' , 1 ) + " deg " ;
}
m_widget - > labelMousePos - > setText ( s ) ;
}
// *************************************************************************************
// map signals
/**
Update the Plugin UI to reflect a change in zoom level
*/
void OPMapGadgetWidget : : zoomChanged ( double zoomt , double zoom , double zoomd )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
QString s = " tot: " + QString : : number ( zoomt , ' f ' , 1 ) + " rea: " + QString : : number ( zoom , ' f ' , 1 ) + " dig: " + QString : : number ( zoomd , ' f ' , 1 ) ;
m_widget - > labelMapZoom - > setText ( s ) ;
int i_zoom = ( int ) ( zoomt + 0.5 ) ;
2012-05-12 02:20:35 +02:00
if ( i_zoom < m_min_zoom ) i_zoom = m_min_zoom ;
2011-05-14 14:47:49 +02:00
else
2012-05-12 02:20:35 +02:00
if ( i_zoom > m_max_zoom ) i_zoom = m_max_zoom ;
2011-05-14 14:47:49 +02:00
if ( m_widget - > horizontalSliderZoom - > value ( ) ! = i_zoom )
2012-05-12 02:20:35 +02:00
m_widget - > horizontalSliderZoom - > setValue ( i_zoom ) ; // set the GUI zoom slider position
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
int index0_zoom = i_zoom - m_min_zoom ; // zoom level starting at index level '0'
2011-05-14 14:47:49 +02:00
if ( index0_zoom < zoomAct . count ( ) )
2012-06-29 02:20:38 +02:00
zoomAct . at ( index0_zoom ) - > setChecked ( true ) ; // set the right-click context menu zoom level
2011-05-14 14:47:49 +02:00
}
void OPMapGadgetWidget : : OnCurrentPositionChanged ( internals : : PointLatLng point )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
QString coord_str = QString : : number ( point . Lat ( ) , ' f ' , 7 ) + " " + QString : : number ( point . Lng ( ) , ' f ' , 7 ) + " " ;
m_widget - > labelMapPos - > setText ( coord_str ) ;
}
/**
Update the progress bar while there are still tiles to load
*/
void OPMapGadgetWidget : : OnTilesStillToLoad ( int number )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
if ( m_widget - > progressBarMap - > maximum ( ) < number )
2012-05-12 02:20:35 +02:00
m_widget - > progressBarMap - > setMaximum ( number ) ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
m_widget - > progressBarMap - > setValue ( m_widget - > progressBarMap - > maximum ( ) - number ) ; // update the progress bar
2011-05-14 14:47:49 +02:00
m_prev_tile_number = number ;
}
/**
Show the progress bar as soon as the map lib starts downloading
*/
void OPMapGadgetWidget : : OnTileLoadStart ( )
{
if ( ! m_widget | | ! m_map )
return ;
m_widget - > progressBarMap - > setVisible ( true ) ;
}
/**
Hide the progress bar once the map lib has finished downloading
TODO : somehow this gets called before tile load is actually complete ?
*/
void OPMapGadgetWidget : : OnTileLoadComplete ( )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
m_widget - > progressBarMap - > setVisible ( false ) ;
}
void OPMapGadgetWidget : : on_toolButtonZoomP_clicked ( )
{
QMutexLocker locker ( & m_map_mutex ) ;
zoomIn ( ) ;
}
void OPMapGadgetWidget : : on_toolButtonZoomM_clicked ( )
{
QMutexLocker locker ( & m_map_mutex ) ;
zoomOut ( ) ;
}
void OPMapGadgetWidget : : on_toolButtonMapHome_clicked ( )
{
QMutexLocker locker ( & m_map_mutex ) ;
goHome ( ) ;
}
void OPMapGadgetWidget : : on_toolButtonMapUAV_clicked ( )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
QMutexLocker locker ( & m_map_mutex ) ;
followUAVpositionAct - > toggle ( ) ;
}
void OPMapGadgetWidget : : on_toolButtonMapUAVheading_clicked ( )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
followUAVheadingAct - > toggle ( ) ;
}
void OPMapGadgetWidget : : on_horizontalSliderZoom_sliderMoved ( int position )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
QMutexLocker locker ( & m_map_mutex ) ;
setZoom ( position ) ;
}
void OPMapGadgetWidget : : on_toolButtonNormalMapMode_clicked ( )
{
setMapMode ( Normal_MapMode ) ;
}
void OPMapGadgetWidget : : on_toolButtonMagicWaypointMapMode_clicked ( )
{
setMapMode ( MagicWaypoint_MapMode ) ;
}
void OPMapGadgetWidget : : on_toolButtonHomeWaypoint_clicked ( )
{
homeMagicWaypoint ( ) ;
}
void OPMapGadgetWidget : : on_toolButtonMoveToWP_clicked ( )
{
moveToMagicWaypointPosition ( ) ;
}
// *************************************************************************************
// public slots
void OPMapGadgetWidget : : onTelemetryConnect ( )
{
2012-05-12 02:20:35 +02:00
m_telemetry_connected = true ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
if ( ! obum ) return ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
bool set ;
double LLA [ 3 ] ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
// ***********************
// fetch the home location
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
if ( obum - > getHomeLocation ( set , LLA ) < 0 )
return ; // error
2011-05-14 14:47:49 +02:00
2012-06-20 16:02:57 +02:00
setHome ( internals : : PointLatLng ( LLA [ 0 ] , LLA [ 1 ] ) , LLA [ 2 ] ) ;
2011-05-14 14:47:49 +02:00
if ( m_map )
2012-05-12 02:20:35 +02:00
m_map - > SetCurrentPosition ( m_home_position . coord ) ; // set the map position
2011-05-14 14:47:49 +02:00
// ***********************
}
void OPMapGadgetWidget : : onTelemetryDisconnect ( )
{
2012-05-12 02:20:35 +02:00
m_telemetry_connected = false ;
2011-05-14 14:47:49 +02:00
}
// Updates the Home position icon whenever the HomePosition object is updated
void OPMapGadgetWidget : : homePositionUpdated ( UAVObject * hp )
{
2012-06-20 16:02:57 +02:00
Q_UNUSED ( hp ) ;
if ( ! obum ) return ;
bool set ;
double LLA [ 3 ] ;
if ( obum - > getHomeLocation ( set , LLA ) < 0 )
return ; // error
setHome ( internals : : PointLatLng ( LLA [ 0 ] , LLA [ 1 ] ) , LLA [ 2 ] ) ;
2011-05-14 14:47:49 +02:00
}
// *************************************************************************************
// public functions
/**
Sets the home position on the map widget
*/
void OPMapGadgetWidget : : setHome ( QPointF pos )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
double latitude = pos . x ( ) ;
double longitude = pos . y ( ) ;
if ( latitude > 90 ) latitude = 90 ;
else
2012-05-12 02:20:35 +02:00
if ( latitude < - 90 ) latitude = - 90 ;
2011-05-14 14:47:49 +02:00
if ( longitude ! = longitude ) longitude = 0 ; // nan detection
else
2012-05-12 02:20:35 +02:00
if ( longitude > 180 ) longitude = 180 ;
else
if ( longitude < - 180 ) longitude = - 180 ;
2011-05-14 14:47:49 +02:00
2012-06-20 16:02:57 +02:00
setHome ( internals : : PointLatLng ( latitude , longitude ) , 0 ) ;
2011-05-14 14:47:49 +02:00
}
/**
Sets the home position on the map widget
*/
2012-09-27 14:42:57 +02:00
void OPMapGadgetWidget : : setHome ( internals : : PointLatLng pos_lat_lon , double altitude )
2011-05-14 14:47:49 +02:00
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
if ( pos_lat_lon . Lat ( ) ! = pos_lat_lon . Lat ( ) | | pos_lat_lon . Lng ( ) ! = pos_lat_lon . Lng ( ) )
return ; ; // nan prevention
double latitude = pos_lat_lon . Lat ( ) ;
double longitude = pos_lat_lon . Lng ( ) ;
if ( latitude ! = latitude ) latitude = 0 ; // nan detection
else
2012-05-12 02:20:35 +02:00
if ( latitude > 90 ) latitude = 90 ;
else
if ( latitude < - 90 ) latitude = - 90 ;
2011-05-14 14:47:49 +02:00
if ( longitude ! = longitude ) longitude = 0 ; // nan detection
else
if ( longitude > 180 ) longitude = 180 ;
else
if ( longitude < - 180 ) longitude = - 180 ;
// *********
2012-05-12 02:20:35 +02:00
m_home_position . coord = internals : : PointLatLng ( latitude , longitude ) ;
2012-09-27 14:42:57 +02:00
m_home_position . altitude = altitude ;
2011-05-14 14:47:49 +02:00
2012-09-27 14:42:57 +02:00
m_map - > Home - > SetCoord ( m_home_position . coord ) ;
2012-06-20 16:02:57 +02:00
m_map - > Home - > SetAltitude ( altitude ) ;
2011-05-14 14:47:49 +02:00
m_map - > Home - > RefreshPos ( ) ;
// move the magic waypoint to keep it within the safe area boundry
keepMagicWaypointWithInSafeArea ( ) ;
}
/**
Centers the map over the home position
*/
void OPMapGadgetWidget : : goHome ( )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
followUAVpositionAct - > setChecked ( false ) ;
2012-05-12 02:20:35 +02:00
internals : : PointLatLng home_pos = m_home_position . coord ; // get the home location
2011-05-14 14:47:49 +02:00
m_map - > SetCurrentPosition ( home_pos ) ; // center the map onto the home location
}
void OPMapGadgetWidget : : zoomIn ( )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
int zoom = m_map - > ZoomTotal ( ) + 1 ;
2012-05-12 02:20:35 +02:00
if ( zoom < m_min_zoom ) zoom = m_min_zoom ;
2011-05-14 14:47:49 +02:00
else
2012-05-12 02:20:35 +02:00
if ( zoom > m_max_zoom ) zoom = m_max_zoom ;
2011-05-14 14:47:49 +02:00
m_map - > SetZoom ( zoom ) ;
}
void OPMapGadgetWidget : : zoomOut ( )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
int zoom = m_map - > ZoomTotal ( ) - 1 ;
2012-05-12 02:20:35 +02:00
if ( zoom < m_min_zoom ) zoom = m_min_zoom ;
2011-05-14 14:47:49 +02:00
else
2012-05-12 02:20:35 +02:00
if ( zoom > m_max_zoom ) zoom = m_max_zoom ;
2011-05-14 14:47:49 +02:00
m_map - > SetZoom ( zoom ) ;
}
void OPMapGadgetWidget : : setMaxUpdateRate ( int update_rate )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
int list_size = sizeof ( max_update_rate_list ) / sizeof ( max_update_rate_list [ 0 ] ) ;
int min_rate = max_update_rate_list [ 0 ] ;
int max_rate = max_update_rate_list [ list_size - 1 ] ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
if ( update_rate < min_rate ) update_rate = min_rate ;
else
if ( update_rate > max_rate ) update_rate = max_rate ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
m_maxUpdateRate = update_rate ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
if ( m_updateTimer )
m_updateTimer - > setInterval ( m_maxUpdateRate ) ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
// if (m_statusUpdateTimer)
// m_statusUpdateTimer->setInterval(m_maxUpdateRate);
2011-05-14 14:47:49 +02:00
}
void OPMapGadgetWidget : : setZoom ( int zoom )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
if ( zoom < m_min_zoom ) zoom = m_min_zoom ;
2011-05-14 14:47:49 +02:00
else
2012-05-12 02:20:35 +02:00
if ( zoom > m_max_zoom ) zoom = m_max_zoom ;
2011-05-14 14:47:49 +02:00
internals : : MouseWheelZoomType : : Types zoom_type = m_map - > GetMouseWheelZoomType ( ) ;
m_map - > SetMouseWheelZoomType ( internals : : MouseWheelZoomType : : ViewCenter ) ;
m_map - > SetZoom ( zoom ) ;
m_map - > SetMouseWheelZoomType ( zoom_type ) ;
}
2012-06-29 02:20:38 +02:00
void OPMapGadgetWidget : : setOverlayOpacity ( qreal value )
{
if ( ! m_widget | | ! m_map )
return ;
m_map - > setOverlayOpacity ( value ) ;
overlayOpacityAct . at ( value * 10 ) - > setChecked ( true ) ;
}
2012-06-03 20:19:00 +02:00
void OPMapGadgetWidget : : setHomePosition ( QPointF pos )
{
if ( ! m_widget | | ! m_map )
return ;
double latitude = pos . y ( ) ;
double longitude = pos . x ( ) ;
if ( latitude ! = latitude | | longitude ! = longitude )
return ; // nan prevention
if ( latitude > 90 ) latitude = 90 ;
else
if ( latitude < - 90 ) latitude = - 90 ;
if ( longitude > 180 ) longitude = 180 ;
else
if ( longitude < - 180 ) longitude = - 180 ;
m_map - > Home - > SetCoord ( internals : : PointLatLng ( latitude , longitude ) ) ;
}
2011-05-14 14:47:49 +02:00
void OPMapGadgetWidget : : setPosition ( QPointF pos )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
double latitude = pos . y ( ) ;
double longitude = pos . x ( ) ;
if ( latitude ! = latitude | | longitude ! = longitude )
return ; // nan prevention
if ( latitude > 90 ) latitude = 90 ;
else
2012-05-12 02:20:35 +02:00
if ( latitude < - 90 ) latitude = - 90 ;
2011-05-14 14:47:49 +02:00
if ( longitude > 180 ) longitude = 180 ;
else
2012-05-12 02:20:35 +02:00
if ( longitude < - 180 ) longitude = - 180 ;
2011-05-14 14:47:49 +02:00
m_map - > SetCurrentPosition ( internals : : PointLatLng ( latitude , longitude ) ) ;
}
void OPMapGadgetWidget : : setMapProvider ( QString provider )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
m_map - > SetMapType ( mapcontrol : : Helper : : MapTypeFromString ( provider ) ) ;
}
void OPMapGadgetWidget : : setAccessMode ( QString accessMode )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
m_map - > configuration - > SetAccessMode ( mapcontrol : : Helper : : AccessModeFromString ( accessMode ) ) ;
}
void OPMapGadgetWidget : : setUseOpenGL ( bool useOpenGL )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
m_map - > SetUseOpenGL ( useOpenGL ) ;
}
void OPMapGadgetWidget : : setShowTileGridLines ( bool showTileGridLines )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
m_map - > SetShowTileGridLines ( showTileGridLines ) ;
}
void OPMapGadgetWidget : : setUseMemoryCache ( bool useMemoryCache )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
m_map - > configuration - > SetUseMemoryCache ( useMemoryCache ) ;
}
void OPMapGadgetWidget : : setCacheLocation ( QString cacheLocation )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
cacheLocation = cacheLocation . simplified ( ) ; // remove any surrounding spaces
if ( cacheLocation . isEmpty ( ) ) return ;
2012-05-12 02:20:35 +02:00
if ( ! cacheLocation . endsWith ( QDir : : separator ( ) ) ) cacheLocation + = QDir : : separator ( ) ;
2011-05-14 14:47:49 +02:00
QDir dir ;
if ( ! dir . exists ( cacheLocation ) )
if ( ! dir . mkpath ( cacheLocation ) )
return ;
m_map - > configuration - > SetCacheLocation ( cacheLocation ) ;
}
void OPMapGadgetWidget : : setMapMode ( opMapModeType mode )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
if ( mode ! = Normal_MapMode & & mode ! = MagicWaypoint_MapMode )
mode = Normal_MapMode ; // fix error
if ( m_map_mode = = mode )
{ // no change in map mode
switch ( mode )
{ // make sure the UI buttons are set correctly
2012-05-12 02:20:35 +02:00
case Normal_MapMode :
m_widget - > toolButtonMagicWaypointMapMode - > setChecked ( false ) ;
m_widget - > toolButtonNormalMapMode - > setChecked ( true ) ;
break ;
case MagicWaypoint_MapMode :
m_widget - > toolButtonNormalMapMode - > setChecked ( false ) ;
m_widget - > toolButtonMagicWaypointMapMode - > setChecked ( true ) ;
break ;
2011-05-14 14:47:49 +02:00
}
return ;
}
switch ( mode )
{
2012-05-12 02:20:35 +02:00
case Normal_MapMode :
m_map_mode = Normal_MapMode ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
m_widget - > toolButtonMagicWaypointMapMode - > setChecked ( false ) ;
m_widget - > toolButtonNormalMapMode - > setChecked ( true ) ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
hideMagicWaypointControls ( ) ;
2011-05-14 14:47:49 +02:00
2012-09-01 23:18:03 +02:00
magicWayPoint - > setVisible ( false ) ;
m_map - > WPSetVisibleAll ( true ) ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
break ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
case MagicWaypoint_MapMode :
m_map_mode = MagicWaypoint_MapMode ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
m_widget - > toolButtonNormalMapMode - > setChecked ( false ) ;
m_widget - > toolButtonMagicWaypointMapMode - > setChecked ( true ) ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
showMagicWaypointControls ( ) ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
// delete the normal waypoints from the map
2012-09-01 23:18:03 +02:00
m_map - > WPSetVisibleAll ( false ) ;
magicWayPoint - > setVisible ( true ) ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
break ;
2011-05-14 14:47:49 +02:00
}
}
// *************************************************************************************
// Context menu stuff
void OPMapGadgetWidget : : createActions ( )
{
2012-05-12 02:20:35 +02:00
int list_size ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
// ***********************
// create menu actions
closeAct1 = new QAction ( tr ( " Close menu " ) , this ) ;
closeAct1 - > setStatusTip ( tr ( " Close the context menu " ) ) ;
closeAct2 = new QAction ( tr ( " Close menu " ) , this ) ;
closeAct2 - > setStatusTip ( tr ( " Close the context menu " ) ) ;
reloadAct = new QAction ( tr ( " &Reload map " ) , this ) ;
reloadAct - > setShortcut ( tr ( " F5 " ) ) ;
reloadAct - > setStatusTip ( tr ( " Reload the map tiles " ) ) ;
connect ( reloadAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onReloadAct_triggered ( ) ) ) ;
2012-06-03 20:19:00 +02:00
this - > addAction ( reloadAct ) ;
2011-05-14 14:47:49 +02:00
2012-04-27 16:55:06 +02:00
ripAct = new QAction ( tr ( " &Rip map " ) , this ) ;
ripAct - > setStatusTip ( tr ( " Rip the map tiles " ) ) ;
connect ( ripAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onRipAct_triggered ( ) ) ) ;
2011-05-14 14:47:49 +02:00
copyMouseLatLonToClipAct = new QAction ( tr ( " Mouse latitude and longitude " ) , this ) ;
copyMouseLatLonToClipAct - > setStatusTip ( tr ( " Copy the mouse latitude and longitude to the clipboard " ) ) ;
connect ( copyMouseLatLonToClipAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onCopyMouseLatLonToClipAct_triggered ( ) ) ) ;
copyMouseLatToClipAct = new QAction ( tr ( " Mouse latitude " ) , this ) ;
copyMouseLatToClipAct - > setStatusTip ( tr ( " Copy the mouse latitude to the clipboard " ) ) ;
connect ( copyMouseLatToClipAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onCopyMouseLatToClipAct_triggered ( ) ) ) ;
copyMouseLonToClipAct = new QAction ( tr ( " Mouse longitude " ) , this ) ;
copyMouseLonToClipAct - > setStatusTip ( tr ( " Copy the mouse longitude to the clipboard " ) ) ;
connect ( copyMouseLonToClipAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onCopyMouseLonToClipAct_triggered ( ) ) ) ;
showCompassAct = new QAction ( tr ( " Show compass " ) , this ) ;
showCompassAct - > setStatusTip ( tr ( " Show/Hide the compass " ) ) ;
showCompassAct - > setCheckable ( true ) ;
showCompassAct - > setChecked ( true ) ;
connect ( showCompassAct , SIGNAL ( toggled ( bool ) ) , this , SLOT ( onShowCompassAct_toggled ( bool ) ) ) ;
showDiagnostics = new QAction ( tr ( " Show Diagnostics " ) , this ) ;
showDiagnostics - > setStatusTip ( tr ( " Show/Hide the diagnostics " ) ) ;
showDiagnostics - > setCheckable ( true ) ;
showDiagnostics - > setChecked ( false ) ;
connect ( showDiagnostics , SIGNAL ( toggled ( bool ) ) , this , SLOT ( onShowDiagnostics_toggled ( bool ) ) ) ;
2012-08-02 19:13:54 +02:00
showUAVInfo = new QAction ( tr ( " Show UAV Info " ) , this ) ;
showUAVInfo - > setStatusTip ( tr ( " Show/Hide the UAV info " ) ) ;
showUAVInfo - > setCheckable ( true ) ;
showUAVInfo - > setChecked ( false ) ;
connect ( showUAVInfo , SIGNAL ( toggled ( bool ) ) , this , SLOT ( onShowUAVInfo_toggled ( bool ) ) ) ;
2011-05-14 14:47:49 +02:00
showHomeAct = new QAction ( tr ( " Show Home " ) , this ) ;
showHomeAct - > setStatusTip ( tr ( " Show/Hide the Home location " ) ) ;
showHomeAct - > setCheckable ( true ) ;
showHomeAct - > setChecked ( true ) ;
connect ( showHomeAct , SIGNAL ( toggled ( bool ) ) , this , SLOT ( onShowHomeAct_toggled ( bool ) ) ) ;
showUAVAct = new QAction ( tr ( " Show UAV " ) , this ) ;
showUAVAct - > setStatusTip ( tr ( " Show/Hide the UAV " ) ) ;
showUAVAct - > setCheckable ( true ) ;
showUAVAct - > setChecked ( true ) ;
connect ( showUAVAct , SIGNAL ( toggled ( bool ) ) , this , SLOT ( onShowUAVAct_toggled ( bool ) ) ) ;
2012-06-03 20:19:00 +02:00
changeDefaultLocalAndZoom = new QAction ( tr ( " Set default zoom and location " ) , this ) ;
changeDefaultLocalAndZoom - > setStatusTip ( tr ( " Changes the map default zoom and location to the current values " ) ) ;
connect ( changeDefaultLocalAndZoom , SIGNAL ( triggered ( ) ) , this , SLOT ( onChangeDefaultLocalAndZoom ( ) ) ) ;
2011-05-14 14:47:49 +02:00
zoomInAct = new QAction ( tr ( " Zoom &In " ) , this ) ;
zoomInAct - > setShortcut ( Qt : : Key_PageUp ) ;
zoomInAct - > setStatusTip ( tr ( " Zoom the map in " ) ) ;
connect ( zoomInAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onGoZoomInAct_triggered ( ) ) ) ;
2012-06-03 20:19:00 +02:00
this - > addAction ( zoomInAct ) ;
2011-05-14 14:47:49 +02:00
zoomOutAct = new QAction ( tr ( " Zoom &Out " ) , this ) ;
zoomOutAct - > setShortcut ( Qt : : Key_PageDown ) ;
zoomOutAct - > setStatusTip ( tr ( " Zoom the map out " ) ) ;
connect ( zoomOutAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onGoZoomOutAct_triggered ( ) ) ) ;
2012-06-03 20:19:00 +02:00
this - > addAction ( zoomOutAct ) ;
2011-05-14 14:47:49 +02:00
goMouseClickAct = new QAction ( tr ( " Go to where you right clicked the mouse " ) , this ) ;
goMouseClickAct - > setStatusTip ( tr ( " Center the map onto where you right clicked the mouse " ) ) ;
connect ( goMouseClickAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onGoMouseClickAct_triggered ( ) ) ) ;
setHomeAct = new QAction ( tr ( " Set the home location " ) , this ) ;
setHomeAct - > setStatusTip ( tr ( " Set the home location to where you clicked " ) ) ;
2012-05-12 02:20:35 +02:00
# if !defined(allow_manual_home_location_move)
setHomeAct - > setEnabled ( false ) ;
# endif
2011-05-14 14:47:49 +02:00
connect ( setHomeAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onSetHomeAct_triggered ( ) ) ) ;
goHomeAct = new QAction ( tr ( " Go to &Home location " ) , this ) ;
goHomeAct - > setShortcut ( tr ( " Ctrl+H " ) ) ;
goHomeAct - > setStatusTip ( tr ( " Center the map onto the home location " ) ) ;
connect ( goHomeAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onGoHomeAct_triggered ( ) ) ) ;
goUAVAct = new QAction ( tr ( " Go to &UAV location " ) , this ) ;
goUAVAct - > setShortcut ( tr ( " Ctrl+U " ) ) ;
goUAVAct - > setStatusTip ( tr ( " Center the map onto the UAV location " ) ) ;
connect ( goUAVAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onGoUAVAct_triggered ( ) ) ) ;
followUAVpositionAct = new QAction ( tr ( " Follow UAV position " ) , this ) ;
followUAVpositionAct - > setShortcut ( tr ( " Ctrl+F " ) ) ;
followUAVpositionAct - > setStatusTip ( tr ( " Keep the map centered onto the UAV " ) ) ;
followUAVpositionAct - > setCheckable ( true ) ;
followUAVpositionAct - > setChecked ( false ) ;
connect ( followUAVpositionAct , SIGNAL ( toggled ( bool ) ) , this , SLOT ( onFollowUAVpositionAct_toggled ( bool ) ) ) ;
followUAVheadingAct = new QAction ( tr ( " Follow UAV heading " ) , this ) ;
followUAVheadingAct - > setShortcut ( tr ( " Ctrl+F " ) ) ;
followUAVheadingAct - > setStatusTip ( tr ( " Keep the map rotation to the UAV heading " ) ) ;
followUAVheadingAct - > setCheckable ( true ) ;
followUAVheadingAct - > setChecked ( false ) ;
connect ( followUAVheadingAct , SIGNAL ( toggled ( bool ) ) , this , SLOT ( onFollowUAVheadingAct_toggled ( bool ) ) ) ;
2012-06-29 02:20:38 +02:00
overlayOpacityActGroup = new QActionGroup ( this ) ;
connect ( overlayOpacityActGroup , SIGNAL ( triggered ( QAction * ) ) , this , SLOT ( onOverlayOpacityActGroup_triggered ( QAction * ) ) ) ;
overlayOpacityAct . clear ( ) ;
for ( int i = 0 ; i < = 10 ; i + + )
{
QAction * overlayAct = new QAction ( QString : : number ( i * 10 ) , overlayOpacityActGroup ) ;
overlayAct - > setCheckable ( true ) ;
overlayAct - > setData ( i * 10 ) ;
overlayOpacityAct . append ( overlayAct ) ;
}
2011-05-14 14:47:49 +02:00
homeMagicWaypointAct = new QAction ( tr ( " Home magic waypoint " ) , this ) ;
homeMagicWaypointAct - > setStatusTip ( tr ( " Move the magic waypoint to the home position " ) ) ;
connect ( homeMagicWaypointAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onHomeMagicWaypointAct_triggered ( ) ) ) ;
mapModeActGroup = new QActionGroup ( this ) ;
connect ( mapModeActGroup , SIGNAL ( triggered ( QAction * ) ) , this , SLOT ( onMapModeActGroup_triggered ( QAction * ) ) ) ;
mapModeAct . clear ( ) ;
{
QAction * map_mode_act ;
map_mode_act = new QAction ( tr ( " Normal " ) , mapModeActGroup ) ;
map_mode_act - > setCheckable ( true ) ;
map_mode_act - > setChecked ( m_map_mode = = Normal_MapMode ) ;
map_mode_act - > setData ( ( int ) Normal_MapMode ) ;
mapModeAct . append ( map_mode_act ) ;
map_mode_act = new QAction ( tr ( " Magic Waypoint " ) , mapModeActGroup ) ;
map_mode_act - > setCheckable ( true ) ;
map_mode_act - > setChecked ( m_map_mode = = MagicWaypoint_MapMode ) ;
map_mode_act - > setData ( ( int ) MagicWaypoint_MapMode ) ;
mapModeAct . append ( map_mode_act ) ;
}
zoomActGroup = new QActionGroup ( this ) ;
connect ( zoomActGroup , SIGNAL ( triggered ( QAction * ) ) , this , SLOT ( onZoomActGroup_triggered ( QAction * ) ) ) ;
zoomAct . clear ( ) ;
2012-05-12 02:20:35 +02:00
for ( int i = m_min_zoom ; i < = m_max_zoom ; i + + )
2011-05-14 14:47:49 +02:00
{
QAction * zoom_act = new QAction ( QString : : number ( i ) , zoomActGroup ) ;
zoom_act - > setCheckable ( true ) ;
zoom_act - > setData ( i ) ;
zoomAct . append ( zoom_act ) ;
}
2012-05-12 02:20:35 +02:00
maxUpdateRateActGroup = new QActionGroup ( this ) ;
connect ( maxUpdateRateActGroup , SIGNAL ( triggered ( QAction * ) ) , this , SLOT ( onMaxUpdateRateActGroup_triggered ( QAction * ) ) ) ;
maxUpdateRateAct . clear ( ) ;
list_size = sizeof ( max_update_rate_list ) / sizeof ( max_update_rate_list [ 0 ] ) ;
for ( int i = 0 ; i < list_size ; i + + )
{
QAction * maxUpdateRate_act ;
int j = max_update_rate_list [ i ] ;
maxUpdateRate_act = new QAction ( QString : : number ( j ) , maxUpdateRateActGroup ) ;
maxUpdateRate_act - > setCheckable ( true ) ;
maxUpdateRate_act - > setData ( j ) ;
maxUpdateRate_act - > setChecked ( j = = m_maxUpdateRate ) ;
maxUpdateRateAct . append ( maxUpdateRate_act ) ;
}
// *****
2011-05-14 14:47:49 +02:00
// safe area
showSafeAreaAct = new QAction ( tr ( " Show Safe Area " ) , this ) ;
showSafeAreaAct - > setStatusTip ( tr ( " Show/Hide the Safe Area around the home location " ) ) ;
showSafeAreaAct - > setCheckable ( true ) ;
showSafeAreaAct - > setChecked ( m_map - > Home - > ShowSafeArea ( ) ) ;
connect ( showSafeAreaAct , SIGNAL ( toggled ( bool ) ) , this , SLOT ( onShowSafeAreaAct_toggled ( bool ) ) ) ;
safeAreaActGroup = new QActionGroup ( this ) ;
connect ( safeAreaActGroup , SIGNAL ( triggered ( QAction * ) ) , this , SLOT ( onSafeAreaActGroup_triggered ( QAction * ) ) ) ;
safeAreaAct . clear ( ) ;
2012-05-12 02:20:35 +02:00
list_size = sizeof ( safe_area_radius_list ) / sizeof ( safe_area_radius_list [ 0 ] ) ;
for ( int i = 0 ; i < list_size ; i + + )
2011-05-14 14:47:49 +02:00
{
int safeArea = safe_area_radius_list [ i ] ;
QAction * safeArea_act = new QAction ( QString : : number ( safeArea ) + " m " , safeAreaActGroup ) ;
safeArea_act - > setCheckable ( true ) ;
safeArea_act - > setChecked ( safeArea = = m_map - > Home - > SafeArea ( ) ) ;
safeArea_act - > setData ( safeArea ) ;
safeAreaAct . append ( safeArea_act ) ;
}
// *****
// UAV trail
2012-06-07 16:51:11 +02:00
showUAVAct = new QAction ( tr ( " Show UAV " ) , this ) ;
showUAVAct - > setStatusTip ( tr ( " Show/Hide the UAV " ) ) ;
showUAVAct - > setCheckable ( true ) ;
showUAVAct - > setChecked ( true ) ;
connect ( showUAVAct , SIGNAL ( toggled ( bool ) ) , this , SLOT ( onShowUAVAct_toggled ( bool ) ) ) ;
2011-05-14 14:47:49 +02:00
uavTrailTypeActGroup = new QActionGroup ( this ) ;
2012-06-11 18:27:08 +02:00
connect ( uavTrailTypeActGroup , SIGNAL ( triggered ( QAction * ) ) , this , SLOT ( onUAVtrailTypeActGroup_triggered ( QAction * ) ) ) ;
2011-05-14 14:47:49 +02:00
uavTrailTypeAct . clear ( ) ;
QStringList uav_trail_type_list = mapcontrol : : Helper : : UAVTrailTypes ( ) ;
for ( int i = 0 ; i < uav_trail_type_list . count ( ) ; i + + )
{
mapcontrol : : UAVTrailType : : Types uav_trail_type = mapcontrol : : Helper : : UAVTrailTypeFromString ( uav_trail_type_list [ i ] ) ;
QAction * uavTrailType_act = new QAction ( mapcontrol : : Helper : : StrFromUAVTrailType ( uav_trail_type ) , uavTrailTypeActGroup ) ;
uavTrailType_act - > setCheckable ( true ) ;
uavTrailType_act - > setChecked ( uav_trail_type = = m_map - > UAV - > GetTrailType ( ) ) ;
uavTrailType_act - > setData ( i ) ;
uavTrailTypeAct . append ( uavTrailType_act ) ;
}
2012-06-07 16:51:11 +02:00
showUAVtrailAct = new QAction ( tr ( " Show Trail dots " ) , this ) ;
showUAVtrailAct - > setStatusTip ( tr ( " Show/Hide the Trail dots " ) ) ;
showUAVtrailAct - > setCheckable ( true ) ;
showUAVtrailAct - > setChecked ( true ) ;
connect ( showUAVtrailAct , SIGNAL ( toggled ( bool ) ) , this , SLOT ( onShowUAVtrailAct_toggled ( bool ) ) ) ;
2011-05-14 14:47:49 +02:00
clearUAVtrailAct = new QAction ( tr ( " Clear UAV trail " ) , this ) ;
clearUAVtrailAct - > setStatusTip ( tr ( " Clear the UAV trail " ) ) ;
connect ( clearUAVtrailAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onClearUAVtrailAct_triggered ( ) ) ) ;
uavTrailTimeActGroup = new QActionGroup ( this ) ;
2012-06-07 16:51:11 +02:00
connect ( uavTrailTimeActGroup , SIGNAL ( triggered ( QAction * ) ) , this , SLOT ( onUAVtrailTimeActGroup_triggered ( QAction * ) ) ) ;
2011-05-14 14:47:49 +02:00
uavTrailTimeAct . clear ( ) ;
2012-05-12 02:20:35 +02:00
list_size = sizeof ( uav_trail_time_list ) / sizeof ( uav_trail_time_list [ 0 ] ) ;
for ( int i = 0 ; i < list_size ; i + + )
2011-05-14 14:47:49 +02:00
{
int uav_trail_time = uav_trail_time_list [ i ] ;
QAction * uavTrailTime_act = new QAction ( QString : : number ( uav_trail_time ) + " sec " , uavTrailTimeActGroup ) ;
uavTrailTime_act - > setCheckable ( true ) ;
uavTrailTime_act - > setChecked ( uav_trail_time = = m_map - > UAV - > TrailTime ( ) ) ;
uavTrailTime_act - > setData ( uav_trail_time ) ;
uavTrailTimeAct . append ( uavTrailTime_act ) ;
}
uavTrailDistanceActGroup = new QActionGroup ( this ) ;
2012-06-07 16:51:11 +02:00
connect ( uavTrailDistanceActGroup , SIGNAL ( triggered ( QAction * ) ) , this , SLOT ( onUAVtrailDistanceActGroup_triggered ( QAction * ) ) ) ;
2011-05-14 14:47:49 +02:00
uavTrailDistanceAct . clear ( ) ;
2012-05-12 02:20:35 +02:00
list_size = sizeof ( uav_trail_distance_list ) / sizeof ( uav_trail_distance_list [ 0 ] ) ;
for ( int i = 0 ; i < list_size ; i + + )
2011-05-14 14:47:49 +02:00
{
int uav_trail_distance = uav_trail_distance_list [ i ] ;
QAction * uavTrailDistance_act = new QAction ( QString : : number ( uav_trail_distance ) + " meters " , uavTrailDistanceActGroup ) ;
uavTrailDistance_act - > setCheckable ( true ) ;
uavTrailDistance_act - > setChecked ( uav_trail_distance = = m_map - > UAV - > TrailDistance ( ) ) ;
uavTrailDistance_act - > setData ( uav_trail_distance ) ;
uavTrailDistanceAct . append ( uavTrailDistance_act ) ;
}
2012-09-01 23:49:15 +02:00
//GPS trail
showGPSAct = new QAction ( tr ( " Show GPS " ) , this ) ;
showGPSAct - > setStatusTip ( tr ( " Show/Hide the GPS " ) ) ;
showGPSAct - > setCheckable ( true ) ;
showGPSAct - > setChecked ( false ) ;
connect ( showGPSAct , SIGNAL ( toggled ( bool ) ) , this , SLOT ( onShowGPSAct_toggled ( bool ) ) ) ;
/** Actions for way points **/
addWayPointAct = new QAction ( tr ( " &Add waypoint " ) , this ) ;
addWayPointAct - > setShortcut ( tr ( " Ctrl+A " ) ) ;
addWayPointAct - > setStatusTip ( tr ( " Add waypoint " ) ) ;
connect ( addWayPointAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onAddWayPointAct_triggered ( ) ) ) ;
clearWayPointsAct = new QAction ( tr ( " &Clear waypoints " ) , this ) ;
clearWayPointsAct - > setStatusTip ( tr ( " Clear all the waypoints " ) ) ;
connect ( clearWayPointsAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onClearWayPointsAct_triggered ( ) ) ) ;
deleteWayPointAct = new QAction ( tr ( " &Del waypoint " ) , this ) ;
deleteWayPointAct - > setStatusTip ( tr ( " Delete this waypoint " ) ) ;
connect ( deleteWayPointAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onDeleteWayPointAct_triggered ( ) ) ) ;
lockWayPointAct = new QAction ( tr ( " &Lock waypoints " ) , this ) ;
lockWayPointAct - > setStatusTip ( tr ( " Lock a waypoint location " ) ) ;
connect ( lockWayPointAct , SIGNAL ( triggered ( ) ) , this , SLOT ( onLockWayPointAct_triggered ( ) ) ) ;
2011-05-14 14:47:49 +02:00
}
void OPMapGadgetWidget : : onReloadAct_triggered ( )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
m_map - > ReloadMap ( ) ;
}
2012-04-27 16:55:06 +02:00
void OPMapGadgetWidget : : onRipAct_triggered ( )
{
m_map - > RipMap ( ) ;
}
2011-05-14 14:47:49 +02:00
void OPMapGadgetWidget : : onCopyMouseLatLonToClipAct_triggered ( )
{
QClipboard * clipboard = QApplication : : clipboard ( ) ;
2012-05-12 02:20:35 +02:00
clipboard - > setText ( QString : : number ( m_context_menu_lat_lon . Lat ( ) , ' f ' , 7 ) + " , " + QString : : number ( m_context_menu_lat_lon . Lng ( ) , ' f ' , 7 ) , QClipboard : : Clipboard ) ;
2011-05-14 14:47:49 +02:00
}
void OPMapGadgetWidget : : onCopyMouseLatToClipAct_triggered ( )
{
QClipboard * clipboard = QApplication : : clipboard ( ) ;
2012-05-12 02:20:35 +02:00
clipboard - > setText ( QString : : number ( m_context_menu_lat_lon . Lat ( ) , ' f ' , 7 ) , QClipboard : : Clipboard ) ;
2011-05-14 14:47:49 +02:00
}
void OPMapGadgetWidget : : onCopyMouseLonToClipAct_triggered ( )
{
QClipboard * clipboard = QApplication : : clipboard ( ) ;
2012-05-12 02:20:35 +02:00
clipboard - > setText ( QString : : number ( m_context_menu_lat_lon . Lng ( ) , ' f ' , 7 ) , QClipboard : : Clipboard ) ;
2011-05-14 14:47:49 +02:00
}
void OPMapGadgetWidget : : onShowCompassAct_toggled ( bool show )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
m_map - > SetShowCompass ( show ) ;
}
void OPMapGadgetWidget : : onShowDiagnostics_toggled ( bool show )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
2011-05-14 14:47:49 +02:00
return ;
m_map - > SetShowDiagnostics ( show ) ;
}
2012-08-02 19:13:54 +02:00
void OPMapGadgetWidget : : onShowUAVInfo_toggled ( bool show )
2011-05-14 14:47:49 +02:00
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
2012-08-02 19:13:54 +02:00
m_map - > UAV - > SetShowUAVInfo ( show ) ;
2011-05-14 14:47:49 +02:00
}
void OPMapGadgetWidget : : onShowHomeAct_toggled ( bool show )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
m_map - > Home - > setVisible ( show ) ;
}
void OPMapGadgetWidget : : onShowUAVAct_toggled ( bool show )
{
if ( ! m_widget | | ! m_map )
return ;
m_map - > UAV - > setVisible ( show ) ;
}
void OPMapGadgetWidget : : onShowTrailLineAct_toggled ( bool show )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
m_map - > UAV - > SetShowTrailLine ( show ) ;
2012-08-12 00:36:00 +02:00
if ( m_map - > GPS )
m_map - > GPS - > SetShowTrailLine ( show ) ;
2011-05-14 14:47:49 +02:00
}
void OPMapGadgetWidget : : onMapModeActGroup_triggered ( QAction * action )
{
if ( ! m_widget | | ! m_map | | ! action )
return ;
opMapModeType mode = ( opMapModeType ) action - > data ( ) . toInt ( ) ;
setMapMode ( mode ) ;
}
void OPMapGadgetWidget : : onGoZoomInAct_triggered ( )
{
zoomIn ( ) ;
}
void OPMapGadgetWidget : : onGoZoomOutAct_triggered ( )
{
zoomOut ( ) ;
}
void OPMapGadgetWidget : : onZoomActGroup_triggered ( QAction * action )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map | | ! action )
return ;
2011-05-14 14:47:49 +02:00
setZoom ( action - > data ( ) . toInt ( ) ) ;
}
void OPMapGadgetWidget : : onMaxUpdateRateActGroup_triggered ( QAction * action )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map | | ! action )
return ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
setMaxUpdateRate ( action - > data ( ) . toInt ( ) ) ;
2011-05-14 14:47:49 +02:00
}
2012-06-03 20:19:00 +02:00
void OPMapGadgetWidget : : onChangeDefaultLocalAndZoom ( )
{
emit defaultLocationAndZoomChanged ( m_map - > CurrentPosition ( ) . Lng ( ) , m_map - > CurrentPosition ( ) . Lat ( ) , m_map - > ZoomTotal ( ) ) ;
2011-05-14 14:47:49 +02:00
}
void OPMapGadgetWidget : : onGoMouseClickAct_triggered ( )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
m_map - > SetCurrentPosition ( m_map - > currentMousePosition ( ) ) ; // center the map onto the mouse position
}
void OPMapGadgetWidget : : onSetHomeAct_triggered ( )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
2012-09-27 14:42:57 +02:00
float altitude = 0 ;
bool ok ;
//Get desired HomeLocation altitude from dialog box.
//TODO: Populate box with altitude already in HomeLocation UAVO
altitude = QInputDialog : : getDouble ( this , tr ( " Set home altitude " ) ,
tr ( " In [m], referenced to WGS84: " ) , altitude , - 100 , 100000 , 2 , & ok ) ;
setHome ( m_context_menu_lat_lon , altitude ) ;
2011-05-14 14:47:49 +02:00
setHomeLocationObject ( ) ; // update the HomeLocation UAVObject
}
void OPMapGadgetWidget : : onGoHomeAct_triggered ( )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
goHome ( ) ;
}
void OPMapGadgetWidget : : onGoUAVAct_triggered ( )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
double latitude ;
double longitude ;
double altitude ;
2012-05-12 02:20:35 +02:00
if ( getUAVPosition ( latitude , longitude , altitude ) ) // get current UAV position
2011-05-14 14:47:49 +02:00
{
internals : : PointLatLng uav_pos = internals : : PointLatLng ( latitude , longitude ) ; // current UAV position
internals : : PointLatLng map_pos = m_map - > CurrentPosition ( ) ; // current MAP position
if ( map_pos ! = uav_pos ) m_map - > SetCurrentPosition ( uav_pos ) ; // center the map onto the UAV
}
}
void OPMapGadgetWidget : : onFollowUAVpositionAct_toggled ( bool checked )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
if ( m_widget - > toolButtonMapUAV - > isChecked ( ) ! = checked )
m_widget - > toolButtonMapUAV - > setChecked ( checked ) ;
setMapFollowingMode ( ) ;
}
void OPMapGadgetWidget : : onFollowUAVheadingAct_toggled ( bool checked )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
if ( m_widget - > toolButtonMapUAVheading - > isChecked ( ) ! = checked )
m_widget - > toolButtonMapUAVheading - > setChecked ( checked ) ;
setMapFollowingMode ( ) ;
}
2012-06-07 16:51:11 +02:00
2012-09-01 23:18:03 +02:00
//! Toggle whether the UAV trail is shown
2012-06-07 16:51:11 +02:00
void OPMapGadgetWidget : : onShowUAVtrailAct_toggled ( bool show )
{
2012-06-08 17:36:16 +02:00
if ( ! m_widget | | ! m_map )
2012-06-07 16:51:11 +02:00
return ;
m_map - > UAV - > SetShowTrail ( show ) ;
}
void OPMapGadgetWidget : : onClearUAVtrailAct_triggered ( )
{
if ( ! m_widget | | ! m_map )
return ;
m_map - > UAV - > DeleteTrail ( ) ;
2012-05-17 18:27:08 +02:00
if ( m_map - > GPS )
m_map - > GPS - > DeleteTrail ( ) ;
2012-06-07 16:51:11 +02:00
}
void OPMapGadgetWidget : : onUAVtrailTimeActGroup_triggered ( QAction * action )
{
if ( ! m_widget | | ! m_map | | ! action )
return ;
int trail_time = ( double ) action - > data ( ) . toInt ( ) ;
m_map - > UAV - > SetTrailTime ( trail_time ) ;
}
void OPMapGadgetWidget : : onUAVtrailDistanceActGroup_triggered ( QAction * action )
{
if ( ! m_widget | | ! m_map | | ! action )
return ;
int trail_distance = action - > data ( ) . toInt ( ) ;
m_map - > UAV - > SetTrailDistance ( trail_distance ) ;
}
void OPMapGadgetWidget : : onUAVtrailTypeActGroup_triggered ( QAction * action )
2011-05-14 14:47:49 +02:00
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map | | ! action )
return ;
2011-05-14 14:47:49 +02:00
int trail_type_idx = action - > data ( ) . toInt ( ) ;
QStringList uav_trail_type_list = mapcontrol : : Helper : : UAVTrailTypes ( ) ;
mapcontrol : : UAVTrailType : : Types uav_trail_type = mapcontrol : : Helper : : UAVTrailTypeFromString ( uav_trail_type_list [ trail_type_idx ] ) ;
m_map - > UAV - > SetTrailType ( uav_trail_type ) ;
}
2012-06-07 16:51:11 +02:00
/*GPS*/
void OPMapGadgetWidget : : onShowGPSAct_toggled ( bool show )
{
if ( ! m_widget | | ! m_map )
return ;
m_map - > GPS - > setVisible ( show ) ;
}
void OPMapGadgetWidget : : onShowGPStrailAct_toggled ( bool show )
{
if ( ! m_widget | | ! m_map )
return ;
m_map - > GPS - > SetShowTrail ( show ) ;
}
void OPMapGadgetWidget : : onShowGPStrailLineAct_toggled ( bool show )
{
if ( ! m_widget | | ! m_map )
return ;
m_map - > GPS - > SetShowTrailLine ( show ) ;
}
void OPMapGadgetWidget : : onClearGPStrailAct_triggered ( )
2011-05-14 14:47:49 +02:00
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
m_map - > GPS - > DeleteTrail ( ) ;
}
2012-06-07 16:51:11 +02:00
void OPMapGadgetWidget : : onGPStrailTimeActGroup_triggered ( QAction * action )
2011-05-14 14:47:49 +02:00
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map | | ! action )
return ;
2011-05-14 14:47:49 +02:00
int trail_time = ( double ) action - > data ( ) . toInt ( ) ;
2012-06-07 16:51:11 +02:00
m_map - > GPS - > SetTrailTime ( trail_time ) ;
2011-05-14 14:47:49 +02:00
}
2012-06-07 16:51:11 +02:00
void OPMapGadgetWidget : : onGPStrailDistanceActGroup_triggered ( QAction * action )
2011-05-14 14:47:49 +02:00
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map | | ! action )
return ;
2011-05-14 14:47:49 +02:00
int trail_distance = action - > data ( ) . toInt ( ) ;
2012-06-07 16:51:11 +02:00
m_map - > GPS - > SetTrailDistance ( trail_distance ) ;
}
void OPMapGadgetWidget : : onGPStrailTypeActGroup_triggered ( QAction * action )
{
if ( ! m_widget | | ! m_map | | ! action )
return ;
int trail_type_idx = action - > data ( ) . toInt ( ) ;
QStringList uav_trail_type_list = mapcontrol : : Helper : : UAVTrailTypes ( ) ;
mapcontrol : : UAVTrailType : : Types uav_trail_type = mapcontrol : : Helper : : UAVTrailTypeFromString ( uav_trail_type_list [ trail_type_idx ] ) ;
m_map - > GPS - > SetTrailType ( uav_trail_type ) ;
2011-05-14 14:47:49 +02:00
}
2012-06-03 01:36:00 +02:00
/**
* Called when the add waypoint menu item is selected
* the coordinate clicked is in m_context_menu_lat_lon
*/
2011-05-14 14:47:49 +02:00
void OPMapGadgetWidget : : onAddWayPointAct_triggered ( )
{
2012-06-02 21:29:22 +02:00
Q_ASSERT ( m_widget ) ;
Q_ASSERT ( m_map ) ;
2012-05-12 03:29:53 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
if ( m_map_mode ! = Normal_MapMode )
return ;
2012-06-02 21:29:22 +02:00
struct PathCompiler : : waypoint newWaypoint ;
newWaypoint . latitude = m_context_menu_lat_lon . Lat ( ) ;
newWaypoint . longitude = m_context_menu_lat_lon . Lng ( ) ;
pathCompiler - > doAddWaypoint ( newWaypoint ) ;
2011-05-14 14:47:49 +02:00
}
2012-09-01 23:18:03 +02:00
//! Called when the user asks to edit a waypoint from the map
2011-05-14 14:47:49 +02:00
void OPMapGadgetWidget : : onEditWayPointAct_triggered ( )
{
2012-05-12 03:29:53 +02:00
if ( ! m_widget | | ! m_map )
return ;
2011-05-14 14:47:49 +02:00
if ( m_map_mode ! = Normal_MapMode )
return ;
if ( ! m_mouse_waypoint )
return ;
2012-09-01 23:18:03 +02:00
//waypoint_edit_dialog->editWaypoint(m_mouse_waypoint);
2011-05-14 14:47:49 +02:00
m_mouse_waypoint = NULL ;
}
void OPMapGadgetWidget : : onLockWayPointAct_triggered ( )
{
if ( ! m_widget | | ! m_map | | ! m_mouse_waypoint )
return ;
if ( m_map_mode ! = Normal_MapMode )
return ;
bool locked = ( m_mouse_waypoint - > flags ( ) & QGraphicsItem : : ItemIsMovable ) = = 0 ;
m_mouse_waypoint - > setFlag ( QGraphicsItem : : ItemIsMovable , locked ) ;
if ( ! locked )
m_mouse_waypoint - > picture . load ( QString : : fromUtf8 ( " :/opmap/images/waypoint_marker2.png " ) ) ;
else
m_mouse_waypoint - > picture . load ( QString : : fromUtf8 ( " :/opmap/images/waypoint_marker1.png " ) ) ;
m_mouse_waypoint - > update ( ) ;
m_mouse_waypoint = NULL ;
}
2012-06-03 01:36:00 +02:00
/**
* Called when the delete waypoint menu item is selected
* the waypoint clicked is in m_mouse_waypoint
*/
2011-05-14 14:47:49 +02:00
void OPMapGadgetWidget : : onDeleteWayPointAct_triggered ( )
{
2012-06-02 22:02:43 +02:00
Q_ASSERT ( m_widget ) ;
Q_ASSERT ( m_map ) ;
2011-05-14 14:47:49 +02:00
if ( ! m_widget | | ! m_map )
return ;
if ( m_map_mode ! = Normal_MapMode )
return ;
2012-06-02 22:02:43 +02:00
Q_ASSERT ( m_mouse_waypoint ) ;
if ( m_mouse_waypoint ) {
2012-06-03 01:36:00 +02:00
int waypointIdx = m_mouse_waypoint - > Number ( ) ;
2012-05-12 03:29:53 +02:00
2012-06-03 01:36:00 +02:00
if ( waypointIdx < 0 ) {
qDebug ( ) < < " WTF Map gadget. Wrong number " ;
return ;
}
2012-06-02 22:02:43 +02:00
Q_ASSERT ( pathCompiler ) ;
if ( pathCompiler )
pathCompiler - > doDelWaypoint ( waypointIdx ) ;
2012-05-12 03:29:53 +02:00
}
2011-05-14 14:47:49 +02:00
m_mouse_waypoint = NULL ;
}
2012-09-01 23:18:03 +02:00
//! Trigger the path compiler to delete all waypoints
2011-05-14 14:47:49 +02:00
void OPMapGadgetWidget : : onClearWayPointsAct_triggered ( )
{
2012-06-02 22:02:43 +02:00
Q_ASSERT ( m_widget ) ;
Q_ASSERT ( m_map ) ;
2011-05-14 14:47:49 +02:00
if ( ! m_widget | | ! m_map )
return ;
if ( m_map_mode ! = Normal_MapMode )
return ;
2012-06-28 13:59:42 +02:00
//First, ask to ensure this is what the user wants to do
QMessageBox msgBox ;
msgBox . setText ( tr ( " Are you sure you want to clear waypoints? " ) ) ;
msgBox . setInformativeText ( tr ( " All associated data will be lost. " ) ) ;
msgBox . setStandardButtons ( QMessageBox : : Yes | QMessageBox : : No ) ;
int ret = msgBox . exec ( ) ;
if ( ret = = QMessageBox : : No )
{
return ;
}
2012-06-02 22:02:43 +02:00
Q_ASSERT ( pathCompiler ) ;
if ( pathCompiler )
pathCompiler - > doDelAllWaypoints ( ) ;
2011-05-14 14:47:49 +02:00
}
void OPMapGadgetWidget : : onHomeMagicWaypointAct_triggered ( )
{
// center the magic waypoint on the home position
homeMagicWaypoint ( ) ;
}
void OPMapGadgetWidget : : onShowSafeAreaAct_toggled ( bool show )
{
if ( ! m_widget | | ! m_map )
return ;
m_map - > Home - > SetShowSafeArea ( show ) ; // show the safe area
2012-08-18 09:28:30 +02:00
m_map - > Home - > SetToggleRefresh ( true ) ;
2011-05-14 14:47:49 +02:00
m_map - > Home - > RefreshPos ( ) ;
}
void OPMapGadgetWidget : : onSafeAreaActGroup_triggered ( QAction * action )
{
2012-05-12 02:20:35 +02:00
if ( ! m_widget | | ! m_map | | ! action )
2011-05-14 14:47:49 +02:00
return ;
int radius = action - > data ( ) . toInt ( ) ;
m_map - > Home - > SetSafeArea ( radius ) ; // set the radius (meters)
m_map - > Home - > RefreshPos ( ) ;
// move the magic waypoint if need be to keep it within the safe area around the home position
keepMagicWaypointWithInSafeArea ( ) ;
}
2012-09-01 23:18:03 +02:00
//! Move the magic waypoint to the home position
2011-05-14 14:47:49 +02:00
void OPMapGadgetWidget : : homeMagicWaypoint ( )
{
if ( ! m_widget | | ! m_map )
return ;
if ( m_map_mode ! = MagicWaypoint_MapMode )
return ;
2012-06-03 20:19:00 +02:00
magicWayPoint - > SetCoord ( m_home_position . coord ) ;
2011-05-14 14:47:49 +02:00
}
2012-09-01 23:18:03 +02:00
//! Move the UAV to the magic waypoint position
2011-05-14 14:47:49 +02:00
void OPMapGadgetWidget : : moveToMagicWaypointPosition ( )
{
if ( ! m_widget | | ! m_map )
return ;
if ( m_map_mode ! = MagicWaypoint_MapMode )
return ;
2012-09-01 23:18:03 +02:00
// TODO
2011-05-14 14:47:49 +02:00
}
2012-09-01 23:18:03 +02:00
//! Hide the magic waypoint controls
2011-05-14 14:47:49 +02:00
void OPMapGadgetWidget : : hideMagicWaypointControls ( )
{
m_widget - > lineWaypoint - > setVisible ( false ) ;
m_widget - > toolButtonHomeWaypoint - > setVisible ( false ) ;
m_widget - > toolButtonMoveToWP - > setVisible ( false ) ;
}
2012-09-01 23:18:03 +02:00
//! Show the magic waypoint controls
2011-05-14 14:47:49 +02:00
void OPMapGadgetWidget : : showMagicWaypointControls ( )
{
m_widget - > lineWaypoint - > setVisible ( true ) ;
m_widget - > toolButtonHomeWaypoint - > setVisible ( true ) ;
2012-05-12 02:20:35 +02:00
# if defined(allow_manual_home_location_move)
m_widget - > toolButtonMoveToWP - > setVisible ( true ) ;
# else
m_widget - > toolButtonMoveToWP - > setVisible ( false ) ;
# endif
2011-05-14 14:47:49 +02:00
}
2012-09-01 23:18:03 +02:00
//! Move the magic waypoint to keep it within the safe area boundry
2011-05-14 14:47:49 +02:00
void OPMapGadgetWidget : : keepMagicWaypointWithInSafeArea ( )
{
// calcute the bearing and distance from the home position to the magic waypoint
2012-06-03 20:19:00 +02:00
double dist = distance ( m_home_position . coord , magicWayPoint - > Coord ( ) ) ;
double bear = bearing ( m_home_position . coord , magicWayPoint - > Coord ( ) ) ;
2011-05-14 14:47:49 +02:00
// get the maximum safe distance - in kilometers
double boundry_dist = ( double ) m_map - > Home - > SafeArea ( ) / 1000 ;
if ( dist > boundry_dist ) dist = boundry_dist ;
2012-06-03 20:19:00 +02:00
// move the magic waypoint;
2011-05-14 14:47:49 +02:00
if ( m_map_mode = = MagicWaypoint_MapMode )
{ // move the on-screen waypoint
2012-06-03 20:19:00 +02:00
if ( magicWayPoint )
magicWayPoint - > SetCoord ( destPoint ( m_home_position . coord , bear , dist ) ) ;
2011-05-14 14:47:49 +02:00
}
}
2012-09-01 23:18:03 +02:00
//! Return the distance between two points .. in kilometers
2011-05-14 14:47:49 +02:00
double OPMapGadgetWidget : : distance ( internals : : PointLatLng from , internals : : PointLatLng to )
{
double lat1 = from . Lat ( ) * deg_to_rad ;
double lon1 = from . Lng ( ) * deg_to_rad ;
double lat2 = to . Lat ( ) * deg_to_rad ;
double lon2 = to . Lng ( ) * deg_to_rad ;
return ( acos ( sin ( lat1 ) * sin ( lat2 ) + cos ( lat1 ) * cos ( lat2 ) * cos ( lon2 - lon1 ) ) * earth_mean_radius ) ;
}
2012-09-01 23:18:03 +02:00
//! Return the bearing from one point to another .. in degrees
2011-05-14 14:47:49 +02:00
double OPMapGadgetWidget : : bearing ( internals : : PointLatLng from , internals : : PointLatLng to )
{
double lat1 = from . Lat ( ) * deg_to_rad ;
double lon1 = from . Lng ( ) * deg_to_rad ;
double lat2 = to . Lat ( ) * deg_to_rad ;
double lon2 = to . Lng ( ) * deg_to_rad ;
2012-05-12 02:20:35 +02:00
// double delta_lat = lat2 - lat1;
2011-05-14 14:47:49 +02:00
double delta_lon = lon2 - lon1 ;
double y = sin ( delta_lon ) * cos ( lat2 ) ;
double x = cos ( lat1 ) * sin ( lat2 ) - sin ( lat1 ) * cos ( lat2 ) * cos ( delta_lon ) ;
double bear = atan2 ( y , x ) * rad_to_deg ;
bear + = 360 ;
while ( bear < 0 ) bear + = 360 ;
while ( bear > = 360 ) bear - = 360 ;
return bear ;
}
2012-09-01 23:18:03 +02:00
//! Return a destination lat/lon point given a source lat/lon point and the bearing and distance from the source point
2011-05-14 14:47:49 +02:00
internals : : PointLatLng OPMapGadgetWidget : : destPoint ( internals : : PointLatLng source , double bear , double dist )
{
double lat1 = source . Lat ( ) * deg_to_rad ;
double lon1 = source . Lng ( ) * deg_to_rad ;
bear * = deg_to_rad ;
double ad = dist / earth_mean_radius ;
double lat2 = asin ( sin ( lat1 ) * cos ( ad ) + cos ( lat1 ) * sin ( ad ) * cos ( bear ) ) ;
double lon2 = lon1 + atan2 ( sin ( bear ) * sin ( ad ) * cos ( lat1 ) , cos ( ad ) - sin ( lat1 ) * sin ( lat2 ) ) ;
return internals : : PointLatLng ( lat2 * rad_to_deg , lon2 * rad_to_deg ) ;
}
// *************************************************************************************
bool OPMapGadgetWidget : : getUAVPosition ( double & latitude , double & longitude , double & altitude )
{
double NED [ 3 ] ;
double LLA [ 3 ] ;
2012-03-03 19:37:01 +01:00
double homeLLA [ 3 ] ;
2011-05-14 14:47:49 +02:00
2012-03-03 19:37:01 +01:00
Q_ASSERT ( obm ! = NULL ) ;
2011-05-14 14:47:49 +02:00
2012-03-03 19:37:01 +01:00
HomeLocation * homeLocation = HomeLocation : : GetInstance ( obm ) ;
Q_ASSERT ( homeLocation ! = NULL ) ;
HomeLocation : : DataFields homeLocationData = homeLocation - > getData ( ) ;
2011-05-14 14:47:49 +02:00
2012-08-08 18:20:15 +02:00
homeLLA [ 0 ] = homeLocationData . Latitude / 1e7 ;
homeLLA [ 1 ] = homeLocationData . Longitude / 1e7 ;
2012-03-03 19:37:01 +01:00
homeLLA [ 2 ] = homeLocationData . Altitude ;
2011-05-14 14:47:49 +02:00
2012-03-03 19:37:01 +01:00
PositionActual * positionActual = PositionActual : : GetInstance ( obm ) ;
Q_ASSERT ( positionActual ! = NULL ) ;
PositionActual : : DataFields positionActualData = positionActual - > getData ( ) ;
2011-05-14 14:47:49 +02:00
2012-03-15 08:07:00 +01:00
NED [ 0 ] = positionActualData . North ;
NED [ 1 ] = positionActualData . East ;
NED [ 2 ] = positionActualData . Down ;
2011-05-14 14:47:49 +02:00
2012-03-03 19:37:01 +01:00
Utils : : CoordinateConversions ( ) . GetLLA ( homeLLA , NED , LLA ) ;
2011-05-14 14:47:49 +02:00
latitude = LLA [ 0 ] ;
longitude = LLA [ 1 ] ;
altitude = LLA [ 2 ] ;
if ( latitude ! = latitude ) latitude = 0 ; // nan detection
2012-03-15 08:07:00 +01:00
else if ( latitude > 90 ) latitude = 90 ;
else if ( latitude < - 90 ) latitude = - 90 ;
2011-05-14 14:47:49 +02:00
if ( longitude ! = longitude ) longitude = 0 ; // nan detection
2012-03-15 08:07:00 +01:00
else if ( longitude > 180 ) longitude = 180 ;
else if ( longitude < - 180 ) longitude = - 180 ;
2011-05-14 14:47:49 +02:00
if ( altitude ! = altitude ) altitude = 0 ; // nan detection
return true ;
}
double OPMapGadgetWidget : : getUAV_Yaw ( )
{
2012-05-12 02:20:35 +02:00
if ( ! obm )
return 0 ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
UAVObject * obj = dynamic_cast < UAVDataObject * > ( obm - > getObject ( QString ( " AttitudeActual " ) ) ) ;
double yaw = obj - > getField ( QString ( " Yaw " ) ) - > getDouble ( ) ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
if ( yaw ! = yaw ) yaw = 0 ; // nan detection
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
while ( yaw < 0 ) yaw + = 360 ;
while ( yaw > = 360 ) yaw - = 360 ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
return yaw ;
2011-05-14 14:47:49 +02:00
}
bool OPMapGadgetWidget : : getGPSPosition ( double & latitude , double & longitude , double & altitude )
{
2012-05-12 02:20:35 +02:00
double LLA [ 3 ] ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
if ( ! obum )
return false ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
if ( obum - > getGPSPosition ( LLA ) < 0 )
return false ; // error
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
latitude = LLA [ 0 ] ;
longitude = LLA [ 1 ] ;
altitude = LLA [ 2 ] ;
2011-05-14 14:47:49 +02:00
return true ;
}
// *************************************************************************************
void OPMapGadgetWidget : : setMapFollowingMode ( )
{
if ( ! m_widget | | ! m_map )
return ;
if ( ! followUAVpositionAct - > isChecked ( ) )
{
m_map - > UAV - > SetMapFollowType ( UAVMapFollowType : : None ) ;
m_map - > SetRotate ( 0 ) ; // reset map rotation to 0deg
}
else
2012-05-12 02:20:35 +02:00
if ( ! followUAVheadingAct - > isChecked ( ) )
{
m_map - > UAV - > SetMapFollowType ( UAVMapFollowType : : CenterMap ) ;
m_map - > SetRotate ( 0 ) ; // reset map rotation to 0deg
}
else
{
m_map - > UAV - > SetMapFollowType ( UAVMapFollowType : : CenterMap ) ; // the map library won't let you reset the uav rotation if it's already in rotate mode
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
m_map - > UAV - > SetUAVHeading ( 0 ) ; // reset the UAV heading to 0deg
m_map - > UAV - > SetMapFollowType ( UAVMapFollowType : : CenterAndRotateMap ) ;
}
2011-05-14 14:47:49 +02:00
}
// *************************************************************************************
// update the HomeLocation UAV Object
bool OPMapGadgetWidget : : setHomeLocationObject ( )
{
2012-05-12 02:20:35 +02:00
if ( ! obum )
return false ;
2011-05-14 14:47:49 +02:00
2012-05-12 02:20:35 +02:00
double LLA [ 3 ] = { m_home_position . coord . Lat ( ) , m_home_position . coord . Lng ( ) , m_home_position . altitude } ;
return ( obum - > setHomeLocation ( LLA , true ) > = 0 ) ;
2011-05-14 14:47:49 +02:00
}
// *************************************************************************************
void OPMapGadgetWidget : : SetUavPic ( QString UAVPic )
{
m_map - > SetUavPic ( UAVPic ) ;
}
2012-06-02 19:43:41 +02:00
/**
* Called from path compiler whenever the path to visualize has changed
*/
void OPMapGadgetWidget : : doVisualizationChanged ( QList < PathCompiler : : waypoint > waypoints )
{
2012-09-01 23:18:03 +02:00
disconnect ( this , SLOT ( onWPDragged ( WayPointItem * ) ) ) ;
2012-06-02 19:43:41 +02:00
m_map - > WPDeleteAll ( ) ;
2012-06-02 20:28:10 +02:00
int index = 0 ;
2012-06-02 19:43:41 +02:00
foreach ( PathCompiler : : waypoint waypoint , waypoints ) {
internals : : PointLatLng position ( waypoint . latitude , waypoint . longitude ) ;
2012-06-15 23:01:15 +02:00
WayPointItem * wayPointItem = m_map - > WPCreate ( position , waypoint . altitude , QString ( index ) ) ;
2012-06-02 19:43:41 +02:00
Q_ASSERT ( wayPointItem ) ;
if ( wayPointItem ) {
2012-06-15 22:51:12 +02:00
wayPointItem - > SetNumber ( index ) ;
2012-06-03 01:36:00 +02:00
wayPointItem - > setFlag ( QGraphicsItem : : ItemIsMovable , true ) ;
2012-06-02 19:43:41 +02:00
wayPointItem - > picture . load ( QString : : fromUtf8 ( " :/opmap/images/waypoint_marker1.png " ) ) ;
2012-06-02 20:28:10 +02:00
index + + ;
2012-06-02 19:43:41 +02:00
}
2012-09-01 23:18:03 +02:00
connect ( wayPointItem , SIGNAL ( WPDropped ( WayPointItem * ) ) , this , SLOT ( onWPDragged ( WayPointItem * ) ) ) ;
2012-06-05 17:01:12 +02:00
}
2012-06-15 22:51:12 +02:00
2012-06-05 17:01:12 +02:00
}
/**
* Called when a waypoint is dropped at a new location . Waypoint changed
* can ' t be used as it is updated too frequently and we don ' t want to
* overload the pathcompiler with unnecessary updates
*/
2012-09-01 23:18:03 +02:00
void OPMapGadgetWidget : : onWPDragged ( WayPointItem * waypoint )
2012-06-05 17:01:12 +02:00
{
switch ( m_map_mode )
{
case Normal_MapMode :
PathCompiler : : waypoint newWaypoint ;
newWaypoint . latitude = waypoint - > Coord ( ) . Lat ( ) ;
newWaypoint . longitude = waypoint - > Coord ( ) . Lng ( ) ;
pathCompiler - > doUpdateWaypoints ( newWaypoint , waypoint - > Number ( ) ) ;
break ;
2012-06-02 19:43:41 +02:00
}
}
2012-06-24 21:05:27 +02:00
2012-09-01 23:18:03 +02:00
//! Open a home editor when double click on home
2012-06-24 21:05:27 +02:00
void OPMapGadgetWidget : : onHomeDoubleClick ( HomeItem * )
{
new homeEditor ( m_map - > Home , this ) ;
}
2012-06-29 02:20:38 +02:00
void OPMapGadgetWidget : : onOverlayOpacityActGroup_triggered ( QAction * action )
{
if ( ! m_widget | | ! m_map | | ! action )
return ;
m_map - > setOverlayOpacity ( action - > data ( ) . toReal ( ) / 100 ) ;
emit overlayOpacityChanged ( action - > data ( ) . toReal ( ) / 100 ) ;
}