• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • plugins
  • positionprovider
  • flightgear
FlightGearPositionProviderPlugin.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2012 Ralf Habacker <ralf.habacker@freenet.de>
9 //
10 
11 #include "FlightGearPositionProviderPlugin.h"
12 
13 #include "MarbleDebug.h"
14 #include <math.h>
15 
16 #include <QUdpSocket>
17 
18 using namespace Marble;
19 /* TRANSLATOR Marble::FlightGearPositionProviderPlugin */
20 
21 using namespace std;
22 
23 FlightGearPositionProviderPlugin::FlightGearPositionProviderPlugin()
24  : m_socket(0), m_speed( 0.0 ), m_track( 0.0 )
25 {
26 }
27 
28 FlightGearPositionProviderPlugin::~FlightGearPositionProviderPlugin()
29 {
30  delete m_socket;
31 }
32 
33 QString FlightGearPositionProviderPlugin::name() const
34 {
35  return tr( "FlightGear position provider Plugin" );
36 }
37 
38 QString FlightGearPositionProviderPlugin::nameId() const
39 {
40  return QString::fromLatin1( "flightgear" );
41 }
42 
43 QString FlightGearPositionProviderPlugin::guiString() const
44 {
45  return tr( "FlightGear" );
46 }
47 
48 QString FlightGearPositionProviderPlugin::version() const
49 {
50  return "1.0";
51 }
52 
53 QString FlightGearPositionProviderPlugin::description() const
54 {
55  return tr( "Reports the position of running flightgear application." );
56 }
57 
58 QString FlightGearPositionProviderPlugin::copyrightYears() const
59 {
60  return "2012";
61 }
62 
63 QList<PluginAuthor> FlightGearPositionProviderPlugin::pluginAuthors() const
64 {
65  return QList<PluginAuthor>()
66  << PluginAuthor( QString::fromUtf8( "Ralf Habacker" ), "ralf.habacker@freenet.de" );
67 
68 }
69 
70 QIcon FlightGearPositionProviderPlugin::icon() const
71 {
72  return QIcon();
73 }
74 
75 void FlightGearPositionProviderPlugin::initialize()
76 {
77  m_status = PositionProviderStatusAcquiring;
78  emit statusChanged( m_status );
79 
80  m_socket = new QUdpSocket(this);
81  m_socket->bind(QHostAddress::LocalHost, 5500);
82 
83  connect(m_socket, SIGNAL(readyRead()),
84  this, SLOT(readPendingDatagrams()));
85 }
86 
90 bool fixBadGPRMC(QByteArray &line)
91 {
92  if (!line.startsWith("$GPRMC"))
93  return false;
94 
95  QStringList parts = QString(line).split(',');
96  if (parts[9].size() == 7) {
97  parts[9].remove(4,1);
98  line = parts.join(",").toLatin1();
99  // update crc
100  int crc = 0;
101  for(int i=1; i < line.size()-3; i++) {
102  crc ^= (int) line[i];
103  }
104  parts[11] = parts[11][0] + parts[11][1] + QString::number(crc, 16).toUpper();
105 
106  line = parts.join(",").toLatin1();
107  return true;
108  }
109  return false;
110 }
111 
112 void FlightGearPositionProviderPlugin::readPendingDatagrams()
113 {
114  while (m_socket->hasPendingDatagrams()) {
115  QByteArray datagram;
116  datagram.resize(m_socket->pendingDatagramSize());
117  QHostAddress sender;
118  quint16 senderPort;
119 
120  m_socket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
121  typedef QList<QByteArray>::Iterator Iterator;
122  QList<QByteArray> splitted = datagram.split('\n');
123  for (Iterator i = splitted.begin(); i != splitted.end(); i++) {
124  fixBadGPRMC(*i);
125  i->append( "\n" );
126  parseNmeaSentence( *i );
127  }
128  }
129 }
130 
131 void FlightGearPositionProviderPlugin::parseNmeaSentence( const QString &sentence )
132 {
133  PositionProviderStatus oldStatus = m_status;
134  GeoDataCoordinates oldPosition = m_position;
135 
136  if ( sentence.startsWith( QLatin1String( "$GPRMC" ) ) ) {
137  QStringList const values = sentence.split( ',' );
138  if ( values.size() > 9 ) {
139  if ( values[2] == "A" ) {
140  m_speed = values[7].toDouble() * 0.514444; // knots => m/s
141  m_track = values[8].toDouble();
142  QString const date = values[9] + ' ' + values[1];
143  m_timestamp = QDateTime::fromString( date, "ddMMyy HHmmss" );
144  if (m_timestamp.date().year() <= 1930 && m_timestamp.date().year() >= 1900 ) {
145  m_timestamp = m_timestamp.addYears( 100 ); // Qt range is 1900-1999 for two-digits
146  }
147  }
148  // Flightgear submits geoposition twice in one datagram, once
149  // in GPRMC and once in GPGGA. Parsing one is sufficient
150  }
151  } else if ( sentence.startsWith( QLatin1String( "$GPGGA" ) ) ) {
152  QStringList const values = sentence.split( ',' );
153  if ( values.size() > 10 ) {
154  if ( values[6] == 0 ) {
155  m_status = PositionProviderStatusUnavailable; // no fix
156  } else {
157  double const lat = parsePosition( values[2], values[3] == "S" );
158  double const lon = parsePosition( values[4], values[5] == "W" );
159  double const unitFactor = values[10] == "F" ? FT2M : 1.0;
160  double const alt = unitFactor * values[9].toDouble();
161  m_position.set( lon, lat, alt, GeoDataCoordinates::Degree );
162  m_accuracy.level = GeoDataAccuracy::Detailed;
163  m_status = PositionProviderStatusAvailable;
164  }
165  }
166  } else {
167  return;
168  }
169 
170  if ( m_status != oldStatus ) {
171  emit statusChanged( m_status );
172  }
173  if ( m_position != oldPosition && m_status == PositionProviderStatusAvailable ) {
174  emit positionChanged( m_position, m_accuracy );
175  }
176 }
177 
178 double FlightGearPositionProviderPlugin::parsePosition( const QString &value, bool isNegative )
179 {
180  double pos = value.toDouble();
181  pos = int( pos / 100.0 ) + ( pos - 100.0 * int( pos / 100.0 ) ) / 60.0;
182  return isNegative ? -qAbs( pos ) : pos;
183 }
184 
185 bool FlightGearPositionProviderPlugin::isInitialized() const
186 {
187  return m_socket;
188 }
189 
190 PositionProviderPlugin* FlightGearPositionProviderPlugin::newInstance() const
191 {
192  return new FlightGearPositionProviderPlugin;
193 }
194 
195 PositionProviderStatus FlightGearPositionProviderPlugin::status() const
196 {
197  return m_status;
198 }
199 
200 GeoDataCoordinates FlightGearPositionProviderPlugin::position() const
201 {
202  return m_position;
203 }
204 
205 GeoDataAccuracy FlightGearPositionProviderPlugin::accuracy() const
206 {
207  return m_accuracy;
208 }
209 
210 qreal FlightGearPositionProviderPlugin::speed() const
211 {
212  return m_speed;
213 }
214 
215 qreal FlightGearPositionProviderPlugin::direction() const
216 {
217  return m_track;
218 }
219 
220 QDateTime FlightGearPositionProviderPlugin::timestamp() const
221 {
222  return m_timestamp;
223 }
224 
225 QString FlightGearPositionProviderPlugin::error() const
226 {
227  return QString();
228 }
229 
230 Q_EXPORT_PLUGIN2( FlightGearPositionProviderPlugin, Marble::FlightGearPositionProviderPlugin )
231 
232 #include "FlightGearPositionProviderPlugin.moc"
Marble::GeoDataCoordinates
A 3d point representation.
Definition: GeoDataCoordinates.h:52
QString::toUpper
QString toUpper() const
QList::remove
iterator remove(iterator pos)
QHostAddress
QDateTime::addYears
QDateTime addYears(int nyears) const
QByteArray::split
QList< QByteArray > split(char sep) const
Marble::FlightGearPositionProviderPlugin::name
virtual QString name() const
Returns the user-visible name of the plugin.
Definition: FlightGearPositionProviderPlugin.cpp:33
QByteArray
Marble::PositionProviderPlugin::statusChanged
void statusChanged(PositionProviderStatus status) const
fixBadGPRMC
bool fixBadGPRMC(QByteArray &line)
fixed case where wrong date format is used '2404112' instead of '240412'
Definition: FlightGearPositionProviderPlugin.cpp:90
QObject::sender
QObject * sender() const
QString::split
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
QUdpSocket::hasPendingDatagrams
bool hasPendingDatagrams() const
Marble::FlightGearPositionProviderPlugin::speed
virtual qreal speed() const
Returns the speed of the gps device in meters per second.
Definition: FlightGearPositionProviderPlugin.cpp:210
Marble::FlightGearPositionProviderPlugin::icon
virtual QIcon icon() const
Returns an icon for the plugin.
Definition: FlightGearPositionProviderPlugin.cpp:70
Marble::PluginAuthor
Definition: PluginInterface.h:28
QByteArray::startsWith
bool startsWith(const QByteArray &ba) const
Marble::FlightGearPositionProviderPlugin::version
virtual QString version() const
Definition: FlightGearPositionProviderPlugin.cpp:48
QStringList::join
QString join(const QString &separator) const
QString::toDouble
double toDouble(bool *ok) const
MarbleDebug.h
QObject::tr
QString tr(const char *sourceText, const char *disambiguation, int n)
Marble::PositionProviderStatusUnavailable
Definition: PositionProviderPluginInterface.h:27
Marble::GeoDataCoordinates::Degree
Definition: GeoDataCoordinates.h:66
QList::size
int size() const
Marble::PositionProviderPlugin
The abstract class that provides position information.
Definition: PositionProviderPlugin.h:26
Marble::FlightGearPositionProviderPlugin::initialize
virtual void initialize()
Definition: FlightGearPositionProviderPlugin.cpp:75
QByteArray::resize
void resize(int size)
Marble::FlightGearPositionProviderPlugin::description
virtual QString description() const
Returns a user description of the plugin.
Definition: FlightGearPositionProviderPlugin.cpp:53
QString::number
QString number(int n, int base)
QString::fromUtf8
QString fromUtf8(const char *str, int size)
QUdpSocket
Marble::FlightGearPositionProviderPlugin
Definition: FlightGearPositionProviderPlugin.h:20
Marble::FT2M
const qreal FT2M
Definition: MarbleGlobal.h:212
QUdpSocket::bind
bool bind(const QHostAddress &address, quint16 port)
Marble::FlightGearPositionProviderPlugin::pluginAuthors
virtual QList< PluginAuthor > pluginAuthors() const
Definition: FlightGearPositionProviderPlugin.cpp:63
Marble::PositionProviderPlugin::positionChanged
void positionChanged(GeoDataCoordinates position, GeoDataAccuracy accuracy) const
QString::startsWith
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const
Marble::FlightGearPositionProviderPlugin::guiString
virtual QString guiString() const
Returns the string that should appear in the user interface.
Definition: FlightGearPositionProviderPlugin.cpp:43
QDate::year
int year() const
QString
QList
Marble::FlightGearPositionProviderPlugin::accuracy
virtual GeoDataAccuracy accuracy() const
Definition: FlightGearPositionProviderPlugin.cpp:205
FlightGearPositionProviderPlugin.h
Marble::GeoDataCoordinates::set
void set(qreal lon, qreal lat, qreal alt=0, GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian)
(re)set the coordinates in a GeoDataCoordinates object
Definition: GeoDataCoordinates.cpp:657
Marble::FlightGearPositionProviderPlugin::~FlightGearPositionProviderPlugin
virtual ~FlightGearPositionProviderPlugin()
Definition: FlightGearPositionProviderPlugin.cpp:28
QUdpSocket::readDatagram
qint64 readDatagram(char *data, qint64 maxSize, QHostAddress *address, quint16 *port)
QStringList
Marble::FlightGearPositionProviderPlugin::timestamp
virtual QDateTime timestamp() const
Definition: FlightGearPositionProviderPlugin.cpp:220
Marble::FlightGearPositionProviderPlugin::status
virtual PositionProviderStatus status() const
Definition: FlightGearPositionProviderPlugin.cpp:195
Marble::PositionProviderStatus
PositionProviderStatus
Definition: PositionProviderPluginInterface.h:25
Q_EXPORT_PLUGIN2
#define Q_EXPORT_PLUGIN2(a, b)
Definition: marble_export.h:34
QList::end
iterator end()
QDateTime::fromString
QDateTime fromString(const QString &string, Qt::DateFormat format)
Marble::FlightGearPositionProviderPlugin::FlightGearPositionProviderPlugin
FlightGearPositionProviderPlugin()
Definition: FlightGearPositionProviderPlugin.cpp:23
Marble::FlightGearPositionProviderPlugin::isInitialized
virtual bool isInitialized() const
Definition: FlightGearPositionProviderPlugin.cpp:185
Marble::GeoDataAccuracy::Detailed
Definition: GeoDataAccuracy.h:32
QString::toLatin1
QByteArray toLatin1() const
QDateTime::date
QDate date() const
QLatin1String
Marble::FlightGearPositionProviderPlugin::direction
virtual qreal direction() const
Returns the direction in which the gps device is moving.
Definition: FlightGearPositionProviderPlugin.cpp:215
Marble::FlightGearPositionProviderPlugin::position
virtual GeoDataCoordinates position() const
Definition: FlightGearPositionProviderPlugin.cpp:200
QByteArray::data
char * data()
Marble::FlightGearPositionProviderPlugin::nameId
virtual QString nameId() const
Returns the unique name of the plugin.
Definition: FlightGearPositionProviderPlugin.cpp:38
Marble::FlightGearPositionProviderPlugin::copyrightYears
virtual QString copyrightYears() const
Definition: FlightGearPositionProviderPlugin.cpp:58
Marble::GeoDataAccuracy::level
Level level
Approximate descriptive accuracy.
Definition: GeoDataAccuracy.h:44
QString::fromLatin1
QString fromLatin1(const char *str, int size)
Marble::PositionProviderStatusAvailable
Definition: PositionProviderPluginInterface.h:29
QByteArray::size
int size() const
Marble::GeoDataAccuracy
Definition: GeoDataAccuracy.h:22
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QList::begin
iterator begin()
Marble::PositionProviderStatusAcquiring
Definition: PositionProviderPluginInterface.h:28
Marble::FlightGearPositionProviderPlugin::error
virtual QString error() const
Returns an error string to be presented to the user if the status is PositionProviderStatusError.
Definition: FlightGearPositionProviderPlugin.cpp:225
QIcon
QDateTime
QUdpSocket::pendingDatagramSize
qint64 pendingDatagramSize() const
Marble::FlightGearPositionProviderPlugin::newInstance
virtual PositionProviderPlugin * newInstance() const
Create a new PositionProvider Plugin and return it.
Definition: FlightGearPositionProviderPlugin.cpp:190
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:39 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal