Commit 43ce5cca authored by pixhawk's avatar pixhawk

Improving Google Earth support

parent 53a72a04
...@@ -13,12 +13,12 @@ google.load("earth", "1", { 'language': 'en'}); ...@@ -13,12 +13,12 @@ google.load("earth", "1", { 'language': 'en'});
var ge = null; var ge = null;
var initialized = false; var initialized = false;
var aircraft = new Array();
var currAircraft = 220; var currAircraft = 220;
var followAircraft = false; var followEnabled = false;
var currLat = 47.3769; var currLat = 47.3769;
var currLon = 8.549444; var currLon = 8.549444;
var currAlt = 470; var currAlt = 470;
var currFollowHeading = 0.0;
var homeLat = 0; var homeLat = 0;
var homeLon = 0; var homeLon = 0;
...@@ -32,11 +32,17 @@ var currTilt = 40.0; ///<< The tilt angle (in degrees) ...@@ -32,11 +32,17 @@ var currTilt = 40.0; ///<< The tilt angle (in degrees)
var currFollowTilt = 40.0; var currFollowTilt = 40.0;
var currView = null; var currView = null;
var M_PI = 3.14159265;
var planeOrient; var planeOrient;
var planeLoc; var planeLoc;
var aircraft = [];
var attitudes = [];
var locations = [];
var trails = [];
// Aircraft class // Aircraft class
...@@ -53,7 +59,10 @@ function init() { ...@@ -53,7 +59,10 @@ function init() {
function setCurrAircraft(id)
{
currAircraft = id;
}
function setGCSHome(lat, lon, alt) function setGCSHome(lat, lon, alt)
{ {
...@@ -86,13 +95,70 @@ function setGCSHome(lat, lon, alt) ...@@ -86,13 +95,70 @@ function setGCSHome(lat, lon, alt)
{ {
homeGroundLevel = alt; homeGroundLevel = alt;
} }
}
function createAircraft(id, type, color)
{
console.debug("Aircraft created");
var planePlacemark = ge.createPlacemark('');
goHome(); planePlacemark.setName('aircraft');
var planeModel = ge.createModel('');
ge.getFeatures().appendChild(planePlacemark);
var planeLoc = ge.createLocation('');
planeModel.setLocation(planeLoc);
var planeLink = ge.createLink('');
var planeOrient = ge.createOrientation('');
planeModel.setOrientation(planeOrient);
planeLink.setHref('http://qgroundcontrol.org/_media/users/models/multiplex-twinstar.dae');
planeModel.setLink(planeLink);
planeModel.setAltitudeMode (ge.ALTITUDE_ABSOLUTE);
planeLoc.setLatitude(currLat);
planeLoc.setLongitude(currLon);
planeLoc.setAltitude(currAlt);
planePlacemark.setGeometry(planeModel);
// Write into global structure
aircraft[id] = planePlacemark;
attitudes[id] = planeOrient;
locations[id] = planeLoc;
createTrail(id, color);
console.debug("Aircraft created");
}
function createTrail(id, color)
{
// Create the placemark
var lineStringPlacemark = ge.createPlacemark('');
// Create the LineString; set it to extend down to the ground
// and set the altitude mode
trails[id] = ge.createLineString('');
lineStringPlacemark.setGeometry(trails[id]);
trails[id].setExtrude(true);
lineString.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
// Add LineString points
//lineString.getCoordinates().pushLatLngAlt(48.754, -121.835, 700);
// Create a style and set width and color of line
lineStringPlacemark.setStyleSelector(ge.createStyle(''));
var lineStyle = lineStringPlacemark.getStyleSelector().getLineStyle();
lineStyle.setWidth(5);
lineStyle.getColor().set('99bbaaff');
//lineStyle.getColor().set(color);  // aabbggrr format
// Add the feature to Earth
ge.getFeatures().appendChild(lineStringPlacemark);
}
function addTrailPosition(id, lat, lon, alt)
{
//trails[id].getCoordinates().pushLatLngAlt(lat, lon, alt);
} }
function initCallback(object) function initCallback(object)
...@@ -110,7 +176,7 @@ function initCallback(object) ...@@ -110,7 +176,7 @@ function initCallback(object)
ge.getLayerRoot().enableLayerById(ge.LAYER_TREES, true); ge.getLayerRoot().enableLayerById(ge.LAYER_TREES, true);
// Now after the Google Earth initialization, initialize the GCS view // Now after the Google Earth initialization, initialize the GCS view
setGCSHome(currLat, currLon, currAlt); //setGCSHome(currLat, currLon, currAlt);
// Create the first aircraft model // Create the first aircraft model
...@@ -135,8 +201,8 @@ function initCallback(object) ...@@ -135,8 +201,8 @@ function initCallback(object)
planePlacemark.setGeometry(planeModel); planePlacemark.setGeometry(planeModel);
setAircraftPositionAttitude(220, 47.3772, currLon, currAlt+50, 20, 15, 50); //setAircraftPositionAttitude(220, 47.3772, currLon, currAlt+50, 20, 15, 50);
enableFollowing(true); //enableFollowing(true);
updateFollowAircraft(); updateFollowAircraft();
initialized = true; initialized = true;
...@@ -150,17 +216,19 @@ function setAircraftPositionAttitude(id, lat, lon, alt, roll, pitch, yaw) ...@@ -150,17 +216,19 @@ function setAircraftPositionAttitude(id, lat, lon, alt, roll, pitch, yaw)
currLat = lat; currLat = lat;
currLon = lon; currLon = lon;
currAlt = alt; currAlt = alt;
currFollowHeading = ((yaw/M_PI)+1.0)*360.0;
} }
planeOrient.setRoll(roll); // FIXME Currently invalid conversion from right-handed z-down to z-up frame
planeOrient.setTilt(pitch); planeOrient.setRoll(((roll/M_PI)+1.0)*360.0);
planeOrient.setHeading(yaw); planeOrient.setTilt(((pitch/M_PI)+1.0)*360.0);
planeOrient.setHeading(((yaw/M_PI)+1.0)*360.0);
planeLoc.setLatitude(lat); planeLoc.setLatitude(lat);
planeLoc.setLongitude(lon); planeLoc.setLongitude(lon);
planeLoc.setAltitude(alt); planeLoc.setAltitude(alt);
} }
...@@ -180,24 +248,16 @@ function setCurrentAircraft(id) ...@@ -180,24 +248,16 @@ function setCurrentAircraft(id)
currAircraft = id; currAircraft = id;
} }
function enableFollowing(follow)
{
followEnabled = follow;
}
function updateFollowAircraft() function updateFollowAircraft()
{ {
if (followEnabled)
{
currView = ge.getView().copyAsLookAt(ge.ALTITUDE_ABSOLUTE); currView = ge.getView().copyAsLookAt(ge.ALTITUDE_ABSOLUTE);
currView.setLatitude(currLat); currView.setLatitude(currLat);
currView.setLongitude(currLon); currView.setLongitude(currLon);
currView.setAltitude(currAlt); currView.setAltitude(currAlt);
currView.setRange(currViewRange); currView.setRange(currViewRange);
currView.setTilt(currFollowTilt); currView.setTilt(currFollowTilt);
currView.setHeading(currFollowHeading-90.0);
ge.getView().setAbstractView(currView); ge.getView().setAbstractView(currView);
}
} }
function failureCallback(object) function failureCallback(object)
......
...@@ -1119,41 +1119,9 @@ void MainWindow::loadMAVLinkView() ...@@ -1119,41 +1119,9 @@ void MainWindow::loadMAVLinkView()
void MainWindow::presentView() void MainWindow::presentView()
{ {
showTheCentralWidget(CENTRAL_3D_LOCAL, currentView);
showTheCentralWidget(CENTRAL_3D_MAP, currentView);
//#ifdef QGC_OSG_ENABLED
// // 3D map
// if (_3DWidget)
// {
// if (centerStack)
// {
// //map3DWidget->setActive(true);
// centerStack->setCurrentWidget(_3DWidget);
// }
// }
//#endif
qDebug() << "LC"; qDebug() << "LC";
showTheCentralWidget(CENTRAL_LINECHART, currentView); showTheCentralWidget(CENTRAL_LINECHART, currentView);
// FIXME
// if (linechartWidget)
// {
// qDebug () << buildMenuKey (SUB_SECTION_CHECKED,CENTRAL_LINECHART,currentView) <<
// settings.value(buildMenuKey (SUB_SECTION_CHECKED,CENTRAL_LINECHART,currentView)).toBool() ;
// if (settings.value(buildMenuKey (SUB_SECTION_CHECKED,CENTRAL_LINECHART,currentView)).toBool()){
// if (centerStack)
// {
// centerStack->setCurrentWidget(linechartWidget);
// }
// }
// }
// MAP // MAP
qDebug() << "MAP"; qDebug() << "MAP";
showTheCentralWidget(CENTRAL_MAP, currentView); showTheCentralWidget(CENTRAL_MAP, currentView);
...@@ -1164,16 +1132,17 @@ void MainWindow::presentView() ...@@ -1164,16 +1132,17 @@ void MainWindow::presentView()
// HEAD UP DISPLAY // HEAD UP DISPLAY
showTheCentralWidget(CENTRAL_HUD, currentView); showTheCentralWidget(CENTRAL_HUD, currentView);
// qDebug() << "HUD";
// if (hudWidget){ // GOOGLE EARTH
// qDebug() << buildMenuKey(SUB_SECTION_CHECKED,CENTRAL_HUD,currentView) << showTheCentralWidget(CENTRAL_GOOGLE_EARTH, currentView);
// settings.value(buildMenuKey (SUB_SECTION_CHECKED,CENTRAL_HUD,currentView)).toBool();
// if (settings.value(buildMenuKey (SUB_SECTION_CHECKED,CENTRAL_HUD,currentView)).toBool()){ // LOCAL 3D VIEW
// if (centerStack) { showTheCentralWidget(CENTRAL_3D_LOCAL, currentView);
// centerStack->setCurrentWidget(hudWidget);
// } // GLOBAL 3D VIEW
// } showTheCentralWidget(CENTRAL_3D_MAP, currentView);
// }
// Show docked widgets based on current view and autopilot type // Show docked widgets based on current view and autopilot type
......
...@@ -48,6 +48,7 @@ Q3DWidget::Q3DWidget(QWidget* parent) ...@@ -48,6 +48,7 @@ Q3DWidget::Q3DWidget(QWidget* parent)
, robotAttitude(new osg::PositionAttitudeTransform()) , robotAttitude(new osg::PositionAttitudeTransform())
, hudGroup(new osg::Switch()) , hudGroup(new osg::Switch())
, hudProjectionMatrix(new osg::Projection) , hudProjectionMatrix(new osg::Projection)
, fps(30.0f)
{ {
// set initial camera parameters // set initial camera parameters
cameraParams.minZoomRange = 2.0f; cameraParams.minZoomRange = 2.0f;
...@@ -70,6 +71,8 @@ Q3DWidget::~Q3DWidget() ...@@ -70,6 +71,8 @@ Q3DWidget::~Q3DWidget()
void void
Q3DWidget::init(float fps) Q3DWidget::init(float fps)
{ {
this->fps = fps;
getCamera()->setGraphicsContext(osgGW); getCamera()->setGraphicsContext(osgGW);
// manually specify near and far clip planes // manually specify near and far clip planes
...@@ -105,6 +108,23 @@ Q3DWidget::init(float fps) ...@@ -105,6 +108,23 @@ Q3DWidget::init(float fps)
timer.start(static_cast<int>(floorf(1000.0f / fps))); timer.start(static_cast<int>(floorf(1000.0f / fps)));
} }
void Q3DWidget::showEvent(QShowEvent* event)
{
// React only to internal (pre/post-display)
// events
if (!event->spontaneous())
{
if (event->type() == QEvent::Hide)
{
timer.stop();
}
else if (event->type() == QEvent::Show)
{
timer.start(static_cast<int>(floorf(1000.0f / fps)));
}
}
}
osg::ref_ptr<osg::Geode> osg::ref_ptr<osg::Geode>
Q3DWidget::createRobot(void) Q3DWidget::createRobot(void)
{ {
......
...@@ -257,6 +257,7 @@ protected: ...@@ -257,6 +257,7 @@ protected:
}; };
CameraParams cameraParams; /**< Struct representing camera parameters. */ CameraParams cameraParams; /**< Struct representing camera parameters. */
float fps;
}; };
#endif // Q3DWIDGET_H #endif // Q3DWIDGET_H
#include <QApplication> #include <QApplication>
#include <QDir> #include <QDir>
#include <QShowEvent> #include <QShowEvent>
#include <QSettings>
#include <QDebug> #include <QDebug>
#include "UASManager.h" #include "UASManager.h"
...@@ -14,14 +15,17 @@ ...@@ -14,14 +15,17 @@
#include "ui_QGCGoogleEarthView.h" #include "ui_QGCGoogleEarthView.h"
#include "QGCGoogleEarthView.h" #include "QGCGoogleEarthView.h"
#define QGCGOOGLEEARTHVIEWSETTINGS QString("GoogleEarthViewSettings_")
QGCGoogleEarthView::QGCGoogleEarthView(QWidget *parent) : QGCGoogleEarthView::QGCGoogleEarthView(QWidget *parent) :
QWidget(parent), QWidget(parent),
updateTimer(new QTimer(this)), updateTimer(new QTimer(this)),
refreshRateMs(200), refreshRateMs(80),
mav(NULL), mav(NULL),
followCamera(true), followCamera(true),
trailEnabled(true), trailEnabled(true),
webViewInitialized(false), webViewInitialized(false),
gEarthInitialized(false),
#if (defined Q_OS_MAC) #if (defined Q_OS_MAC)
webViewMac(new QWebView(this)), webViewMac(new QWebView(this)),
#endif #endif
...@@ -39,20 +43,23 @@ QGCGoogleEarthView::QGCGoogleEarthView(QWidget *parent) : ...@@ -39,20 +43,23 @@ QGCGoogleEarthView::QGCGoogleEarthView(QWidget *parent) :
#else #else
#endif #endif
// Load settings
QSettings settings;
followCamera = settings.value(QGCGOOGLEEARTHVIEWSETTINGS + "follow", followCamera).toBool();
trailEnabled = settings.value(QGCGOOGLEEARTHVIEWSETTINGS + "trail", trailEnabled).toBool();
ui->setupUi(this); ui->setupUi(this);
#if (defined Q_OS_MAC) #if (defined Q_OS_MAC)
ui->webViewLayout->addWidget(webViewMac); ui->webViewLayout->addWidget(webViewMac);
connect(webViewMac, SIGNAL(loadFinished(bool)), this, SLOT(initializeGoogleEarth(bool)));
#endif #endif
#ifdef _MSC_VER #ifdef _MSC_VER
ui->webViewLayout->addWidget(webViewWin); ui->webViewLayout->addWidget(webViewWin);
#endif #endif
#if ((defined Q_OS_MAC) | (defined _MSC_VER))
connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(setActiveUAS(UASInterface*))); connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(setActiveUAS(UASInterface*)));
connect(updateTimer, SIGNAL(timeout()), this, SLOT(updateState())); connect(updateTimer, SIGNAL(timeout()), this, SLOT(updateState()));
updateTimer->start(refreshRateMs);
#endif
// Follow checkbox // Follow checkbox
ui->followAirplaneCheckbox->setChecked(followCamera); ui->followAirplaneCheckbox->setChecked(followCamera);
...@@ -62,32 +69,63 @@ QGCGoogleEarthView::QGCGoogleEarthView(QWidget *parent) : ...@@ -62,32 +69,63 @@ QGCGoogleEarthView::QGCGoogleEarthView(QWidget *parent) :
ui->trailCheckbox->setChecked(trailEnabled); ui->trailCheckbox->setChecked(trailEnabled);
connect(ui->trailCheckbox, SIGNAL(toggled(bool)), this, SLOT(showTrail(bool))); connect(ui->trailCheckbox, SIGNAL(toggled(bool)), this, SLOT(showTrail(bool)));
// Get list of available 3D models // Go home
connect(ui->goHomeButton, SIGNAL(clicked()), this, SLOT(goHome()));
}
QGCGoogleEarthView::~QGCGoogleEarthView()
{
QSettings settings;
settings.setValue(QGCGOOGLEEARTHVIEWSETTINGS + "follow", followCamera);
settings.setValue(QGCGOOGLEEARTHVIEWSETTINGS + "trail", trailEnabled);
settings.sync();
delete ui;
}
// Load HTML file void QGCGoogleEarthView::addUAS(UASInterface* uas)
{
#ifdef Q_OS_MAC
webViewMac->page()->currentFrame()->evaluateJavaScript(QString("createAircraft(%1, %2, %3);").arg(uas->getUASID()).arg(uas->getSystemType()).arg(uas->getColor().name()));
#endif
#ifdef _MSC_VER #ifdef _MSC_VER
webViewWin->dynamicCall("GoHome()"); //if (webViewMac->page()->currentFrame()->evaluateJavaScript("isInitialized();").toBool())
webViewWin->dynamicCall("Navigate(const QString&)", QApplication::applicationDirPath() + "/earth.html");
#endif #endif
// Parse for model links // Automatically receive further position updates
connect(uas, SIGNAL(globalPositionChanged(UASInterface*,double,double,double,quint64)), this, SLOT(updateGlobalPosition(UASInterface*,double,double,double,quint64)));
// Populate model list
} }
QGCGoogleEarthView::~QGCGoogleEarthView() void QGCGoogleEarthView::setActiveUAS(UASInterface* uas)
{ {
delete ui; if (uas)
{
mav = uas;
#ifdef Q_OS_MAC
if (webViewMac->page()->currentFrame()->evaluateJavaScript("isInitialized();").toBool())
{
webViewMac->page()->currentFrame()->evaluateJavaScript(QString("setCurrAircraft(%1);").arg(uas->getUASID()));
}
#endif
#ifdef _MSC_VER
//if (webViewMac->page()->currentFrame()->evaluateJavaScript("isInitialized();").toBool())
#endif
}
} }
void QGCGoogleEarthView::setActiveUAS(UASInterface* uas) void QGCGoogleEarthView::updateGlobalPosition(UASInterface* uas, double lat, double lon, double alt, quint64 usec)
{ {
mav = uas; Q_UNUSED(usec);
#ifdef Q_OS_MAC
webViewMac->page()->currentFrame()->evaluateJavaScript(QString("addTrailPosition(%1, %2, %3, %4);").arg(uas->getUASID()).arg(lat, 0, 'f', 15).arg(lon, 0, 'f', 15).arg(alt, 0, 'f', 15));
#endif
#ifdef _MSC_VER
//if (webViewMac->page()->currentFrame()->evaluateJavaScript("isInitialized();").toBool())
#endif
} }
void QGCGoogleEarthView::showTrail(bool state) void QGCGoogleEarthView::showTrail(bool state)
{ {
ui->trailCheckbox->setChecked(state);
} }
void QGCGoogleEarthView::showWaypoints(bool state) void QGCGoogleEarthView::showWaypoints(bool state)
...@@ -97,9 +135,34 @@ void QGCGoogleEarthView::showWaypoints(bool state) ...@@ -97,9 +135,34 @@ void QGCGoogleEarthView::showWaypoints(bool state)
void QGCGoogleEarthView::follow(bool follow) void QGCGoogleEarthView::follow(bool follow)
{ {
ui->followAirplaneCheckbox->setChecked(follow);
followCamera = follow; followCamera = follow;
} }
void QGCGoogleEarthView::goHome()
{
// Disable follow and update
follow(false);
updateState();
// Go to home location
#ifdef Q_OS_MAC
webViewMac->page()->currentFrame()->evaluateJavaScript("goHome();");
#endif
#ifdef _MSC_VER
webViewWin.dynamicCall("InvokeScript(\"goHome\");");
#endif
}
void QGCGoogleEarthView::setHome(double lat, double lon, double alt)
{
#ifdef Q_OS_MAC
webViewMac->page()->currentFrame()->evaluateJavaScript(QString("setGCSHome(%1,%2,%3);").arg(lat, 0, 'f', 15).arg(lon, 0, 'f', 15).arg(alt, 0, 'f', 15));
#endif
#ifdef _MSC_VER
webViewWin.dynamicCall(QString("InvokeScript(\"setGCSHome\", %1, %2, %3);").arg(lat, 0, 'f', 15).arg(lon, 0, 'f', 15).arg(alt, 0, 'f', 15));
#endif
}
void QGCGoogleEarthView::showEvent(QShowEvent* event) void QGCGoogleEarthView::showEvent(QShowEvent* event)
{ {
// React only to internal (pre-display) // React only to internal (pre-display)
...@@ -110,6 +173,7 @@ void QGCGoogleEarthView::showEvent(QShowEvent* event) ...@@ -110,6 +173,7 @@ void QGCGoogleEarthView::showEvent(QShowEvent* event)
{ {
// Disable widget // Disable widget
updateTimer->stop(); updateTimer->stop();
qDebug() << "STOPPED GOOGLE EARTH UPDATES";
} }
else if (event->type() == QEvent::Show) else if (event->type() == QEvent::Show)
{ {
...@@ -123,59 +187,86 @@ void QGCGoogleEarthView::showEvent(QShowEvent* event) ...@@ -123,59 +187,86 @@ void QGCGoogleEarthView::showEvent(QShowEvent* event)
#endif #endif
#ifdef _MSC_VER #ifdef _MSC_VER
webViewWin->dynamicCall("GoHome()"); //webViewWin->dynamicCall("GoHome()");
webViewWin->dynamicCall("Navigate(const QString&)", "http://pixhawk.ethz.ch"); webViewWin->dynamicCall("Navigate(const QString&)", QApplication::applicationDirPath() + "/earth.html");
#endif #endif
webViewInitialized = true; webViewInitialized = true;
// Reloading the webpage, this resets Google Earth
gEarthInitialized = false;
QTimer::singleShot(1000, this, SLOT(initializeGoogleEarth()));
updateTimer->start(refreshRateMs);
} }
} }
updateTimer->start();
} }
} }
void QGCGoogleEarthView::updateState() void QGCGoogleEarthView::initializeGoogleEarth()
{ {
if (isVisible()) if (!gEarthInitialized)
{ {
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
if (webViewMac->page()->currentFrame()->evaluateJavaScript("isInitialized();").toBool()) if (!webViewMac->page()->currentFrame()->evaluateJavaScript("isInitialized();").toBool())
{
#endif
#ifdef _MSC_VER
// if (webViewMacWin->dynamicCall("Navigate(const QString&)","isInitialized();").toBool())
// {
#endif
static bool initialized = false;
if (!initialized)
{
#ifdef Q_OS_MAC
webViewMac->page()->currentFrame()->evaluateJavaScript("setGCSHome(22.679833,8.549444, 470);");
#endif #endif
#ifdef _MSC_VER #ifdef _MSC_VER
//webViewMac->page()->currentFrame()->evaluateJavaScript("setGCSHome(22.679833,8.549444, 470);"); //if (!webViewMac->page()->currentFrame()->evaluateJavaScript("isInitialized();").toBool())
#endif #endif
initialized = true; {
} QTimer::singleShot(200, this, SLOT(initializeGoogleEarth()));
int uasId = 0; }
double lat = 22.679833; else
double lon = 8.549444; {
double alt = 470.0; // Set home location
setHome(47.3769, 8.549444, 500);
// Move to home location
goHome();
float roll = 0.0f; // Set current UAS
float pitch = 0.0f; setActiveUAS(mav);
float yaw = 0.0f;
if (mav) // Add all MAVs
QList<UASInterface*> mavs = UASManager::instance()->getUASList();
foreach (UASInterface* mav, mavs)
{ {
uasId = mav->getUASID(); addUAS(mav);
lat = mav->getLatitude();
lon = mav->getLongitude();
alt = mav->getAltitude();
roll = mav->getRoll();
pitch = mav->getPitch();
yaw = mav->getYaw();
} }
#ifdef Q_OS_MAC
// Add any further MAV automatically
connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), this, SLOT(addUAS(UASInterface*)));
gEarthInitialized = true;
}
}
}
void QGCGoogleEarthView::updateState()
{
if (gEarthInitialized)
{
int uasId = 0;
double lat = 47.3769;
double lon = 8.549444;
double alt = 470.0;
float roll = 0.0f;
float pitch = 0.0f;
float yaw = 0.0f;
// Update all MAVs
QList<UASInterface*> mavs = UASManager::instance()->getUASList();
foreach (UASInterface* mav, mavs)
{
uasId = mav->getUASID();
lat = mav->getLatitude();
lon = mav->getLongitude();
alt = mav->getAltitude();
roll = mav->getRoll();
pitch = mav->getPitch();
yaw = mav->getYaw();
#ifdef Q_OS_MAC
webViewMac->page()->currentFrame()->evaluateJavaScript(QString("setAircraftPositionAttitude(%1, %2, %3, %4, %6, %7, %8);") webViewMac->page()->currentFrame()->evaluateJavaScript(QString("setAircraftPositionAttitude(%1, %2, %3, %4, %6, %7, %8);")
.arg(uasId) .arg(uasId)
.arg(lat) .arg(lat)
...@@ -188,18 +279,16 @@ void QGCGoogleEarthView::updateState() ...@@ -188,18 +279,16 @@ void QGCGoogleEarthView::updateState()
#ifdef _MSC_VER #ifdef _MSC_VER
#endif #endif
}
if (followCamera) if (followCamera)
{ {
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
webViewMac->page()->currentFrame()->evaluateJavaScript(QString("updateFollowAircraft()")); webViewMac->page()->currentFrame()->evaluateJavaScript(QString("updateFollowAircraft()"));
#endif #endif
#ifdef _MSC_VER #ifdef _MSC_VER
#endif #endif
}
#if (defined Q_OS_MAC) || (defined _MSC_VER)
} }
#endif
} }
} }
......
...@@ -54,14 +54,24 @@ public: ...@@ -54,14 +54,24 @@ public:
public slots: public slots:
/** @brief Update the internal state. Does not trigger a redraw */ /** @brief Update the internal state. Does not trigger a redraw */
void updateState(); void updateState();
/** @brief Add a new MAV/UAS to the visualization */
void addUAS(UASInterface* uas);
/** @brief Set the currently selected UAS */ /** @brief Set the currently selected UAS */
void setActiveUAS(UASInterface* uas); void setActiveUAS(UASInterface* uas);
/** @brief Update the global position */
void updateGlobalPosition(UASInterface* uas, double lat, double lon, double alt, quint64 usec);
/** @brief Show the vehicle trail */ /** @brief Show the vehicle trail */
void showTrail(bool state); void showTrail(bool state);
/** @brief Show the waypoints */ /** @brief Show the waypoints */
void showWaypoints(bool state); void showWaypoints(bool state);
/** @brief Follow the aircraft during flight */ /** @brief Follow the aircraft during flight */
void follow(bool follow); void follow(bool follow);
/** @brief Go to the home location */
void goHome();
/** @brief Set the home location */
void setHome(double lat, double lon, double alt);
/** @brief Initialize Google Earth */
void initializeGoogleEarth();
protected: protected:
void changeEvent(QEvent *e); void changeEvent(QEvent *e);
...@@ -71,6 +81,7 @@ protected: ...@@ -71,6 +81,7 @@ protected:
bool followCamera; bool followCamera;
bool trailEnabled; bool trailEnabled;
bool webViewInitialized; bool webViewInitialized;
bool gEarthInitialized;
#ifdef _MSC_VER #ifdef _MSC_VER
QGCWebAxWidget* webViewWin; QGCWebAxWidget* webViewWin;
#endif #endif
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>QGCUnconnectedInfoWidget</class> <class>QGCUnconnectedInfoWidget</class>
<widget class="QWidget" name="QGCUnconnectedInfoWidget"> <widget class="QWidget" name="QGCUnconnectedInfoWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>400</width> <width>400</width>
<height>300</height> <height>300</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">
<item row="0" column="0" colspan="3"> <item row="0" column="0" colspan="3">
<widget class="QTextEdit" name="textEdit"> <widget class="QTextEdit" name="textEdit">
<property name="verticalScrollBarPolicy"> <property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum> <enum>Qt::ScrollBarAlwaysOff</enum>
</property> </property>
<property name="horizontalScrollBarPolicy"> <property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum> <enum>Qt::ScrollBarAlwaysOff</enum>
</property> </property>
<property name="autoFormatting"> <property name="autoFormatting">
<set>QTextEdit::AutoAll</set> <set>QTextEdit::AutoAll</set>
</property> </property>
<property name="undoRedoEnabled"> <property name="undoRedoEnabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="readOnly"> <property name="readOnly">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="html"> <property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;table border=&quot;0&quot; style=&quot;-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;&quot;&gt; &lt;table border=&quot;0&quot; style=&quot;-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;&quot;&gt;
&lt;tr&gt; &lt;tr&gt;
&lt;td style=&quot;border: none;&quot;&gt; &lt;td style=&quot;border: none;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:12pt; font-weight:600;&quot;&gt;Unmanned System List&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:14pt; font-weight:600;&quot;&gt;Unmanned System List&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:6pt; font-weight:600;&quot;&gt;&lt;/p&gt; &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:6pt; font-weight:600;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:9pt; font-weight:600;&quot;&gt;No Systems are connected yet.&lt;/span&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:9pt;&quot;&gt; Please either connect a link or use the simulation function to see QGroundControl in action.&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:600;&quot;&gt;No Systems are connected yet.&lt;/span&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt;&quot;&gt; Please either connect a link or use the simulation function to see QGroundControl in action.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;&quot;&gt;&lt;/p&gt; &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:9pt; font-style:italic;&quot;&gt;Click on the simulation button below to simulate a micro air vehicle or on the connect link button to connect a serial port link. A UDP link is already open for connections on port &lt;/span&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:9pt; font-weight:600; font-style:italic;&quot;&gt;14550&lt;/span&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:9pt; font-style:italic;&quot;&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt; font-style:italic;&quot;&gt;Click on the simulation button below to simulate a micro air vehicle or on the connect link button to connect a serial port link. A UDP link is already open for connections on port &lt;/span&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:600; font-style:italic;&quot;&gt;14550&lt;/span&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt; font-style:italic;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:9pt; font-style:italic;&quot;&gt;&lt;/p&gt; &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt; font-style:italic;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:9pt; font-style:italic;&quot;&gt;&lt;/p&gt; &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt; font-style:italic;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:10pt; font-weight:600;&quot;&gt;Communication Link Help:&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:600;&quot;&gt;Communication Link Help:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:9pt; font-style:italic;&quot;&gt;&lt;/p&gt; &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt; font-style:italic;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:9pt;&quot;&gt;If you encounter communication problems on your link (e.g. no MAV is shown in the list after connecting the link), please check if you receive data on the link using the communication console. Select &lt;/span&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:9pt; font-weight:600;&quot;&gt;Tools -&amp;gt; Communication Console&lt;/span&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:9pt;&quot;&gt; to enable it. The console should show incoming traffic and some used bandwidth (e.g. 1.43 kB/s on the indicator).&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;</string> &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt;&quot;&gt;If you encounter communication problems on your link (e.g. no MAV is shown in the list after connecting the link), please check if you receive data on the link using the communication console. Select &lt;/span&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt; font-weight:600;&quot;&gt;Tools -&amp;gt; Communication Console&lt;/span&gt;&lt;span style=&quot; font-family:'Ubuntu'; font-size:11pt;&quot;&gt; to enable it. The console should show incoming traffic and some used bandwidth (e.g. 1.43 kB/s on the indicator).&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>40</width> <width>40</width>
<height>20</height> <height>20</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QPushButton" name="simulationButton"> <widget class="QPushButton" name="simulationButton">
<property name="text"> <property name="text">
<string>Simulate MAV</string> <string>Simulate MAV</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="2"> <item row="1" column="2">
<widget class="QPushButton" name="connectButton"> <widget class="QPushButton" name="connectButton">
<property name="text"> <property name="text">
<string>Connect Link</string> <string>Connect Link</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>
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