[routing] Simplify notifications on roundabout.

Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
This commit is contained in:
Viktor Govako
2025-08-17 09:52:36 -03:00
committed by Konstantin Pastbin
parent 836c39ff64
commit 1a6bbd756a
3 changed files with 16 additions and 33 deletions

View File

@@ -487,10 +487,11 @@ UNIT_TEST(TurnsSound_RoundaboutTurnTest)
// 620 meters till the 4th turn.
vector<TurnItemDist> const turns9 = {
{{25 /* idx */, CarDirection::EnterRoundAbout, 4 /* m_exitNum */}, 620. /* m_distMeters */},
{{30 /* idx */, CarDirection::LeaveRoundAbout, 4 /* m_exitNum */}, 665. /* m_distMeters */}};
{{30 /* idx */, CarDirection::LeaveRoundAbout, 4 /* m_exitNum */}, 1000. /* m_distMeters */}};
vector<string> const expectedNotification9 = {{"In 600 meters. Enter the roundabout."},
{"Then. Take the fourth exit."}};
notificationManager.GenerateTurnNotifications(turns9, turnNotifications);
notificationManager.GenerateTurnNotifications(turns9, turnNotifications,
routing::RouteSegment::RoadNameInfo("Main street"));
TEST_EQUAL(turnNotifications, expectedNotification9, ());
TEST_EQUAL(notificationManager.GetSecondTurnNotification(), CarDirection::LeaveRoundAbout, ());
}

View File

@@ -75,15 +75,15 @@ std::string NotificationManager::GenerateTurnText(uint32_t distanceUnits, uint8_
{
auto const lengthUnits = m_settings.GetLengthUnits();
if (turn.m_turn != CarDirection::None && turn.m_turn != CarDirection::EnterRoundAbout)
return m_getTtsText.GetTurnNotification(
{distanceUnits, exitNum, useThenInsteadOfDistance, turn.m_turn, lengthUnits, nextStreetInfo});
else if (turn.m_turn == CarDirection::EnterRoundAbout) // Don't include roundabout street name in TTS
return m_getTtsText.GetTurnNotification(
{distanceUnits, exitNum, useThenInsteadOfDistance, turn.m_turn, lengthUnits});
Notification notif{distanceUnits, exitNum, useThenInsteadOfDistance, turn.m_turn, lengthUnits};
if (turn.m_turn == CarDirection::None)
notif.m_turnDirPedestrian = turn.m_pedestrianTurn;
return m_getTtsText.GetTurnNotification(
{distanceUnits, exitNum, useThenInsteadOfDistance, turn.m_pedestrianTurn, lengthUnits, nextStreetInfo});
// https://github.com/organicmaps/organicmaps/issues/6146
if (turn.m_turn != CarDirection::EnterRoundAbout)
notif.m_nextStreetInfo = nextStreetInfo;
return m_getTtsText.GetTurnNotification(notif);
}
std::string NotificationManager::GenerateRecalculatingText() const
@@ -129,12 +129,14 @@ void NotificationManager::GenerateTurnNotifications(std::vector<TurnItemDist> co
double distBetweenTurnsMeters = secondTurn.m_distMeters - firstTurn.m_distMeters;
ASSERT_GREATER_OR_EQUAL(distBetweenTurnsMeters, 0, ());
if (distBetweenTurnsMeters > kSecondTurnThresholdDistM && !IsClassicEntranceToRoundabout(firstTurn, secondTurn))
bool const isRoundabout = IsClassicEntranceToRoundabout(firstTurn, secondTurn);
if (!isRoundabout && distBetweenTurnsMeters > kSecondTurnThresholdDistM)
return;
if ((distBetweenTurnsMeters < kDistanceNotifyThresholdM) || IsClassicEntranceToRoundabout(firstTurn, secondTurn))
if (distBetweenTurnsMeters < kDistanceNotifyThresholdM ||
(isRoundabout && distBetweenTurnsMeters < kSecondTurnThresholdDistM))
{
// distanceUnits is not used because "Then" is used
// Don't pronounce distance because of immediate "Then".
distBetweenTurnsMeters = 0;
}

View File

@@ -167,26 +167,6 @@ struct Notification
, m_lengthUnits(lengthUnits)
{}
Notification(uint32_t distanceUnits, uint8_t exitNum, bool useThenInsteadOfDistance,
PedestrianDirection turnDirPedestrian, measurement_utils::Units lengthUnits,
RouteSegment::RoadNameInfo const & nextStreetInfo)
: m_distanceUnits(distanceUnits)
, m_exitNum(exitNum)
, m_useThenInsteadOfDistance(useThenInsteadOfDistance)
, m_turnDirPedestrian(turnDirPedestrian)
, m_lengthUnits(lengthUnits)
, m_nextStreetInfo(nextStreetInfo)
{}
Notification(uint32_t distanceUnits, uint8_t exitNum, bool useThenInsteadOfDistance,
PedestrianDirection turnDirPedestrian, measurement_utils::Units lengthUnits)
: m_distanceUnits(distanceUnits)
, m_exitNum(exitNum)
, m_useThenInsteadOfDistance(useThenInsteadOfDistance)
, m_turnDirPedestrian(turnDirPedestrian)
, m_lengthUnits(lengthUnits)
{}
bool operator==(Notification const & rhv) const
{
return m_distanceUnits == rhv.m_distanceUnits && m_exitNum == rhv.m_exitNum &&