/** ****************************************************************************** * * @file gpsdisplaywidget.cpp * @author Edouard Lafargue Copyright (C) 2010. * @addtogroup GCSPlugins GCS Plugins * @{ * @addtogroup GPSGadgetPlugin GPS Gadget Plugin * @{ * @brief A gadget that displays GPS status and enables basic configuration *****************************************************************************/ /* * 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 "gpsdisplaywidget.h" #include "extensionsystem/pluginmanager.h" #include "uavobjectmanager.h" #include #include #include /* * Initialize the widget */ GpsDisplayWidget::GpsDisplayWidget(QWidget *parent) : QWidget(parent) { setupUi(this); // Not elegant, just load the image for now QGraphicsScene *fescene = new QGraphicsScene(this); QPixmap earthpix(":/gpsgadget/images/flatEarth.png"); fescene->addPixmap(earthpix); flatEarth->setScene(fescene); marker = new QGraphicsSvgItem(); QSvgRenderer *renderer = new QSvgRenderer(); renderer->load(QString(":/gpsgadget/images/marker.svg")); marker->setSharedRenderer(renderer); fescene->addItem(marker); double scale = earthpix.width() / (marker->boundingRect().width() * 20); marker->setScale(scale); } GpsDisplayWidget::~GpsDisplayWidget() {} void GpsDisplayWidget::setSpeedHeading(double speed, double heading) { QString str; speed_value->setText(str.sprintf("%.02f m/s", speed)); bear_value->setText(str.sprintf("%.02f deg", heading)); } void GpsDisplayWidget::setDateTime(double date, double time) { QString dstring1, dstring2; dstring1.sprintf("%06.0f", date); dstring1.insert(dstring1.length() - 2, "."); dstring1.insert(dstring1.length() - 5, "."); dstring2.sprintf("%06.0f", time); dstring2.insert(dstring2.length() - 2, ":"); dstring2.insert(dstring2.length() - 5, ":"); time_value->setText(dstring1 + " " + dstring2 + " GMT"); } void GpsDisplayWidget::setFixType(const QString &fixtype) { if (fixtype == "NoGPS") { fix_value->setText("No GPS"); } else if (fixtype == "NoFix") { fix_value->setText("Fix not available"); } else if (fixtype == "Fix2D") { fix_value->setText("2D"); } else if (fixtype == "Fix3D") { fix_value->setText("3D"); } else { fix_value->setText("Unknown"); } } void GpsDisplayWidget::dumpPacket(const QString &packet) { textBrowser->append(packet); if (textBrowser->document()->lineCount() > 200) { QTextCursor tc = textBrowser->textCursor(); tc.movePosition(QTextCursor::Start); tc.movePosition(QTextCursor::Down, QTextCursor::KeepAnchor); tc.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor); tc.removeSelectedText(); } } void GpsDisplayWidget::setSVs(int sv) { QString temp; temp.append(QString::number(sv)); status_value->setText(temp); status_value->adjustSize(); } void GpsDisplayWidget::setDOP(double hdop, double vdop, double pdop) { QString str; str.sprintf("%.2f / %.2f / %.2f", hdop, vdop, pdop); dop_value->setText(str); } void GpsDisplayWidget::setPosition(double lat, double lon, double alt) { // lat *= 1E-7; // lon *= 1E-7; double deg = floor(fabs(lat)); double min = (fabs(lat) - deg) * 60; QString str1; str1.sprintf("%.0f%c%.3f' ", deg, 0x00b0, min); if (lat > 0) { str1.append("N"); } else { str1.append("S"); } coord_value->setText(str1); deg = floor(fabs(lon)); min = (fabs(lon) - deg) * 60; QString str2; str2.sprintf("%.0f%c%.3f' ", deg, 0x00b0, min); if (lon > 0) { str2.append("E"); } else { str2.append("W"); } coord_value_2->setText(str2); QString str3; str3.sprintf("%.2f m", alt); coord_value_3->setText(str3); // Now place the marker: double wscale = flatEarth->sceneRect().width() / 360; double hscale = flatEarth->sceneRect().height() / 180; QPointF opd = QPointF((lon + 180) * wscale - marker->boundingRect().width() * marker->scale() / 2, (90 - lat) * hscale - marker->boundingRect().height() * marker->scale() / 2); marker->setTransform(QTransform::fromTranslate(opd.x(), opd.y()), false); }