mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-21 01:01:43 +00:00
[wpiutil] Enhance DataLog Java raw value support
Add support for start, length, and ByteBuffers
This commit is contained in:
@@ -4,7 +4,9 @@
|
||||
|
||||
#include <jni.h>
|
||||
|
||||
#include "WPIUtilJNI.h"
|
||||
#include "edu_wpi_first_util_datalog_DataLogJNI.h"
|
||||
#include "fmt/format.h"
|
||||
#include "wpi/DataLog.h"
|
||||
#include "wpi/jni_util.h"
|
||||
|
||||
@@ -23,6 +25,18 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_create
|
||||
(JNIEnv* env, jclass, jstring dir, jstring filename, jdouble period,
|
||||
jstring extraHeader)
|
||||
{
|
||||
if (!dir) {
|
||||
wpi::ThrowNullPointerException(env, "dir is null");
|
||||
return 0;
|
||||
}
|
||||
if (!filename) {
|
||||
wpi::ThrowNullPointerException(env, "filename is null");
|
||||
return 0;
|
||||
}
|
||||
if (!extraHeader) {
|
||||
wpi::ThrowNullPointerException(env, "extraHeader is null");
|
||||
return 0;
|
||||
}
|
||||
return reinterpret_cast<jlong>(new DataLog{JStringRef{env, dir},
|
||||
JStringRef{env, filename}, period,
|
||||
JStringRef{env, extraHeader}});
|
||||
@@ -38,6 +52,11 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_setFilename
|
||||
(JNIEnv* env, jclass, jlong impl, jstring filename)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
if (!filename) {
|
||||
wpi::ThrowNullPointerException(env, "filename is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->SetFilename(JStringRef{env, filename});
|
||||
@@ -50,9 +69,10 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_setFilename
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_util_datalog_DataLogJNI_flush
|
||||
(JNIEnv*, jclass, jlong impl)
|
||||
(JNIEnv* env, jclass, jlong impl)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->Flush();
|
||||
@@ -65,9 +85,10 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_flush
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_util_datalog_DataLogJNI_pause
|
||||
(JNIEnv*, jclass, jlong impl)
|
||||
(JNIEnv* env, jclass, jlong impl)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->Pause();
|
||||
@@ -80,9 +101,10 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_pause
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_util_datalog_DataLogJNI_resume
|
||||
(JNIEnv*, jclass, jlong impl)
|
||||
(JNIEnv* env, jclass, jlong impl)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->Resume();
|
||||
@@ -99,6 +121,7 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_start
|
||||
jstring metadata, jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return 0;
|
||||
}
|
||||
return reinterpret_cast<DataLog*>(impl)->Start(
|
||||
@@ -113,9 +136,10 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_start
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_util_datalog_DataLogJNI_finish
|
||||
(JNIEnv*, jclass, jlong impl, jint entry, jlong timestamp)
|
||||
(JNIEnv* env, jclass, jlong impl, jint entry, jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->Finish(entry, timestamp);
|
||||
@@ -132,6 +156,7 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_setMetadata
|
||||
jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->SetMetadata(
|
||||
@@ -153,21 +178,73 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_close
|
||||
/*
|
||||
* Class: edu_wpi_first_util_datalog_DataLogJNI
|
||||
* Method: appendRaw
|
||||
* Signature: (JI[BJ)V
|
||||
* Signature: (JI[BIIJ)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_util_datalog_DataLogJNI_appendRaw
|
||||
(JNIEnv* env, jclass, jlong impl, jint entry, jbyteArray value,
|
||||
jlong timestamp)
|
||||
(JNIEnv* env, jclass, jlong impl, jint entry, jbyteArray value, jint start,
|
||||
jint length, jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
if (!value) {
|
||||
wpi::ThrowNullPointerException(env, "value is null");
|
||||
return;
|
||||
}
|
||||
if (start < 0) {
|
||||
wpi::ThrowIndexOobException(env, "start must be >= 0");
|
||||
return;
|
||||
}
|
||||
if (length < 0) {
|
||||
wpi::ThrowIndexOobException(env, "length must be >= 0");
|
||||
return;
|
||||
}
|
||||
CriticalJByteArrayRef cvalue{env, value};
|
||||
if (static_cast<unsigned int>(start + length) > cvalue.size()) {
|
||||
wpi::ThrowIndexOobException(
|
||||
env, "start + len must be smaller than array length");
|
||||
return;
|
||||
}
|
||||
JByteArrayRef cvalue{env, value};
|
||||
reinterpret_cast<DataLog*>(impl)->AppendRaw(
|
||||
entry,
|
||||
{reinterpret_cast<const uint8_t*>(cvalue.array().data()), cvalue.size()},
|
||||
timestamp);
|
||||
entry, cvalue.uarray().subspan(start, length), timestamp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: edu_wpi_first_util_datalog_DataLogJNI
|
||||
* Method: appendRawBuffer
|
||||
* Signature: (JILjava/lang/Object;IIJ)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_util_datalog_DataLogJNI_appendRawBuffer
|
||||
(JNIEnv* env, jclass, jlong impl, jint entry, jobject value, jint start,
|
||||
jint length, jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
if (!value) {
|
||||
wpi::ThrowNullPointerException(env, "value is null");
|
||||
return;
|
||||
}
|
||||
if (start < 0) {
|
||||
wpi::ThrowIndexOobException(env, "start must be >= 0");
|
||||
return;
|
||||
}
|
||||
if (length < 0) {
|
||||
wpi::ThrowIndexOobException(env, "length must be >= 0");
|
||||
return;
|
||||
}
|
||||
JByteArrayRef cvalue{env, value, start + length};
|
||||
if (!cvalue) {
|
||||
wpi::ThrowIllegalArgumentException(env,
|
||||
"value must be a native ByteBuffer");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->AppendRaw(
|
||||
entry, cvalue.uarray().subspan(start, length), timestamp);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -177,9 +254,10 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendRaw
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_util_datalog_DataLogJNI_appendBoolean
|
||||
(JNIEnv*, jclass, jlong impl, jint entry, jboolean value, jlong timestamp)
|
||||
(JNIEnv* env, jclass, jlong impl, jint entry, jboolean value, jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->AppendBoolean(entry, value, timestamp);
|
||||
@@ -192,9 +270,10 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendBoolean
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_util_datalog_DataLogJNI_appendInteger
|
||||
(JNIEnv*, jclass, jlong impl, jint entry, jlong value, jlong timestamp)
|
||||
(JNIEnv* env, jclass, jlong impl, jint entry, jlong value, jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->AppendInteger(entry, value, timestamp);
|
||||
@@ -207,9 +286,10 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendInteger
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_util_datalog_DataLogJNI_appendFloat
|
||||
(JNIEnv*, jclass, jlong impl, jint entry, jfloat value, jlong timestamp)
|
||||
(JNIEnv* env, jclass, jlong impl, jint entry, jfloat value, jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->AppendFloat(entry, value, timestamp);
|
||||
@@ -222,9 +302,10 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendFloat
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_util_datalog_DataLogJNI_appendDouble
|
||||
(JNIEnv*, jclass, jlong impl, jint entry, jdouble value, jlong timestamp)
|
||||
(JNIEnv* env, jclass, jlong impl, jint entry, jdouble value, jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->AppendDouble(entry, value, timestamp);
|
||||
@@ -240,6 +321,7 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendString
|
||||
(JNIEnv* env, jclass, jlong impl, jint entry, jstring value, jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->AppendString(entry, JStringRef{env, value},
|
||||
@@ -257,6 +339,11 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendBooleanArray
|
||||
jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
if (!value) {
|
||||
wpi::ThrowNullPointerException(env, "value is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->AppendBooleanArray(
|
||||
@@ -274,6 +361,11 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendIntegerArray
|
||||
jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
if (!value) {
|
||||
wpi::ThrowNullPointerException(env, "value is null");
|
||||
return;
|
||||
}
|
||||
JLongArrayRef jarr{env, value};
|
||||
@@ -304,6 +396,11 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendFloatArray
|
||||
jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
if (!value) {
|
||||
wpi::ThrowNullPointerException(env, "value is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->AppendFloatArray(
|
||||
@@ -321,6 +418,11 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendDoubleArray
|
||||
jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
if (!value) {
|
||||
wpi::ThrowNullPointerException(env, "value is null");
|
||||
return;
|
||||
}
|
||||
reinterpret_cast<DataLog*>(impl)->AppendDoubleArray(
|
||||
@@ -338,6 +440,11 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendStringArray
|
||||
jlong timestamp)
|
||||
{
|
||||
if (impl == 0) {
|
||||
wpi::ThrowNullPointerException(env, "impl is null");
|
||||
return;
|
||||
}
|
||||
if (!value) {
|
||||
wpi::ThrowNullPointerException(env, "value is null");
|
||||
return;
|
||||
}
|
||||
size_t len = env->GetArrayLength(value);
|
||||
@@ -347,6 +454,8 @@ Java_edu_wpi_first_util_datalog_DataLogJNI_appendStringArray
|
||||
JLocal<jstring> elem{
|
||||
env, static_cast<jstring>(env->GetObjectArrayElement(value, i))};
|
||||
if (!elem) {
|
||||
wpi::ThrowNullPointerException(
|
||||
env, fmt::format("string at element {} is null", i));
|
||||
return;
|
||||
}
|
||||
arr.emplace_back(JStringRef{env, elem}.str());
|
||||
|
||||
Reference in New Issue
Block a user