Commit 988e99fe authored by pixhawk's avatar pixhawk

Merge branch 'dev' of github.com:pixhawk/qgroundcontrol into dev

parents 577258d5 6a38548a
...@@ -16,7 +16,7 @@ LicenseData ..\license.txt ...@@ -16,7 +16,7 @@ LicenseData ..\license.txt
Section "" Section ""
SetOutPath $INSTDIR SetOutPath $INSTDIR
File ..\release\*.* File /r ..\release\*.*
WriteUninstaller $INSTDIR\QGroundControl_uninstall.exe WriteUninstaller $INSTDIR\QGroundControl_uninstall.exe
SectionEnd SectionEnd
......
...@@ -320,8 +320,14 @@ win32-msvc2008 { ...@@ -320,8 +320,14 @@ win32-msvc2008 {
message(Building for Windows Visual Studio 2008 (32bit)) message(Building for Windows Visual Studio 2008 (32bit))
# QAxContainer support is needed for the Internet Control
# element showing the Google Earth window
CONFIG += qaxcontainer CONFIG += qaxcontainer
# The EIGEN library needs this define
# to make the internal min/max functions work
DEFINES += NOMINMAX
# QWebkit is not needed on MS-Windows compilation environment # QWebkit is not needed on MS-Windows compilation environment
CONFIG -= webkit CONFIG -= webkit
......
...@@ -33,9 +33,22 @@ ...@@ -33,9 +33,22 @@
/* Windows fixes */ /* Windows fixes */
#ifdef _MSC_VER #ifdef _MSC_VER
#include <math.h> /* Needed define for Eigen */
#define isnan(x) _isnan(x) //#define NOMINMAX
#define isinf(x) (!_finite(x)) #include <limits>
template<typename T>
inline bool isnan(T value)
{
return value != value;
}
// requires #include <limits>
template<typename T>
inline bool isinf(T value)
{
return std::numeric_limits<T>::has_infinity && (value == std::numeric_limits<T>::infinity() || (-1*value) == std::numeric_limits<T>::infinity());
}
#else #else
#include <cmath> #include <cmath>
#ifndef isnan #ifndef isnan
......
...@@ -820,7 +820,7 @@ void MAVLinkSimulationWaypointPlanner::mavlink_handler (const mavlink_message_t* ...@@ -820,7 +820,7 @@ void MAVLinkSimulationWaypointPlanner::mavlink_handler (const mavlink_message_t*
mavlink_msg_action_decode(msg, &action); mavlink_msg_action_decode(msg, &action);
if(action.target == systemid) { if(action.target == systemid) {
if (verbose) qDebug("Waypoint: received message with action %d\n", action.action); if (verbose) qDebug("Waypoint: received message with action %d\n", action.action);
switch (action.action) { // switch (action.action) {
// case MAV_ACTION_LAUNCH: // case MAV_ACTION_LAUNCH:
// if (verbose) std::cerr << "Launch received" << std::endl; // if (verbose) std::cerr << "Launch received" << std::endl;
// current_active_wp_id = 0; // current_active_wp_id = 0;
...@@ -847,10 +847,10 @@ void MAVLinkSimulationWaypointPlanner::mavlink_handler (const mavlink_message_t* ...@@ -847,10 +847,10 @@ void MAVLinkSimulationWaypointPlanner::mavlink_handler (const mavlink_message_t*
// default: // default:
// if (verbose) std::cerr << "Unknown action received with id " << action.action << ", no action taken" << std::endl; // if (verbose) std::cerr << "Unknown action received with id " << action.action << ", no action taken" << std::endl;
// break; // break;
} // }
} }
break; break;
} }
case MAVLINK_MSG_ID_WAYPOINT_ACK: { case MAVLINK_MSG_ID_WAYPOINT_ACK: {
mavlink_waypoint_ack_t wpa; mavlink_waypoint_ack_t wpa;
......
...@@ -86,7 +86,7 @@ namespace mapcontrol ...@@ -86,7 +86,7 @@ namespace mapcontrol
} }
else if(trailtype==UAVTrailType::ByDistance) else if(trailtype==UAVTrailType::ByDistance)
{ {
if(qAbs(internals::PureProjection::DistanceBetweenLatLng(lastcoord,position))>traildistance) if(qAbs(internals::PureProjection::DistanceBetweenLatLng(lastcoord,position)*1000)>traildistance)
{ {
trail->addToGroup(new TrailItem(position,altitude,color,this)); trail->addToGroup(new TrailItem(position,altitude,color,this));
if(!lasttrailline.IsEmpty()) if(!lasttrailline.IsEmpty())
......
...@@ -20,7 +20,7 @@ QGCUASParamManager::QGCUASParamManager(UASInterface* uas, QWidget *parent) : ...@@ -20,7 +20,7 @@ QGCUASParamManager::QGCUASParamManager(UASInterface* uas, QWidget *parent) :
*/ */
void QGCUASParamManager::requestParameterListUpdate(int component) void QGCUASParamManager::requestParameterListUpdate(int component)
{ {
Q_UNUSED(component);
} }
...@@ -51,20 +51,6 @@ This file is part of the QGROUNDCONTROL project ...@@ -51,20 +51,6 @@ This file is part of the QGROUNDCONTROL project
#define GL_MULTISAMPLE 0x809D #define GL_MULTISAMPLE 0x809D
#endif #endif
template<typename T>
inline bool isnan(T value)
{
return value != value;
}
// requires #include <limits>
template<typename T>
inline bool isinf(T value)
{
return std::numeric_limits<T>::has_infinity && (value == std::numeric_limits<T>::infinity() || (-1*value) == std::numeric_limits<T>::infinity());
}
/** /**
* @warning The HUD widget will not start painting its content automatically * @warning The HUD widget will not start painting its content automatically
* to update the view, start the auto-update by calling HUD::start(). * to update the view, start the auto-update by calling HUD::start().
......
...@@ -405,8 +405,6 @@ void QGCDataPlot2D::loadCsvLog(QString file, QString xAxisName, QString yAxisFil ...@@ -405,8 +405,6 @@ void QGCDataPlot2D::loadCsvLog(QString file, QString xAxisName, QString yAxisFil
int curveNameIndex = 0; int curveNameIndex = 0;
//int xValueIndex = curveNames.indexOf(xAxisName);
QString xAxisFilter; QString xAxisFilter;
if (xAxisName == "") { if (xAxisName == "") {
xAxisFilter = curveNames.first(); xAxisFilter = curveNames.first();
...@@ -414,6 +412,34 @@ void QGCDataPlot2D::loadCsvLog(QString file, QString xAxisName, QString yAxisFil ...@@ -414,6 +412,34 @@ void QGCDataPlot2D::loadCsvLog(QString file, QString xAxisName, QString yAxisFil
xAxisFilter = xAxisName; xAxisFilter = xAxisName;
} }
// Fill y-axis renaming lookup table
// Allow the user to rename data dimensions in the plot
QMap<QString, QString> renaming;
QStringList yCurves = yAxisFilter.split("|", QString::SkipEmptyParts);
// Figure out the correct renaming
for (int i = 0; i < yCurves.count(); ++i)
{
if (yCurves.at(i).contains(":"))
{
QStringList parts = yCurves.at(i).split(":", QString::SkipEmptyParts);
if (parts.count() > 1)
{
// Insert renaming map
renaming.insert(parts.first(), parts.last());
// Replace curve value with first part only
yCurves.replace(i, parts.first());
}
}
// else
// {
// // Insert same value, not renaming anything
// renaming.insert(yCurves.at(i), yCurves.at(i));
// }
}
foreach(curveName, curveNames) { foreach(curveName, curveNames) {
// Add to plot x axis selection // Add to plot x axis selection
ui->xAxis->addItem(curveName); ui->xAxis->addItem(curveName);
...@@ -421,14 +447,19 @@ void QGCDataPlot2D::loadCsvLog(QString file, QString xAxisName, QString yAxisFil ...@@ -421,14 +447,19 @@ void QGCDataPlot2D::loadCsvLog(QString file, QString xAxisName, QString yAxisFil
ui->xRegressionComboBox->addItem(curveName); ui->xRegressionComboBox->addItem(curveName);
ui->yRegressionComboBox->addItem(curveName); ui->yRegressionComboBox->addItem(curveName);
if (curveName != xAxisFilter) { if (curveName != xAxisFilter) {
if ((yAxisFilter == "") || yAxisFilter.contains(curveName)) { if ((yAxisFilter == "") || yCurves.contains(curveName)) {
yValues.insert(curveName, new QVector<double>()); yValues.insert(curveName, new QVector<double>());
xValues.insert(curveName, new QVector<double>()); xValues.insert(curveName, new QVector<double>());
// Add separator starting with second item // Add separator starting with second item
if (curveNameIndex > 0 && curveNameIndex < curveNames.count()) { if (curveNameIndex > 0 && curveNameIndex < curveNames.count()) {
ui->yAxis->setText(ui->yAxis->text()+"|"); ui->yAxis->setText(ui->yAxis->text()+"|");
} }
ui->yAxis->setText(ui->yAxis->text()+curveName); // If this curve was renamed, re-add the renaming to the text field
QString renamingText = "";
if (renaming.contains(curveName)) renamingText = QString(":%1").arg(renaming.value(curveName));
ui->yAxis->setText(ui->yAxis->text()+curveName+renamingText);
// Insert same value, not renaming anything
if (!renaming.contains(curveName)) renaming.insert(curveName, curveName);
curveNameIndex++; curveNameIndex++;
} }
} }
...@@ -478,7 +509,8 @@ void QGCDataPlot2D::loadCsvLog(QString file, QString xAxisName, QString yAxisFil ...@@ -478,7 +509,8 @@ void QGCDataPlot2D::loadCsvLog(QString file, QString xAxisName, QString yAxisFil
foreach(curveName, curveNames) foreach(curveName, curveNames)
{ {
// Y AXIS HANDLING // Y AXIS HANDLING
if(curveName != xAxisFilter && (yAxisFilter == "" || yAxisFilter.contains(curveName))) // Only plot non-x curver and those selected in the yAxisFilter (or all if the filter is not set)
if(curveName != xAxisFilter && (yAxisFilter == "" || yCurves.contains(curveName)))
{ {
bool oky; bool oky;
int curveNameIndex = curveNames.indexOf(curveName); int curveNameIndex = curveNames.indexOf(curveName);
...@@ -504,7 +536,14 @@ void QGCDataPlot2D::loadCsvLog(QString file, QString xAxisName, QString yAxisFil ...@@ -504,7 +536,14 @@ void QGCDataPlot2D::loadCsvLog(QString file, QString xAxisName, QString yAxisFil
// Add data array of each curve to the plot at once (fast) // Add data array of each curve to the plot at once (fast)
// Iterates through all x-y curve combinations // Iterates through all x-y curve combinations
for (int i = 0; i < yValues.count(); i++) { for (int i = 0; i < yValues.count(); i++) {
plot->appendData(yValues.keys().at(i), xValues.values().at(i)->data(), yValues.values().at(i)->data(), xValues.values().at(i)->count()); if (renaming.contains(yValues.keys().at(i)))
{
plot->appendData(renaming.value(yValues.keys().at(i)), xValues.values().at(i)->data(), yValues.values().at(i)->data(), xValues.values().at(i)->count());
}
else
{
plot->appendData(yValues.keys().at(i), xValues.values().at(i)->data(), yValues.values().at(i)->data(), xValues.values().at(i)->count());
}
} }
plot->updateScale(); plot->updateScale();
plot->setStyleText(ui->style->currentText()); plot->setStyleText(ui->style->currentText());
......
...@@ -6,14 +6,14 @@ ...@@ -6,14 +6,14 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1073</width> <width>1463</width>
<height>308</height> <height>311</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout" columnstretch="1,1,1,1,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
...@@ -303,7 +303,7 @@ ...@@ -303,7 +303,7 @@
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>40</width> <width>5</width>
<height>20</height> <height>20</height>
</size> </size>
</property> </property>
......
#include "QGCMapTool.h" #include "QGCMapTool.h"
#include "ui_QGCMapTool.h" #include "ui_QGCMapTool.h"
#include <QAction>
#include <QMenu>
QGCMapTool::QGCMapTool(QWidget *parent) : QGCMapTool::QGCMapTool(QWidget *parent) :
QWidget(parent), QWidget(parent),
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define QGCMAPTOOL_H #define QGCMAPTOOL_H
#include <QWidget> #include <QWidget>
#include <QMenu>
namespace Ui { namespace Ui {
class QGCMapTool; class QGCMapTool;
......
...@@ -29,9 +29,42 @@ void QGCMapToolBar::setMap(QGCMapWidget* map) ...@@ -29,9 +29,42 @@ void QGCMapToolBar::setMap(QGCMapWidget* map)
// Edit mode handling // Edit mode handling
ui->editButton->hide(); ui->editButton->hide();
// const int uavTrailTimeList[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // seconds
// const int uavTrailTimeCount = 10;
// const int uavTrailDistanceList[] = {1, 2, 5, 10, 20, 50, 100, 200, 500}; // meters
// const int uavTrailDistanceCount = 9;
// optionsMenu.setParent(this);
// // Build up menu
// //trailPlotMenu(tr("Add trail dot every.."), this);
// for (int i = 0; i < uavTrailTimeCount; ++i)
// {
// trailPlotMenu.addAction(QString("%1 second%2").arg(uavTrailTimeList[i]).arg((uavTrailTimeList[i] > 1) ? "s" : ""), this, SLOT(setUAVTrailTime()));
// }
// for (int i = 0; i < uavTrailDistanceCount; ++i)
// {
// trailPlotMenu.addAction(QString("%1 meter%2").arg(uavTrailDistanceList[i]).arg((uavTrailDistanceList[i] > 1) ? "s" : ""), this, SLOT(setUAVTrailDistance()));
// }
// optionsMenu.addMenu(&trailPlotMenu);
// ui->optionsButton->setMenu(&optionsMenu);
} }
} }
void QGCMapToolBar::setUAVTrailTime()
{
}
void QGCMapToolBar::setUAVTrailDistance()
{
}
void QGCMapToolBar::tileLoadStart() void QGCMapToolBar::tileLoadStart()
{ {
ui->posLabel->setText(QString("Starting to load tiles..")); ui->posLabel->setText(QString("Starting to load tiles.."));
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define QGCMAPTOOLBAR_H #define QGCMAPTOOLBAR_H
#include <QWidget> #include <QWidget>
#include <QMenu>
class QGCMapWidget; class QGCMapWidget;
...@@ -23,9 +24,13 @@ public slots: ...@@ -23,9 +24,13 @@ public slots:
void tileLoadStart(); void tileLoadStart();
void tileLoadEnd(); void tileLoadEnd();
void tileLoadProgress(int progress); void tileLoadProgress(int progress);
void setUAVTrailTime();
void setUAVTrailDistance();
protected: protected:
QGCMapWidget* map; QGCMapWidget* map;
QMenu optionsMenu;
QMenu trailPlotMenu;
private: private:
Ui::QGCMapToolBar *ui; Ui::QGCMapToolBar *ui;
......
...@@ -69,6 +69,13 @@ ...@@ -69,6 +69,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QPushButton" name="optionsButton">
<property name="text">
<string>Options</string>
</property>
</widget>
</item>
<item> <item>
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
......
...@@ -26,6 +26,9 @@ QGCMapWidget::~QGCMapWidget() ...@@ -26,6 +26,9 @@ QGCMapWidget::~QGCMapWidget()
void QGCMapWidget::showEvent(QShowEvent* event) void QGCMapWidget::showEvent(QShowEvent* event)
{ {
// FIXME XXX this is a hack to trick OPs current 1-system design
SetShowUAV(false);
// Pass on to parent widget // Pass on to parent widget
OPMapWidget::showEvent(event); OPMapWidget::showEvent(event);
...@@ -57,30 +60,25 @@ void QGCMapWidget::showEvent(QShowEvent* event) ...@@ -57,30 +60,25 @@ void QGCMapWidget::showEvent(QShowEvent* event)
// magic_waypoint.time_seconds = 0; // magic_waypoint.time_seconds = 0;
// magic_waypoint.hold_time_seconds = 0; // magic_waypoint.hold_time_seconds = 0;
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
SetMouseWheelZoomType(internals::MouseWheelZoomType::MousePositionWithoutCenter); // set how the mouse wheel zoom functions SetMouseWheelZoomType(internals::MouseWheelZoomType::MousePositionWithoutCenter); // set how the mouse wheel zoom functions
SetFollowMouse(true); // we want a contiuous mouse position reading SetFollowMouse(true); // we want a contiuous mouse position reading
SetShowHome(true); // display the HOME position on the map SetShowHome(true); // display the HOME position on the map
SetShowUAV(true); // display the UAV position on the map // SetShowUAV(true); // display the UAV position on the map
//SetShowDiagnostics(true); // Not needed in flight / production mode //SetShowDiagnostics(true); // Not needed in flight / production mode
Home->SetSafeArea(safe_area_radius_list[0]); // set radius (meters)
Home->SetSafeArea(30); // set radius (meters)
Home->SetShowSafeArea(true); // show the safe area Home->SetShowSafeArea(true); // show the safe area
// UAV->SetTrailTime(uav_trail_time_list[0]); // seconds //// UAV->SetTrailTime(uav_trail_time_list[0]); // seconds
// UAV->SetTrailDistance(uav_trail_distance_list[1]); // meters //// UAV->SetTrailDistance(uav_trail_distance_list[1]); // meters
// UAV->SetTrailType(UAVTrailType::ByTimeElapsed); //// UAV->SetTrailType(mapcontrol::UAVTrailType::ByTimeElapsed);
// UAV->SetTrailType(UAVTrailType::ByDistance); //// UAV->SetTrailType(mapcontrol::UAVTrailType::ByDistance);
GPS->SetTrailTime(uav_trail_time_list[0]); // seconds // GPS->SetTrailTime(uav_trail_time_list[0]); // seconds
GPS->SetTrailDistance(uav_trail_distance_list[1]); // meters // GPS->SetTrailDistance(uav_trail_distance_list[1]); // meters
// GPS->SetTrailType(UAVTrailType::ByTimeElapsed); // GPS->SetTrailType(UAVTrailType::ByTimeElapsed);
...@@ -245,9 +243,9 @@ void QGCMapWidget::updateGlobalPosition(UASInterface* uas, double lat, double lo ...@@ -245,9 +243,9 @@ void QGCMapWidget::updateGlobalPosition(UASInterface* uas, double lat, double lo
newUAV->setParentItem(map); newUAV->setParentItem(map);
UAVS.insert(uas->getUASID(), newUAV); UAVS.insert(uas->getUASID(), newUAV);
uav = GetUAV(uas->getUASID()); uav = GetUAV(uas->getUASID());
// uav->SetTrailTime(1); uav->SetTrailTime(1);
// uav->SetTrailDistance(5); uav->SetTrailDistance(5);
// uav->SetTrailType(mapcontrol::UAVTrailType::ByTimeElapsed); uav->SetTrailType(mapcontrol::UAVTrailType::ByTimeElapsed);
} }
// Set new lat/lon position of UAV icon // Set new lat/lon position of UAV icon
...@@ -276,6 +274,9 @@ void QGCMapWidget::updateGlobalPosition() ...@@ -276,6 +274,9 @@ void QGCMapWidget::updateGlobalPosition()
MAV2DIcon* newUAV = new MAV2DIcon(map, this, system); MAV2DIcon* newUAV = new MAV2DIcon(map, this, system);
AddUAV(system->getUASID(), newUAV); AddUAV(system->getUASID(), newUAV);
uav = newUAV; uav = newUAV;
uav->SetTrailTime(1);
uav->SetTrailDistance(5);
uav->SetTrailType(mapcontrol::UAVTrailType::ByTimeElapsed);
} }
// Set new lat/lon position of UAV icon // Set new lat/lon position of UAV icon
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment