From d54a55c12b5bb8654702d47cfe5eae0c727608f2 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Mon, 11 Aug 2014 20:29:15 +0200 Subject: [PATCH 1/2] implements announcement of waypoints, closes #584 --- DataStructures/RawRouteData.h | 5 +++++ DataStructures/TurnInstructions.h | 2 +- Descriptors/DescriptionFactory.cpp | 10 ++++++++-- Descriptors/DescriptionFactory.h | 2 +- Descriptors/JSONDescriptor.h | 8 +++++--- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/DataStructures/RawRouteData.h b/DataStructures/RawRouteData.h index e034b43bc..f799841b2 100644 --- a/DataStructures/RawRouteData.h +++ b/DataStructures/RawRouteData.h @@ -69,6 +69,11 @@ struct RawRouteData int shortest_path_length; int alternative_path_length; + bool is_via_leg(const std::size_t leg) const + { + return (leg != unpacked_path_segments.size() - 1); + } + RawRouteData() : check_sum(SPECIAL_NODEID), shortest_path_length(INVALID_EDGE_WEIGHT), diff --git a/DataStructures/TurnInstructions.h b/DataStructures/TurnInstructions.h index 61de3b11b..611b574dd 100644 --- a/DataStructures/TurnInstructions.h +++ b/DataStructures/TurnInstructions.h @@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. enum class TurnInstruction : unsigned char { NoTurn = 0, GoStraight, TurnSlightRight, TurnRight, TurnSharpRight, UTurn, - TurnSharpLeft, TurnLeft, TurnSlightLeft, ReachViaPoint, HeadOn, EnterRoundAbout, + TurnSharpLeft, TurnLeft, TurnSlightLeft, ReachViaLocation, HeadOn, EnterRoundAbout, LeaveRoundAbout, StayOnRoundAbout, StartAtEndOfStreet, ReachedYourDestination, EnterAgainstAllowedDirection, LeaveAgainstAllowedDirection, InverseAccessRestrictionFlag = 127, diff --git a/Descriptors/DescriptionFactory.cpp b/Descriptors/DescriptionFactory.cpp index 2d66cc197..2ed10ede5 100644 --- a/Descriptors/DescriptionFactory.cpp +++ b/Descriptors/DescriptionFactory.cpp @@ -50,13 +50,19 @@ void DescriptionFactory::SetStartSegment(const PhantomNode &source, const bool t BOOST_ASSERT(path_description.back().duration == segment_duration); } -void DescriptionFactory::SetEndSegment(const PhantomNode &target, const bool traversed_in_reverse) +void DescriptionFactory::SetEndSegment(const PhantomNode &target, const bool traversed_in_reverse, const bool is_via_location) { target_phantom = target; const EdgeWeight segment_duration = (traversed_in_reverse ? target.reverse_weight : target.forward_weight); path_description.emplace_back( - target.location, target.name_id, segment_duration, 0.f, TurnInstruction::NoTurn, true, true); + target.location, + target.name_id, + segment_duration, + 0.f, + is_via_location ? TurnInstruction::ReachViaLocation : TurnInstruction::NoTurn, + true, + true); BOOST_ASSERT(path_description.back().duration == segment_duration); } diff --git a/Descriptors/DescriptionFactory.h b/Descriptors/DescriptionFactory.h index d081bae88..96f7537eb 100644 --- a/Descriptors/DescriptionFactory.h +++ b/Descriptors/DescriptionFactory.h @@ -80,7 +80,7 @@ class DescriptionFactory void AppendSegment(const FixedPointCoordinate &coordinate, const PathData &data); void BuildRouteSummary(const double distance, const unsigned time); void SetStartSegment(const PhantomNode &start_phantom, const bool traversed_in_reverse); - void SetEndSegment(const PhantomNode &start_phantom, const bool traversed_in_reverse); + void SetEndSegment(const PhantomNode &start_phantom, const bool traversed_in_reverse, const bool is_via_location = false); JSON::Value AppendEncodedPolylineString(const bool return_encoded); std::vector const & GetViaIndices() const; diff --git a/Descriptors/JSONDescriptor.h b/Descriptors/JSONDescriptor.h index 7164ead65..6b35157f4 100644 --- a/Descriptors/JSONDescriptor.h +++ b/Descriptors/JSONDescriptor.h @@ -76,7 +76,8 @@ template class JSONDescriptor : public BaseDescriptor route_leg, const PhantomNodes &leg_phantoms, - const bool target_traversed_in_reverse) + const bool target_traversed_in_reverse, + const bool is_via_leg) { unsigned added_element_count = 0; // Get all the coordinates for the computed route @@ -87,7 +88,7 @@ template class JSONDescriptor : public BaseDescriptor class JSONDescriptor : public BaseDescriptor Date: Tue, 12 Aug 2014 09:27:17 +0200 Subject: [PATCH 2/2] Adapt test cases to output of way points - waypoints are now announced in the route guidance - implements #584 --- features/testbot/loop.feature | 6 +++--- features/testbot/uturn.feature | 6 +++--- features/testbot/via.feature | 24 ++++++++++++------------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/features/testbot/loop.feature b/features/testbot/loop.feature index eb5b45e66..ac9ae30ff 100644 --- a/features/testbot/loop.feature +++ b/features/testbot/loop.feature @@ -73,6 +73,6 @@ Feature: Avoid weird loops caused by rounding errors | cf | secondary | When I route I should get - | waypoints | route | turns | - | a,2,d | ab,be,ef,cf,cd | head,left,right,right,left,destination | - | a,1,d | ab,be,ef,cf,cd | head,left,right,right,left,destination | + | waypoints | route | turns | + | a,2,d | ab,be,ef,ef,cf,cd | head,left,right,via,right,left,destination | + | a,1,d | ab,be,ef,ef,cf,cd | head,left,right,via,right,left,destination | diff --git a/features/testbot/uturn.feature b/features/testbot/uturn.feature index 0056f023b..aa81fc284 100644 --- a/features/testbot/uturn.feature +++ b/features/testbot/uturn.feature @@ -21,7 +21,7 @@ Feature: U-turns at via points When I route I should get | waypoints | route | turns | - | a,e,c | ab,be,ef,fg,dg,cd | head,right,left,straight,left,left,destination | + | a,e,c | ab,be,be,ef,fg,dg,cd | head,right,via,left,straight,left,left,destination | Scenario: Query param to allow U-turns at all via points Given the node map @@ -42,8 +42,8 @@ Feature: U-turns at via points | fg | When I route I should get - | waypoints | route | - | a,e,c | ab,be,bc | + | waypoints | route | + | a,e,c | ab,be,be,bc | @todo Scenario: Instructions at via points at u-turns diff --git a/features/testbot/via.feature b/features/testbot/via.feature index 79fe54090..9eb8f556e 100644 --- a/features/testbot/via.feature +++ b/features/testbot/via.feature @@ -13,9 +13,9 @@ Feature: Via points | abc | When I route I should get - | waypoints | route | - | a,b,c | abc | - | c,b,a | abc | + | waypoints | route | + | a,b,c | abc,abc | + | c,b,a | abc,abc | Scenario: Via point at a dead end Given the node map @@ -28,9 +28,9 @@ Feature: Via points | bd | When I route I should get - | waypoints | route | - | a,d,c | abc,bd,bd,abc | - | c,d,a | abc,bd,bd,abc | + | waypoints | route | + | a,d,c | abc,bd,bd,bd,abc | + | c,d,a | abc,bd,bd,bd,abc | Scenario: Multiple via points Given the node map @@ -48,9 +48,9 @@ Feature: Via points | dh | When I route I should get - | waypoints | route | - | a,c,f | ab,bcd,de,efg | - | a,c,f,h | ab,bcd,de,efg,gh | + | waypoints | route | + | a,c,f | ab,bcd,bcd,de,efg | + | a,c,f,h | ab,bcd,bcd,de,efg,efg,gh | Scenario: Via points on ring of oneways # xa it to avoid only having a single ring, which cna trigger edge cases @@ -73,9 +73,9 @@ Feature: Via points | waypoints | route | distance | turns | | 1,3 | ab,bc,cd | 400m +-1 | head,straight,straight,destination | | 3,1 | cd,de,ef,fa,ab | 1000m +-1 | head,right,right,right,right,destination | - | 1,2,3 | ab,bc,cd | 400m +-1 | head,straight,straight,destination | - | 1,3,2 | ab,bc,cd,de,ef,fa,ab,bc | 1600m +-1 | head,straight,straight,right,right,right,right,straight,destination | - | 3,2,1 | cd,de,ef,fa,ab,bc,cd,de,ef,fa,ab | 2400m +-1 | head,right,right,right,right,straight,straight,right,right,right,right,destination | + | 1,2,3 | ab,bc,bc,cd | 400m +-1 | head,straight,via,straight,destination | + | 1,3,2 | ab,bc,cd,cd,de,ef,fa,ab,bc | 1600m +-1 | head,straight,straight,via,right,right,right,right,straight,destination | + | 3,2,1 | cd,de,ef,fa,ab,bc,bc,cd,de,ef,fa,ab | 2400m +-1 | head,right,right,right,right,straight,via,straight,right,right,right,right,destination | @bug Scenario: Via points on ring on the same oneway