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:
authorRoman Kuznetsov <r.kuznetsow@gmail.com>2016-12-07 11:51:35 +0300
committerGitHub <noreply@github.com>2016-12-07 11:51:35 +0300
commitfce37cc9a0483aed41aaa15ad5b20ee64bd4c3e0 (patch)
treeabfaa369bc072531bbc446bdd0bfab31a7e41bb5
parentaec4b2ccf5435d838f50fb5267bac66e99a30ac3 (diff)
parentd57302b1bfe691b748176010d5a9e717435412d1 (diff)
Merge pull request #4885 from darina/traffic-states-logic-fixbeta-515
Fixed traffic states logic.
-rw-r--r--drape_frontend/drape_engine.cpp14
-rw-r--r--drape_frontend/drape_engine.hpp5
-rw-r--r--drape_frontend/message_subclasses.hpp5
-rw-r--r--map/traffic_manager.cpp114
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));