com_phidgets_SpatialPhidget.c
Go to the documentation of this file.
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; //class
00009 static jmethodID spatialEventData_cons; //constructor
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 //SpatialData event
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         //create and fill in short array
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                 //create and fill in data arrays
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                 //create and add the SpatialEventData object to its array
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 }


pedal_monitor
Author(s): Pedro Mendes
autogenerated on Fri Jun 6 2014 18:37:20