aboutsummaryrefslogtreecommitdiffstats
path: root/processor.h
blob: eb489a4f353e117c48fecaa22807a2c5f99d51fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "../stdafx.h"
#include "phidget_jni.h"
#include "com_phidgets_SpatialPhidget.h"
#include "../cphidgetspatial.h"

EVENT_VARS(spatialData, SpatialData)

static jclass spatialEventData_class; //class
static jmethodID spatialEventData_cons; //constructor

JNI_LOAD(spatial, Spatial)
	EVENT_VAR_SETUP(spatial, spatialData, SpatialData, [Lcom/phidgets/SpatialEventData;, V)

	if (!(spatialEventData_class = (*env)->FindClass(env,"com/phidgets/SpatialEventData")))
		JNI_ABORT_STDERR("Couldn't FindClass com/phidgets/SpatialEventData");
	if (!(spatialEventData_class = (jclass)(*env)->NewGlobalRef(env, spatialEventData_class)))
		JNI_ABORT_STDERR("Couldn't create global ref spatialEventData_class");
	if (!(spatialEventData_cons = (*env)->GetMethodID(env, spatialEventData_class, "<init>", "([D[D[DII)V")))
		JNI_ABORT_STDERR("Couldn't get method ID <init> from spatialEventData_class");
}

//SpatialData event
static int CCONV spatialData_handler(CPhidgetSpatialHandle h, void *arg, CPhidgetSpatial_SpatialEventDataHandle *, int);
JNIEXPORT void JNICALL
Java_com_phidgets_SpatialPhidget_enableSpatialDataEvents(JNIEnv *env, jobject obj, jboolean b)
{
	jlong gr = updateGlobalRef(env, obj, nativeSpatialDataHandler_fid, b);
	CPhidgetSpatialHandle h = (CPhidgetSpatialHandle)(uintptr_t)(*env)->GetLongField(env, obj, handle_fid);
	CPhidgetSpatial_set_OnSpatialData_Handler(h, b ? spatialData_handler : 0, (void *)(uintptr_t)gr);
}
static int CCONV
spatialData_handler(CPhidgetSpatialHandle h, void *arg, CPhidgetSpatial_SpatialEventDataHandle *data, int dataLength)
{
	JNIEnv *env;
	jobject obj;
	jobject spatialDataEv;
	jobjectArray jo;
	int i, j;

	if ((*ph_vm)->AttachCurrentThread(ph_vm, (JNIEnvPtr)&env, NULL))
		JNI_ABORT_STDERR("Couldn't AttachCurrentThread");

	obj = (jobject)arg;

	//create and fill in short array
	jo = (*env)->NewObjectArray(env, dataLength, spatialEventData_class, NULL);
	if (!jo)
		return -1;

	for (i=0; i<dataLength; i++)
	{
		jdoubleArray accel, gyro, mag;
		jdouble *datas;

		//create and fill in data arrays
		accel = (*env)->NewDoubleArray(env, h->phid.attr.spatial.numAccelAxes);
		gyro = (*env)->NewDoubleArray(env, h->phid.attr.spatial.numGyroAxes);
		mag = (*env)->NewDoubleArray(env, data[i]->magneticField[0]==PUNK_DBL?0:h->phid.attr.spatial.numCompassAxes);
		if (!accel || !gyro || !mag)
		{
			PH_THROW(EPHIDGET_UNEXPECTED);
			return -1;
		}
		if(h->phid.attr.spatial.numAccelAxes)
		{
			datas = (*env)->GetDoubleArrayElements(env, accel, 0);
			if (!datas)
			{
				PH_THROW(EPHIDGET_UNEXPECTED);
				return -1;
			}
			for (j=0; j<h->phid.attr.spatial.numAccelAxes; j++)
				datas[j] = (jdouble)data[i]->acceleration[j];
			(*env)->ReleaseDoubleArrayElements(env, accel, datas, 0);
		}
		if(h->phid.attr.spatial.numGyroAxes)
		{
			datas = (*env)->GetDoubleArrayElements(env, gyro, 0);
			if (!datas)
			{
				PH_THROW(EPHIDGET_UNEXPECTED);
				return -1;
			}
			for (j=0; j<h->phid.attr.spatial.numGyroAxes; j++)
				datas[j] = (jdouble)data[i]->angularRate[j];
			(*env)->ReleaseDoubleArrayElements(env, gyro, datas, 0);
		}
		if(data[i]->magneticField[0]==PUNK_DBL?0:h->phid.attr.spatial.numCompassAxes)
		{
			datas = (*env)->GetDoubleArrayElements(env, mag, 0);
			if (!datas)
			{
				PH_THROW(EPHIDGET_UNEXPECTED);
				return -1;
			}
			for (j=0; j<h->phid.attr.spatial.numCompassAxes; j++)
				datas[j] = (jdouble)data[i]->magneticField[j];
			(*env)->ReleaseDoubleArrayElements(env, mag, datas, 0);
		}

		//create and add the SpatialEventData object to its array
		(*env)->SetObjectArrayElement(env,jo,i,(*env)->NewObject(env, spatialEventData_class, spatialEventData_cons, accel, gyro, mag, data[i]->timestamp.seconds, data[i]->timestamp.microseconds));
	}

	if (!(spatialDataEv = (*env)->NewObject(env, spatialDataEvent_class, spatialDataEvent_cons, obj, jo)))
	{
		return -1;
	}

	(*env)->CallVoidMethod(env, obj, fireSpatialData_mid, spatialDataEv);

	(*env)->DeleteLocalRef(env, spatialDataEv);
	(*ph_vm)->DetachCurrentThread(ph_vm);

	return 0;
}

JNI_CREATE(Spatial)

JNI_INDEXED_GETFUNC(Spatial, AccelerationMax, AccelerationMax, jdouble)
JNI_INDEXED_GETFUNC(Spatial, AccelerationMin, AccelerationMin, jdouble)
JNI_INDEXED_GETFUNC(Spatial, Acceleration, Acceleration, jdouble)
JNI_GETFUNC(Spatial, AccelerationAxisCount, AccelerationAxisCount, jint)

JNI_INDEXED_GETFUNC(Spatial, AngularRateMax, AngularRateMax, jdouble)
JNI_INDEXED_GETFUNC(Spatial, AngularRateMin, AngularRateMin, jdouble)
JNI_INDEXED_GETFUNC(Spatial, AngularRate, AngularRate, jdouble)
JNI_GETFUNC(Spatial, GyroAxisCount, GyroAxisCount, jint)

JNI_INDEXED_GETFUNC(Spatial, MagneticFieldMax, MagneticFieldMax, jdouble)
JNI_INDEXED_GETFUNC(Spatial, MagneticFieldMin, MagneticFieldMin, jdouble)
JNI_INDEXED_GETFUNC(Spatial, MagneticField, MagneticField, jdouble)
JNI_GETFUNC(Spatial, CompassAxisCount, CompassAxisCount, jint)

JNI_GETFUNC(Spatial, DataRateMin, DataRateMin, jint)
JNI_GETFUNC(Spatial, DataRateMax, DataRateMax, jint)
JNI_GETFUNC(Spatial, DataRate, DataRate, jint)
JNI_SETFUNC(Spatial, DataRate, DataRate, jint)

JNIEXPORT void JNICALL Java_com_phidgets_SpatialPhidget_zeroGyro (JNIEnv *env, jobject obj)
{
	CPhidgetSpatialHandle h = (CPhidgetSpatialHandle)(uintptr_t)(*env)->GetLongField( env, obj, handle_fid);
	int error;
	if ((error = CPhidgetSpatial_zeroGyro(h)))
		PH_THROW(error);
}

JNIEXPORT void JNICALL Java_com_phidgets_SpatialPhidget_setCompassCorrectionParameters (JNIEnv *env, jobject obj, 
	jdouble magField, 
	jdouble offset0, jdouble offset1, jdouble offset2, 
	jdouble gain0, jdouble gain1, jdouble gain2, 
	jdouble T0, jdouble T1, jdouble T2, jdouble T3, jdouble T4, jdouble T5)
{
	CPhidgetSpatialHandle h = (CPhidgetSpatialHandle)(uintptr_t)(*env)->GetLongField( env, obj, handle_fid);
	int error;
	if ((error = CPhidgetSpatial_setCompassCorrectionParameters(h, magField, offset0, offset1, offset2, gain0, gain1, gain2, T0, T1, T2, T3, T4, T5)))
		PH_THROW(error);
}

JNIEXPORT void JNICALL Java_com_phidgets_SpatialPhidget_resetCompassCorrectionParameters (JNIEnv *env, jobject obj)
{
	CPhidgetSpatialHandle h = (CPhidgetSpatialHandle)(uintptr_t)(*env)->GetLongField( env, obj, handle_fid);
	int error;
	if ((error = CPhidgetSpatial_resetCompassCorrectionParameters(h)))
		PH_THROW(error);
}