diff options
author | Roman Kuznetsov <r.kuznetsow@gmail.com> | 2016-12-07 11:51:35 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-07 11:51:35 +0300 |
commit | fce37cc9a0483aed41aaa15ad5b20ee64bd4c3e0 (patch) | |
tree | abfaa369bc072531bbc446bdd0bfab31a7e41bb5 | |
parent | aec4b2ccf5435d838f50fb5267bac66e99a30ac3 (diff) | |
parent | d57302b1bfe691b748176010d5a9e717435412d1 (diff) |
Merge pull request #4885 from darina/traffic-states-logic-fixbeta-515
Fixed traffic states logic.
-rw-r--r-- | drape_frontend/drape_engine.cpp | 14 | ||||
-rw-r--r-- | drape_frontend/drape_engine.hpp | 5 | ||||
-rw-r--r-- | drape_frontend/message_subclasses.hpp | 5 | ||||
-rw-r--r-- | map/traffic_manager.cpp | 114 |
4 files changed, 66 insertions, 72 deletions
diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 2c1f601a8d..44fcf5812c 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -542,13 +542,21 @@ void DrapeEngine::EnableTraffic(bool trafficEnabled) MessagePriority::Normal); } -void DrapeEngine::UpdateTraffic(TrafficSegmentsColoring const & segmentsColoring) +void DrapeEngine::UpdateTraffic(traffic::TrafficInfo const & info) { - if (segmentsColoring.empty()) + if (info.GetColoring().empty()) return; + df::TrafficSegmentsColoring segmentsColoring; + auto & mwmColoring = segmentsColoring[info.GetMwmId()]; + for (auto const & segmentPair : info.GetColoring()) + { + if (segmentPair.second != traffic::SpeedGroup::Unknown) + mwmColoring.insert(segmentPair); + } + m_threadCommutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - make_unique_dp<UpdateTrafficMessage>(segmentsColoring), + make_unique_dp<UpdateTrafficMessage>(move(segmentsColoring), false), MessagePriority::Normal); } diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index a4bce5e70a..b1ba5fc2bd 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -5,12 +5,13 @@ #include "drape_frontend/frontend_renderer.hpp" #include "drape_frontend/route_shape.hpp" #include "drape_frontend/selection_shape.hpp" -#include "drape_frontend/traffic_generator.hpp" #include "drape_frontend/threads_commutator.hpp" #include "drape/pointers.hpp" #include "drape/texture_manager.hpp" +#include "traffic/traffic_info.hpp" + #include "platform/location.hpp" #include "geometry/polyline2d.hpp" @@ -167,7 +168,7 @@ public: TRequestSymbolsSizeCallback const & callback); void EnableTraffic(bool trafficEnabled); - void UpdateTraffic(TrafficSegmentsColoring const & segmentsColoring); + void UpdateTraffic(traffic::TrafficInfo const & info); void ClearTrafficCache(MwmSet::MwmId const & mwmId); void SetFontScaleFactor(double scaleFactor); diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index 849dd70f7a..8a2d882ae9 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -1051,11 +1051,6 @@ private: class UpdateTrafficMessage : public Message { public: - explicit UpdateTrafficMessage(TrafficSegmentsColoring const & segmentsColoring) - : m_segmentsColoring(segmentsColoring) - , m_needInvalidate(false) - {} - UpdateTrafficMessage(TrafficSegmentsColoring && segmentsColoring, bool needInvalidate) : m_segmentsColoring(move(segmentsColoring)) , m_needInvalidate(needInvalidate) diff --git a/map/traffic_manager.cpp b/map/traffic_manager.cpp index 6d3110557f..797a1889b2 100644 --- a/map/traffic_manager.cpp +++ b/map/traffic_manager.cpp @@ -33,7 +33,7 @@ TrafficManager::CacheEntry::CacheEntry(time_point<steady_clock> const & requestT , m_dataSize(0) , m_lastRequestTime(requestTime) , m_retriesCount(0) - , m_isWaitingForResponse(false) + , m_isWaitingForResponse(true) , m_lastAvailability(traffic::TrafficInfo::Availability::Unknown) {} @@ -212,63 +212,54 @@ bool TrafficManager::WaitForRequest(vector<MwmSet::MwmId> & mwms) return false; if (timeout) - { - if (!IsEnabled() || IsInvalidState()) - return true; + RequestTrafficData(); - mwms.reserve(m_activeMwms.size()); - for (auto const & mwmId : m_activeMwms) - mwms.push_back(mwmId); - } - else - { - ASSERT(!m_requestedMwms.empty(), ()); + if (!m_requestedMwms.empty()) mwms.swap(m_requestedMwms); - } + return true; } -void TrafficManager::RequestTrafficData() +void TrafficManager::RequestTrafficData(MwmSet::MwmId const & mwmId) { - if (m_activeMwms.empty()) - return; - - for (auto const & mwmId : m_activeMwms) + bool needRequesting = false; + auto const currentTime = steady_clock::now(); + auto const it = m_mwmCache.find(mwmId); + if (it == m_mwmCache.end()) { - ASSERT(mwmId.IsAlive(), ()); - bool needRequesting = false; - - auto const currentTime = steady_clock::now(); - - auto it = m_mwmCache.find(mwmId); - if (it == m_mwmCache.end()) + needRequesting = true; + m_mwmCache.insert(make_pair(mwmId, CacheEntry(currentTime))); + } + else + { + it->second.m_lastSeenTime = currentTime; + auto const passedSeconds = currentTime - it->second.m_lastRequestTime; + if (passedSeconds >= kUpdateInterval) { needRequesting = true; - m_mwmCache.insert(make_pair(mwmId, CacheEntry(currentTime))); + it->second.m_isWaitingForResponse = true; + it->second.m_lastRequestTime = currentTime; } - else - { - it->second.m_lastSeenTime = currentTime; - auto const passedSeconds = currentTime - it->second.m_lastRequestTime; - if (passedSeconds >= kUpdateInterval) - { - needRequesting = true; - it->second.m_isWaitingForResponse = true; - it->second.m_lastRequestTime = currentTime; - } - } - - if (needRequesting) - RequestTrafficData(mwmId); } - UpdateState(); + if (needRequesting) + { + m_requestedMwms.push_back(mwmId); + m_condition.notify_one(); + UpdateState(); + } } -void TrafficManager::RequestTrafficData(MwmSet::MwmId const & mwmId) +void TrafficManager::RequestTrafficData() { - m_requestedMwms.push_back(mwmId); - m_condition.notify_one(); + if (m_activeMwms.empty() || !IsEnabled() || IsInvalidState()) + return; + + for (auto const & mwmId : m_activeMwms) + { + ASSERT(mwmId.IsAlive(), ()); + RequestTrafficData(mwmId); + } } void TrafficManager::OnTrafficRequestFailed(traffic::TrafficInfo && info) @@ -306,31 +297,30 @@ void TrafficManager::OnTrafficRequestFailed(traffic::TrafficInfo && info) void TrafficManager::OnTrafficDataResponse(traffic::TrafficInfo && info) { - lock_guard<mutex> lock(m_mutex); + { + lock_guard<mutex> lock(m_mutex); - auto it = m_mwmCache.find(info.GetMwmId()); - if (it == m_mwmCache.end()) - return; + auto it = m_mwmCache.find(info.GetMwmId()); + if (it == m_mwmCache.end()) + return; - it->second.m_isLoaded = true; - it->second.m_lastResponseTime = steady_clock::now(); - it->second.m_isWaitingForResponse = false; - it->second.m_lastAvailability = info.GetAvailability(); + it->second.m_isLoaded = true; + it->second.m_lastResponseTime = steady_clock::now(); + it->second.m_isWaitingForResponse = false; + it->second.m_lastAvailability = info.GetAvailability(); - // Update cache. - size_t constexpr kElementSize = sizeof(traffic::TrafficInfo::RoadSegmentId) + sizeof(traffic::SpeedGroup); + // Update cache. + size_t constexpr kElementSize = sizeof(traffic::TrafficInfo::RoadSegmentId) + sizeof(traffic::SpeedGroup); - size_t const dataSize = info.GetColoring().size() * kElementSize; - m_currentCacheSizeBytes += (dataSize - it->second.m_dataSize); - it->second.m_dataSize = dataSize; - CheckCacheSize(); + size_t const dataSize = info.GetColoring().size() * kElementSize; + m_currentCacheSizeBytes += (dataSize - it->second.m_dataSize); + it->second.m_dataSize = dataSize; + CheckCacheSize(); - // Update traffic colors for drape. - df::TrafficSegmentsColoring coloring; - coloring[info.GetMwmId()] = info.GetColoring(); - m_drapeEngine->UpdateTraffic(coloring); + UpdateState(); + } - UpdateState(); + m_drapeEngine->UpdateTraffic(info); // Update traffic colors for routing. m_observer.OnTrafficInfoAdded(move(info)); |