diff --git a/src/lib/marble/routing/Route.h b/src/lib/marble/routing/Route.h --- a/src/lib/marble/routing/Route.h +++ b/src/lib/marble/routing/Route.h @@ -30,6 +30,8 @@ const RouteSegment & at( int index ) const; + int indexOf(const RouteSegment &segment) const; + int size() const; const GeoDataLineString & path() const; diff --git a/src/lib/marble/routing/Route.cpp b/src/lib/marble/routing/Route.cpp --- a/src/lib/marble/routing/Route.cpp +++ b/src/lib/marble/routing/Route.cpp @@ -63,6 +63,11 @@ return m_segments[index]; } +int Route::indexOf(const RouteSegment &segment) const +{ + return m_segments.indexOf(segment); +} + const GeoDataLineString & Route::path() const { return m_path; diff --git a/src/lib/marble/routing/VoiceNavigationModel.cpp b/src/lib/marble/routing/VoiceNavigationModel.cpp --- a/src/lib/marble/routing/VoiceNavigationModel.cpp +++ b/src/lib/marble/routing/VoiceNavigationModel.cpp @@ -19,6 +19,18 @@ class VoiceNavigationModelPrivate { public: + + struct Announcement + { + bool announcementDone; + bool turnInstructionDone; + + Announcement(){ + announcementDone = false; + turnInstructionDone = false; + } + }; + VoiceNavigationModel* m_parent; QString m_speaker; @@ -33,6 +45,8 @@ qreal m_lastDistanceTraversed; + GeoDataLineString m_lastRoutePath; + Maneuver::Direction m_lastTurnType; GeoDataCoordinates m_lastTurnPoint; @@ -41,13 +55,12 @@ QString m_announcementText; - RouteSegment m_lastSegment; - RouteSegment m_secondLastSegment; - bool m_destinationReached; bool m_deviated; + QVector m_announcementList; + explicit VoiceNavigationModelPrivate( VoiceNavigationModel* parent ); void reset(); @@ -216,11 +229,7 @@ QString nextSegmentAnnouncementText = announcementText(nextSegmentDirection, nextSegmentDistance); m_announcementText += nextSegmentAnnouncementText != QString("") ? QString(", then ") + nextSegmentAnnouncementText : QString(""); } - if(segment.maneuver().instructionText() != m_secondLastSegment.maneuver().instructionText()){ - emit m_parent->instructionChanged(); - } - m_secondLastSegment = m_lastSegment; - m_lastSegment = segment; + emit m_parent->instructionChanged(); } void VoiceNavigationModelPrivate::updateInstruction( const QString &name ) @@ -323,6 +332,12 @@ void VoiceNavigationModel::update(const Route &route, qreal distanceManuever, qreal distanceTarget, bool deviated ) { + if (d->m_lastRoutePath != route.path()){ + d->m_announcementList.resize(0); + d->m_announcementList.resize(route.size()); + d->m_lastRoutePath = route.path(); + } + if ( d->m_destinationReached && distanceTarget < 250 ) { return; } @@ -351,13 +366,26 @@ d->reset(); } + int index = route.indexOf(route.currentSegment()); + qreal const distanceTraversed = route.currentSegment().distance() - distanceManuever; bool const minDistanceTraversed = d->m_lastDistanceTraversed < 40 && distanceTraversed >= 40; bool const announcementAfterTurn = minDistanceTraversed && distanceManuever >= 75; bool const announcement = ( d->m_lastDistance > 850 || announcementAfterTurn ) && distanceManuever <= 850; bool const turn = ( d->m_lastDistance == 0 || d->m_lastDistance > 75 ) && distanceManuever <= 75; - if ( announcement || turn ) { + + bool const announcementDone = d->m_announcementList[index].announcementDone; + bool const turnInstructionDone = d->m_announcementList[index].turnInstructionDone; + + if ( ( announcement && !announcementDone ) || ( turn && !turnInstructionDone ) ) { d->updateInstruction( route.currentSegment(), distanceManuever, turnType ); + VoiceNavigationModelPrivate::Announcement & curAnnouncement = d->m_announcementList[index]; + if (announcement){ + curAnnouncement.announcementDone = true; + } + if (turn){ + curAnnouncement.turnInstructionDone = true; + } } d->m_lastTurnType = turnType;