2020-12-26 14:12:05 -08:00
|
|
|
// Copyright (c) FIRST and other WPILib contributors.
|
|
|
|
|
// Open Source Software; you can modify and/or share it under the terms of
|
|
|
|
|
// the WPILib BSD license file in the root directory of this project.
|
2019-09-28 11:34:46 -07:00
|
|
|
|
|
|
|
|
#include "SimDeviceDataJNI.h"
|
|
|
|
|
|
|
|
|
|
#include <jni.h>
|
|
|
|
|
|
2021-06-06 16:13:58 -07:00
|
|
|
#include <cstdio>
|
2024-09-20 17:43:39 -07:00
|
|
|
#include <memory>
|
|
|
|
|
#include <string>
|
2019-09-28 11:34:46 -07:00
|
|
|
#include <utility>
|
2024-09-20 17:43:39 -07:00
|
|
|
#include <vector>
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2025-11-07 19:56:21 -05:00
|
|
|
#include "wpi/util/jni_util.hpp"
|
2019-09-28 11:34:46 -07:00
|
|
|
|
|
|
|
|
#include "SimulatorJNI.h"
|
2025-11-07 19:55:43 -05:00
|
|
|
#include "org_wpilib_hardware_hal_simulation_SimDeviceDataJNI.h"
|
2025-11-07 19:56:21 -05:00
|
|
|
#include "wpi/hal/handles/UnlimitedHandleResource.h"
|
|
|
|
|
#include "wpi/hal/simulation/SimDeviceData.h"
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-06-26 17:12:55 -07:00
|
|
|
using namespace hal;
|
2019-09-28 11:34:46 -07:00
|
|
|
using namespace wpi::java;
|
|
|
|
|
|
|
|
|
|
static JClass simDeviceInfoCls;
|
|
|
|
|
static JClass simValueInfoCls;
|
|
|
|
|
static JClass simDeviceCallbackCls;
|
|
|
|
|
static JClass simValueCallbackCls;
|
|
|
|
|
static jmethodID simDeviceCallbackCallback;
|
|
|
|
|
static jmethodID simValueCallbackCallback;
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
|
|
struct DeviceInfo {
|
|
|
|
|
DeviceInfo(const char* name_, HAL_SimDeviceHandle handle_)
|
|
|
|
|
: name{name_}, handle{handle_} {}
|
|
|
|
|
std::string name;
|
|
|
|
|
HAL_SimValueHandle handle;
|
|
|
|
|
|
|
|
|
|
jobject MakeJava(JNIEnv* env) const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ValueInfo {
|
2020-12-23 15:54:11 -08:00
|
|
|
ValueInfo(const char* name_, HAL_SimValueHandle handle_, int32_t direction_,
|
2019-09-28 11:34:46 -07:00
|
|
|
const HAL_Value& value_)
|
2020-12-23 15:54:11 -08:00
|
|
|
: name{name_}, handle{handle_}, direction{direction_}, value{value_} {}
|
2019-09-28 11:34:46 -07:00
|
|
|
std::string name;
|
|
|
|
|
HAL_SimValueHandle handle;
|
2020-12-23 15:54:11 -08:00
|
|
|
int32_t direction;
|
2019-09-28 11:34:46 -07:00
|
|
|
HAL_Value value;
|
|
|
|
|
|
|
|
|
|
jobject MakeJava(JNIEnv* env) const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
jobject DeviceInfo::MakeJava(JNIEnv* env) const {
|
|
|
|
|
static jmethodID func =
|
|
|
|
|
env->GetMethodID(simDeviceInfoCls, "<init>", "(Ljava/lang/String;I)V");
|
|
|
|
|
return env->NewObject(simDeviceInfoCls, func, MakeJString(env, name),
|
2020-12-28 11:04:20 -08:00
|
|
|
static_cast<jint>(handle));
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
static std::pair<jlong, jdouble> ToValue12(const HAL_Value& value) {
|
2019-09-28 11:34:46 -07:00
|
|
|
jlong value1 = 0;
|
|
|
|
|
jdouble value2 = 0.0;
|
|
|
|
|
switch (value.type) {
|
|
|
|
|
case HAL_BOOLEAN:
|
|
|
|
|
value1 = value.data.v_boolean;
|
|
|
|
|
break;
|
|
|
|
|
case HAL_DOUBLE:
|
|
|
|
|
value2 = value.data.v_double;
|
|
|
|
|
break;
|
|
|
|
|
case HAL_ENUM:
|
|
|
|
|
value1 = value.data.v_enum;
|
|
|
|
|
break;
|
|
|
|
|
case HAL_INT:
|
|
|
|
|
value1 = value.data.v_int;
|
|
|
|
|
break;
|
|
|
|
|
case HAL_LONG:
|
|
|
|
|
value1 = value.data.v_long;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return std::pair(value1, value2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
jobject ValueInfo::MakeJava(JNIEnv* env) const {
|
|
|
|
|
static jmethodID func =
|
2020-12-23 15:54:11 -08:00
|
|
|
env->GetMethodID(simValueInfoCls, "<init>", "(Ljava/lang/String;IIIJD)V");
|
2020-11-14 21:04:51 -08:00
|
|
|
auto [value1, value2] = ToValue12(value);
|
2019-09-28 11:34:46 -07:00
|
|
|
return env->NewObject(simValueInfoCls, func, MakeJString(env, name),
|
2020-12-28 11:04:20 -08:00
|
|
|
static_cast<jint>(handle), static_cast<jint>(direction),
|
|
|
|
|
static_cast<jint>(value.type), value1, value2);
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
class DeviceCallbackStore {
|
2019-09-28 11:34:46 -07:00
|
|
|
public:
|
2020-11-14 21:04:51 -08:00
|
|
|
void create(JNIEnv* env, jobject obj) { m_call = JGlobal<jobject>(env, obj); }
|
|
|
|
|
void performCallback(const char* name, HAL_SimDeviceHandle handle);
|
|
|
|
|
void free(JNIEnv* env) { m_call.free(env); }
|
|
|
|
|
void setCallbackId(int32_t id) { callbackId = id; }
|
|
|
|
|
int32_t getCallbackId() { return callbackId; }
|
2019-09-28 11:34:46 -07:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
wpi::java::JGlobal<jobject> m_call;
|
2020-11-14 21:04:51 -08:00
|
|
|
int32_t callbackId;
|
2019-09-28 11:34:46 -07:00
|
|
|
};
|
|
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
class ValueCallbackStore {
|
2019-09-28 11:34:46 -07:00
|
|
|
public:
|
2020-11-14 21:04:51 -08:00
|
|
|
void create(JNIEnv* env, jobject obj) { m_call = JGlobal<jobject>(env, obj); }
|
|
|
|
|
void performCallback(const char* name, HAL_SimValueHandle handle,
|
2020-12-23 15:54:11 -08:00
|
|
|
int32_t direction, const HAL_Value& value);
|
2020-11-14 21:04:51 -08:00
|
|
|
void free(JNIEnv* env) { m_call.free(env); }
|
2020-12-23 15:54:11 -08:00
|
|
|
void setCallbackId(int32_t id) { m_callbackId = id; }
|
|
|
|
|
int32_t getCallbackId() { return m_callbackId; }
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
private:
|
|
|
|
|
wpi::java::JGlobal<jobject> m_call;
|
2020-12-23 15:54:11 -08:00
|
|
|
int32_t m_callbackId;
|
2019-09-28 11:34:46 -07:00
|
|
|
};
|
|
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
} // namespace
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
void DeviceCallbackStore::performCallback(const char* name,
|
|
|
|
|
HAL_SimDeviceHandle handle) {
|
|
|
|
|
JNIEnv* env;
|
|
|
|
|
JavaVM* vm = sim::GetJVM();
|
|
|
|
|
bool didAttachThread = false;
|
|
|
|
|
int tryGetEnv = vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6);
|
|
|
|
|
if (tryGetEnv == JNI_EDETACHED) {
|
|
|
|
|
// Thread not attached
|
|
|
|
|
didAttachThread = true;
|
|
|
|
|
if (vm->AttachCurrentThread(reinterpret_cast<void**>(&env), nullptr) != 0) {
|
|
|
|
|
// Failed to attach, log and return
|
2021-06-06 16:13:58 -07:00
|
|
|
std::puts("Failed to attach");
|
|
|
|
|
std::fflush(stdout);
|
2020-11-14 21:04:51 -08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
} else if (tryGetEnv == JNI_EVERSION) {
|
2021-06-06 16:13:58 -07:00
|
|
|
std::puts("Invalid JVM Version requested");
|
|
|
|
|
std::fflush(stdout);
|
2020-11-14 21:04:51 -08:00
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
env->CallVoidMethod(m_call, simDeviceCallbackCallback, MakeJString(env, name),
|
2020-12-28 11:04:20 -08:00
|
|
|
static_cast<jint>(handle));
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
if (env->ExceptionCheck()) {
|
|
|
|
|
env->ExceptionDescribe();
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
if (didAttachThread) {
|
|
|
|
|
vm->DetachCurrentThread();
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
void ValueCallbackStore::performCallback(const char* name,
|
|
|
|
|
HAL_SimValueHandle handle,
|
2020-12-23 15:54:11 -08:00
|
|
|
int32_t direction,
|
2020-11-14 21:04:51 -08:00
|
|
|
const HAL_Value& value) {
|
2019-09-28 11:34:46 -07:00
|
|
|
JNIEnv* env;
|
2020-11-14 21:04:51 -08:00
|
|
|
JavaVM* vm = sim::GetJVM();
|
|
|
|
|
bool didAttachThread = false;
|
|
|
|
|
int tryGetEnv = vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6);
|
|
|
|
|
if (tryGetEnv == JNI_EDETACHED) {
|
|
|
|
|
// Thread not attached
|
|
|
|
|
didAttachThread = true;
|
|
|
|
|
if (vm->AttachCurrentThread(reinterpret_cast<void**>(&env), nullptr) != 0) {
|
|
|
|
|
// Failed to attach, log and return
|
2021-06-06 16:13:58 -07:00
|
|
|
std::puts("Failed to attach");
|
|
|
|
|
std::fflush(stdout);
|
2020-11-14 21:04:51 -08:00
|
|
|
return;
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
2020-11-14 21:04:51 -08:00
|
|
|
} else if (tryGetEnv == JNI_EVERSION) {
|
2021-06-06 16:13:58 -07:00
|
|
|
std::puts("Invalid JVM Version requested");
|
|
|
|
|
std::fflush(stdout);
|
2020-11-14 21:04:51 -08:00
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
auto [value1, value2] = ToValue12(value);
|
2021-03-21 23:22:04 -07:00
|
|
|
env->CallVoidMethod(m_call, simValueCallbackCallback, MakeJString(env, name),
|
|
|
|
|
static_cast<jint>(handle), static_cast<jint>(direction),
|
|
|
|
|
static_cast<jint>(value.type), value1, value2);
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
if (env->ExceptionCheck()) {
|
|
|
|
|
env->ExceptionDescribe();
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
if (didAttachThread) {
|
|
|
|
|
vm->DetachCurrentThread();
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
2020-11-14 21:04:51 -08:00
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
static hal::UnlimitedHandleResource<SIM_JniHandle, DeviceCallbackStore,
|
|
|
|
|
hal::HAL_HandleEnum::SimulationJni>*
|
|
|
|
|
deviceCallbackHandles;
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
namespace {
|
2020-12-27 22:52:53 -08:00
|
|
|
using RegisterDeviceCallbackFunc =
|
|
|
|
|
int32_t (*)(const char* prefix, void* param,
|
|
|
|
|
HALSIM_SimDeviceCallback callback, HAL_Bool initialNotify);
|
|
|
|
|
using FreeDeviceCallbackFunc = void (*)(int32_t uid);
|
2020-11-14 21:04:51 -08:00
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
static SIM_JniHandle AllocateDeviceCallback(
|
|
|
|
|
JNIEnv* env, const char* prefix, jobject callback, jboolean initialNotify,
|
|
|
|
|
RegisterDeviceCallbackFunc createCallback) {
|
|
|
|
|
auto callbackStore = std::make_shared<DeviceCallbackStore>();
|
|
|
|
|
|
|
|
|
|
auto handle = deviceCallbackHandles->Allocate(callbackStore);
|
|
|
|
|
|
|
|
|
|
if (handle == HAL_kInvalidHandle) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uintptr_t handleAsPtr = static_cast<uintptr_t>(handle);
|
|
|
|
|
void* handleAsVoidPtr = reinterpret_cast<void*>(handleAsPtr);
|
|
|
|
|
|
|
|
|
|
callbackStore->create(env, callback);
|
|
|
|
|
|
|
|
|
|
auto callbackFunc = [](const char* name, void* param,
|
|
|
|
|
HAL_SimDeviceHandle handle) {
|
|
|
|
|
uintptr_t handleTmp = reinterpret_cast<uintptr_t>(param);
|
|
|
|
|
SIM_JniHandle jnihandle = static_cast<SIM_JniHandle>(handleTmp);
|
|
|
|
|
auto data = deviceCallbackHandles->Get(jnihandle);
|
2020-12-28 12:58:06 -08:00
|
|
|
if (!data) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
data->performCallback(name, handle);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
auto id =
|
|
|
|
|
createCallback(prefix, handleAsVoidPtr, callbackFunc, initialNotify);
|
|
|
|
|
|
|
|
|
|
callbackStore->setCallbackId(id);
|
|
|
|
|
|
|
|
|
|
return handle;
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
static void FreeDeviceCallback(JNIEnv* env, SIM_JniHandle handle,
|
|
|
|
|
FreeDeviceCallbackFunc freeCallback) {
|
|
|
|
|
auto callback = deviceCallbackHandles->Free(handle);
|
2023-01-02 02:19:04 -05:00
|
|
|
if (callback == nullptr) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2020-11-14 21:04:51 -08:00
|
|
|
freeCallback(callback->getCallbackId());
|
|
|
|
|
callback->free(env);
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
static hal::UnlimitedHandleResource<SIM_JniHandle, ValueCallbackStore,
|
|
|
|
|
hal::HAL_HandleEnum::SimulationJni>*
|
|
|
|
|
valueCallbackHandles;
|
|
|
|
|
|
|
|
|
|
namespace {
|
2020-12-27 22:52:53 -08:00
|
|
|
using FreeValueCallbackFunc = void (*)(int32_t uid);
|
2020-11-14 21:04:51 -08:00
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
template <typename THandle>
|
|
|
|
|
static SIM_JniHandle AllocateValueCallback(
|
2021-03-21 23:22:04 -07:00
|
|
|
JNIEnv* env, THandle h, jobject callback, jboolean initialNotify,
|
2020-11-14 21:04:51 -08:00
|
|
|
int32_t (*createCallback)(THandle handle, void* param,
|
|
|
|
|
HALSIM_SimValueCallback callback,
|
|
|
|
|
HAL_Bool initialNotify)) {
|
2021-03-21 23:22:04 -07:00
|
|
|
auto callbackStore = std::make_shared<ValueCallbackStore>();
|
2020-11-14 21:04:51 -08:00
|
|
|
|
|
|
|
|
auto handle = valueCallbackHandles->Allocate(callbackStore);
|
|
|
|
|
|
|
|
|
|
if (handle == HAL_kInvalidHandle) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uintptr_t handleAsPtr = static_cast<uintptr_t>(handle);
|
|
|
|
|
void* handleAsVoidPtr = reinterpret_cast<void*>(handleAsPtr);
|
|
|
|
|
|
|
|
|
|
callbackStore->create(env, callback);
|
|
|
|
|
|
|
|
|
|
auto callbackFunc = [](const char* name, void* param,
|
2020-12-23 15:54:11 -08:00
|
|
|
HAL_SimValueHandle handle, int32_t direction,
|
2020-11-14 21:04:51 -08:00
|
|
|
const HAL_Value* value) {
|
|
|
|
|
uintptr_t handleTmp = reinterpret_cast<uintptr_t>(param);
|
|
|
|
|
SIM_JniHandle jnihandle = static_cast<SIM_JniHandle>(handleTmp);
|
|
|
|
|
auto data = valueCallbackHandles->Get(jnihandle);
|
2020-12-28 12:58:06 -08:00
|
|
|
if (!data) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2020-11-14 21:04:51 -08:00
|
|
|
|
2020-12-23 15:54:11 -08:00
|
|
|
data->performCallback(name, handle, direction, *value);
|
2020-11-14 21:04:51 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
auto id = createCallback(h, handleAsVoidPtr, callbackFunc, initialNotify);
|
|
|
|
|
|
|
|
|
|
callbackStore->setCallbackId(id);
|
|
|
|
|
|
|
|
|
|
return handle;
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
static void FreeValueCallback(JNIEnv* env, SIM_JniHandle handle,
|
|
|
|
|
FreeValueCallbackFunc freeCallback) {
|
|
|
|
|
auto callback = valueCallbackHandles->Free(handle);
|
2023-01-02 02:19:04 -05:00
|
|
|
if (callback == nullptr) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2020-11-14 21:04:51 -08:00
|
|
|
freeCallback(callback->getCallbackId());
|
|
|
|
|
callback->free(env);
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
2020-12-28 01:19:59 -08:00
|
|
|
namespace hal::sim {
|
2019-09-28 11:34:46 -07:00
|
|
|
|
|
|
|
|
bool InitializeSimDeviceDataJNI(JNIEnv* env) {
|
|
|
|
|
simDeviceInfoCls = JClass(
|
2025-11-07 19:55:43 -05:00
|
|
|
env, "org/wpilib/hardware/hal/simulation/SimDeviceDataJNI$SimDeviceInfo");
|
2020-12-28 12:58:06 -08:00
|
|
|
if (!simDeviceInfoCls) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-06-27 22:11:24 -07:00
|
|
|
simValueInfoCls =
|
2025-11-07 19:55:43 -05:00
|
|
|
JClass(env, "org/wpilib/hardware/hal/simulation/SimDeviceDataJNI$SimValueInfo");
|
2020-12-28 12:58:06 -08:00
|
|
|
if (!simValueInfoCls) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-06-27 22:11:24 -07:00
|
|
|
simDeviceCallbackCls =
|
2025-11-07 19:55:43 -05:00
|
|
|
JClass(env, "org/wpilib/hardware/hal/simulation/SimDeviceCallback");
|
2020-12-28 12:58:06 -08:00
|
|
|
if (!simDeviceCallbackCls) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
|
|
|
|
|
simDeviceCallbackCallback = env->GetMethodID(simDeviceCallbackCls, "callback",
|
|
|
|
|
"(Ljava/lang/String;I)V");
|
2020-12-28 12:58:06 -08:00
|
|
|
if (!simDeviceCallbackCallback) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-06-27 22:11:24 -07:00
|
|
|
simValueCallbackCls =
|
2025-11-07 19:55:43 -05:00
|
|
|
JClass(env, "org/wpilib/hardware/hal/simulation/SimValueCallback");
|
2020-12-28 12:58:06 -08:00
|
|
|
if (!simValueCallbackCls) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
|
|
|
|
|
simValueCallbackCallback = env->GetMethodID(
|
2021-03-21 23:22:04 -07:00
|
|
|
simValueCallbackCls, "callbackNative", "(Ljava/lang/String;IIIJD)V");
|
2020-12-28 12:58:06 -08:00
|
|
|
if (!simValueCallbackCallback) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
|
2020-11-14 21:04:51 -08:00
|
|
|
static hal::UnlimitedHandleResource<SIM_JniHandle, DeviceCallbackStore,
|
|
|
|
|
hal::HAL_HandleEnum::SimulationJni>
|
|
|
|
|
cbDevice;
|
|
|
|
|
deviceCallbackHandles = &cbDevice;
|
|
|
|
|
|
|
|
|
|
static hal::UnlimitedHandleResource<SIM_JniHandle, ValueCallbackStore,
|
|
|
|
|
hal::HAL_HandleEnum::SimulationJni>
|
|
|
|
|
cbValue;
|
|
|
|
|
valueCallbackHandles = &cbValue;
|
|
|
|
|
|
2019-09-28 11:34:46 -07:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FreeSimDeviceDataJNI(JNIEnv* env) {
|
|
|
|
|
simDeviceInfoCls.free(env);
|
|
|
|
|
simValueInfoCls.free(env);
|
|
|
|
|
simDeviceCallbackCls.free(env);
|
|
|
|
|
simValueCallbackCls.free(env);
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-28 01:19:59 -08:00
|
|
|
} // namespace hal::sim
|
2019-09-28 11:34:46 -07:00
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
|
2020-07-04 01:09:49 -07:00
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2020-07-04 01:09:49 -07:00
|
|
|
* Method: setSimDeviceEnabled
|
|
|
|
|
* Signature: (Ljava/lang/String;Z)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_setSimDeviceEnabled
|
2020-07-04 01:09:49 -07:00
|
|
|
(JNIEnv* env, jclass, jstring prefix, jboolean enabled)
|
|
|
|
|
{
|
|
|
|
|
HALSIM_SetSimDeviceEnabled(JStringRef{env, prefix}.c_str(), enabled);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2020-07-04 01:09:49 -07:00
|
|
|
* Method: isSimDeviceEnabled
|
|
|
|
|
* Signature: (Ljava/lang/String;)Z
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jboolean JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_isSimDeviceEnabled
|
2020-07-04 01:09:49 -07:00
|
|
|
(JNIEnv* env, jclass, jstring name)
|
|
|
|
|
{
|
|
|
|
|
return HALSIM_IsSimDeviceEnabled(JStringRef{env, name}.c_str());
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-28 11:34:46 -07:00
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: registerSimDeviceCreatedCallback
|
|
|
|
|
* Signature: (Ljava/lang/String;Ljava/lang/Object;Z)I
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_registerSimDeviceCreatedCallback
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv* env, jclass, jstring prefix, jobject callback,
|
|
|
|
|
jboolean initialNotify)
|
|
|
|
|
{
|
2020-11-14 21:04:51 -08:00
|
|
|
return AllocateDeviceCallback(env, JStringRef{env, prefix}.c_str(), callback,
|
|
|
|
|
initialNotify,
|
|
|
|
|
&HALSIM_RegisterSimDeviceCreatedCallback);
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: cancelSimDeviceCreatedCallback
|
|
|
|
|
* Signature: (I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_cancelSimDeviceCreatedCallback
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv* env, jclass, jint uid)
|
|
|
|
|
{
|
2020-11-14 21:04:51 -08:00
|
|
|
FreeDeviceCallback(env, uid, &HALSIM_CancelSimDeviceCreatedCallback);
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: registerSimDeviceFreedCallback
|
2020-11-14 21:04:51 -08:00
|
|
|
* Signature: (Ljava/lang/String;Ljava/lang/Object;Z)I
|
2019-09-28 11:34:46 -07:00
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_registerSimDeviceFreedCallback
|
2020-11-14 21:04:51 -08:00
|
|
|
(JNIEnv* env, jclass, jstring prefix, jobject callback,
|
|
|
|
|
jboolean initialNotify)
|
2019-09-28 11:34:46 -07:00
|
|
|
{
|
2020-11-14 21:04:51 -08:00
|
|
|
return AllocateDeviceCallback(env, JStringRef{env, prefix}.c_str(), callback,
|
|
|
|
|
initialNotify,
|
|
|
|
|
&HALSIM_RegisterSimDeviceFreedCallback);
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: cancelSimDeviceFreedCallback
|
|
|
|
|
* Signature: (I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_cancelSimDeviceFreedCallback
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv* env, jclass, jint uid)
|
|
|
|
|
{
|
2020-11-14 21:04:51 -08:00
|
|
|
FreeDeviceCallback(env, uid, &HALSIM_CancelSimDeviceFreedCallback);
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: getSimDeviceHandle
|
|
|
|
|
* Signature: (Ljava/lang/String;)I
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_getSimDeviceHandle
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv* env, jclass, jstring name)
|
|
|
|
|
{
|
|
|
|
|
return HALSIM_GetSimDeviceHandle(JStringRef{env, name}.c_str());
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-08 20:42:46 -08:00
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2020-12-08 20:42:46 -08:00
|
|
|
* Method: getSimDeviceName
|
|
|
|
|
* Signature: (I)Ljava/lang/String;
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jstring JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_getSimDeviceName
|
2020-12-08 20:42:46 -08:00
|
|
|
(JNIEnv* env, jclass, jint handle)
|
|
|
|
|
{
|
2023-02-01 23:25:55 -08:00
|
|
|
const char* name = HALSIM_GetSimDeviceName(handle);
|
|
|
|
|
if (!name) {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
return MakeJString(env, name);
|
2020-12-08 20:42:46 -08:00
|
|
|
}
|
|
|
|
|
|
2019-09-28 11:34:46 -07:00
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: getSimValueDeviceHandle
|
|
|
|
|
* Signature: (I)I
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_getSimValueDeviceHandle
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv*, jclass, jint handle)
|
|
|
|
|
{
|
|
|
|
|
return HALSIM_GetSimValueDeviceHandle(handle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: enumerateSimDevices
|
|
|
|
|
* Signature: (Ljava/lang/String;)[Ljava/lang/Object;
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jobjectArray JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_enumerateSimDevices
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv* env, jclass, jstring prefix)
|
|
|
|
|
{
|
|
|
|
|
// get values
|
|
|
|
|
std::vector<DeviceInfo> arr;
|
|
|
|
|
HALSIM_EnumerateSimDevices(
|
|
|
|
|
JStringRef{env, prefix}.c_str(), &arr,
|
|
|
|
|
[](const char* name, void* param, HAL_SimDeviceHandle handle) {
|
|
|
|
|
auto arr = static_cast<std::vector<DeviceInfo>*>(param);
|
|
|
|
|
arr->emplace_back(name, handle);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// convert to java
|
|
|
|
|
size_t numElems = arr.size();
|
|
|
|
|
jobjectArray jarr =
|
|
|
|
|
env->NewObjectArray(arr.size(), simDeviceInfoCls, nullptr);
|
2020-12-28 12:58:06 -08:00
|
|
|
if (!jarr) {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
for (size_t i = 0; i < numElems; ++i) {
|
|
|
|
|
JLocal<jobject> elem{env, arr[i].MakeJava(env)};
|
|
|
|
|
env->SetObjectArrayElement(jarr, i, elem.obj());
|
|
|
|
|
}
|
|
|
|
|
return jarr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: registerSimValueCreatedCallback
|
|
|
|
|
* Signature: (ILjava/lang/Object;Z)I
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_registerSimValueCreatedCallback
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv* env, jclass, jint device, jobject callback, jboolean initialNotify)
|
|
|
|
|
{
|
2020-11-14 21:04:51 -08:00
|
|
|
return AllocateValueCallback(env, static_cast<HAL_SimDeviceHandle>(device),
|
2021-03-21 23:22:04 -07:00
|
|
|
callback, initialNotify,
|
2020-11-14 21:04:51 -08:00
|
|
|
&HALSIM_RegisterSimValueCreatedCallback);
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: cancelSimValueCreatedCallback
|
|
|
|
|
* Signature: (I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_cancelSimValueCreatedCallback
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv* env, jclass, jint uid)
|
|
|
|
|
{
|
2020-11-14 21:04:51 -08:00
|
|
|
FreeValueCallback(env, uid, &HALSIM_CancelSimValueCreatedCallback);
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: registerSimValueChangedCallback
|
|
|
|
|
* Signature: (ILjava/lang/Object;Z)I
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_registerSimValueChangedCallback
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv* env, jclass, jint handle, jobject callback, jboolean initialNotify)
|
|
|
|
|
{
|
2020-11-14 21:04:51 -08:00
|
|
|
return AllocateValueCallback(env, static_cast<HAL_SimValueHandle>(handle),
|
2021-03-21 23:22:04 -07:00
|
|
|
callback, initialNotify,
|
2020-11-14 21:04:51 -08:00
|
|
|
&HALSIM_RegisterSimValueChangedCallback);
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: cancelSimValueChangedCallback
|
|
|
|
|
* Signature: (I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_cancelSimValueChangedCallback
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv* env, jclass, jint uid)
|
|
|
|
|
{
|
2020-11-14 21:04:51 -08:00
|
|
|
FreeValueCallback(env, uid, &HALSIM_CancelSimValueChangedCallback);
|
2019-09-28 11:34:46 -07:00
|
|
|
}
|
|
|
|
|
|
2021-01-12 00:38:58 -08:00
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2021-01-12 00:38:58 -08:00
|
|
|
* Method: registerSimValueResetCallback
|
|
|
|
|
* Signature: (ILjava/lang/Object;Z)I
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_registerSimValueResetCallback
|
2021-01-12 00:38:58 -08:00
|
|
|
(JNIEnv* env, jclass, jint handle, jobject callback, jboolean initialNotify)
|
|
|
|
|
{
|
|
|
|
|
return AllocateValueCallback(env, static_cast<HAL_SimValueHandle>(handle),
|
2021-03-21 23:22:04 -07:00
|
|
|
callback, initialNotify,
|
2021-01-12 00:38:58 -08:00
|
|
|
&HALSIM_RegisterSimValueResetCallback);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2021-01-12 00:38:58 -08:00
|
|
|
* Method: cancelSimValueResetCallback
|
|
|
|
|
* Signature: (I)V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_cancelSimValueResetCallback
|
2021-01-12 00:38:58 -08:00
|
|
|
(JNIEnv* env, jclass, jint uid)
|
|
|
|
|
{
|
|
|
|
|
FreeValueCallback(env, uid, &HALSIM_CancelSimValueResetCallback);
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-28 11:34:46 -07:00
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: getSimValueHandle
|
|
|
|
|
* Signature: (ILjava/lang/String;)I
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jint JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_getSimValueHandle
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv* env, jclass, jint device, jstring name)
|
|
|
|
|
{
|
|
|
|
|
return HALSIM_GetSimValueHandle(device, JStringRef{env, name}.c_str());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: enumerateSimValues
|
|
|
|
|
* Signature: (I)[Ljava/lang/Object;
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jobjectArray JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_enumerateSimValues
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv* env, jclass, jint device)
|
|
|
|
|
{
|
|
|
|
|
// get values
|
|
|
|
|
std::vector<ValueInfo> arr;
|
|
|
|
|
HALSIM_EnumerateSimValues(
|
|
|
|
|
device, &arr,
|
|
|
|
|
[](const char* name, void* param, HAL_SimValueHandle handle,
|
|
|
|
|
HAL_Bool readonly, const HAL_Value* value) {
|
|
|
|
|
auto arr = static_cast<std::vector<ValueInfo>*>(param);
|
|
|
|
|
arr->emplace_back(name, handle, readonly, *value);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// convert to java
|
|
|
|
|
size_t numElems = arr.size();
|
|
|
|
|
jobjectArray jarr = env->NewObjectArray(arr.size(), simValueInfoCls, nullptr);
|
2020-12-28 12:58:06 -08:00
|
|
|
if (!jarr) {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
for (size_t i = 0; i < numElems; ++i) {
|
|
|
|
|
JLocal<jobject> elem{env, arr[i].MakeJava(env)};
|
|
|
|
|
env->SetObjectArrayElement(jarr, i, elem.obj());
|
|
|
|
|
}
|
|
|
|
|
return jarr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: getSimValueEnumOptions
|
|
|
|
|
* Signature: (I)[Ljava/lang/Object;
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jobjectArray JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_getSimValueEnumOptions
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv* env, jclass, jint handle)
|
|
|
|
|
{
|
|
|
|
|
static JClass stringCls{env, "java/lang/String"};
|
2020-12-28 12:58:06 -08:00
|
|
|
if (!stringCls) {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
int32_t numElems = 0;
|
|
|
|
|
const char** elems = HALSIM_GetSimValueEnumOptions(handle, &numElems);
|
|
|
|
|
jobjectArray jarr = env->NewObjectArray(numElems, stringCls, nullptr);
|
2020-12-28 12:58:06 -08:00
|
|
|
if (!jarr) {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
2019-09-28 11:34:46 -07:00
|
|
|
for (int32_t i = 0; i < numElems; ++i) {
|
|
|
|
|
JLocal<jstring> elem{env, MakeJString(env, elems[i])};
|
|
|
|
|
env->SetObjectArrayElement(jarr, i, elem.obj());
|
|
|
|
|
}
|
|
|
|
|
return jarr;
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-23 15:54:11 -08:00
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2020-12-23 15:54:11 -08:00
|
|
|
* Method: getSimValueEnumDoubleValues
|
|
|
|
|
* Signature: (I)[D
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT jdoubleArray JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_getSimValueEnumDoubleValues
|
2020-12-23 15:54:11 -08:00
|
|
|
(JNIEnv* env, jclass, jint handle)
|
|
|
|
|
{
|
|
|
|
|
int32_t numElems = 0;
|
|
|
|
|
const double* elems = HALSIM_GetSimValueEnumDoubleValues(handle, &numElems);
|
2022-10-15 16:33:14 -07:00
|
|
|
return MakeJDoubleArray(env, std::span(elems, numElems));
|
2020-12-23 15:54:11 -08:00
|
|
|
}
|
|
|
|
|
|
2019-09-28 11:34:46 -07:00
|
|
|
/*
|
2025-11-07 19:55:43 -05:00
|
|
|
* Class: org_wpilib_hardware_hal_simulation_SimDeviceDataJNI
|
2019-09-28 11:34:46 -07:00
|
|
|
* Method: resetSimDeviceData
|
|
|
|
|
* Signature: ()V
|
|
|
|
|
*/
|
|
|
|
|
JNIEXPORT void JNICALL
|
2025-11-07 19:55:43 -05:00
|
|
|
Java_org_wpilib_hardware_hal_simulation_SimDeviceDataJNI_resetSimDeviceData
|
2019-09-28 11:34:46 -07:00
|
|
|
(JNIEnv*, jclass)
|
|
|
|
|
{
|
|
|
|
|
HALSIM_ResetSimDeviceData();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // extern "C"
|