Emit a notification when turning on a ferry and don't merge step

This commit is contained in:
Patrick Niklaus 2017-04-06 20:50:59 +00:00 committed by Patrick Niklaus
parent e0593c7ca2
commit 4e9e2ed5bd
2 changed files with 41 additions and 21 deletions

View File

@ -687,21 +687,23 @@ Feature: Basic Roundabout
Scenario: Only Enter Scenario: Only Enter
Given the node map Given the node map
""" """
a a
b b
c e ~ ~ ~ f - h i c e ~ ~ ~ f - h
d j d
g k g
""" """
And the ways And the ways
| nodes | junction | route | | nodes | junction | route |
| ab | | | | ab | | |
| ef | | ferry | | ef | | ferry |
| fh | | | | fh | | |
| dg | | | | dg | | |
| bcdeb | roundabout | | | ic | | |
| jk | | |
| bcjdeb | roundabout | |
When I route I should get When I route I should get
| waypoints | route | turns | | waypoints | route | turns |
| a,h | ab,ef,fh | depart,roundabout-exit-2,arrive | | a,h | ab,ef,ef,fh,fh | depart,roundabout-exit-4,notification slight right,notification straight,arrive |

View File

@ -118,12 +118,14 @@ bool setUpRoundabout(RouteStep &step)
void closeOffRoundabout(const bool on_roundabout, void closeOffRoundabout(const bool on_roundabout,
std::vector<RouteStep> &steps, std::vector<RouteStep> &steps,
const std::size_t step_index) std::size_t step_index)
{ {
auto &step = steps[step_index]; auto &step = steps[step_index];
step.maneuver.exit += 1; step.maneuver.exit += 1;
if (!on_roundabout) if (!on_roundabout)
{ {
BOOST_ASSERT(steps.size() >= 2);
// We reached a special case that requires the addition of a special route step in the // We reached a special case that requires the addition of a special route step in the
// beginning. We started in a roundabout, so to announce the exit, we move use the exit // beginning. We started in a roundabout, so to announce the exit, we move use the exit
// instruction and move it right to the beginning to make sure to immediately announce the // instruction and move it right to the beginning to make sure to immediately announce the
@ -160,6 +162,23 @@ void closeOffRoundabout(const bool on_roundabout,
} }
} }
if (step_index > 1)
{
auto &exit_step = steps[step_index];
auto &prev_step = steps[step_index - 1];
// In case the step with the roundabout exit instruction cannot be merged with the
// previous step we change the instruction to a normal turn
if (!guidance::haveSameMode(exit_step, prev_step))
{
BOOST_ASSERT(leavesRoundabout(exit_step.maneuver.instruction));
prev_step.maneuver.instruction = exit_step.maneuver.instruction;
if (!entersRoundabout(prev_step.maneuver.instruction))
prev_step.maneuver.exit = exit_step.maneuver.exit;
exit_step.maneuver.instruction.type = TurnType::Notification;
step_index--;
}
}
// Normal exit from the roundabout, or exit from a previously fixed roundabout. Propagate the // Normal exit from the roundabout, or exit from a previously fixed roundabout. Propagate the
// index back to the entering location and prepare the current silent set of instructions for // index back to the entering location and prepare the current silent set of instructions for
// removal. // removal.
@ -170,6 +189,7 @@ void closeOffRoundabout(const bool on_roundabout,
const auto exit_intersection = steps[step_index].intersections.front(); const auto exit_intersection = steps[step_index].intersections.front();
const auto exit_bearing = exit_intersection.bearings[exit_intersection.out]; const auto exit_bearing = exit_intersection.bearings[exit_intersection.out];
const auto destination_copy = step; const auto destination_copy = step;
if (step_index > 1) if (step_index > 1)
{ {
// The very first route-step is head, so we cannot iterate past that one // The very first route-step is head, so we cannot iterate past that one
@ -177,8 +197,11 @@ void closeOffRoundabout(const bool on_roundabout,
--propagation_index) --propagation_index)
{ {
auto &propagation_step = steps[propagation_index]; auto &propagation_step = steps[propagation_index];
propagation_step.ElongateBy(steps[propagation_index + 1]); auto &next_step = steps[propagation_index + 1];
propagation_step.maneuver.exit = steps[propagation_index + 1].maneuver.exit; propagation_step.ElongateBy(next_step);
propagation_step.maneuver.exit = next_step.maneuver.exit;
next_step.Invalidate();
if (entersRoundabout(propagation_step.maneuver.instruction)) if (entersRoundabout(propagation_step.maneuver.instruction))
{ {
const auto entry_intersection = propagation_step.intersections.front(); const auto entry_intersection = propagation_step.intersections.front();
@ -206,13 +229,8 @@ void closeOffRoundabout(const bool on_roundabout,
} }
propagation_step.AdaptStepSignage(destination_copy); propagation_step.AdaptStepSignage(destination_copy);
steps[propagation_index + 1].Invalidate();
break; break;
} }
else
{
steps[propagation_index + 1].Invalidate();
}
} }
// remove exit // remove exit
} }