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