-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathorg_libdivecomputer_Parser.c
312 lines (276 loc) · 10.4 KB
/
org_libdivecomputer_Parser.c
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
#include <libdivecomputer/parser.h>
#include "org_libdivecomputer_Parser.h"
#include "exception.h"
typedef struct jni_parser_t {
JNIEnv *env;
jobject obj;
jclass cls;
jmethodID time;
jmethodID depth;
jmethodID pressure;
jmethodID temperature;
jmethodID event;
jmethodID rbt;
jmethodID heartbeat;
jmethodID bearing;
jmethodID vendor;
jmethodID setpoint;
jmethodID ppo2;
jmethodID cns;
jmethodID deco;
jmethodID gasmix;
} jni_parser_t;
static void
sample_cb (dc_sample_type_t type, const dc_sample_value_t *value, void *userdata)
{
jni_parser_t *jni = userdata;
switch (type) {
case DC_SAMPLE_TIME:
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->time,
value->time);
break;
case DC_SAMPLE_DEPTH:
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->depth,
value->depth);
break;
case DC_SAMPLE_PRESSURE:
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->pressure,
value->pressure.tank,
value->pressure.value);
break;
case DC_SAMPLE_TEMPERATURE:
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->temperature,
value->temperature);
break;
case DC_SAMPLE_EVENT:
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->event,
value->event.type,
value->event.time,
value->event.flags,
value->event.value);
break;
case DC_SAMPLE_RBT:
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->rbt,
value->rbt);
break;
case DC_SAMPLE_HEARTBEAT:
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->heartbeat,
value->heartbeat);
break;
case DC_SAMPLE_BEARING:
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->bearing,
value->bearing);
break;
case DC_SAMPLE_VENDOR:
#if 0
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->vendor,
value->vendor.type,
value->vendor.data,
value->vendor.size);
#endif
break;
case DC_SAMPLE_SETPOINT:
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->setpoint,
value->setpoint);
break;
case DC_SAMPLE_PPO2:
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->ppo2,
value->ppo2.sensor,
value->ppo2.value);
break;
case DC_SAMPLE_CNS:
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->cns,
value->cns);
break;
case DC_SAMPLE_DECO:
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->deco,
value->deco.type,
value->deco.time,
value->deco.depth,
value->deco.tts);
break;
case DC_SAMPLE_GASMIX:
(*jni->env)->CallVoidMethod(jni->env, jni->obj,
jni->gasmix,
value->gasmix);
break;
default:
break;
}
}
JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Parser_New
(JNIEnv *env, jobject obj, jlong device, jbyteArray data)
{
dc_parser_t *parser = NULL;
// Get the pointer and length.
jboolean isCopy = 0;
jint len = (*env)->GetArrayLength(env, data);
jbyte *buf = (*env)->GetByteArrayElements(env, data, &isCopy);
DC_EXCEPTION_THROW(dc_parser_new (&parser,
(dc_device_t *) device,
buf,
len));
// Release the pointer.
(*env)->ReleaseByteArrayElements(env, data, buf, JNI_ABORT);
return (jlong) parser;
}
JNIEXPORT jlong JNICALL Java_org_libdivecomputer_Parser_New2
(JNIEnv *env, jobject obj, jlong context, jlong descriptor, jbyteArray data)
{
dc_parser_t *parser = NULL;
// Get the pointer and length.
jboolean isCopy = 0;
jint len = (*env)->GetArrayLength(env, data);
jbyte *buf = (*env)->GetByteArrayElements(env, data, &isCopy);
DC_EXCEPTION_THROW(dc_parser_new2 (&parser,
(dc_context_t *) context,
(dc_descriptor_t *) descriptor,
buf,
len));
// Release the pointer.
(*env)->ReleaseByteArrayElements(env, data, buf, JNI_ABORT);
return (jlong) parser;
}
JNIEXPORT void JNICALL Java_org_libdivecomputer_Parser_Free
(JNIEnv *env, jobject obj, jlong handle)
{
DC_EXCEPTION_THROW(dc_parser_destroy ((dc_parser_t *) handle));
}
JNIEXPORT void JNICALL Java_org_libdivecomputer_Parser_Foreach
(JNIEnv *env, jobject obj, jlong handle, jobject callback)
{
jni_parser_t jni = {0};
if (callback) {
jni.env = env;
jni.obj = (*env)->NewGlobalRef(env, callback);
jni.cls = (*env)->GetObjectClass(env, callback);
jni.time = (*env)->GetMethodID(env, jni.cls, "Time", "(I)V");
jni.depth = (*env)->GetMethodID(env, jni.cls, "Depth", "(D)V");
jni.pressure = (*env)->GetMethodID(env, jni.cls, "Pressure", "(ID)V");
jni.temperature = (*env)->GetMethodID(env, jni.cls, "Temperature", "(D)V");
jni.event = (*env)->GetMethodID(env, jni.cls, "Event", "(IIII)V");
jni.rbt = (*env)->GetMethodID(env, jni.cls, "Rbt", "(I)V");
jni.heartbeat = (*env)->GetMethodID(env, jni.cls, "Heartbeat", "(I)V");
jni.bearing = (*env)->GetMethodID(env, jni.cls, "Bearing", "(I)V");
jni.vendor = (*env)->GetMethodID(env, jni.cls, "Vendor", "(I[B)V");
jni.setpoint = (*env)->GetMethodID(env, jni.cls, "Setpoint", "(D)V");
jni.ppo2 = (*env)->GetMethodID(env, jni.cls, "Ppo2", "(ID)V");
jni.cns = (*env)->GetMethodID(env, jni.cls, "Cns", "(D)V");
jni.deco = (*env)->GetMethodID(env, jni.cls, "Deco", "(IIDI)V");
jni.gasmix = (*env)->GetMethodID(env, jni.cls, "Gasmix", "(I)V");
DC_EXCEPTION_THROW(dc_parser_samples_foreach((dc_parser_t *) handle, sample_cb, &jni));
(*env)->DeleteGlobalRef(env, jni.obj);
} else {
DC_EXCEPTION_THROW(dc_parser_samples_foreach((dc_parser_t *) handle, NULL, NULL));
}
}
JNIEXPORT void JNICALL Java_org_libdivecomputer_Parser_GetDatetime
(JNIEnv *env, jobject obj, jlong handle, jobject value)
{
dc_datetime_t datetime = {0};
DC_EXCEPTION_THROW(dc_parser_get_datetime ((dc_parser_t *) handle, &datetime));
jclass cls = (*env)->GetObjectClass(env, value);
jfieldID fid_year = (*env)->GetFieldID(env, cls, "year", "I");
jfieldID fid_month = (*env)->GetFieldID(env, cls, "month", "I");
jfieldID fid_day = (*env)->GetFieldID(env, cls, "day", "I");
jfieldID fid_hour = (*env)->GetFieldID(env, cls, "hour", "I");
jfieldID fid_minute = (*env)->GetFieldID(env, cls, "minute", "I");
jfieldID fid_second = (*env)->GetFieldID(env, cls, "second", "I");
jfieldID fid_timezone = (*env)->GetFieldID(env, cls, "timezone", "I");
(*env)->SetIntField(env, value, fid_year, datetime.year);
(*env)->SetIntField(env, value, fid_month, datetime.month);
(*env)->SetIntField(env, value, fid_day, datetime.day);
(*env)->SetIntField(env, value, fid_hour, datetime.hour);
(*env)->SetIntField(env, value, fid_minute, datetime.minute);
(*env)->SetIntField(env, value, fid_second, datetime.second);
(*env)->SetIntField(env, value, fid_timezone, datetime.timezone);
}
JNIEXPORT void JNICALL Java_org_libdivecomputer_Parser_GetSalinity
(JNIEnv *env, jobject obj, jlong handle, jobject value)
{
dc_salinity_t salinity = {0};
DC_EXCEPTION_THROW(dc_parser_get_field ((dc_parser_t *) handle, DC_FIELD_SALINITY, 0, &salinity));
jclass cls = (*env)->GetObjectClass(env, value);
jfieldID fid_type = (*env)->GetFieldID(env, cls, "type", "I");
jfieldID fid_density = (*env)->GetFieldID(env, cls, "density", "D");
(*env)->SetIntField(env, value, fid_type, salinity.type);
(*env)->SetDoubleField(env, value, fid_density, salinity.density);
}
JNIEXPORT void JNICALL Java_org_libdivecomputer_Parser_GetDecomodel
(JNIEnv *env, jobject obj, jlong handle, jobject value)
{
dc_decomodel_t decomodel = {0};
DC_EXCEPTION_THROW(dc_parser_get_field ((dc_parser_t *) handle, DC_FIELD_DECOMODEL, 0, &decomodel));
jclass cls = (*env)->GetObjectClass(env, value);
jfieldID fid_type = (*env)->GetFieldID(env, cls, "type", "I");
jfieldID fid_conservatism = (*env)->GetFieldID(env, cls, "conservatism", "I");
jfieldID fid_gf_high = (*env)->GetFieldID(env, cls, "gf_high", "I");
jfieldID fid_gf_low = (*env)->GetFieldID(env, cls, "gf_low", "I");
(*env)->SetIntField(env, value, fid_type, decomodel.type);
(*env)->SetIntField(env, value, fid_conservatism, decomodel.conservatism);
(*env)->SetIntField(env, value, fid_gf_high, decomodel.params.gf.high);
(*env)->SetIntField(env, value, fid_gf_low, decomodel.params.gf.low);
}
JNIEXPORT void JNICALL Java_org_libdivecomputer_Parser_GetGasmix
(JNIEnv *env, jobject obj, jlong handle, jobject value, jint idx)
{
dc_gasmix_t gasmix = {0};
DC_EXCEPTION_THROW(dc_parser_get_field ((dc_parser_t *) handle, DC_FIELD_GASMIX, idx, &gasmix));
jclass cls = (*env)->GetObjectClass(env, value);
jfieldID fid_helium = (*env)->GetFieldID(env, cls, "helium", "D");
jfieldID fid_oxygen = (*env)->GetFieldID(env, cls, "oxygen", "D");
jfieldID fid_nitrogen = (*env)->GetFieldID(env, cls, "nitrogen", "D");
jfieldID fid_usage = (*env)->GetFieldID(env, cls, "usage", "I");
(*env)->SetDoubleField(env, value, fid_helium, gasmix.helium);
(*env)->SetDoubleField(env, value, fid_oxygen, gasmix.oxygen);
(*env)->SetDoubleField(env, value, fid_nitrogen, gasmix.nitrogen);
(*env)->SetIntField(env, value, fid_usage, gasmix.usage);
}
JNIEXPORT void JNICALL Java_org_libdivecomputer_Parser_GetTank
(JNIEnv *env, jobject obj, jlong handle, jobject value, jint idx)
{
dc_tank_t tank = {0};
DC_EXCEPTION_THROW(dc_parser_get_field ((dc_parser_t *) handle, DC_FIELD_TANK, idx, &tank));
jclass cls = (*env)->GetObjectClass(env, value);
jfieldID fid_gasmix = (*env)->GetFieldID(env, cls, "gasmix", "I");
jfieldID fid_type = (*env)->GetFieldID(env, cls, "type", "I");
jfieldID fid_volume = (*env)->GetFieldID(env, cls, "volume", "D");
jfieldID fid_workpressure = (*env)->GetFieldID(env, cls, "workpressure", "D");
jfieldID fid_beginpressure = (*env)->GetFieldID(env, cls, "beginpressure", "D");
jfieldID fid_endpressure = (*env)->GetFieldID(env, cls, "endpressure", "D");
jfieldID fid_usage = (*env)->GetFieldID(env, cls, "usage", "I");
(*env)->SetIntField(env, value, fid_gasmix, tank.gasmix);
(*env)->SetIntField(env, value, fid_type, tank.type);
(*env)->SetDoubleField(env, value, fid_volume, tank.volume);
(*env)->SetDoubleField(env, value, fid_workpressure, tank.workpressure);
(*env)->SetDoubleField(env, value, fid_beginpressure, tank.beginpressure);
(*env)->SetDoubleField(env, value, fid_endpressure, tank.endpressure);
(*env)->SetIntField(env, value, fid_usage, tank.usage);
}
JNIEXPORT jint JNICALL Java_org_libdivecomputer_Parser_GetFieldInt
(JNIEnv *env, jobject obj, jlong handle, jint field)
{
unsigned int value = 0;
DC_EXCEPTION_THROW(dc_parser_get_field ((dc_parser_t *) handle, field, 0, &value));
return value;
}
JNIEXPORT jdouble JNICALL Java_org_libdivecomputer_Parser_GetFieldDouble
(JNIEnv *env, jobject obj, jlong handle, jint field)
{
double value = 0;
DC_EXCEPTION_THROW(dc_parser_get_field ((dc_parser_t *) handle, field, 0, &value));
return value;
}