• 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
  • declarative
Navigation.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 2011 Dennis Nienhüser <earthwings@gentoo.org>
9 //
10 
11 #include "Navigation.h"
12 
13 #include "MarbleDeclarativeWidget.h"
14 #include "MarbleModel.h"
15 #include "routing/RoutingManager.h"
16 #include "routing/RoutingModel.h"
17 #include "PositionTracking.h"
18 #include "MarbleMath.h"
19 #include "AutoNavigation.h"
20 #include "routing/VoiceNavigationModel.h"
21 
22 class NavigationPrivate
23 {
24 public:
25  NavigationPrivate();
26 
27  MarbleWidget* m_marbleWidget;
28 
29  bool m_muted;
30 
31  Marble::RouteSegment m_currentSegment;
32 
33  Marble::AutoNavigation* m_autoNavigation;
34 
35  Marble::VoiceNavigationModel m_voiceNavigation;
36 
37  qreal m_nextInstructionDistance;
38 
39  qreal m_destinationDistance;
40 
41  Marble::RouteSegment nextRouteSegment();
42 
43  void updateNextInstructionDistance( const Marble::RoutingModel *model );
44 };
45 
46 NavigationPrivate::NavigationPrivate() :
47  m_marbleWidget( 0 ), m_muted( false ), m_autoNavigation( 0 ), m_nextInstructionDistance( 0.0 ),
48  m_destinationDistance( 0.0 )
49 {
50  // nothing to do
51 }
52 
53 void NavigationPrivate::updateNextInstructionDistance( const Marble::RoutingModel *model )
54 {
55  Marble::GeoDataCoordinates position = model->route().position();
56  Marble::GeoDataCoordinates interpolated = model->route().positionOnRoute();
57  Marble::GeoDataCoordinates onRoute = model->route().currentWaypoint();
58  qreal distance = Marble::EARTH_RADIUS * ( distanceSphere( position, interpolated ) + distanceSphere( interpolated, onRoute ) );
59  qreal remaining = 0.0;
60  const Marble::RouteSegment &segment = model->route().currentSegment();
61  for ( int i=0; i<segment.path().size(); ++i ) {
62  if ( segment.path()[i] == onRoute ) {
63  distance += segment.path().length( Marble::EARTH_RADIUS, i );
64  break;
65  }
66  }
67 
68  bool upcoming = false;
69  for ( int i=0; i<model->route().size(); ++i ) {
70  const Marble::RouteSegment &segment = model->route().at( i );
71 
72  if ( upcoming ) {
73  remaining += segment.path().length( Marble::EARTH_RADIUS );
74  }
75 
76  if ( segment == model->route().currentSegment() ) {
77  upcoming = true;
78  }
79  }
80 
81  m_nextInstructionDistance = distance;
82  m_destinationDistance = distance + remaining;
83 }
84 
85 Marble::RouteSegment NavigationPrivate::nextRouteSegment()
86 {
87  if ( m_marbleWidget ) {
88  // Not using m_currentSegment on purpose
89  return m_marbleWidget->model()->routingManager()->routingModel()->route().currentSegment().nextRouteSegment();
90  }
91 
92  return Marble::RouteSegment();
93 }
94 
95 Navigation::Navigation( QObject* parent) :
96  QObject( parent ), d( new NavigationPrivate )
97 {
98  connect( &d->m_voiceNavigation, SIGNAL(instructionChanged()), this, SIGNAL(voiceNavigationAnnouncementChanged()) );
99 }
100 
101 Navigation::~Navigation()
102 {
103  delete d;
104 }
105 
106 MarbleWidget *Navigation::map()
107 {
108  return d->m_marbleWidget;
109 }
110 
111 void Navigation::setMap( MarbleWidget* widget )
112 {
113  d->m_marbleWidget = widget;
114  if ( d->m_marbleWidget ) {
115  // Avoid the QWidget based warning
116  d->m_marbleWidget->model()->routingManager()->setShowGuidanceModeStartupWarning( false );
117  connect( d->m_marbleWidget->model()->routingManager()->routingModel(),
118  SIGNAL(positionChanged()), this, SLOT(update()) );
119 
120  d->m_autoNavigation = new Marble::AutoNavigation( d->m_marbleWidget->model(), d->m_marbleWidget->viewport(), this );
121  connect( d->m_autoNavigation, SIGNAL(zoomIn(FlyToMode)),
122  d->m_marbleWidget, SLOT(zoomIn()) );
123  connect( d->m_autoNavigation, SIGNAL(zoomOut(FlyToMode)),
124  d->m_marbleWidget, SLOT(zoomOut()) );
125  connect( d->m_autoNavigation, SIGNAL(centerOn(GeoDataCoordinates,bool)),
126  d->m_marbleWidget, SLOT(centerOn(GeoDataCoordinates)) );
127 
128  connect( d->m_marbleWidget, SIGNAL(visibleLatLonAltBoxChanged()),
129  d->m_autoNavigation, SLOT(inhibitAutoAdjustments()) );
130  connect( d->m_marbleWidget->model()->positionTracking(), SIGNAL(statusChanged(PositionProviderStatus)),
131  &d->m_voiceNavigation, SLOT(handleTrackingStatusChange(PositionProviderStatus)) );
132 
133  d->m_marbleWidget->model()->routingManager()->setAutoNavigation( d->m_autoNavigation );
134  }
135  emit mapChanged();
136 }
137 
138 bool Navigation::guidanceModeEnabled() const
139 {
140  return d->m_marbleWidget ? d->m_marbleWidget->model()->routingManager()->guidanceModeEnabled() : false;
141 }
142 
143 void Navigation::setGuidanceModeEnabled( bool enabled )
144 {
145  if ( d->m_marbleWidget ) {
146  d->m_marbleWidget->model()->routingManager()->setGuidanceModeEnabled( enabled );
147 
148  if ( enabled && !d->m_muted ) {
149  //d->m_audio.announceStart();
150  }
151  }
152 }
153 
154 bool Navigation::muted() const
155 {
156  return d->m_muted;
157 }
158 
159 void Navigation::setMuted(bool enabled)
160 {
161  d->m_muted = enabled;
162 }
163 
164 QString Navigation::nextInstructionText() const
165 {
166  return d->nextRouteSegment().maneuver().instructionText();
167 }
168 
169 QString Navigation::nextRoad() const
170 {
171  return d->nextRouteSegment().maneuver().roadName();
172 }
173 
174 QString Navigation::nextInstructionImage() const
175 {
176  switch ( d->nextRouteSegment().maneuver().direction() ) {
177  case Marble::Maneuver::Unknown: return "";
178  case Marble::Maneuver::Continue: return "qrc:/marble/turn-continue.svg";
179  case Marble::Maneuver::Merge: return "qrc:/marble/turn-merge.svg";
180  case Marble::Maneuver::Straight: return "qrc:/marble/turn-continue.svg";
181  case Marble::Maneuver::SlightRight: return "qrc:/marble/turn-slight-right.svg";
182  case Marble::Maneuver::Right: return "qrc:/marble/turn-right.svg";
183  case Marble::Maneuver::SharpRight: return "qrc:/marble/turn-sharp-right.svg";
184  case Marble::Maneuver::TurnAround: return "qrc:/marble/turn-around.svg";
185  case Marble::Maneuver::SharpLeft: return "qrc:/marble/turn-sharp-left.svg";
186  case Marble::Maneuver::Left: return "qrc:/marble/turn-left.svg";
187  case Marble::Maneuver::SlightLeft: return "qrc:/marble/turn-slight-left.svg";
188  case Marble::Maneuver::RoundaboutFirstExit: return "qrc:/marble/turn-roundabout-first.svg";
189  case Marble::Maneuver::RoundaboutSecondExit: return "qrc:/marble/turn-roundabout-second.svg";
190  case Marble::Maneuver::RoundaboutThirdExit: return "qrc:/marble/turn-roundabout-third.svg";
191  case Marble::Maneuver::RoundaboutExit: return "qrc:/marble/turn-roundabout-far.svg";
192  case Marble::Maneuver::ExitLeft: return "qrc:/marble/turn-exit-left.svg";
193  case Marble::Maneuver::ExitRight: return "qrc:/marble/turn-exit-right.svg";
194  }
195 
196  return "";
197 }
198 
199 qreal Navigation::nextInstructionDistance() const
200 {
201  return d->m_nextInstructionDistance;
202 }
203 
204 qreal Navigation::destinationDistance() const
205 {
206  return d->m_destinationDistance;
207 }
208 
209 QString Navigation::voiceNavigationAnnouncement() const
210 {
211  return d->m_voiceNavigation.instruction();
212 }
213 
214 QString Navigation::speaker() const
215 {
216  return d->m_voiceNavigation.speaker();
217 }
218 
219 void Navigation::setSpeaker( const QString &speaker )
220 {
221  d->m_voiceNavigation.setSpeaker( speaker );
222 }
223 
224 bool Navigation::soundEnabled() const
225 {
226  return !d->m_voiceNavigation.isSpeakerEnabled();
227 }
228 
229 void Navigation::setSoundEnabled( bool soundEnabled )
230 {
231  d->m_voiceNavigation.setSpeakerEnabled( !soundEnabled );
232 }
233 
234 bool Navigation::deviated() const
235 {
236  if ( d->m_marbleWidget ) {
237  Marble::RoutingModel const * model = d->m_marbleWidget->model()->routingManager()->routingModel();
238  return model->deviatedFromRoute();
239  }
240 
241  return true;
242 }
243 
244 void Navigation::update()
245 {
246  Marble::RoutingModel const * model = d->m_marbleWidget->model()->routingManager()->routingModel();
247  d->updateNextInstructionDistance( model );
248  emit nextInstructionDistanceChanged();
249  emit destinationDistanceChanged();
250  Marble::RouteSegment segment = model->route().currentSegment();
251  if ( !d->m_muted ) {
252  d->m_voiceNavigation.update( model->route(), d->m_nextInstructionDistance, d->m_destinationDistance, model->deviatedFromRoute() );
253  }
254  if ( segment != d->m_currentSegment ) {
255  d->m_currentSegment = segment;
256  emit nextInstructionTextChanged();
257  emit nextInstructionImageChanged();
258  emit nextRoadChanged();
259  }
260 }
261 
262 #include "Navigation.moc"
Marble::Maneuver::TurnAround
Definition: Maneuver.h:34
Marble::Maneuver::RoundaboutExit
Definition: Maneuver.h:41
Marble::GeoDataLineString::length
virtual qreal length(qreal planetRadius, int offset=0) const
Returns the length of LineString across a sphere starting from a coordinate in LineString This method...
Definition: GeoDataLineString.cpp:559
Navigation::setSoundEnabled
void setSoundEnabled(bool soundEnabled)
Definition: Navigation.cpp:229
Marble::GeoDataCoordinates
A 3d point representation.
Definition: GeoDataCoordinates.h:52
Marble::RoutingModel::deviatedFromRoute
bool deviatedFromRoute
Definition: RoutingModel.h:38
RoutingModel.h
VoiceNavigationModel.h
Navigation::nextInstructionTextChanged
void nextInstructionTextChanged()
Marble::Route::at
const RouteSegment & at(int index) const
Definition: Route.cpp:61
Navigation::nextInstructionDistance
qreal nextInstructionDistance() const
Marble::Maneuver::SharpRight
Definition: Maneuver.h:33
Navigation::deviated
bool deviated() const
Marble::RouteSegment::path
const GeoDataLineString & path() const
Definition: RouteSegment.cpp:43
MarbleMath.h
Marble::Route::position
GeoDataCoordinates position() const
Definition: Route.cpp:92
Navigation::nextInstructionImageChanged
void nextInstructionImageChanged()
MarbleDeclarativeWidget.h
Navigation::soundEnabled
bool soundEnabled() const
MarbleModel.h
This file contains the headers for MarbleModel.
Marble::GeoDataLineString::size
int size() const
Returns the number of nodes in a LineString.
Definition: GeoDataLineString.cpp:134
Marble::Route::size
int size() const
Definition: Route.cpp:56
Navigation::setMap
void setMap(MarbleWidget *widget)
Definition: Navigation.cpp:111
Marble::Maneuver::Left
Definition: Maneuver.h:36
Navigation.h
Marble::distanceSphere
qreal distanceSphere(qreal lon1, qreal lat1, qreal lon2, qreal lat2)
This method calculates the shortest distance between two points on a sphere.
Definition: MarbleMath.h:52
Marble::RoutingModel::route
const Route & route() const
Definition: RoutingModel.cpp:416
Marble::AutoNavigation
Definition: AutoNavigation.h:27
Navigation::map
MarbleWidget * map()
Navigation::destinationDistance
qreal destinationDistance() const
QObject
Marble::Maneuver::ExitRight
Definition: Maneuver.h:43
Marble::Maneuver::Straight
Definition: Maneuver.h:30
Marble::VoiceNavigationModel
Definition: VoiceNavigationModel.h:27
Navigation::nextInstructionDistanceChanged
void nextInstructionDistanceChanged()
Navigation::setMuted
void setMuted(bool enabled)
Definition: Navigation.cpp:159
Marble::Maneuver::Right
Definition: Maneuver.h:32
Navigation::voiceNavigationAnnouncement
QString voiceNavigationAnnouncement() const
Marble::Maneuver::RoundaboutFirstExit
Definition: Maneuver.h:38
RoutingManager.h
Marble::EARTH_RADIUS
const qreal EARTH_RADIUS
Definition: MarbleGlobal.h:238
Navigation::guidanceModeEnabled
bool guidanceModeEnabled() const
AutoNavigation.h
Navigation::nextInstructionImage
QString nextInstructionImage() const
Navigation::speaker
QString speaker() const
Marble::Maneuver::SlightRight
Definition: Maneuver.h:31
Navigation::Navigation
Navigation(QObject *parent=0)
Definition: Navigation.cpp:95
Navigation::~Navigation
~Navigation()
Definition: Navigation.cpp:101
Marble::PositionProviderStatus
PositionProviderStatus
Definition: PositionProviderPluginInterface.h:25
Marble::Route::currentSegment
const RouteSegment & currentSegment() const
Definition: Route.cpp:128
Marble::RouteSegment::nextRouteSegment
const RouteSegment & nextRouteSegment() const
Definition: RouteSegment.cpp:72
Marble::RoutingModel
Definition: RoutingModel.h:34
Marble::Maneuver::Continue
Definition: Maneuver.h:28
Marble::FlyToMode
FlyToMode
Describes possible flight mode (interpolation between source and target camera positions) ...
Definition: MarbleGlobal.h:169
Navigation::mapChanged
void mapChanged()
Marble::Maneuver::RoundaboutThirdExit
Definition: Maneuver.h:40
Navigation::destinationDistanceChanged
void destinationDistanceChanged()
Marble::Route::positionOnRoute
GeoDataCoordinates positionOnRoute() const
Definition: Route.cpp:142
Marble::Route::currentWaypoint
GeoDataCoordinates currentWaypoint() const
Definition: Route.cpp:151
Marble::Maneuver::Merge
Definition: Maneuver.h:29
Marble::Maneuver::SlightLeft
Definition: Maneuver.h:37
Marble::Maneuver::Unknown
Definition: Maneuver.h:27
MarbleWidget
Wraps a Marble::MarbleWidget, providing access to important properties and methods.
Definition: MarbleDeclarativeWidget.h:50
Navigation::nextRoad
QString nextRoad() const
Navigation::nextRoadChanged
void nextRoadChanged()
PositionTracking.h
Marble::RouteSegment
Definition: RouteSegment.h:23
Navigation::setGuidanceModeEnabled
void setGuidanceModeEnabled(bool enabled)
Definition: Navigation.cpp:143
Marble::Maneuver::SharpLeft
Definition: Maneuver.h:35
Navigation::voiceNavigationAnnouncementChanged
void voiceNavigationAnnouncementChanged()
Marble::Maneuver::RoundaboutSecondExit
Definition: Maneuver.h:39
Navigation::muted
bool muted() const
Navigation::nextInstructionText
QString nextInstructionText() const
Navigation::setSpeaker
void setSpeaker(const QString &speaker)
Definition: Navigation.cpp:219
Marble::Maneuver::ExitLeft
Definition: Maneuver.h:42
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:51 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