aboutsummaryrefslogtreecommitdiffstats
path: root/Java/com_phidgets_BridgePhidget.c
blob: 6f42cf76183d85f3d07f98ac1e2491aaf08e17c6 (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
37
38
39
40
#include "../stdafx.h"
#include "phidget_jni.h"
#include "com_phidgets_BridgePhidget.h"
#include "../cphidgetbridge.h"

EVENT_VARS(bridgeData, BridgeData)

JNI_LOAD(bridge, Bridge)
	EVENT_VAR_SETUP(bridge, bridgeData, BridgeData, ID, V)
}

EVENT_HANDLER_INDEXED(Bridge, bridgeData, BridgeData, 
					  CPhidgetBridge_set_OnBridgeData_Handler, double)

JNI_CREATE(Bridge)

JNI_GETFUNC(Bridge, InputCount, InputCount, jint)
JNI_INDEXED_GETFUNC(Bridge, BridgeValue, BridgeValue, jdouble)
JNI_INDEXED_GETFUNC(Bridge, BridgeMin, BridgeMin, jdouble)
JNI_INDEXED_GETFUNC(Bridge, BridgeMax, BridgeMax, jdouble)
JNI_INDEXED_GETFUNCBOOL(Bridge, Enabled, Enabled)
JNI_INDEXED_SETFUNC(Bridge, Enabled, Enabled, jboolean)

JNIEXPORT jint JNICALL
Java_com_phidgets_BridgePhidget_getGain(JNIEnv *env, jobject obj, jint index)
{
	CPhidgetBridgeHandle h = (CPhidgetBridgeHandle)(uintptr_t)
	    (*env)->GetLongField(env, obj, handle_fid);
	int error;
	CPhidgetBridge_Gain v;
	if ((error = CPhidgetBridge_getGain(h, index, &v)))
		PH_THROW(error);
	return (jint)v;
}

JNI_INDEXED_SETFUNC(Bridge, Gain, Gain, jint)
JNI_GETFUNC(Bridge, DataRate, DataRate, jint)
JNI_SETFUNC(Bridge, DataRate, DataRate, jint)
JNI_GETFUNC(Bridge, DataRateMin, DataRateMin, jint)
JNI_GETFUNC(Bridge, DataRateMax, DataRateMax, jint)
>, int period, double value) { static FILTER *Filter=NULL; static int nFilter=0; struct timeval now; double t, v; int i, j; gettimeofday (&now, NULL); for (i=0; i<nFilter; i++) { if (strcmp(name, Filter[i].name)==0) break; } if (i==nFilter) { int slots=(period+tick-1)/tick; if (slots<2) slots=2; else if (slots>SLOTS) slots=SLOTS; nFilter++; Filter=realloc(Filter, nFilter*sizeof(FILTER)); Filter[i].name=strdup(name); Filter[i].slots=slots; Filter[i].time=malloc(slots*sizeof(Filter[i].time[0])); Filter[i].value=malloc(slots*sizeof(Filter[i].value[0])); for (j=0; j<slots; j++) { Filter[i].time[j]=now; Filter[i].value[j]=value; } } for (j=Filter[i].slots-1; j>0; j--) { Filter[i].time[j]=Filter[i].time[j-1]; Filter[i].value[j]=Filter[i].value[j-1]; } Filter[i].time[0]=now; Filter[i].value[0]=value; t = SECONDS(Filter[i].time[0]) - SECONDS(Filter[i].time[Filter[i].slots-1]); v = Filter[i].value[0]-Filter[i].value[Filter[i].slots-1]; if (t==0.0 || v<0.0) return 0; else return v/t; } double damp(char *name, double value) { static int tau=-1; static FILTER *Filter=NULL; static int nFilter=0; struct timeval now; double max; int i, j; if (tau==-1) tau=atoi(cfg_get("tau")?:"500"); if (tau==0.0) return value; gettimeofday (&now, NULL); for (i=0; i<nFilter; i++) { if (strcmp(name, Filter[i].name)==0) break; } if (i==nFilter) { int slots=log(100)*tau/tick; if (slots<1) slots=1; else if (slots>SLOTS) slots=SLOTS; nFilter++; Filter=realloc(Filter, nFilter*sizeof(FILTER)); Filter[i].name=strdup(name); Filter[i].slots=slots; Filter[i].time=malloc(slots*sizeof(Filter[i].time)); Filter[i].value=malloc(slots*sizeof(Filter[i].value)); for (j=0; j<slots; j++) { Filter[i].time[j]=now; Filter[i].value[j]=0; } } max=value; for (j=Filter[i].slots-1; j>0; j--) { double t = SECONDS(Filter[i].time[j]) - SECONDS(Filter[i].time[j-1]); Filter[i].time[j]=Filter[i].time[j-1]; Filter[i].value[j]=Filter[i].value[j-1]*exp(-t/tau); if (Filter[i].value[j]>max) max=Filter[i].value[j]; } Filter[i].time[0]=now; Filter[i].value[0]=value; return max; }