diff options
-rw-r--r-- | android/jni/com/mapswithme/maps/Framework.cpp | 45 | ||||
-rw-r--r-- | android/jni/com/mapswithme/maps/Framework.hpp | 2 | ||||
-rw-r--r-- | android/jni/com/mapswithme/maps/LocationState.cpp | 19 | ||||
-rw-r--r-- | android/jni/com/mapswithme/maps/MWMActivity.cpp | 39 | ||||
-rw-r--r-- | android/src/com/mapswithme/maps/DownloadResourcesActivity.java | 2 | ||||
-rw-r--r-- | android/src/com/mapswithme/maps/Framework.java | 6 | ||||
-rw-r--r-- | android/src/com/mapswithme/maps/LocationState.java | 12 | ||||
-rw-r--r-- | android/src/com/mapswithme/maps/MWMActivity.java | 31 | ||||
-rw-r--r-- | android/src/com/mapswithme/maps/SearchActivity.java | 5 | ||||
-rw-r--r-- | android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java | 4 | ||||
-rw-r--r-- | android/src/com/mapswithme/maps/location/LocationService.java | 28 | ||||
-rw-r--r-- | iphone/Maps/Classes/MapViewController.mm | 22 | ||||
-rw-r--r-- | iphone/Maps/Classes/PlacePageView.mm | 5 | ||||
-rw-r--r-- | iphone/Maps/Platform/LocationManager.mm | 52 | ||||
-rw-r--r-- | map/framework.cpp | 102 | ||||
-rw-r--r-- | map/framework.hpp | 5 | ||||
-rw-r--r-- | map/location_state.cpp | 5 | ||||
-rw-r--r-- | platform/location.hpp | 40 |
18 files changed, 255 insertions, 169 deletions
diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index 8683f15d90..9e048c9409 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -70,14 +70,8 @@ namespace android Platform::RunOnGuiThreadImpl(bind(&::Framework::OnLocationUpdate, ref(m_work), info)); } - void Framework::OnCompassUpdated(uint64_t timestamp, double magneticNorth, double trueNorth, double accuracy) + void Framework::OnCompassUpdated(location::CompassInfo const & info) { - location::CompassInfo info; - info.m_timestamp = static_cast<double>(timestamp); - info.m_magneticHeading = magneticNorth; - info.m_trueHeading = trueNorth; - info.m_accuracy = accuracy; - Platform::RunOnGuiThreadImpl(bind(&::Framework::OnCompassUpdate, ref(m_work), info)); } @@ -1130,20 +1124,43 @@ extern "C" } JNIEXPORT jobject JNICALL + Java_com_mapswithme_maps_Framework_nativeGetRouteFollowingInfo(JNIEnv * env, jclass thiz) + { + ::Framework * frm = g_framework->NativeFramework(); + + if (frm->IsRoutingActive()) + { + location::FollowingInfo info; + frm->GetRouteFollowingInfo(info); + + if (info.IsValid()) + { + jclass klass = env->FindClass("com/mapswithme/maps/LocationState$RoutingInfo"); + jmethodID methodID = env->GetMethodID(klass, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V"); + + return env->NewObject(klass, methodID, + jni::ToJavaString(env, info.m_distToTarget), + jni::ToJavaString(env, info.m_unitsSuffix)); + } + } + + return 0; + } + + JNIEXPORT jobject JNICALL Java_com_mapswithme_maps_Framework_nativeGetMapObjectForPoint(JNIEnv * env, jclass clazz, jdouble lat, jdouble lon) { search::AddressInfo info; g_framework->NativeFramework()->GetAddressInfoForGlobalPoint(MercatorBounds::FromLatLon(lat, lon), info); - jclass objClazz = env->FindClass("com/mapswithme/maps/bookmarks/data/MapObject$Poi"); - jmethodID methodID = env->GetMethodID(objClazz, - "<init>", "(Ljava/lang/String;DDLjava/lang/String;)V"); - - const jstring j_name = jni::ToJavaString(env, info.GetPinName()); - const jstring j_type = jni::ToJavaString(env, info.GetPinType()); + jclass klass = env->FindClass("com/mapswithme/maps/bookmarks/data/MapObject$Poi"); + jmethodID methodID = env->GetMethodID(klass, "<init>", "(Ljava/lang/String;DDLjava/lang/String;)V"); - return env->NewObject(objClazz, methodID, j_name, lat, lon, j_type); + return env->NewObject(klass, methodID, + jni::ToJavaString(env, info.GetPinName()), + lat, lon, + jni::ToJavaString(env, info.GetPinType())); } JNIEXPORT void JNICALL diff --git a/android/jni/com/mapswithme/maps/Framework.hpp b/android/jni/com/mapswithme/maps/Framework.hpp index 26afbdb095..a5022daf92 100644 --- a/android/jni/com/mapswithme/maps/Framework.hpp +++ b/android/jni/com/mapswithme/maps/Framework.hpp @@ -71,7 +71,7 @@ namespace android void OnLocationError(int/* == location::TLocationStatus*/ newStatus); void OnLocationUpdated(location::GpsInfo const & info); - void OnCompassUpdated(uint64_t time, double magneticNorth, double trueNorth, double accuracy); + void OnCompassUpdated(location::CompassInfo const & info); void UpdateCompassSensor(int ind, float * arr); void Invalidate(); diff --git a/android/jni/com/mapswithme/maps/LocationState.cpp b/android/jni/com/mapswithme/maps/LocationState.cpp index db0bdfc8cc..3de0696689 100644 --- a/android/jni/com/mapswithme/maps/LocationState.cpp +++ b/android/jni/com/mapswithme/maps/LocationState.cpp @@ -1,20 +1,25 @@ #include "Framework.hpp" #include "../core/jni_helper.hpp" -#include "../../../../../anim/controller.hpp" + extern "C" { + shared_ptr<location::State> const & GetLocationState() + { + return g_framework->NativeFramework()->GetLocationState(); + } + JNIEXPORT void JNICALL Java_com_mapswithme_maps_LocationState_switchToNextMode(JNIEnv * env, jobject thiz) { - g_framework->NativeFramework()->GetLocationState()->SwitchToNextMode(); + GetLocationState()->SwitchToNextMode(); } JNIEXPORT jint JNICALL Java_com_mapswithme_maps_LocationState_getLocationStateMode(JNIEnv * env, jobject thiz) { - return g_framework->NativeFramework()->GetLocationState()->GetMode(); + return GetLocationState()->GetMode(); } void LocationStateModeChanged(location::State::Mode mode, shared_ptr<jobject> const & obj) @@ -26,24 +31,24 @@ extern "C" JNIEXPORT jint JNICALL Java_com_mapswithme_maps_LocationState_addLocationStateModeListener(JNIEnv * env, jobject thiz, jobject obj) { - return g_framework->NativeFramework()->GetLocationState()->AddStateModeListener(bind(&LocationStateModeChanged, _1, jni::make_global_ref(obj))); + return GetLocationState()->AddStateModeListener(bind(&LocationStateModeChanged, _1, jni::make_global_ref(obj))); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_LocationState_removeLocationStateModeListener(JNIEnv * env, jobject thiz, jint slotID) { - g_framework->NativeFramework()->GetLocationState()->RemoveStateModeListener(slotID); + GetLocationState()->RemoveStateModeListener(slotID); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_LocationState_turnOff(JNIEnv * env, jobject thiz) { - g_framework->NativeFramework()->GetLocationState()->TurnOff(); + GetLocationState()->TurnOff(); } JNIEXPORT void JNICALL Java_com_mapswithme_maps_LocationState_invalidatePosition(JNIEnv * env, jobject thiz) { - g_framework->NativeFramework()->GetLocationState()->InvalidatePosition(); + GetLocationState()->InvalidatePosition(); } } diff --git a/android/jni/com/mapswithme/maps/MWMActivity.cpp b/android/jni/com/mapswithme/maps/MWMActivity.cpp index 8a547081db..918c103626 100644 --- a/android/jni/com/mapswithme/maps/MWMActivity.cpp +++ b/android/jni/com/mapswithme/maps/MWMActivity.cpp @@ -5,10 +5,12 @@ #include "../platform/Platform.hpp" #include "../../../nv_event/nv_event.hpp" -#include "../../../../../base/logging.hpp" #include "../../../../../map/country_status_display.hpp" -//////////////////////////////////////////////////////////////////////////////////////////// + +#include "../../../../../base/logging.hpp" + + extern "C" { JNIEXPORT void JNICALL @@ -26,28 +28,30 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_maps_MWMActivity_nativeLocationUpdated(JNIEnv * env, jobject thiz, - jlong time, jdouble lat, jdouble lon, jfloat accuracy, - jdouble altitude, jfloat speed, jfloat bearing) + jlong time, jdouble lat, jdouble lon, + jfloat accuracy, jdouble altitude, jfloat speed, jfloat bearing) { - const double GPS_VALUE_NOT_SET = -9999999.9; - location::GpsInfo info; - info.m_horizontalAccuracy = accuracy; + info.m_source = location::EAndroidNative; + + info.m_timestamp = static_cast<double>(time) / 1000.0; info.m_latitude = lat; info.m_longitude = lon; - info.m_timestamp = time; - info.m_source = location::EAndroidNative; - if (altitude == 0.0) - info.m_altitude = info.m_verticalAccuracy = GPS_VALUE_NOT_SET; - else + if (accuracy > 0.0) + info.m_horizontalAccuracy = accuracy; + + if (altitude != 0.0) { info.m_altitude = altitude; - // use horizontal accuracy info.m_verticalAccuracy = accuracy; } - info.m_course = (bearing == 0.0 ? GPS_VALUE_NOT_SET : bearing); - info.m_speed = (speed == 0.0 ? GPS_VALUE_NOT_SET : speed); + + if (bearing > 0.0) + info.m_bearing = bearing; + + if (speed > 0.0) + info.m_speed = speed; g_framework->OnLocationUpdated(info); } @@ -56,7 +60,10 @@ extern "C" Java_com_mapswithme_maps_MWMActivity_nativeCompassUpdated(JNIEnv * env, jobject thiz, jlong time, jdouble magneticNorth, jdouble trueNorth, jdouble accuracy) { - g_framework->OnCompassUpdated(time, magneticNorth, trueNorth, accuracy); + location::CompassInfo info; + info.m_bearing = (trueNorth >= 0.0) ? trueNorth : magneticNorth; + + g_framework->OnCompassUpdated(info); } JNIEXPORT jfloatArray JNICALL diff --git a/android/src/com/mapswithme/maps/DownloadResourcesActivity.java b/android/src/com/mapswithme/maps/DownloadResourcesActivity.java index 8e56f0529b..987fc7a6f8 100644 --- a/android/src/com/mapswithme/maps/DownloadResourcesActivity.java +++ b/android/src/com/mapswithme/maps/DownloadResourcesActivity.java @@ -594,7 +594,7 @@ public class DownloadResourcesActivity extends MapsWithMeBaseFragmentActivity } @Override - public void onDrivingHeadingUpdated(long time, double heading, double accuracy) + public void onDrivingHeadingUpdated(long time, double heading) { } diff --git a/android/src/com/mapswithme/maps/Framework.java b/android/src/com/mapswithme/maps/Framework.java index b99dc29093..bd0b58474a 100644 --- a/android/src/com/mapswithme/maps/Framework.java +++ b/android/src/com/mapswithme/maps/Framework.java @@ -125,13 +125,17 @@ public class Framework public native static void nativeLoadbookmarks(); - // routing + /// @name Routing. + //@{ public native static boolean nativeIsRoutingActive(); public native static void nativeCancelRoutingSession(); public native static void nativeStartRoutingSession(double lat, double lon); + public native static LocationState.RoutingInfo nativeGetRouteFollowingInfo(); + //@} + public native static String nativeGetCountryNameIfAbsent(double lat, double lon); public native static Index nativeGetCountryIndex(double lat, double lon); diff --git a/android/src/com/mapswithme/maps/LocationState.java b/android/src/com/mapswithme/maps/LocationState.java index 8cc9b795ae..9f5dcafece 100644 --- a/android/src/com/mapswithme/maps/LocationState.java +++ b/android/src/com/mapswithme/maps/LocationState.java @@ -19,4 +19,16 @@ public enum LocationState public native void turnOff(); public native void invalidatePosition(); + + public static class RoutingInfo + { + public String mDistToTarget; + public String mUnits; + + public RoutingInfo(String distToTarget, String units) + { + mDistToTarget = distToTarget; + mUnits = units; + } + } } diff --git a/android/src/com/mapswithme/maps/MWMActivity.java b/android/src/com/mapswithme/maps/MWMActivity.java index 43f389244c..164899d510 100644 --- a/android/src/com/mapswithme/maps/MWMActivity.java +++ b/android/src/com/mapswithme/maps/MWMActivity.java @@ -963,32 +963,45 @@ public class MWMActivity extends NvEventQueueActivity @Override public void onLocationUpdated(final Location l) { - nativeLocationUpdated(l.getTime(), l.getLatitude(), l.getLongitude(), l.getAccuracy(), l.getAltitude(), l.getSpeed(), l.getBearing()); + nativeLocationUpdated( + l.getTime(), + l.getLatitude(), + l.getLongitude(), + l.getAccuracy(), + l.getAltitude(), + l.getSpeed(), + l.getBearing()); + if (mInfoView.getState() != State.HIDDEN) mInfoView.updateLocation(l); - // TODO get correct values from routing engine - if (Framework.nativeIsRoutingActive()) - mTvRoutingDistance.setText(new Random().nextInt() % 100 + " KM"); + + final LocationState.RoutingInfo info = Framework.nativeGetRouteFollowingInfo(); + if (info != null) + mTvRoutingDistance.setText(info.mDistToTarget + info.mUnits); } @SuppressWarnings("deprecation") @Override public void onCompassUpdated(long time, double magneticNorth, double trueNorth, double accuracy) { - final double angles[] = {magneticNorth, trueNorth}; + final double angles[] = { magneticNorth, trueNorth }; LocationUtils.correctCompassAngles(getWindowManager().getDefaultDisplay().getOrientation(), angles); nativeCompassUpdated(time, angles[0], angles[1], accuracy); - final double north = (angles[1] >= 0.0 ? angles[1] : angles[0]); + final double north = (angles[1] >= 0.0) ? angles[1] : angles[0]; if (mInfoView.getState() != State.HIDDEN) mInfoView.updateAzimuth(north); } + @SuppressWarnings("deprecation") @Override - public void onDrivingHeadingUpdated(long time, double heading, double accuracy) + public void onDrivingHeadingUpdated(long time, double heading) { - LocationUtils.correctCompassAngles(getWindowManager().getDefaultDisplay().getOrientation(), new double[]{heading}); - nativeCompassUpdated(time, heading, heading, accuracy); + double arr[] = new double[] { heading }; + LocationUtils.correctCompassAngles(getWindowManager().getDefaultDisplay().getOrientation(), arr); + heading = arr[0]; + + nativeCompassUpdated(time, heading, heading, 0.0); if (mInfoView.getState() != State.HIDDEN) mInfoView.updateAzimuth(heading); diff --git a/android/src/com/mapswithme/maps/SearchActivity.java b/android/src/com/mapswithme/maps/SearchActivity.java index 98d3cfa172..685a2ba8a3 100644 --- a/android/src/com/mapswithme/maps/SearchActivity.java +++ b/android/src/com/mapswithme/maps/SearchActivity.java @@ -760,19 +760,16 @@ public class SearchActivity extends MapsWithMeBaseListActivity implements Locati @Override public void onCompassUpdated(long time, double magneticNorth, double trueNorth, double accuracy) { - // } @Override - public void onDrivingHeadingUpdated(long time, double heading, double accuracy) + public void onDrivingHeadingUpdated(long time, double heading) { - // } @Override public void onLocationError(int errorCode) { - // } private boolean isCurrentResult(int id) diff --git a/android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java b/android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java index 8f3f0ba12f..0125141743 100644 --- a/android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java +++ b/android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java @@ -157,15 +157,13 @@ public class BookmarkListAdapter extends BaseAdapter } @Override - public void onDrivingHeadingUpdated(long time, double heading, double accuracy) + public void onDrivingHeadingUpdated(long time, double heading) { - // } @Override public void onLocationError(int errorCode) { - // } private class PinHolder diff --git a/android/src/com/mapswithme/maps/location/LocationService.java b/android/src/com/mapswithme/maps/location/LocationService.java index cc4b815af0..220dbbeeb3 100644 --- a/android/src/com/mapswithme/maps/location/LocationService.java +++ b/android/src/com/mapswithme/maps/location/LocationService.java @@ -56,7 +56,7 @@ public enum LocationService implements public void onCompassUpdated(long time, double magneticNorth, double trueNorth, double accuracy); - public void onDrivingHeadingUpdated(long time, double heading, double accuracy); + public void onDrivingHeadingUpdated(long time, double heading); public void onLocationError(int errorCode); } @@ -76,9 +76,6 @@ public enum LocationService implements private GeomagneticField mMagneticField = null; private LocationProvider mLocationProvider; - private double mLastNorth; - private static final double NOISE_THRESHOLD = 3; - private float[] mGravity = null; private float[] mGeomagnetic = null; private final float[] mR = new float[9]; @@ -155,11 +152,11 @@ public enum LocationService implements it.next().onCompassUpdated(time, magneticNorth, trueNorth, accuracy); } - private void notifyDrivingHeadingUpdated(long time, double heading, double accuracy) + private void notifyDrivingHeadingUpdated(long time, double heading) { final Iterator<LocationListener> it = mListeners.iterator(); while (it.hasNext()) - it.next().onDrivingHeadingUpdated(time, heading, accuracy); + it.next().onDrivingHeadingUpdated(time, heading); } public void startUpdate(LocationListener listener) @@ -225,8 +222,6 @@ public enum LocationService implements @Override public void onLocationChanged(Location l) { - mLogger.d("Location changed: ", l); - // Completely ignore locations without lat and lon if (l.getAccuracy() <= 0.0) return; @@ -253,20 +248,9 @@ public enum LocationService implements private void emitCompassResults(long time, double north, double trueNorth, double offset) { if (mDrivingHeading >= 0.0) - notifyDrivingHeadingUpdated(time, mDrivingHeading, offset); + notifyDrivingHeadingUpdated(time, mDrivingHeading); else - { - if (Math.abs(Math.toDegrees(north - mLastNorth)) < NOISE_THRESHOLD) - { - // ignore noise results. makes compass updates smoother. - } - else - { - notifyCompassUpdated(time, north, trueNorth, offset); - mLastNorth = north; - } - - } + notifyCompassUpdated(time, north, trueNorth, offset); } @Override @@ -304,7 +288,7 @@ public enum LocationService implements } else { - // positive 'offset' means the magnetic field is rotated east that much from true north + // positive 'offset' means the magnetic field is rotated east that match from true north final double offset = Math.toRadians(mMagneticField.getDeclination()); final double trueHeading = LocationUtils.correctAngle(magneticHeading, offset); diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index f10fb80734..26d277001a 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -96,17 +96,27 @@ // TODO: Remove this hack for location changing bug if (self.navigationController.visibleViewController == self) { - Framework & f = GetFramework(); - f.OnLocationUpdate(info); + Framework & frm = GetFramework(); + frm.OnLocationUpdate(info); [self showPopover]; [[Statistics instance] logLatitude:info.m_latitude - longitude:info.m_longitude - horizontalAccuracy:info.m_horizontalAccuracy - verticalAccuracy:info.m_verticalAccuracy]; + longitude:info.m_longitude + horizontalAccuracy:info.m_horizontalAccuracy + verticalAccuracy:info.m_verticalAccuracy]; + + if (frm.IsRoutingActive()) + { + location::FollowingInfo res; + frm.GetRouteFollowingInfo(res); - [self.routeView updateDistance:@"777" withMetrics:@"M"]; + if (res.IsValid()) + { + [self.routeView updateDistance:[NSString stringWithUTF8String:res.m_distToTarget.c_str()] + withMetrics:[NSString stringWithUTF8String:res.m_unitsSuffix.c_str()]]; + } + } } } diff --git a/iphone/Maps/Classes/PlacePageView.mm b/iphone/Maps/Classes/PlacePageView.mm index ec5fd46a0e..176c704fa9 100644 --- a/iphone/Maps/Classes/PlacePageView.mm +++ b/iphone/Maps/Classes/PlacePageView.mm @@ -157,11 +157,10 @@ typedef NS_ENUM(NSUInteger, CellRow) double lat, lon; if (![[MapsAppDelegate theApp].m_locationManager getLat:lat Lon:lon]) return; - double const northRad = (info.m_trueHeading < 0) ? info.m_magneticHeading : info.m_trueHeading; - m2::PointD const point = MercatorBounds::FromLatLon(lat, lon); PlacePageInfoCell * cell = (PlacePageInfoCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:ROW_COMMON inSection:0]]; - cell.compassView.angle = ang::AngleTo(point, [self pinPoint]) + northRad; + + cell.compassView.angle = ang::AngleTo(MercatorBounds::FromLatLon(lat, lon), [self pinPoint]) + info.m_bearing; } - (CellRow)cellRowForIndexPath:(NSIndexPath *)indexPath diff --git a/iphone/Maps/Platform/LocationManager.mm b/iphone/Maps/Platform/LocationManager.mm index 1ef2f5c56e..d21b422388 100644 --- a/iphone/Maps/Platform/LocationManager.mm +++ b/iphone/Maps/Platform/LocationManager.mm @@ -120,16 +120,34 @@ - (void)location:(CLLocation *)location toGpsInfo:(location::GpsInfo &)info { - info.m_horizontalAccuracy = location.horizontalAccuracy; + info.m_source = location::EAppleNative; + info.m_latitude = location.coordinate.latitude; info.m_longitude = location.coordinate.longitude; info.m_timestamp = [location.timestamp timeIntervalSince1970]; - info.m_source = location::EAppleNative; - info.m_verticalAccuracy = location.verticalAccuracy; - info.m_altitude = location.altitude; - info.m_course = location.course; - info.m_speed = location.speed; + if (location.horizontalAccuracy >= 0.0) + info.m_horizontalAccuracy = location.horizontalAccuracy; + + if (location.verticalAccuracy >= 0.0) + { + info.m_verticalAccuracy = location.verticalAccuracy; + info.m_altitude = location.altitude; + } + + if (location.course >= 0.0) + info.m_bearing = location.course; + + if (location.speed >= 0.0) + info.m_speed = location.speed; +} + +- (void)heading:(CLHeading *)heading toCompassInfo:(location::CompassInfo &)info +{ + if (heading.trueHeading >= 0.0) + info.m_bearing = my::DegToRad(heading.trueHeading); + else if (heading.headingAccuracy >= 0.0) + info.m_bearing = my::DegToRad(heading.magneticHeading); } - (void)triggerCompass @@ -137,7 +155,7 @@ [self locationManager:m_locationManager didUpdateHeading:m_locationManager.heading]; } -- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading +- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)heading { // Stop passing driving course if last time stamp for GPS location is later than 20 seconds. if (m_lastLocationTime == nil || ([m_lastLocationTime timeIntervalSinceNow] < -20.0)) @@ -145,13 +163,9 @@ if (!m_isCourse) { - location::CompassInfo newInfo; - newInfo.m_magneticHeading = my::DegToRad(newHeading.magneticHeading); - newInfo.m_trueHeading = my::DegToRad(newHeading.trueHeading); - newInfo.m_accuracy = my::DegToRad(newHeading.headingAccuracy); - newInfo.m_timestamp = [newHeading.timestamp timeIntervalSince1970]; - - [self notifyCompassUpdate:newInfo]; + location::CompassInfo info; + [self heading:heading toCompassInfo:info]; + [self notifyCompassUpdate:info]; } } @@ -186,13 +200,9 @@ { m_isCourse = YES; - location::CompassInfo newInfo; - newInfo.m_magneticHeading = my::DegToRad(newLocation.course); - newInfo.m_trueHeading = newInfo.m_magneticHeading; - newInfo.m_accuracy = 10.0; - newInfo.m_timestamp = [newLocation.timestamp timeIntervalSince1970]; - - [self notifyCompassUpdate:newInfo]; + location::CompassInfo info; + info.m_bearing = my::DegToRad(newLocation.course); + [self notifyCompassUpdate:info]; } else m_isCourse = NO; diff --git a/map/framework.cpp b/map/framework.cpp index 945dea02d6..f29ee532b3 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -60,7 +60,10 @@ #define DEFAULT_BOOKMARK_TYPE "placemark-red" + using namespace storage; +using namespace routing; +using namespace location; #ifdef FIXED_LOCATION @@ -106,13 +109,13 @@ void Framework::RemoveMap(string const & file) m_model.RemoveMap(file); } -void Framework::OnLocationError(location::TLocationError error) +void Framework::OnLocationError(TLocationError error) {} -void Framework::OnLocationUpdate(location::GpsInfo const & info) +void Framework::OnLocationUpdate(GpsInfo const & info) { #ifdef FIXED_LOCATION - location::GpsInfo rInfo(info); + GpsInfo rInfo(info); // get fixed coordinates m_fixedPos.GetLon(rInfo.m_longitude); @@ -124,35 +127,35 @@ void Framework::OnLocationUpdate(location::GpsInfo const & info) if (m_fixedPos.HasNorth()) { // pass compass value (for devices without compass) - location::CompassInfo compass; + CompassInfo compass; compass.m_magneticHeading = compass.m_trueHeading = 0.0; compass.m_timestamp = rInfo.m_timestamp; OnCompassUpdate(compass); } #else - location::GpsInfo const & rInfo = info; + GpsInfo const & rInfo = info; #endif - shared_ptr<location::State> const & state = m_informationDisplay.locationState(); + shared_ptr<State> const & state = GetLocationState(); state->OnLocationUpdate(rInfo); - CheckLocationForRouting(); - m_balloonManager.LocationChanged(rInfo); + + CheckLocationForRouting(info); if (state->IsModeChangeViewport()) UpdateUserViewportChanged(); } -void Framework::OnCompassUpdate(location::CompassInfo const & info) +void Framework::OnCompassUpdate(CompassInfo const & info) { #ifdef FIXED_LOCATION - location::CompassInfo rInfo(info); + CompassInfo rInfo(info); m_fixedPos.GetNorth(rInfo.m_trueHeading); #else - location::CompassInfo const & rInfo = info; + CompassInfo const & rInfo = info; #endif - m_informationDisplay.locationState()->OnCompassUpdate(rInfo); + GetLocationState()->OnCompassUpdate(rInfo); } void Framework::StopLocationFollow() @@ -212,6 +215,7 @@ Framework::Framework() m_stringsBundle.SetDefaultString("my_places", "My Places"); m_stringsBundle.SetDefaultString("my_position", "My Position"); m_stringsBundle.SetDefaultString("routes", "Routes"); + m_stringsBundle.SetDefaultString("recalculating_route", "Recalculating ..."); m_guiController->SetStringsBundle(&m_stringsBundle); @@ -255,7 +259,7 @@ Framework::Framework() LOG(LDEBUG, ("Guides info initialized")); #endif - m_routingSession.SetRouter(new routing::OsrmRouter(&m_model.GetIndex(), [this] (m2::PointD const & pt) + m_routingSession.SetRouter(new OsrmRouter(&m_model.GetIndex(), [this] (m2::PointD const & pt) { return GetSearchEngine()->GetCountryFile(pt); })); @@ -290,7 +294,7 @@ TStatus Framework::GetCountryStatus(TIndex const & index) const return m_storage.CountryStatusEx(index); } -string Framework::GetCountryName(storage::TIndex const & index) const +string Framework::GetCountryName(TIndex const & index) const { string group, name; m_storage.GetGroupAndCountry(index, group, name); @@ -309,7 +313,7 @@ m2::RectD Framework::GetCountryBounds(TIndex const & index) const return GetCountryBounds(m_storage.CountryByIndex(index).GetFile().m_fileName); } -void Framework::ShowCountry(storage::TIndex const & index) +void Framework::ShowCountry(TIndex const & index) { StopLocationFollow(); @@ -700,22 +704,21 @@ void Framework::DrawAdditionalInfo(shared_ptr<PaintEvent> const & e) } -/// Function for calling from platform dependent-paint function. void Framework::DoPaint(shared_ptr<PaintEvent> const & e) { if (m_renderPolicy) { m_renderPolicy->DrawFrame(e, m_navigator.Screen()); - // don't render additional elements if guiController wasn't initialized + // Don't render additional elements if guiController wasn't initialized. if (m_guiController->GetCacheScreen() != NULL) DrawAdditionalInfo(e); } } -m2::PointD Framework::GetViewportCenter() const +m2::PointD const & Framework::GetViewportCenter() const { - return m_navigator.Screen().GlobalRect().GlobalCenter(); + return m_navigator.Screen().GetOrg(); } void Framework::SetViewportCenter(m2::PointD const & pt) @@ -727,11 +730,8 @@ void Framework::SetViewportCenter(m2::PointD const & pt) shared_ptr<MoveScreenTask> Framework::SetViewportCenterAnimated(m2::PointD const & endPt) { anim::Controller::Guard guard(GetAnimController()); - ScreenBase const & s = m_navigator.Screen(); - m2::PointD const & startPt = s.GetOrg(); - double const speed = m_navigator.ComputeMoveSpeed(startPt, endPt); - - return m_animator.MoveScreen(startPt, endPt, speed); + m2::PointD const & startPt = GetViewportCenter(); + return m_animator.MoveScreen(startPt, endPt, m_navigator.ComputeMoveSpeed(startPt, endPt)); } m2::AnyRectD Framework::ToRotated(m2::RectD const & rect) const @@ -1089,7 +1089,7 @@ search::Engine * Framework::GetSearchEngine() const return m_pSearchEngine.get(); } -storage::TIndex Framework::GetCountryIndex(m2::PointD const & pt) const +TIndex Framework::GetCountryIndex(m2::PointD const & pt) const { return m_storage.FindIndexByFile(GetSearchEngine()->GetCountryFile(pt)); } @@ -1127,7 +1127,7 @@ bool Framework::Search(search::SearchParams const & params) bool Framework::GetCurrentPosition(double & lat, double & lon) const { - shared_ptr<location::State> locationState = m_informationDisplay.locationState(); + shared_ptr<State> locationState = m_informationDisplay.locationState(); if (locationState->IsModeHasPosition()) { @@ -1619,7 +1619,7 @@ Navigator & Framework::GetNavigator() return m_navigator; } -shared_ptr<location::State> const & Framework::GetLocationState() const +shared_ptr<State> const & Framework::GetLocationState() const { return m_informationDisplay.locationState(); } @@ -1670,7 +1670,7 @@ UserMark const * Framework::GetUserMark(m2::PointD const & pxPoint, bool isLongP m2::AnyRectD rect; m_navigator.GetTouchRect(pxPoint, TOUCH_PIXEL_RADIUS * GetVisualScale(), rect); - shared_ptr<location::State> const & locationState = GetLocationState(); + shared_ptr<State> const & locationState = GetLocationState(); if (locationState->IsModeHasPosition()) { m2::PointD const & glPivot = locationState->Position(); @@ -1814,7 +1814,7 @@ void Framework::UpdateSavedDataVersion() Settings::Set("DataVersion", m_storage.GetCurrentDataVersion()); } -bool Framework::GetGuideInfo(storage::TIndex const & index, guides::GuideInfo & info) const +bool Framework::GetGuideInfo(TIndex const & index, guides::GuideInfo & info) const { return m_storage.GetGuideManager().GetGuideInfo(m_storage.CountryFileName(index), info); } @@ -1828,19 +1828,18 @@ bool Framework::IsRoutingActive() const bool Framework::StartRoutingSession(m2::PointD const & destination) { - shared_ptr<location::State> state = GetLocationState(); + shared_ptr<State> const & state = GetLocationState(); if (!GetPlatform().HasRouting() || !state->IsModeHasPosition()) return false; if (IsRoutingActive()) CancelRoutingSession(); - m_routingSession.BuildRoute(state->Position(), destination, - [this, state](routing::Route const & route, routing::IRouter::ResultCode e) - { - InsertRoute(route); - state->StartRoutingMode(); - }); + m_routingSession.BuildRoute(state->Position(), destination, [&](Route const & route, routing::IRouter::ResultCode e) + { + InsertRoute(route); + state->StartRoutingMode(); + }); return true; } @@ -1868,7 +1867,7 @@ void Framework::CancelRoutingSession() Invalidate(); } -void Framework::InsertRoute(routing::Route const & route) +void Framework::InsertRoute(Route const & route) { string const categoryName = m_stringsBundle.GetString("routes"); BookmarkCategory * cat = 0; @@ -1905,20 +1904,33 @@ void Framework::InsertRoute(routing::Route const & route) Invalidate(); } -void Framework::CheckLocationForRouting() +void Framework::CheckLocationForRouting(GpsInfo const & info) { if (!IsRoutingActive()) return; - shared_ptr<location::State> const & state = GetLocationState(); + shared_ptr<State> const & state = GetLocationState(); m2::PointD const & position = state->Position(); - if (m_routingSession.OnLocationPositionChanged(position, state->GetErrorRadius()) == routing::RoutingSession::RouteLeft) + + switch (m_routingSession.OnLocationPositionChanged(position, state->GetErrorRadius())) { - m_routingSession.RebuildRoute(position, [this] (routing::Route const & route, routing::IRouter::ResultCode e) - { - InsertRoute(route); - }); + case RoutingSession::RouteLeft: + m_routingSession.RebuildRoute(position, [this] (Route const & route, routing::IRouter::ResultCode e) + { + InsertRoute(route); + }); + break; + + case RoutingSession::OnRoute: + //m_routingSession.UpdatePosition(position, info); + break; + + default: + break; } } -//////////////////////////////////////////////////////////////////////////////////// +void Framework::GetRouteFollowingInfo(location::FollowingInfo & info) +{ + +} diff --git a/map/framework.hpp b/map/framework.hpp index 8104de42aa..85059d4adb 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -303,7 +303,7 @@ public: int GetDrawScale() const; - m2::PointD GetViewportCenter() const; + m2::PointD const & GetViewportCenter() const; void SetViewportCenter(m2::PointD const & pt); shared_ptr<MoveScreenTask> SetViewportCenterAnimated(m2::PointD const & endPt); @@ -482,10 +482,11 @@ public: bool IsRoutingActive() const; bool StartRoutingSession(m2::PointD const & destination); void CancelRoutingSession(); + void GetRouteFollowingInfo(location::FollowingInfo & info); private: void RemoveRoute(); void InsertRoute(routing::Route const & route); - void CheckLocationForRouting(); + void CheckLocationForRouting(location::GpsInfo const & info); //@} }; diff --git a/map/location_state.cpp b/map/location_state.cpp index 72b3651dcb..475baaa506 100644 --- a/map/location_state.cpp +++ b/map/location_state.cpp @@ -320,10 +320,7 @@ void State::OnCompassUpdate(location::CompassInfo const & info) { SetModeInfo(IncludeModeBit(m_modeInfo, KnownDirectionBit)); - if (info.m_trueHeading >= 0.0) - m_drawDirection = info.m_trueHeading; - else - m_drawDirection = info.m_magneticHeading; + m_drawDirection = info.m_bearing; AnimateFollow(); invalidate(); diff --git a/platform/location.hpp b/platform/location.hpp index 16da6a0e49..36a751b833 100644 --- a/platform/location.hpp +++ b/platform/location.hpp @@ -1,8 +1,9 @@ #pragma once +#include "../base/base.hpp" + #include "../std/string.hpp" -#include "../std/vector.hpp" -#include "../std/function.hpp" + namespace location { @@ -29,6 +30,12 @@ namespace location class GpsInfo { public: + GpsInfo() + : m_horizontalAccuracy(100.0), // use as a default accuracy + m_altitude(0.0), m_verticalAccuracy(-1.0), m_bearing(-1.0), m_speed(-1.0) + { + } + TLocationSource m_source; double m_timestamp; //!< seconds from 1st Jan 1970 double m_latitude; //!< degrees @@ -36,21 +43,22 @@ namespace location double m_horizontalAccuracy; //!< metres double m_altitude; //!< metres double m_verticalAccuracy; //!< metres - double m_course; //!< positive degrees from the true North + double m_bearing; //!< positive degrees from the true North double m_speed; //!< metres per second - bool HasAltitude() const { return m_verticalAccuracy >= 0.; } - bool HasBearing() const { return m_course >= 0.; } - bool HasSpeed() const { return m_speed >= 0.; } + //bool HasAltitude() const { return m_verticalAccuracy >= 0.0; } + //bool HasBearing() const { return m_bearing >= 0.0; } + bool HasSpeed() const { return m_speed >= 0.0; } }; class CompassInfo { public: - double m_timestamp; //!< how many seconds ago the heading was retrieved - double m_magneticHeading; //!< positive radians from the magnetic North - double m_trueHeading; //!< positive radians from the true North - double m_accuracy; //!< offset from the magnetic to the true North in radians + //double m_timestamp; //!< seconds from 1st Jan 1970 + //double m_magneticHeading; //!< positive radians from the magnetic North + //double m_trueHeading; //!< positive radians from the true North + //double m_accuracy; //!< offset from the magnetic to the true North in radians + double m_bearing; //!< positive radians from the true North }; static inline bool IsLatValid(double lat) @@ -62,4 +70,16 @@ namespace location return lon != 0. && lon < 180. && lon > -180.; } + class FollowingInfo + { + public: + /// @name Formatted covered distance with measurement units suffix. + //@{ + string m_distToTarget; + string m_unitsSuffix; + //@} + + bool IsValid() const { return !m_distToTarget.empty(); } + }; + } // namespace location |