android_hardware_SensorManager.cpp revision 277d1b2f49897e90a8ec9bd0f05ea4ed62d2ff28
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2008, The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17270e87f71abc2edf446dbec20c725c823e8c7f37Mike Lockwood#define LOG_TAG "SensorManager" 18270e87f71abc2edf446dbec20c725c823e8c7f37Mike Lockwood 19270e87f71abc2edf446dbec20c725c823e8c7f37Mike Lockwood#include "utils/Log.h" 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 211bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian#include <gui/Sensor.h> 221bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian#include <gui/SensorManager.h> 231bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian#include <gui/SensorEventQueue.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct SensorOffsets 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID name; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID vendor; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID version; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID handle; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID type; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID range; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID resolution; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID power; 41050b56244ff46d43e4886018d7cd20f0b1dc02b9Mathias Agopian jfieldID minDelay; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gSensorOffsets; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The method below are not thread-safe and not intended to be 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsensors_module_init(JNIEnv *env, jclass clazz) 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 521bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian SensorManager::getInstance(); 531bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return 0; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsensors_module_get_next_sensor(JNIEnv *env, jobject clazz, jobject sensor, jint next) 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 591bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian SensorManager& mgr(SensorManager::getInstance()); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 611bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian Sensor const* const* sensorList; 621bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian size_t count = mgr.getSensorList(&sensorList); 634fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown if (size_t(next) >= count) 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 661bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian Sensor const* const list = sensorList[next]; 671bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian const SensorOffsets& sensorOffsets(gSensorOffsets); 681bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian jstring name = env->NewStringUTF(list->getName().string()); 691bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian jstring vendor = env->NewStringUTF(list->getVendor().string()); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetObjectField(sensor, sensorOffsets.name, name); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetObjectField(sensor, sensorOffsets.vendor, vendor); 72277d1b2f49897e90a8ec9bd0f05ea4ed62d2ff28Mathias Agopian env->SetIntField(sensor, sensorOffsets.version, list->getVersion()); 731bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetIntField(sensor, sensorOffsets.handle, list->getHandle()); 741bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetIntField(sensor, sensorOffsets.type, list->getType()); 751bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetFloatField(sensor, sensorOffsets.range, list->getMaxValue()); 761bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetFloatField(sensor, sensorOffsets.resolution, list->getResolution()); 771bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetFloatField(sensor, sensorOffsets.power, list->getPowerUsage()); 78050b56244ff46d43e4886018d7cd20f0b1dc02b9Mathias Agopian env->SetIntField(sensor, sensorOffsets.minDelay, list->getMinDelay()); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project next++; 814fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return size_t(next) < count ? next : 0; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//---------------------------------------------------------------------------- 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint 861bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopiansensors_create_queue(JNIEnv *env, jclass clazz) 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 881bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian SensorManager& mgr(SensorManager::getInstance()); 891bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian sp<SensorEventQueue> queue(mgr.createEventQueue()); 901bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian queue->incStrong(clazz); 911bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return reinterpret_cast<int>(queue.get()); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 941bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopianstatic void 951bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopiansensors_destroy_queue(JNIEnv *env, jclass clazz, jint nativeQueue) 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 971bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian sp<SensorEventQueue> queue(reinterpret_cast<SensorEventQueue *>(nativeQueue)); 981bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian if (queue != 0) { 991bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian queue->decStrong(clazz); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1031bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopianstatic jboolean 1041bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopiansensors_enable_sensor(JNIEnv *env, jclass clazz, 10523e8de26b7b3d04daf08526f314c2fdd2f8fee65Mathias Agopian jint nativeQueue, jstring name, jint sensor, jint delay) 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1071bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian sp<SensorEventQueue> queue(reinterpret_cast<SensorEventQueue *>(nativeQueue)); 1081bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian if (queue == 0) return JNI_FALSE; 1091bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian status_t res; 11023e8de26b7b3d04daf08526f314c2fdd2f8fee65Mathias Agopian if (delay >= 0) { 11123e8de26b7b3d04daf08526f314c2fdd2f8fee65Mathias Agopian res = queue->enableSensor(sensor, delay); 1121bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian } else { 1131bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian res = queue->disableSensor(sensor); 114270e87f71abc2edf446dbec20c725c823e8c7f37Mike Lockwood } 1151bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return res == NO_ERROR ? true : false; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint 1191bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopiansensors_data_poll(JNIEnv *env, jclass clazz, jint nativeQueue, 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloatArray values, jintArray status, jlongArray timestamp) 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1221bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian sp<SensorEventQueue> queue(reinterpret_cast<SensorEventQueue *>(nativeQueue)); 1231bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian if (queue == 0) return -1; 1241bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1251bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian status_t res; 1261bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian ASensorEvent event; 1271bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1281bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian res = queue->read(&event, 1); 129bb9ba8bae551305acba4f60577b0f461a9421bc5Mathias Agopian if (res == 0) { 1301bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian res = queue->waitForEvent(); 1311bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian if (res != NO_ERROR) 1321bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return -1; 1331bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian res = queue->read(&event, 1); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1351bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian if (res < 0) 1361bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return -1; 1371bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1381bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian jint accuracy = event.vector.status; 1391bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetFloatArrayRegion(values, 0, 3, event.vector.v); 1401bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetIntArrayRegion(status, 0, 1, &accuracy); 1411bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetLongArrayRegion(timestamp, 0, 1, &event.timestamp); 1421bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1431bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return event.sensor; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectnativeClassInit (JNIEnv *_env, jclass _this) 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass sensorClass = _env->FindClass("android/hardware/Sensor"); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SensorOffsets& sensorOffsets = gSensorOffsets; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.name = _env->GetFieldID(sensorClass, "mName", "Ljava/lang/String;"); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.vendor = _env->GetFieldID(sensorClass, "mVendor", "Ljava/lang/String;"); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.version = _env->GetFieldID(sensorClass, "mVersion", "I"); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.handle = _env->GetFieldID(sensorClass, "mHandle", "I"); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.type = _env->GetFieldID(sensorClass, "mType", "I"); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.range = _env->GetFieldID(sensorClass, "mMaxRange", "F"); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.resolution = _env->GetFieldID(sensorClass, "mResolution","F"); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.power = _env->GetFieldID(sensorClass, "mPower", "F"); 159050b56244ff46d43e4886018d7cd20f0b1dc02b9Mathias Agopian sensorOffsets.minDelay = _env->GetFieldID(sensorClass, "mMinDelay", "I"); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeClassInit", "()V", (void*)nativeClassInit }, 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"sensors_module_init","()I", (void*)sensors_module_init }, 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"sensors_module_get_next_sensor","(Landroid/hardware/Sensor;I)I", 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)sensors_module_get_next_sensor }, 1671bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1681bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian {"sensors_create_queue", "()I", (void*)sensors_create_queue }, 1691bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian {"sensors_destroy_queue", "(I)V", (void*)sensors_destroy_queue }, 1701bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian {"sensors_enable_sensor", "(ILjava/lang/String;II)Z", 1711bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian (void*)sensors_enable_sensor }, 1721bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1731bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian {"sensors_data_poll", "(I[F[I[J)I", (void*)sensors_data_poll }, 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_hardware_SensorManager(JNIEnv *env) 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 18225157e458d6e10b027d1ba6b78b0487156c9f57aJeff Brown return jniRegisterNativeMethods(env, "android/hardware/SystemSensorManager", 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gMethods, NELEM(gMethods)); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 185