| 230 | } |
| 231 | |
| 232 | bool SpeedCameraManager::IsSpeedHigh(double distanceToCameraMeters, double speedMpS, |
| 233 | SpeedCameraOnRoute const & camera) const |
| 234 | { |
| 235 | if (camera.NoSpeed()) |
| 236 | return distanceToCameraMeters < kInfluenceZoneMeters + kDistToReduceSpeedBeforeUnknownCameraM; |
| 237 | |
| 238 | double const distToDangerousZone = std::abs(distanceToCameraMeters) - kInfluenceZoneMeters; |
| 239 | |
| 240 | if (distToDangerousZone < 0) |
| 241 | { |
| 242 | if (distToDangerousZone < -kInfluenceZoneMeters) |
| 243 | return false; |
| 244 | |
| 245 | return speedMpS > measurement_utils::KmphToMps(camera.m_maxSpeedKmH); |
| 246 | } |
| 247 | |
| 248 | if (speedMpS < measurement_utils::KmphToMps(camera.m_maxSpeedKmH)) |
| 249 | return false; |
| 250 | |
| 251 | double timeToSlowSpeed = |
| 252 | (measurement_utils::KmphToMps(camera.m_maxSpeedKmH) - speedMpS) / kAverageAccelerationOfBraking; |
| 253 | |
| 254 | // Look to: https://en.wikipedia.org/wiki/Acceleration#Uniform_acceleration |
| 255 | // S = V_0 * t + at^2 / 2, where |
| 256 | // V_0 - current speed |
| 257 | // a - kAverageAccelerationOfBraking |
| 258 | double distanceNeedsToSlowDown = |
| 259 | timeToSlowSpeed * speedMpS + (kAverageAccelerationOfBraking * timeToSlowSpeed * timeToSlowSpeed) / 2; |
| 260 | distanceNeedsToSlowDown += kTimeForDecision * speedMpS; |
| 261 | |
| 262 | return distToDangerousZone < distanceNeedsToSlowDown + kDistanceEpsilonMeters; |
| 263 | } |
| 264 | |
| 265 | bool SpeedCameraManager::SetNotificationFlags(double passedDistanceMeters, double speedMpS, |
| 266 | SpeedCameraOnRoute const & camera) |