From f63169987dce7df5cd2816306637c6fe64b52e30 Mon Sep 17 00:00:00 2001 From: vng Date: Tue, 24 Apr 2012 13:54:14 +0300 Subject: [PATCH] [android] Add average sensor calculation routine for compass. --- android/jni/com/mapswithme/maps/Framework.cpp | 11 +++++++ android/jni/com/mapswithme/maps/Framework.hpp | 8 +++++ .../jni/com/mapswithme/maps/MWMActivity.cpp | 19 +++++++++++ .../maps/location/LocationService.java | 33 +++++++++++++++++-- 4 files changed, 68 insertions(+), 3 deletions(-) diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index d74cd7f2cf..84eb8391a6 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -42,6 +42,10 @@ namespace android m_videoTimer = new VideoTimer(bind(&Framework::CallRepaint, this)); + size_t const measurementsCount = 5; + m_sensors[0].SetCount(measurementsCount); + m_sensors[1].SetCount(measurementsCount); + // @TODO refactor storage m_work.Storage().ReInitCountries(false); } @@ -81,6 +85,13 @@ namespace android m_work.OnCompassUpdate(info); } + void Framework::UpdateCompassSensor(int ind, float * arr) + { + //LOG ( LINFO, ("Sensors before, C++: ", arr[0], arr[1], arr[2]) ); + m_sensors[ind].Next(arr); + //LOG ( LINFO, ("Sensors after, C++: ", arr[0], arr[1], arr[2]) ); + } + void Framework::DeleteRenderPolicy() { m_work.SaveState(); diff --git a/android/jni/com/mapswithme/maps/Framework.hpp b/android/jni/com/mapswithme/maps/Framework.hpp index b86532f1a9..1541386bc9 100644 --- a/android/jni/com/mapswithme/maps/Framework.hpp +++ b/android/jni/com/mapswithme/maps/Framework.hpp @@ -6,9 +6,14 @@ #include "../../../../../map/drawer_yg.hpp" #include "../../../../../map/window_handle.hpp" #include "../../../../../map/feature_vec_model.hpp" + +#include "../../../../../geometry/avg_vector.hpp" + #include "../../../../../base/timer.hpp" + #include "../../../nv_event/nv_event.hpp" + namespace android { class Framework @@ -43,6 +48,8 @@ namespace android double m_lastX1; double m_lastY1; + math::AvgVector m_sensors[2]; + public: Framework(); @@ -55,6 +62,7 @@ namespace android void OnLocationStatusChanged(int/* == location::TLocationStatus*/ newStatus); void OnLocationUpdated(uint64_t time, double lat, double lon, float accuracy); void OnCompassUpdated(uint64_t time, double magneticNorth, double trueNorth, float accuracy); + void UpdateCompassSensor(int ind, float * arr); void Invalidate(); diff --git a/android/jni/com/mapswithme/maps/MWMActivity.cpp b/android/jni/com/mapswithme/maps/MWMActivity.cpp index 7907449d96..2122262dc8 100644 --- a/android/jni/com/mapswithme/maps/MWMActivity.cpp +++ b/android/jni/com/mapswithme/maps/MWMActivity.cpp @@ -64,6 +64,25 @@ extern "C" g_framework->OnCompassUpdated(time, magneticNorth, trueNorth, accuracy); } + JNIEXPORT jfloatArray JNICALL + Java_com_mapswithme_maps_location_LocationService_nativeUpdateCompassSensor( + JNIEnv * env, jobject thiz, jint ind, jfloatArray arr) + { + int const count = 3; + + // get Java array + jfloat buffer[3]; + env->GetFloatArrayRegion(arr, 0, count, buffer); + + // get the result + g_framework->UpdateCompassSensor(ind, buffer); + + // pass result back to Java + jfloatArray ret = (jfloatArray)env->NewFloatArray(count); + env->SetFloatArrayRegion(ret, 0, count, buffer); + return ret; + } + JNIEXPORT jboolean JNICALL Java_com_mapswithme_maps_MWMActivity_hasMeasurementSystem(JNIEnv * env, jobject thiz) { diff --git a/android/src/com/mapswithme/maps/location/LocationService.java b/android/src/com/mapswithme/maps/location/LocationService.java index 8bec685ca3..4c5f649235 100644 --- a/android/src/com/mapswithme/maps/location/LocationService.java +++ b/android/src/com/mapswithme/maps/location/LocationService.java @@ -291,6 +291,28 @@ public class LocationService implements LocationListener, SensorEventListener, W } } + private native float[] nativeUpdateCompassSensor(int ind, float[] arr); + private float[] UpdateCompassSensor(int ind, float[] arr) + { + /* + Log.d(TAG, "Sensor before, Java: " + + String.valueOf(arr[0]) + ", " + + String.valueOf(arr[1]) + ", " + + String.valueOf(arr[2])); + */ + + float[] ret = nativeUpdateCompassSensor(ind, arr); + + /* + Log.d(TAG, "Sensor after, Java: " + + String.valueOf(ret[0]) + ", " + + String.valueOf(ret[1]) + ", " + + String.valueOf(ret[2])); + */ + + return ret; + } + private float[] m_gravity = null; private float[] m_geomagnetic = null; @@ -298,12 +320,17 @@ public class LocationService implements LocationListener, SensorEventListener, W public void onSensorChanged(SensorEvent event) { // Get the magnetic north (orientation contains azimut, pitch and roll). - float orientation[] = null; + float[] orientation = null; if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) - m_gravity = event.values; + { + m_gravity = UpdateCompassSensor(0, event.values); + } if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) - m_geomagnetic = event.values; + { + m_geomagnetic = UpdateCompassSensor(1, event.values); + } + if (m_gravity != null && m_geomagnetic != null) { float R[] = new float[9];