Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgmoryes <gmoryes@gmail.com>2019-02-21 13:47:46 +0300
committerGitHub <noreply@github.com>2019-02-21 13:47:46 +0300
commitb209fc1c4695f2f7a722c510a1ffefd2f8452636 (patch)
treef5240f980e0ac2b99202f8481164ed5281abe300
parente2f8c8b96dcde16008b3cc1c8c90fc0c9bf12ea9 (diff)
parent9a94bec9b158c8b1e5a497b332b6aac0a8c38d30 (diff)
Merge pull request #10388 from bykoianko/master-fix-highlighting
[routing] Fix searching closest camera on route + highlighting
-rw-r--r--routing/routing_integration_tests/speed_camera_notifications_tests.cpp4
-rw-r--r--routing/speed_camera_manager.cpp82
-rw-r--r--routing/speed_camera_manager.hpp11
3 files changed, 33 insertions, 64 deletions
diff --git a/routing/routing_integration_tests/speed_camera_notifications_tests.cpp b/routing/routing_integration_tests/speed_camera_notifications_tests.cpp
index c3eece8670..1c7448144e 100644
--- a/routing/routing_integration_tests/speed_camera_notifications_tests.cpp
+++ b/routing/routing_integration_tests/speed_camera_notifications_tests.cpp
@@ -172,7 +172,6 @@ UNIT_TEST(SpeedCameraNotification_AutoAlwaysMode_3)
{
double const speedKmPH = 100.0;
ChangePosition({55.76766, 37.59260}, speedKmPH, routingSession);
- TEST(NoCameraFound(routingSession), ());
TEST(!CheckVoiceNotification(routingSession), ());
TEST(!CheckBeepSignal(routingSession), ());
}
@@ -208,7 +207,6 @@ UNIT_TEST(SpeedCameraNotification_AutoAlwaysMode_4)
{
double const speedKmPH = 100.0;
ChangePosition({55.65647, 37.53643}, speedKmPH, routingSession);
- TEST(NoCameraFound(routingSession), ());
TEST(!CheckVoiceNotification(routingSession), ());
TEST(!CheckBeepSignal(routingSession), ());
}
@@ -240,7 +238,6 @@ UNIT_TEST(SpeedCameraNotification_AutoAlwaysMode_5)
{
double const speedKmPH = 100.0;
ChangePosition({55.76766, 37.59260}, speedKmPH, routingSession);
- TEST(NoCameraFound(routingSession), ());
TEST(!CheckVoiceNotification(routingSession), ());
TEST(!CheckBeepSignal(routingSession), ());
}
@@ -386,7 +383,6 @@ UNIT_TEST(SpeedCameraNotification_AutoMode_1)
{
double const speedKmPH = 40.0;
ChangePosition({55.76476, 37.58905}, speedKmPH, routingSession);
- TEST(NoCameraFound(routingSession), ());
TEST(!CheckVoiceNotification(routingSession), ());
TEST(!CheckBeepSignal(routingSession), ());
}
diff --git a/routing/speed_camera_manager.cpp b/routing/speed_camera_manager.cpp
index de95cd92f3..a00f763a9e 100644
--- a/routing/speed_camera_manager.cpp
+++ b/routing/speed_camera_manager.cpp
@@ -4,6 +4,8 @@
#include "3party/Alohalytics/src/alohalytics.h"
+#include <cmath>
+
namespace routing
{
std::string const SpeedCameraManager::kSpeedCamModeKey = "speed_cam_mode";
@@ -51,9 +53,14 @@ void SpeedCameraManager::OnLocationPositionChanged(location::GpsInfo const & inf
{
distFromCurrentPosAndClosestCam = m_closestCamera.m_distFromBeginMeters - passedDistanceMeters;
if (distFromCurrentPosAndClosestCam < -kInfluenceZoneMeters)
+ {
m_closestCamera.Invalidate();
+ m_speedCamClearCallback();
+ }
else if (!m_closestCamera.NoSpeed())
+ {
m_speedLimitExceeded = IsSpeedHigh(distFromCurrentPosAndClosestCam, info.m_speedMpS, m_closestCamera);
+ }
}
// Step 2. Check cached cameras. Do it only after pass through closest camera.
@@ -63,24 +70,13 @@ void SpeedCameraManager::OnLocationPositionChanged(location::GpsInfo const & inf
// invalidate |closestSpeedCam|.
auto const closestSpeedCam = m_cachedSpeedCameras.front();
- bool needUpdateClosestCamera = false;
- auto const distToCamMeters = closestSpeedCam.m_distFromBeginMeters - passedDistanceMeters;
-
- if (closestSpeedCam.m_distFromBeginMeters + kInfluenceZoneMeters > passedDistanceMeters)
+ if (NeedToUpdateClosestCamera(passedDistanceMeters, info.m_speedMpS, closestSpeedCam))
{
- needUpdateClosestCamera =
- NeedUpdateClosestCamera(distToCamMeters, info.m_speedMpS, closestSpeedCam);
-
- if (needUpdateClosestCamera)
- {
- m_closestCamera = closestSpeedCam;
- ResetNotifications();
- m_cachedSpeedCameras.pop();
- }
+ m_closestCamera = closestSpeedCam;
+ ResetNotifications();
+ m_cachedSpeedCameras.pop();
+ PassClosestCameraToUI();
}
-
- if (NeedChangeHighlightedCamera(distToCamMeters, needUpdateClosestCamera))
- PassCameraToUI(closestSpeedCam);
}
if (m_closestCamera.IsValid() &&
@@ -89,19 +85,6 @@ void SpeedCameraManager::OnLocationPositionChanged(location::GpsInfo const & inf
// If some notifications available now.
SendNotificationStat(passedDistanceMeters, info.m_speedMpS, m_closestCamera);
}
-
- // Step 3. Check UI camera (stop or not stop to highlight it).
- if (!m_currentHighlightedCamera.IsValid())
- return;
-
- auto const distToCameraMeters =
- m_currentHighlightedCamera.m_distFromBeginMeters - passedDistanceMeters;
-
- if (IsHighlightedCameraExpired(distToCameraMeters))
- {
- m_speedCamClearCallback();
- m_currentHighlightedCamera.Invalidate();
- }
}
void SpeedCameraManager::GenerateNotifications(std::vector<std::string> & notifications)
@@ -155,7 +138,6 @@ void SpeedCameraManager::Reset()
m_speedCamClearCallback();
m_closestCamera.Invalidate();
- m_currentHighlightedCamera.Invalidate();
m_firstNotCheckedSpeedCameraIndex = 1;
m_cachedSpeedCameras = std::queue<SpeedCameraOnRoute>();
@@ -228,13 +210,12 @@ void SpeedCameraManager::FindCamerasOnRouteAndCache(double passedDistanceMeters)
m_firstNotCheckedSpeedCameraIndex = firstNotChecked;
}
-void SpeedCameraManager::PassCameraToUI(SpeedCameraOnRoute const & camera)
+void SpeedCameraManager::PassClosestCameraToUI()
{
+ CHECK(m_closestCamera.IsValid(), ("Attempt to show invalid speed cam"));
// Clear previous speed cam in UI.
m_speedCamClearCallback();
-
- m_currentHighlightedCamera = camera;
- m_speedCamShowCallback(camera.m_position, camera.m_maxSpeedKmH);
+ m_speedCamShowCallback(m_closestCamera.m_position, m_closestCamera.m_maxSpeedKmH);
}
bool SpeedCameraManager::IsSpeedHigh(double distanceToCameraMeters, double speedMpS,
@@ -243,7 +224,7 @@ bool SpeedCameraManager::IsSpeedHigh(double distanceToCameraMeters, double speed
if (camera.NoSpeed())
return distanceToCameraMeters < kInfluenceZoneMeters + kDistToReduceSpeedBeforeUnknownCameraM;
- double const distToDangerousZone = distanceToCameraMeters - kInfluenceZoneMeters;
+ double const distToDangerousZone = std::abs(distanceToCameraMeters) - kInfluenceZoneMeters;
if (distToDangerousZone < 0)
{
@@ -343,16 +324,19 @@ bool SpeedCameraManager::SetNotificationFlags(double passedDistanceMeters, doubl
UNREACHABLE();
}
-bool SpeedCameraManager::NeedUpdateClosestCamera(double distanceToCameraMeters, double speedMpS,
- SpeedCameraOnRoute const & camera)
+bool SpeedCameraManager::NeedToUpdateClosestCamera(double passedDistanceMeters, double speedMpS,
+ SpeedCameraOnRoute const & nextCamera)
{
- if (IsSpeedHigh(distanceToCameraMeters, speedMpS, camera))
- return true;
+ auto const distToNewCameraMeters = nextCamera.m_distFromBeginMeters - passedDistanceMeters;
+ if (m_closestCamera.IsValid())
+ {
+ auto const distToOldCameraMeters = m_closestCamera.m_distFromBeginMeters - passedDistanceMeters;
- if (m_mode == SpeedCameraManagerMode::Always && distanceToCameraMeters < kInfluenceZoneMeters)
- return true;
+ // If we passed the previous nextCamera and the next is close enough to work with it.
+ return distToOldCameraMeters < 0 && IsCameraCloseEnough(distToNewCameraMeters);
+ }
- return false;
+ return IsCameraCloseEnough(distToNewCameraMeters);
}
bool SpeedCameraManager::IsHighlightedCameraExpired(double distToCameraMeters) const
@@ -360,19 +344,9 @@ bool SpeedCameraManager::IsHighlightedCameraExpired(double distToCameraMeters) c
return distToCameraMeters < -kInfluenceZoneMeters;
}
-bool SpeedCameraManager::NeedChangeHighlightedCamera(double distToCameraMeters,
- bool needUpdateClosestCamera) const
+bool SpeedCameraManager::IsCameraCloseEnough(double distToCameraMeters) const
{
- if (needUpdateClosestCamera)
- return true;
-
- if (!m_currentHighlightedCamera.IsValid() &&
- -kInfluenceZoneMeters < distToCameraMeters && distToCameraMeters < kShowCameraDistanceM)
- {
- return true;
- }
-
- return false;
+ return -kInfluenceZoneMeters < distToCameraMeters && distToCameraMeters < kShowCameraDistanceM;
}
void SpeedCameraManager::SendNotificationStat(double passedDistanceMeters, double speedMpS,
diff --git a/routing/speed_camera_manager.hpp b/routing/speed_camera_manager.hpp
index 667cef3d07..9eaac07a00 100644
--- a/routing/speed_camera_manager.hpp
+++ b/routing/speed_camera_manager.hpp
@@ -134,13 +134,15 @@ private:
void FindCamerasOnRouteAndCache(double passedDistanceMeters);
- void PassCameraToUI(SpeedCameraOnRoute const & camera);
+ void PassClosestCameraToUI();
bool SetNotificationFlags(double passedDistanceMeters, double speedMpS, SpeedCameraOnRoute const & camera);
bool IsSpeedHigh(double distanceToCameraMeters, double speedMpS, SpeedCameraOnRoute const & camera) const;
- bool NeedUpdateClosestCamera(double distanceToCameraMeters, double speedMpS, SpeedCameraOnRoute const & camera);
- bool NeedChangeHighlightedCamera(double distToCameraMeters, bool needUpdateClosestCamera) const;
+
+ /// \brief Returns true if we should change |m_closestCamera| to |nextCamera|. False otherwise.
+ bool NeedToUpdateClosestCamera(double passedDistanceMeters, double speedMpS, SpeedCameraOnRoute const & nextCamera);
bool IsHighlightedCameraExpired(double distToCameraMeters) const;
+ bool IsCameraCloseEnough(double distToCameraMeters) const;
/// \brief Send stat to aloha.
void SendNotificationStat(double passedDistanceMeters, double speedMpS, SpeedCameraOnRoute const & camera);
@@ -168,9 +170,6 @@ private:
// Queue of speedCams, that we have found, but they are too far, to make warning about them.
std::queue<SpeedCameraOnRoute> m_cachedSpeedCameras;
- // Info about camera, that is highlighted now.
- SpeedCameraOnRoute m_currentHighlightedCamera;
-
size_t m_firstNotCheckedSpeedCameraIndex;
std::weak_ptr<Route> m_route;
turns::sound::NotificationManager & m_notificationManager;