1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-17 02:52:12 +01:00

Added magic waypoint buttons, added 'set home location' on right click menu.

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@1915 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
pip 2010-10-08 08:03:09 +00:00 committed by pip
parent 85aeffed9a
commit cc584be136
6 changed files with 327 additions and 51 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -22,5 +22,7 @@
<file>images/minus.png</file>
<file>images/plus.png</file>
<file>images/waypoint_marker3.png</file>
<file>images/center_wp.png</file>
<file>images/home_wp.png</file>
</qresource>
</RCC>

View File

@ -82,6 +82,23 @@ color: rgb(255, 255, 255);
border-radius: 0px;
/*border-radius: 3px;*/
}
QToolButton:disabled {
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(128, 128, 128, 128), stop:1 rgba(128, 128, 128, 128));
color: rgba(255, 255, 255, 128);
/*height: 24px;*/
border: none;
border-radius: 0px;
/*
border: 1px solid rgb(255, 255, 255);
border-radius: 0px;
border-top-color: rgba(0, 0, 0, 64);
border-right-color: rgba(0, 0, 0, 64);
border-bottom-color: rgba(255, 255, 255, 64);
border-left-color: rgba(255, 255, 255, 64);
*/
}
QToolButton:hover {
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(255, 255, 255,128), stop:1 rgba(180, 180, 180, 128));
color: rgb(255, 255, 255);
@ -128,6 +145,62 @@ border-left-color: rgba(255, 255, 255, 64);
*/
}
QPushButton {
background-color: transparent;
color: rgb(255, 255, 255);
/*height: 24px;*/
/*border-style: none;*/
/* border: 1px solid rgba(0, 0, 0, 64); */
/* border: 0px; */
border-radius: 0px;
/*border-radius: 3px;*/
}
QPushButton:disabled {
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(128, 128, 128, 128), stop:1 rgba(128, 128, 128, 128));
color: rgb(255, 255, 255);
/*height: 24px;*/
border: none;
border-radius: 0px;
/*
border: 1px solid rgb(255, 255, 255);
border-radius: 0px;
border-top-color: rgba(0, 0, 0, 64);
border-right-color: rgba(0, 0, 0, 64);
border-bottom-color: rgba(255, 255, 255, 64);
border-left-color: rgba(255, 255, 255, 64);
*/
}
QPushButton:hover {
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(255, 255, 255,128), stop:1 rgba(180, 180, 180, 128));
color: rgb(255, 255, 255);
/*height: 24px;*/
border: 0px;
border-radius: 0px;
/*border-radius: 3px;*/
}
QPushButton:pressed {
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(48, 48, 48, 255), stop:1 rgba(64, 64, 64, 255));
color: rgb(255, 255, 255);
/*height: 24px;*/
border: none;
border-radius: 0px;
/*
border: 1px solid rgb(255, 255, 255);
border-radius: 0px;
border-top-color: rgba(0, 0, 0, 64);
border-right-color: rgba(0, 0, 0, 64);
border-bottom-color: rgba(255, 255, 255, 64);
border-left-color: rgba(255, 255, 255, 64);
*/
}
QComboBox {
background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(48, 48, 48, 255), stop:1 rgba(120, 120, 120, 255));
@ -199,9 +272,12 @@ border-radius: 2px;
</property>
<property name="font">
<font>
<pointsize>9</pointsize>
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>Normal Map Mode</string>
</property>
<property name="text">
<string> Normal </string>
</property>
@ -251,6 +327,9 @@ border-radius: 2px;
<pointsize>8</pointsize>
</font>
</property>
<property name="toolTip">
<string>Magic Waypoint Map Mode</string>
</property>
<property name="text">
<string> Magic Waypoint </string>
</property>
@ -291,6 +370,68 @@ border-radius: 2px;
</property>
</spacer>
</item>
<item>
<widget class="Line" name="line_5">
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="toolButtonHomeWaypoint">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Move the magic waypoint to the home position</string>
</property>
<property name="text">
<string>Home WP</string>
</property>
<property name="icon">
<iconset resource="opmap.qrc">
<normaloff>:/opmap/images/home_wp.png</normaloff>:/opmap/images/home_wp.png</iconset>
</property>
<property name="iconSize">
<size>
<width>28</width>
<height>28</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="toolButtonCenterWaypoint">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Move the magic waypoint to center of map</string>
</property>
<property name="text">
<string>Center WP</string>
</property>
<property name="icon">
<iconset resource="opmap.qrc">
<normaloff>:/opmap/images/center_wp.png</normaloff>:/opmap/images/center_wp.png</iconset>
</property>
<property name="iconSize">
<size>
<width>28</width>
<height>28</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line_8">
<property name="frameShadow">
@ -312,9 +453,6 @@ border-radius: 2px;
<property name="toolTip">
<string>Center map over home position</string>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="text">
<string>Home</string>
</property>
@ -350,9 +488,6 @@ border-radius: 2px;
<property name="toolTip">
<string>Center map over UAV position</string>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="text">
<string>UAV</string>
</property>
@ -391,9 +526,6 @@ border-radius: 2px;
<property name="toolTip">
<string>Map rotation follows UAV heading</string>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="text">
<string>Heading</string>
</property>
@ -432,9 +564,6 @@ border-radius: 2px;
<property name="toolTip">
<string>Show/Hide the UAV trail</string>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="text">
<string>Trail</string>
</property>

View File

@ -68,21 +68,34 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
m_map_mode = Normal_MapMode;
// default magic waypoint params
magic_waypoint.map_wp_item = NULL;
magic_waypoint.coord = internals::PointLatLng(0.0, 0.0);
magic_waypoint.altitude = 0.0;
magic_waypoint.description = "Magic waypoint";
magic_waypoint.locked = false;
magic_waypoint.time_seconds = 0;
magic_waypoint.hold_time_seconds = 0;
// **************
// fetch required UAVObjects
m_plugin_manager = ExtensionSystem::PluginManager::instance();
m_objManager = m_plugin_manager->getObject<UAVObjectManager>();
// current position
QPointF pos = getLatLon();
internals::PointLatLng pos_lat_lon = internals::PointLatLng(pos.x(), pos.y());
// **************
// default home position
home_position.coord = pos_lat_lon;
home_position.altitude = 0.0;
home_position.locked = false;
// **************
// default magic waypoint params
magic_waypoint.map_wp_item = NULL;
magic_waypoint.coord = home_position.coord;
magic_waypoint.altitude = 0.0;
magic_waypoint.description = "Magic waypoint";
magic_waypoint.locked = false;
magic_waypoint.time_seconds = 0;
magic_waypoint.hold_time_seconds = 0;
// **************
// create the widget that holds the user controls and the map
@ -163,17 +176,20 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
case Normal_MapMode:
m_widget->toolButtonMagicWaypointMapMode->setChecked(false);
m_widget->toolButtonNormalMapMode->setChecked(true);
m_widget->toolButtonCenterWaypoint->setEnabled(false);
break;
case MagicWaypoint_MapMode:
m_widget->toolButtonNormalMapMode->setChecked(false);
m_widget->toolButtonMagicWaypointMapMode->setChecked(true);
m_widget->toolButtonCenterWaypoint->setEnabled(true);
break;
default:
m_map_mode = Normal_MapMode;
m_widget->toolButtonMagicWaypointMapMode->setChecked(false);
m_widget->toolButtonNormalMapMode->setChecked(true);
m_widget->toolButtonCenterWaypoint->setEnabled(false);
break;
}
@ -317,8 +333,9 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
connect(m_map, SIGNAL(WPInserted(int const&, WayPointItem*)), this, SLOT(WPInserted(int const&, WayPointItem*)));
connect(m_map, SIGNAL(WPDeleted(int const&)), this, SLOT(WPDeleted(int const&)));
QPointF pos = getLatLon();
m_map->SetCurrentPosition(internals::PointLatLng(pos.x(), pos.y())); // set the default map position
m_map->SetCurrentPosition(home_position.coord); // set the map position
m_map->Home->SetCoord(home_position.coord); // set the HOME position
m_map->UAV->SetUAVPos(home_position.coord, 0.0); // set the UAV position
// **************
// create various context menu (mouse right click menu) actions
@ -328,8 +345,6 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
// **************
// create the desired timers
// Pip .. I don't like polling, I prefer an efficient event driven system (signal/slot) but this will do for now
m_updateTimer = new QTimer();
m_updateTimer->setInterval(200);
connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(updatePosition()));
@ -503,6 +518,7 @@ void OPMapGadgetWidget::contextMenuEvent(QContextMenuEvent *event)
menu.addSeparator()->setText(tr("HOME"));
menu.addAction(setHomeAct);
menu.addAction(showHomeAct);
menu.addAction(goHomeAct);
@ -518,29 +534,37 @@ void OPMapGadgetWidget::contextMenuEvent(QContextMenuEvent *event)
// *********
if (m_map_mode == Normal_MapMode)
{ // only show the waypoint stuff if not in 'magic waypoint' mode
switch (m_map_mode)
{
case Normal_MapMode: // only show the waypoint stuff if not in 'magic waypoint' mode
menu.addSeparator()->setText(tr("Waypoints"));
menu.addSeparator()->setText(tr("Waypoints"));
menu.addAction(wayPointEditorAct);
menu.addAction(addWayPointAct);
menu.addAction(wayPointEditorAct);
menu.addAction(addWayPointAct);
if (m_mouse_waypoint)
{ // we have a waypoint under the mouse
menu.addAction(editWayPointAct);
if (m_mouse_waypoint)
{ // we have a waypoint under the mouse
menu.addAction(editWayPointAct);
lockWayPointAct->setChecked(waypoint_locked);
menu.addAction(lockWayPointAct);
lockWayPointAct->setChecked(waypoint_locked);
menu.addAction(lockWayPointAct);
if (!waypoint_locked)
menu.addAction(deleteWayPointAct);
}
if (!waypoint_locked)
menu.addAction(deleteWayPointAct);
}
m_waypoint_list_mutex.lock();
if (m_waypoint_list.count() > 0)
menu.addAction(clearWayPointsAct); // we have waypoints
m_waypoint_list_mutex.unlock();
m_waypoint_list_mutex.lock();
if (m_waypoint_list.count() > 0)
menu.addAction(clearWayPointsAct); // we have waypoints
m_waypoint_list_mutex.unlock();
break;
case MagicWaypoint_MapMode:
menu.addSeparator()->setText(tr("Waypoints"));
menu.addAction(homeMagicWaypointAct);
menu.addAction(centerMagicWaypointAct);
break;
}
// *********
@ -608,9 +632,9 @@ void OPMapGadgetWidget::updatePosition()
QPointF pos = getLatLon();
internals::PointLatLng uav_pos = internals::PointLatLng(pos.x(), pos.y()); // current UAV position
float uav_heading = 0; //data.Heading; // current UAV heading
float uav_altitude_meters = 0; //data.Altitude; // current UAV height
float uav_ground_speed_meters_per_second = 0; //data.Groundspeed; // current UAV ground speed
float uav_heading = 0; //data.Heading; // current UAV heading
float uav_altitude_meters = 0; //data.Altitude; // current UAV height
float uav_ground_speed_meters_per_second = 0; //data.Groundspeed; // current UAV ground speed
// display the UAV lat/lon position
QString str = "lat: " + QString::number(uav_pos.Lat(), 'f', 7) +
@ -620,7 +644,7 @@ void OPMapGadgetWidget::updatePosition()
" " + QString::number(uav_ground_speed_meters_per_second, 'f', 1) + "m/s";
m_widget->labelUAVPos->setText(str);
m_map->UAV->SetUAVPos(uav_pos, uav_altitude_meters); // set the maps UAV position
m_map->UAV->SetUAVPos(uav_pos, uav_altitude_meters); // set the maps UAV position
m_map->UAV->SetUAVHeading(uav_heading); // set the maps UAV heading
}
@ -1008,9 +1032,38 @@ void OPMapGadgetWidget::on_toolButtonMagicWaypointMapMode_clicked()
setMapMode(MagicWaypoint_MapMode);
}
void OPMapGadgetWidget::on_toolButtonHomeWaypoint_clicked()
{
homeMagicWaypoint();
}
void OPMapGadgetWidget::on_toolButtonCenterWaypoint_clicked()
{
centerMagicWaypoint();
}
// *************************************************************************************
// public functions
void OPMapGadgetWidget::setHome(QPointF pos)
{
if (!m_widget || !m_map)
return;
setHome(internals::PointLatLng(pos.x(), pos.y()));
}
void OPMapGadgetWidget::setHome(internals::PointLatLng pos_lat_lon)
{
if (!m_widget || !m_map)
return;
home_position.coord = pos_lat_lon;
m_map->Home->SetCoord(home_position.coord);
m_map->Home->RefreshPos();
}
void OPMapGadgetWidget::goHome()
{
if (!m_widget || !m_map)
@ -1018,8 +1071,8 @@ void OPMapGadgetWidget::goHome()
followUAVpositionAct->setChecked(false);
internals::PointLatLng home_pos = m_map->Home->Coord(); // get the home location
m_map->SetCurrentPosition(home_pos); // center the map onto the home location
internals::PointLatLng home_pos = home_position.coord; // get the home location
m_map->SetCurrentPosition(home_pos); // center the map onto the home location
}
@ -1162,6 +1215,8 @@ void OPMapGadgetWidget::setMapMode(opMapModeType mode)
m_widget->toolButtonMagicWaypointMapMode->setChecked(false);
m_widget->toolButtonNormalMapMode->setChecked(true);
m_widget->toolButtonCenterWaypoint->setEnabled(false);
// delete the magic waypoint from the map
if (magic_waypoint.map_wp_item)
{
@ -1196,6 +1251,8 @@ void OPMapGadgetWidget::setMapMode(opMapModeType mode)
m_widget->toolButtonNormalMapMode->setChecked(false);
m_widget->toolButtonMagicWaypointMapMode->setChecked(true);
m_widget->toolButtonCenterWaypoint->setEnabled(true);
// delete the normal waypoints from the map
m_waypoint_list_mutex.lock();
foreach (t_waypoint *wp, m_waypoint_list)
@ -1289,6 +1346,10 @@ void OPMapGadgetWidget::createActions()
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"));
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"));
@ -1355,6 +1416,14 @@ void OPMapGadgetWidget::createActions()
clearWayPointsAct->setStatusTip(tr("Clear waypoints"));
connect(clearWayPointsAct, SIGNAL(triggered()), this, SLOT(onClearWayPointsAct_triggered()));
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()));
centerMagicWaypointAct = new QAction(tr("Center magic waypoint"), this);
centerMagicWaypointAct->setStatusTip(tr("Move the magic waypoint to the center of the map"));
connect(centerMagicWaypointAct, SIGNAL(triggered()), this, SLOT(onCenterMagicWaypointAct_triggered()));
mapModeActGroup = new QActionGroup(this);
connect(mapModeActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onMapModeActGroup_triggered(QAction *)));
mapModeAct.clear();
@ -1504,6 +1573,14 @@ void OPMapGadgetWidget::onGoMouseClickAct_triggered()
m_map->SetCurrentPosition(m_map->currentMousePosition()); // center the map onto the mouse position
}
void OPMapGadgetWidget::onSetHomeAct_triggered()
{
if (!m_widget || !m_map)
return;
setHome(mouse_lat_lon);
}
void OPMapGadgetWidget::onGoHomeAct_triggered()
{
if (!m_widget || !m_map)
@ -1724,6 +1801,52 @@ void OPMapGadgetWidget::onClearWayPointsAct_triggered()
m_waypoint_list.clear();
}
void OPMapGadgetWidget::onHomeMagicWaypointAct_triggered()
{
// center the magic waypoint on the home position
homeMagicWaypoint();
}
void OPMapGadgetWidget::onCenterMagicWaypointAct_triggered()
{
// center the magic waypoint on the map
centerMagicWaypoint();
}
// *************************************************************************************
// move the magic waypoint to the home position
void OPMapGadgetWidget::homeMagicWaypoint()
{
if (!m_widget || !m_map)
return;
if (m_map_mode != MagicWaypoint_MapMode)
return;
magic_waypoint.coord = home_position.coord;
if (magic_waypoint.map_wp_item)
magic_waypoint.map_wp_item->SetCoord(magic_waypoint.coord);
}
// *************************************************************************************
// move the magic waypoint to the center of the map
void OPMapGadgetWidget::centerMagicWaypoint()
{
if (!m_widget || !m_map)
return;
if (m_map_mode != MagicWaypoint_MapMode)
return;
magic_waypoint.coord = m_map->CurrentPosition();
if (magic_waypoint.map_wp_item)
magic_waypoint.map_wp_item->SetCoord(magic_waypoint.coord);
}
// *************************************************************************************
// temporary until an object is created for managing the save/restore

View File

@ -65,6 +65,13 @@ using namespace mapcontrol;
// ******************************************************
typedef struct t_home
{
internals::PointLatLng coord;
double altitude;
bool locked;
} t_home;
// local waypoint list item structure
typedef struct t_waypoint
{
@ -97,6 +104,8 @@ public:
*
* @param
*/
void setHome(QPointF pos);
void setHome(internals::PointLatLng pos_lat_lon);
void goHome();
void setZoom(int zoom);
void setPosition(QPointF pos);
@ -147,6 +156,8 @@ private slots:
void on_toolButtonGo_clicked();
void on_toolButtonMagicWaypointMapMode_clicked();
void on_toolButtonNormalMapMode_clicked();
void on_toolButtonHomeWaypoint_clicked();
void on_toolButtonCenterWaypoint_clicked();
/**
* @brief signals received from the map object
@ -183,6 +194,7 @@ private slots:
void onGoZoomInAct_triggered();
void onGoZoomOutAct_triggered();
void onGoMouseClickAct_triggered();
void onSetHomeAct_triggered();
void onGoHomeAct_triggered();
void onGoUAVAct_triggered();
void onFollowUAVpositionAct_toggled(bool checked);
@ -197,6 +209,8 @@ private slots:
void onClearWayPointsAct_triggered();
void onMapModeActGroup_triggered(QAction *action);
void onZoomActGroup_triggered(QAction *action);
void onHomeMagicWaypointAct_triggered();
void onCenterMagicWaypointAct_triggered();
private:
int min_zoom;
@ -210,6 +224,10 @@ private:
opMapModeType m_map_mode;
t_home home_position;
t_waypoint magic_waypoint;
QStringList findPlaceWordList;
QCompleter *findPlaceCompleter;
@ -241,8 +259,6 @@ private:
QList<t_waypoint *> m_waypoint_list;
QMutex m_waypoint_list_mutex;
t_waypoint magic_waypoint;
QMutex m_map_mutex;
void createActions();
@ -259,6 +275,7 @@ private:
QAction *zoomInAct;
QAction *zoomOutAct;
QAction *goMouseClickAct;
QAction *setHomeAct;
QAction *goHomeAct;
QAction *goUAVAct;
QAction *followUAVpositionAct;
@ -271,6 +288,8 @@ private:
QAction *lockWayPointAct;
QAction *deleteWayPointAct;
QAction *clearWayPointsAct;
QAction *homeMagicWaypointAct;
QAction *centerMagicWaypointAct;
QActionGroup *mapModeActGroup;
QList<QAction *> mapModeAct;
@ -278,6 +297,9 @@ private:
QActionGroup *zoomActGroup;
QList<QAction *> zoomAct;
void homeMagicWaypoint();
void centerMagicWaypoint();
void loadComboBoxLines(QComboBox *comboBox, QString filename);
void saveComboBoxLines(QComboBox *comboBox, QString filename);