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

marble

  • sources
  • kde-4.12
  • 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  foreach(QByteArray line, datagram.split('\n')) {
122  fixBadGPRMC(line);
123  //qDebug() << line;
124  line.append( "\n" );
125  parseNmeaSentence( line );
126  }
127  }
128 }
129 
130 void FlightGearPositionProviderPlugin::parseNmeaSentence( const QString &sentence )
131 {
132  PositionProviderStatus oldStatus = m_status;
133  GeoDataCoordinates oldPosition = m_position;
134 
135  if ( sentence.startsWith( QLatin1String( "$GPRMC" ) ) ) {
136  QStringList const values = sentence.split( ',' );
137  if ( values.size() > 9 ) {
138  if ( values[2] == "A" ) {
139  m_speed = values[7].toDouble() * 0.514444; // knots => m/s
140  m_track = values[8].toDouble();
141  QString const date = values[9] + ' ' + values[1];
142  m_timestamp = QDateTime::fromString( date, "ddMMyy HHmmss" );
143  if (m_timestamp.date().year() <= 1930 && m_timestamp.date().year() >= 1900 ) {
144  m_timestamp = m_timestamp.addYears( 100 ); // Qt range is 1900-1999 for two-digits
145  }
146  }
147  // Flightgear submits geoposition twice in one datagram, once
148  // in GPRMC and once in GPGGA. Parsing one is sufficient
149  }
150  } else if ( sentence.startsWith( QLatin1String( "$GPGGA" ) ) ) {
151  QStringList const values = sentence.split( ',' );
152  if ( values.size() > 10 ) {
153  if ( values[6] == 0 ) {
154  m_status = PositionProviderStatusUnavailable; // no fix
155  } else {
156  double const lat = parsePosition( values[2], values[3] == "S" );
157  double const lon = parsePosition( values[4], values[5] == "W" );
158  double const unitFactor = values[10] == "F" ? FT2M : 1.0;
159  double const alt = unitFactor * values[9].toDouble();
160  m_position.set( lon, lat, alt, GeoDataCoordinates::Degree );
161  m_accuracy.level = GeoDataAccuracy::Detailed;
162  m_status = PositionProviderStatusAvailable;
163  }
164  }
165  } else {
166  return;
167  }
168 
169  if ( m_status != oldStatus ) {
170  emit statusChanged( m_status );
171  }
172  if ( m_position != oldPosition && m_status == PositionProviderStatusAvailable ) {
173  emit positionChanged( m_position, m_accuracy );
174  }
175 }
176 
177 double FlightGearPositionProviderPlugin::parsePosition( const QString &value, bool isNegative ) const
178 {
179  double pos = value.toDouble();
180  pos = int( pos / 100.0 ) + ( pos - 100.0 * int( pos / 100.0 ) ) / 60.0;
181  return isNegative ? -qAbs( pos ) : pos;
182 }
183 
184 bool FlightGearPositionProviderPlugin::isInitialized() const
185 {
186  return m_socket;
187 }
188 
189 PositionProviderPlugin* FlightGearPositionProviderPlugin::newInstance() const
190 {
191  return new FlightGearPositionProviderPlugin;
192 }
193 
194 PositionProviderStatus FlightGearPositionProviderPlugin::status() const
195 {
196  return m_status;
197 }
198 
199 GeoDataCoordinates FlightGearPositionProviderPlugin::position() const
200 {
201  return m_position;
202 }
203 
204 GeoDataAccuracy FlightGearPositionProviderPlugin::accuracy() const
205 {
206  return m_accuracy;
207 }
208 
209 qreal FlightGearPositionProviderPlugin::speed() const
210 {
211  return m_speed;
212 }
213 
214 qreal FlightGearPositionProviderPlugin::direction() const
215 {
216  return m_track;
217 }
218 
219 QDateTime FlightGearPositionProviderPlugin::timestamp() const
220 {
221  return m_timestamp;
222 }
223 
224 QString FlightGearPositionProviderPlugin::error() const
225 {
226  return QString();
227 }
228 
229 Q_EXPORT_PLUGIN2( FlightGearPositionProviderPlugin, Marble::FlightGearPositionProviderPlugin )
230 
231 #include "FlightGearPositionProviderPlugin.moc"
Marble::GeoDataCoordinates
A 3d point representation.
Definition: GeoDataCoordinates.h:52
Marble::FlightGearPositionProviderPlugin::name
virtual QString name() const
Returns the user-visible name of the plugin.
Definition: FlightGearPositionProviderPlugin.cpp:33
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
Marble::FlightGearPositionProviderPlugin::speed
virtual qreal speed() const
Returns the speed of the gps device in meters per second.
Definition: FlightGearPositionProviderPlugin.cpp:209
Marble::FlightGearPositionProviderPlugin::icon
virtual QIcon icon() const
Returns an icon for the plugin.
Definition: FlightGearPositionProviderPlugin.cpp:70
Marble::PluginAuthor
Definition: PluginInterface.h:28
Marble::FlightGearPositionProviderPlugin::version
virtual QString version() const
Definition: FlightGearPositionProviderPlugin.cpp:48
MarbleDebug.h
Marble::PositionProviderStatusUnavailable
Definition: PositionProviderPluginInterface.h:27
Marble::GeoDataCoordinates::Degree
Definition: GeoDataCoordinates.h:66
Marble::PositionProviderPlugin
The abstract class that provides position information.
Definition: PositionProviderPlugin.h:26
Marble::FlightGearPositionProviderPlugin::initialize
virtual void initialize()
Definition: FlightGearPositionProviderPlugin.cpp:75
Marble::FlightGearPositionProviderPlugin::description
virtual QString description() const
Returns a user description of the plugin.
Definition: FlightGearPositionProviderPlugin.cpp:53
Marble::FlightGearPositionProviderPlugin
Definition: FlightGearPositionProviderPlugin.h:20
Marble::FT2M
const qreal FT2M
Definition: MarbleGlobal.h:193
Marble::FlightGearPositionProviderPlugin::pluginAuthors
virtual QList< PluginAuthor > pluginAuthors() const
Definition: FlightGearPositionProviderPlugin.cpp:63
Marble::PositionProviderPlugin::positionChanged
void positionChanged(GeoDataCoordinates position, GeoDataAccuracy accuracy) const
Marble::FlightGearPositionProviderPlugin::guiString
virtual QString guiString() const
Returns the string that should appear in the user interface.
Definition: FlightGearPositionProviderPlugin.cpp:43
Marble::FlightGearPositionProviderPlugin::accuracy
virtual GeoDataAccuracy accuracy() const
Definition: FlightGearPositionProviderPlugin.cpp:204
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
Marble::FlightGearPositionProviderPlugin::timestamp
virtual QDateTime timestamp() const
Definition: FlightGearPositionProviderPlugin.cpp:219
Marble::FlightGearPositionProviderPlugin::status
virtual PositionProviderStatus status() const
Definition: FlightGearPositionProviderPlugin.cpp:194
Marble::PositionProviderStatus
PositionProviderStatus
Definition: PositionProviderPluginInterface.h:25
Q_EXPORT_PLUGIN2
#define Q_EXPORT_PLUGIN2(a, b)
Definition: marble_export.h:34
Marble::FlightGearPositionProviderPlugin::FlightGearPositionProviderPlugin
FlightGearPositionProviderPlugin()
Definition: FlightGearPositionProviderPlugin.cpp:23
Marble::FlightGearPositionProviderPlugin::isInitialized
virtual bool isInitialized() const
Definition: FlightGearPositionProviderPlugin.cpp:184
Marble::GeoDataAccuracy::Detailed
Definition: GeoDataAccuracy.h:32
Marble::FlightGearPositionProviderPlugin::direction
virtual qreal direction() const
Returns the direction in which the gps device is moving.
Definition: FlightGearPositionProviderPlugin.cpp:214
Marble::FlightGearPositionProviderPlugin::position
virtual GeoDataCoordinates position() const
Definition: FlightGearPositionProviderPlugin.cpp:199
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:42
Marble::PositionProviderStatusAvailable
Definition: PositionProviderPluginInterface.h:29
Marble::GeoDataAccuracy
Definition: GeoDataAccuracy.h:22
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:224
Marble::FlightGearPositionProviderPlugin::newInstance
virtual PositionProviderPlugin * newInstance() const
Create a new PositionProvider Plugin and return it.
Definition: FlightGearPositionProviderPlugin.cpp:189
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:49 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
  • kstars
  • libkdeedu
  •   keduvocdocument
  • 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