00001 #include "../stdafx.h"
00002 #include "phidget_jni.h"
00003 #include "com_phidgets_SpatialPhidget.h"
00004 #include "../cphidgetspatial.h"
00005
00006 EVENT_VARS(spatialData, SpatialData)
00007
00008 static jclass spatialEventData_class;
00009 static jmethodID spatialEventData_cons;
00010
00011 JNI_LOAD(spatial, Spatial)
00012 EVENT_VAR_SETUP(spatial, spatialData, SpatialData, [Lcom/phidgets/SpatialEventData;, V)
00013
00014 if (!(spatialEventData_class = (*env)->FindClass(env,"com/phidgets/SpatialEventData")))
00015 JNI_ABORT_STDERR("Couldn't FindClass com/phidgets/SpatialEventData");
00016 if (!(spatialEventData_class = (jclass)(*env)->NewGlobalRef(env, spatialEventData_class)))
00017 JNI_ABORT_STDERR("Couldn't create global ref spatialEventData_class");
00018 if (!(spatialEventData_cons = (*env)->GetMethodID(env, spatialEventData_class, "<init>", "([D[D[DII)V")))
00019 JNI_ABORT_STDERR("Couldn't get method ID <init> from spatialEventData_class");
00020 }
00021
00022
00023 static int CCONV spatialData_handler(CPhidgetSpatialHandle h, void *arg, CPhidgetSpatial_SpatialEventDataHandle *, int);
00024 JNIEXPORT void JNICALL
00025 Java_com_phidgets_SpatialPhidget_enableSpatialDataEvents(JNIEnv *env, jobject obj, jboolean b)
00026 {
00027 jlong gr = updateGlobalRef(env, obj, nativeSpatialDataHandler_fid, b);
00028 CPhidgetSpatialHandle h = (CPhidgetSpatialHandle)(uintptr_t)(*env)->GetLongField(env, obj, handle_fid);
00029 CPhidgetSpatial_set_OnSpatialData_Handler(h, b ? spatialData_handler : 0, (void *)(uintptr_t)gr);
00030 }
00031 static int CCONV
00032 spatialData_handler(CPhidgetSpatialHandle h, void *arg, CPhidgetSpatial_SpatialEventDataHandle *data, int dataLength)
00033 {
00034 JNIEnv *env;
00035 jobject obj;
00036 jobject spatialDataEv;
00037 jobject spatialEventData;
00038 jobjectArray jo;
00039 int i, j;
00040
00041 if ((*ph_vm)->AttachCurrentThread(ph_vm, (JNIEnvPtr)&env, NULL))
00042 JNI_ABORT_STDERR("Couldn't AttachCurrentThread");
00043
00044 obj = (jobject)arg;
00045
00046
00047 jo = (*env)->NewObjectArray(env, dataLength, spatialEventData_class, NULL);
00048 if (!jo)
00049 return -1;
00050
00051 for (i=0; i<dataLength; i++)
00052 {
00053 jdoubleArray accel, gyro, mag;
00054 jdouble *datas;
00055
00056
00057 accel = (*env)->NewDoubleArray(env, h->phid.attr.spatial.numAccelAxes);
00058 gyro = (*env)->NewDoubleArray(env, h->phid.attr.spatial.numGyroAxes);
00059 mag = (*env)->NewDoubleArray(env, data[i]->magneticField[0]==PUNK_DBL?0:h->phid.attr.spatial.numCompassAxes);
00060
00061 if (!accel || !gyro || !mag)
00062 {
00063 PH_THROW(EPHIDGET_UNEXPECTED);
00064 return -1;
00065 }
00066
00067 if(h->phid.attr.spatial.numAccelAxes)
00068 {
00069 datas = (*env)->GetDoubleArrayElements(env, accel, 0);
00070 if (!datas)
00071 {
00072 PH_THROW(EPHIDGET_UNEXPECTED);
00073 return -1;
00074 }
00075 for (j=0; j<h->phid.attr.spatial.numAccelAxes; j++)
00076 datas[j] = (jdouble)data[i]->acceleration[j];
00077 (*env)->ReleaseDoubleArrayElements(env, accel, datas, 0);
00078 }
00079 if(h->phid.attr.spatial.numGyroAxes)
00080 {
00081 datas = (*env)->GetDoubleArrayElements(env, gyro, 0);
00082 if (!datas)
00083 {
00084 PH_THROW(EPHIDGET_UNEXPECTED);
00085 return -1;
00086 }
00087 for (j=0; j<h->phid.attr.spatial.numGyroAxes; j++)
00088 datas[j] = (jdouble)data[i]->angularRate[j];
00089 (*env)->ReleaseDoubleArrayElements(env, gyro, datas, 0);
00090 }
00091 if(data[i]->magneticField[0]==PUNK_DBL?0:h->phid.attr.spatial.numCompassAxes)
00092 {
00093 datas = (*env)->GetDoubleArrayElements(env, mag, 0);
00094 if (!datas)
00095 {
00096 PH_THROW(EPHIDGET_UNEXPECTED);
00097 return -1;
00098 }
00099 for (j=0; j<h->phid.attr.spatial.numCompassAxes; j++)
00100 datas[j] = (jdouble)data[i]->magneticField[j];
00101 (*env)->ReleaseDoubleArrayElements(env, mag, datas, 0);
00102 }
00103
00104 if(!(spatialEventData = (*env)->NewObject(env, spatialEventData_class, spatialEventData_cons, accel, gyro, mag, data[i]->timestamp.seconds, data[i]->timestamp.microseconds)))
00105 {
00106 PH_THROW(EPHIDGET_UNEXPECTED);
00107 return -1;
00108 }
00109
00110 (*env)->DeleteLocalRef(env, accel);
00111 (*env)->DeleteLocalRef(env, gyro);
00112 (*env)->DeleteLocalRef(env, mag);
00113
00114
00115 (*env)->SetObjectArrayElement(env,jo,i,spatialEventData);
00116
00117 (*env)->DeleteLocalRef(env, spatialEventData);
00118 }
00119
00120 if (!(spatialDataEv = (*env)->NewObject(env, spatialDataEvent_class, spatialDataEvent_cons, obj, jo)))
00121 {
00122 PH_THROW(EPHIDGET_UNEXPECTED);
00123 return -1;
00124 }
00125 (*env)->DeleteLocalRef(env, jo);
00126
00127 (*env)->CallVoidMethod(env, obj, fireSpatialData_mid, spatialDataEv);
00128
00129 (*env)->DeleteLocalRef(env, spatialDataEv);
00130
00131 return 0;
00132 }
00133
00134 JNI_CREATE(Spatial)
00135
00136 JNI_INDEXED_GETFUNC(Spatial, AccelerationMax, AccelerationMax, jdouble)
00137 JNI_INDEXED_GETFUNC(Spatial, AccelerationMin, AccelerationMin, jdouble)
00138 JNI_INDEXED_GETFUNC(Spatial, Acceleration, Acceleration, jdouble)
00139 JNI_GETFUNC(Spatial, AccelerationAxisCount, AccelerationAxisCount, jint)
00140
00141 JNI_INDEXED_GETFUNC(Spatial, AngularRateMax, AngularRateMax, jdouble)
00142 JNI_INDEXED_GETFUNC(Spatial, AngularRateMin, AngularRateMin, jdouble)
00143 JNI_INDEXED_GETFUNC(Spatial, AngularRate, AngularRate, jdouble)
00144 JNI_GETFUNC(Spatial, GyroAxisCount, GyroAxisCount, jint)
00145
00146 JNI_INDEXED_GETFUNC(Spatial, MagneticFieldMax, MagneticFieldMax, jdouble)
00147 JNI_INDEXED_GETFUNC(Spatial, MagneticFieldMin, MagneticFieldMin, jdouble)
00148 JNI_INDEXED_GETFUNC(Spatial, MagneticField, MagneticField, jdouble)
00149 JNI_GETFUNC(Spatial, CompassAxisCount, CompassAxisCount, jint)
00150
00151 JNI_GETFUNC(Spatial, DataRateMin, DataRateMin, jint)
00152 JNI_GETFUNC(Spatial, DataRateMax, DataRateMax, jint)
00153 JNI_GETFUNC(Spatial, DataRate, DataRate, jint)
00154 JNI_SETFUNC(Spatial, DataRate, DataRate, jint)
00155
00156 JNIEXPORT void JNICALL Java_com_phidgets_SpatialPhidget_zeroGyro (JNIEnv *env, jobject obj)
00157 {
00158 CPhidgetSpatialHandle h = (CPhidgetSpatialHandle)(uintptr_t)(*env)->GetLongField( env, obj, handle_fid);
00159 int error;
00160 if ((error = CPhidgetSpatial_zeroGyro(h)))
00161 PH_THROW(error);
00162 }
00163
00164 JNIEXPORT void JNICALL Java_com_phidgets_SpatialPhidget_setCompassCorrectionParameters (JNIEnv *env, jobject obj,
00165 jdouble magField,
00166 jdouble offset0, jdouble offset1, jdouble offset2,
00167 jdouble gain0, jdouble gain1, jdouble gain2,
00168 jdouble T0, jdouble T1, jdouble T2, jdouble T3, jdouble T4, jdouble T5)
00169 {
00170 CPhidgetSpatialHandle h = (CPhidgetSpatialHandle)(uintptr_t)
00171 (*env)->GetLongField(env, obj, handle_fid);
00172 int error;
00173 if ((error = CPhidgetSpatial_setCompassCorrectionParameters(h, magField, offset0, offset1, offset2, gain0, gain1, gain2, T0, T1, T2, T3, T4, T5)))
00174 PH_THROW(error);
00175 }
00176
00177 JNIEXPORT void JNICALL Java_com_phidgets_SpatialPhidget_resetCompassCorrectionParameters (JNIEnv *env, jobject obj)
00178 {
00179 CPhidgetSpatialHandle h = (CPhidgetSpatialHandle)(uintptr_t)(*env)->GetLongField( env, obj, handle_fid);
00180 int error;
00181 if ((error = CPhidgetSpatial_resetCompassCorrectionParameters(h)))
00182 PH_THROW(error);
00183 }