diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:43 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:43 -0800 |
commit | f013e1afd1e68af5e3b868c26a653bbfb39538f8 (patch) | |
tree | 7ad6c8fd9c7b55f4b4017171dec1cb760bbd26bf /core/jni/android_hardware_SensorManager.cpp | |
parent | e70cfafe580c6f2994c4827cd8a534aabf3eb05c (diff) | |
download | frameworks_base-f013e1afd1e68af5e3b868c26a653bbfb39538f8.zip frameworks_base-f013e1afd1e68af5e3b868c26a653bbfb39538f8.tar.gz frameworks_base-f013e1afd1e68af5e3b868c26a653bbfb39538f8.tar.bz2 |
Code drop from //branches/cupcake/...@124589
Diffstat (limited to 'core/jni/android_hardware_SensorManager.cpp')
-rw-r--r-- | core/jni/android_hardware_SensorManager.cpp | 127 |
1 files changed, 109 insertions, 18 deletions
diff --git a/core/jni/android_hardware_SensorManager.cpp b/core/jni/android_hardware_SensorManager.cpp index e8dcd71..75aa458 100644 --- a/core/jni/android_hardware_SensorManager.cpp +++ b/core/jni/android_hardware_SensorManager.cpp @@ -24,51 +24,142 @@ namespace android { +struct SensorOffsets +{ + jfieldID name; + jfieldID vendor; + jfieldID version; + jfieldID handle; + jfieldID type; + jfieldID range; + jfieldID resolution; + jfieldID power; +} gSensorOffsets; + /* * The method below are not thread-safe and not intended to be */ +static sensors_module_t* sSensorModule = 0; +static sensors_data_device_t* sSensorDevice = 0; + +static jint +sensors_module_init(JNIEnv *env, jclass clazz) +{ + int err = 0; + sensors_module_t const* module; + err = hw_get_module(SENSORS_HARDWARE_MODULE_ID, (const hw_module_t **)&module); + if (err == 0) + sSensorModule = (sensors_module_t*)module; + return err; +} + static jint -android_data_open(JNIEnv *env, jclass clazz, jobject fdo) +sensors_module_get_next_sensor(JNIEnv *env, jobject clazz, jobject sensor, jint next) +{ + if (sSensorModule == NULL) + return 0; + + SensorOffsets& sensorOffsets = gSensorOffsets; + const struct sensor_t* list; + int count = sSensorModule->get_sensors_list(sSensorModule, &list); + if (next >= count) + return -1; + + list += next; + + jstring name = env->NewStringUTF(list->name); + jstring vendor = env->NewStringUTF(list->vendor); + env->SetObjectField(sensor, sensorOffsets.name, name); + env->SetObjectField(sensor, sensorOffsets.vendor, vendor); + env->SetIntField(sensor, sensorOffsets.version, list->version); + env->SetIntField(sensor, sensorOffsets.handle, list->handle); + env->SetIntField(sensor, sensorOffsets.type, list->type); + env->SetFloatField(sensor, sensorOffsets.range, list->maxRange); + env->SetFloatField(sensor, sensorOffsets.resolution, list->resolution); + env->SetFloatField(sensor, sensorOffsets.power, list->power); + + next++; + return next<count ? next : 0; +} + +//---------------------------------------------------------------------------- +static jint +sensors_data_init(JNIEnv *env, jclass clazz) +{ + if (sSensorModule == NULL) + return -1; + int err = sensors_data_open(&sSensorModule->common, &sSensorDevice); + return err; +} + +static jint +sensors_data_uninit(JNIEnv *env, jclass clazz) +{ + int err = 0; + if (sSensorDevice) { + err = sensors_data_close(sSensorDevice); + if (err == 0) + sSensorDevice = 0; + } + return err; +} + +static jint +sensors_data_open(JNIEnv *env, jclass clazz, jobject fdo) { jclass FileDescriptor = env->FindClass("java/io/FileDescriptor"); jfieldID offset = env->GetFieldID(FileDescriptor, "descriptor", "I"); int fd = env->GetIntField(fdo, offset); - return sensors_data_open(fd); // doesn't take ownership of fd + return sSensorDevice->data_open(sSensorDevice, fd); // doesn't take ownership of fd } static jint -android_data_close(JNIEnv *env, jclass clazz) +sensors_data_close(JNIEnv *env, jclass clazz) { - return sensors_data_close(); + return sSensorDevice->data_close(sSensorDevice); } static jint -android_data_poll(JNIEnv *env, jclass clazz, jfloatArray values, jint sensors) +sensors_data_poll(JNIEnv *env, jclass clazz, + jfloatArray values, jintArray status, jlongArray timestamp) { sensors_data_t data; - int res = sensors_data_poll(&data, sensors); - if (res) { + int res = sSensorDevice->poll(sSensorDevice, &data); + if (res >= 0) { + jint accuracy = data.vector.status; env->SetFloatArrayRegion(values, 0, 3, data.vector.v); - // return the sensor's number - res = 31 - __builtin_clz(res); - // and its status in the top 4 bits - res |= data.vector.status << 28; + env->SetIntArrayRegion(status, 0, 1, &accuracy); + env->SetLongArrayRegion(timestamp, 0, 1, &data.time); } return res; } -static jint -android_data_get_sensors(JNIEnv *env, jclass clazz) +static void +nativeClassInit (JNIEnv *_env, jclass _this) { - return sensors_data_get_sensors(); + jclass sensorClass = _env->FindClass("android/hardware/Sensor"); + SensorOffsets& sensorOffsets = gSensorOffsets; + sensorOffsets.name = _env->GetFieldID(sensorClass, "mName", "Ljava/lang/String;"); + sensorOffsets.vendor = _env->GetFieldID(sensorClass, "mVendor", "Ljava/lang/String;"); + sensorOffsets.version = _env->GetFieldID(sensorClass, "mVersion", "I"); + sensorOffsets.handle = _env->GetFieldID(sensorClass, "mHandle", "I"); + sensorOffsets.type = _env->GetFieldID(sensorClass, "mType", "I"); + sensorOffsets.range = _env->GetFieldID(sensorClass, "mMaxRange", "F"); + sensorOffsets.resolution = _env->GetFieldID(sensorClass, "mResolution","F"); + sensorOffsets.power = _env->GetFieldID(sensorClass, "mPower", "F"); } static JNINativeMethod gMethods[] = { - {"_sensors_data_open", "(Ljava/io/FileDescriptor;)I", (void*) android_data_open }, - {"_sensors_data_close", "()I", (void*) android_data_close }, - {"_sensors_data_poll", "([FI)I", (void*) android_data_poll }, - {"_sensors_data_get_sensors","()I", (void*) android_data_get_sensors }, + {"nativeClassInit", "()V", (void*)nativeClassInit }, + {"sensors_module_init","()I", (void*)sensors_module_init }, + {"sensors_module_get_next_sensor","(Landroid/hardware/Sensor;I)I", + (void*)sensors_module_get_next_sensor }, + {"sensors_data_init", "()I", (void*)sensors_data_init }, + {"sensors_data_uninit", "()I", (void*)sensors_data_uninit }, + {"sensors_data_open", "(Ljava/io/FileDescriptor;)I", (void*)sensors_data_open }, + {"sensors_data_close", "()I", (void*)sensors_data_close }, + {"sensors_data_poll", "([F[I[J)I", (void*)sensors_data_poll }, }; }; // namespace android |