android_hardware_SensorManager.cpp revision 1bf797857e025e8a71db86fb9e79765a767ec1eb
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; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gSensorOffsets; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The method below are not thread-safe and not intended to be 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsensors_module_init(JNIEnv *env, jclass clazz) 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 511bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian SensorManager::getInstance(); 521bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return 0; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsensors_module_get_next_sensor(JNIEnv *env, jobject clazz, jobject sensor, jint next) 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 581bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian SensorManager& mgr(SensorManager::getInstance()); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 601bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian Sensor const* const* sensorList; 611bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian size_t count = mgr.getSensorList(&sensorList); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (next >= count) 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 651bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian Sensor const* const list = sensorList[next]; 661bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian const SensorOffsets& sensorOffsets(gSensorOffsets); 671bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian jstring name = env->NewStringUTF(list->getName().string()); 681bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian jstring vendor = env->NewStringUTF(list->getVendor().string()); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetObjectField(sensor, sensorOffsets.name, name); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetObjectField(sensor, sensorOffsets.vendor, vendor); 711bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetIntField(sensor, sensorOffsets.version, 1); 721bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetIntField(sensor, sensorOffsets.handle, list->getHandle()); 731bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetIntField(sensor, sensorOffsets.type, list->getType()); 741bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetFloatField(sensor, sensorOffsets.range, list->getMaxValue()); 751bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetFloatField(sensor, sensorOffsets.resolution, list->getResolution()); 761bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetFloatField(sensor, sensorOffsets.power, list->getPowerUsage()); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project next++; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return next<count ? next : 0; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//---------------------------------------------------------------------------- 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint 841bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopiansensors_create_queue(JNIEnv *env, jclass clazz) 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 861bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian SensorManager& mgr(SensorManager::getInstance()); 871bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian sp<SensorEventQueue> queue(mgr.createEventQueue()); 881bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian queue->incStrong(clazz); 891bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return reinterpret_cast<int>(queue.get()); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 921bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopianstatic void 931bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopiansensors_destroy_queue(JNIEnv *env, jclass clazz, jint nativeQueue) 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 951bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian sp<SensorEventQueue> queue(reinterpret_cast<SensorEventQueue *>(nativeQueue)); 961bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian if (queue != 0) { 971bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian queue->decStrong(clazz); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1011bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopianstatic jboolean 1021bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopiansensors_enable_sensor(JNIEnv *env, jclass clazz, 1031bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian jint nativeQueue, jstring name, jint sensor, jint enable) 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1051bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian sp<SensorEventQueue> queue(reinterpret_cast<SensorEventQueue *>(nativeQueue)); 1061bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian if (queue == 0) return JNI_FALSE; 1071bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian status_t res; 1081bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian if (enable) { 1091bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian res = queue->enableSensor(sensor); 1101bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian } else { 1111bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian res = queue->disableSensor(sensor); 112270e87f71abc2edf446dbec20c725c823e8c7f37Mike Lockwood } 1131bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return res == NO_ERROR ? true : false; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint 1171bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopiansensors_data_poll(JNIEnv *env, jclass clazz, jint nativeQueue, 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloatArray values, jintArray status, jlongArray timestamp) 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1201bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian sp<SensorEventQueue> queue(reinterpret_cast<SensorEventQueue *>(nativeQueue)); 1211bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian if (queue == 0) return -1; 1221bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1231bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian status_t res; 1241bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian ASensorEvent event; 1251bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1261bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian res = queue->read(&event, 1); 1271bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian if (res == -EAGAIN) { 1281bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian res = queue->waitForEvent(); 1291bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian if (res != NO_ERROR) 1301bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return -1; 1311bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian res = queue->read(&event, 1); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1331bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian if (res < 0) 1341bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return -1; 1351bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1361bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian jint accuracy = event.vector.status; 1371bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetFloatArrayRegion(values, 0, 3, event.vector.v); 1381bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetIntArrayRegion(status, 0, 1, &accuracy); 1391bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian env->SetLongArrayRegion(timestamp, 0, 1, &event.timestamp); 1401bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1411bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return event.sensor; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectnativeClassInit (JNIEnv *_env, jclass _this) 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass sensorClass = _env->FindClass("android/hardware/Sensor"); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SensorOffsets& sensorOffsets = gSensorOffsets; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.name = _env->GetFieldID(sensorClass, "mName", "Ljava/lang/String;"); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.vendor = _env->GetFieldID(sensorClass, "mVendor", "Ljava/lang/String;"); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.version = _env->GetFieldID(sensorClass, "mVersion", "I"); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.handle = _env->GetFieldID(sensorClass, "mHandle", "I"); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.type = _env->GetFieldID(sensorClass, "mType", "I"); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.range = _env->GetFieldID(sensorClass, "mMaxRange", "F"); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.resolution = _env->GetFieldID(sensorClass, "mResolution","F"); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensorOffsets.power = _env->GetFieldID(sensorClass, "mPower", "F"); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeClassInit", "()V", (void*)nativeClassInit }, 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"sensors_module_init","()I", (void*)sensors_module_init }, 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"sensors_module_get_next_sensor","(Landroid/hardware/Sensor;I)I", 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*)sensors_module_get_next_sensor }, 1641bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1651bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian {"sensors_create_queue", "()I", (void*)sensors_create_queue }, 1661bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian {"sensors_destroy_queue", "(I)V", (void*)sensors_destroy_queue }, 1671bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian {"sensors_enable_sensor", "(ILjava/lang/String;II)Z", 1681bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian (void*)sensors_enable_sensor }, 1691bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1701bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian {"sensors_data_poll", "(I[F[I[J)I", (void*)sensors_data_poll }, 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_hardware_SensorManager(JNIEnv *env) 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return jniRegisterNativeMethods(env, "android/hardware/SensorManager", 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gMethods, NELEM(gMethods)); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 182