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