mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-20 00:51:42 +00:00
The HAL functions often call NI functions that may expect status to be initialized on entry. Java does not guarantee direct pointer allocation memory to be initialized, although that may have been occurring by accident. Change-Id: I5e3a553f3a7be8de3716ccfc13e6ca1cb4f2a552
216 lines
7.4 KiB
C++
216 lines
7.4 KiB
C++
#include <jni.h>
|
|
#include <assert.h>
|
|
#include "Log.hpp"
|
|
|
|
#include "edu_wpi_first_wpilibj_hal_PWMJNI.h"
|
|
|
|
#include "HAL/Digital.hpp"
|
|
|
|
// set the logging level
|
|
TLogLevel pwmJNILogLevel = logWARNING;
|
|
|
|
#define PWMJNI_LOG(level) \
|
|
if (level > pwmJNILogLevel) ; \
|
|
else Log().Get(level)
|
|
|
|
|
|
/*
|
|
* Class: edu_wpi_first_wpilibj_hal_PWMJNI
|
|
* Method: allocatePWMChannel
|
|
* Signature: (Ljava/nio/ByteBuffer;Ljava/nio/IntBuffer;)Z
|
|
*/
|
|
JNIEXPORT jboolean JNICALL Java_edu_wpi_first_wpilibj_hal_PWMJNI_allocatePWMChannel
|
|
(JNIEnv * env, jclass, jobject id, jobject status)
|
|
{
|
|
PWMJNI_LOG(logDEBUG) << "Calling DIOJNI allocatePWMChannel";
|
|
void ** javaId = (void**)env->GetDirectBufferAddress(id);
|
|
PWMJNI_LOG(logDEBUG) << "Port Ptr = " << *javaId;
|
|
jint * statusPtr = (jint*)env->GetDirectBufferAddress(status);
|
|
PWMJNI_LOG(logDEBUG) << "Status Ptr = " << statusPtr;
|
|
*statusPtr = 0;
|
|
jbyte returnValue = allocatePWMChannel(*javaId, statusPtr);
|
|
PWMJNI_LOG(logDEBUG) << "Status = " << *statusPtr;
|
|
PWMJNI_LOG(logDEBUG) << "allocatePWMChannelResult = " << (jint)returnValue;
|
|
return returnValue;
|
|
}
|
|
|
|
/*
|
|
* Class: edu_wpi_first_wpilibj_hal_PWMJNI
|
|
* Method: freePWMChannel
|
|
* Signature: (Ljava/nio/ByteBuffer;Ljava/nio/IntBuffer;)V
|
|
*/
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_PWMJNI_freePWMChannel
|
|
(JNIEnv * env, jclass, jobject id, jobject status)
|
|
{
|
|
PWMJNI_LOG(logDEBUG) << "Calling DIOJNI freePWMChannel";
|
|
void ** javaId = (void**)env->GetDirectBufferAddress(id);
|
|
PWMJNI_LOG(logDEBUG) << "Port Ptr = " << *javaId;
|
|
jint * statusPtr = (jint*)env->GetDirectBufferAddress(status);
|
|
PWMJNI_LOG(logDEBUG) << "Status Ptr = " << statusPtr;
|
|
*statusPtr = 0;
|
|
freePWMChannel(*javaId, statusPtr);
|
|
PWMJNI_LOG(logDEBUG) << "Status = " << *statusPtr;
|
|
|
|
}
|
|
|
|
/*
|
|
* Class: edu_wpi_first_wpilibj_hal_PWMJNI
|
|
* Method: setPWM
|
|
* Signature: (Ljava/nio/ByteBuffer;SLjava/nio/IntBuffer;)V
|
|
*/
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_PWMJNI_setPWM
|
|
(JNIEnv * env, jclass, jobject id, jshort value, jobject status)
|
|
{
|
|
void ** javaId = (void**)env->GetDirectBufferAddress(id);
|
|
PWMJNI_LOG(logDEBUG) << "DigitalPort Ptr = " << *javaId;
|
|
PWMJNI_LOG(logDEBUG) << "PWM Value = " << value;
|
|
jint * statusPtr = (jint*)env->GetDirectBufferAddress(status);
|
|
*statusPtr = 0;
|
|
setPWM( *javaId, value, statusPtr );
|
|
PWMJNI_LOG(logDEBUG) << "Status = " << *statusPtr;
|
|
}
|
|
|
|
/*
|
|
* Class: edu_wpi_first_wpilibj_hal_PWMJNI
|
|
* Method: getPWM
|
|
* Signature: (Ljava/nio/ByteBuffer;Ljava/nio/IntBuffer;)S
|
|
*/
|
|
JNIEXPORT jshort JNICALL Java_edu_wpi_first_wpilibj_hal_PWMJNI_getPWM
|
|
(JNIEnv * env, jclass, jobject id, jobject status)
|
|
{
|
|
void ** javaId = (void**)env->GetDirectBufferAddress(id);
|
|
PWMJNI_LOG(logDEBUG) << "PWM Ptr = " << *javaId;
|
|
jint * statusPtr = (jint*)env->GetDirectBufferAddress(status);
|
|
*statusPtr = 0;
|
|
jshort returnValue = getPWM( *javaId, statusPtr );
|
|
PWMJNI_LOG(logDEBUG) << "Status = " << *statusPtr;
|
|
PWMJNI_LOG(logDEBUG) << "Value = " << returnValue;
|
|
return returnValue;
|
|
}
|
|
|
|
/*
|
|
* Class: edu_wpi_first_wpilibj_hal_PWMJNI
|
|
* Method: latchPWMZero
|
|
* Signature: (Ljava/nio/ByteBuffer;Ljava/nio/IntBuffer;)V
|
|
*/
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_PWMJNI_latchPWMZero
|
|
(JNIEnv * env, jclass, jobject id, jobject status)
|
|
{
|
|
void ** javaId = (void**)env->GetDirectBufferAddress(id);
|
|
PWMJNI_LOG(logDEBUG) << "PWM Ptr = " << *javaId;
|
|
jint * statusPtr = (jint*)env->GetDirectBufferAddress(status);
|
|
*statusPtr = 0;
|
|
latchPWMZero( *javaId, statusPtr );
|
|
PWMJNI_LOG(logDEBUG) << "Status = " << *statusPtr;
|
|
}
|
|
|
|
/*
|
|
* Class: edu_wpi_first_wpilibj_hal_PWMJNI
|
|
* Method: setPWMPeriodScale
|
|
* Signature: (Ljava/nio/ByteBuffer;ILjava/nio/IntBuffer;)V
|
|
*/
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_PWMJNI_setPWMPeriodScale
|
|
(JNIEnv * env, jclass, jobject id, jint value, jobject status )
|
|
{
|
|
void ** javaId = (void**)env->GetDirectBufferAddress(id);
|
|
PWMJNI_LOG(logDEBUG) << "DigitalPort Ptr = " << *javaId;
|
|
PWMJNI_LOG(logDEBUG) << "PeriodScale Value = " << value;
|
|
jint * statusPtr = (jint*)env->GetDirectBufferAddress(status);
|
|
*statusPtr = 0;
|
|
setPWMPeriodScale( *javaId, value, statusPtr );
|
|
PWMJNI_LOG(logDEBUG) << "Status = " << *statusPtr;
|
|
}
|
|
|
|
/*
|
|
* Class: edu_wpi_first_wpilibj_hal_PWMJNI
|
|
* Method: allocatePWM
|
|
* Signature: (Ljava/nio/IntBuffer;)Ljava/nio/ByteBuffer;
|
|
*/
|
|
JNIEXPORT jobject JNICALL Java_edu_wpi_first_wpilibj_hal_PWMJNI_allocatePWM
|
|
(JNIEnv * env, jclass, jobject status)
|
|
{
|
|
PWMJNI_LOG(logDEBUG) << "Calling PWMJNI allocatePWM";
|
|
jint * statusPtr = (jint*)env->GetDirectBufferAddress(status);
|
|
PWMJNI_LOG(logDEBUG) << "Status Ptr = " << statusPtr;
|
|
void** pwmPtr = (void**)new unsigned char[4];
|
|
*statusPtr = 0;
|
|
*pwmPtr = allocatePWM(statusPtr);
|
|
PWMJNI_LOG(logDEBUG) << "Status = " << *statusPtr;
|
|
PWMJNI_LOG(logDEBUG) << "PWM Ptr = " << *pwmPtr;
|
|
return env->NewDirectByteBuffer( pwmPtr, 4);
|
|
|
|
}
|
|
|
|
/*
|
|
* Class: edu_wpi_first_wpilibj_hal_PWMJNI
|
|
* Method: freePWM
|
|
* Signature: (Ljava/nio/ByteBuffer;Ljava/nio/IntBuffer;)V
|
|
*/
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_PWMJNI_freePWM
|
|
(JNIEnv * env, jclass, jobject id, jobject status)
|
|
{
|
|
PWMJNI_LOG(logDEBUG) << "Calling PWMJNI freePWM";
|
|
void ** javaId = (void**)env->GetDirectBufferAddress(id);
|
|
PWMJNI_LOG(logDEBUG) << "PWM Ptr = " << *javaId;
|
|
jint * statusPtr = (jint*)env->GetDirectBufferAddress(status);
|
|
PWMJNI_LOG(logDEBUG) << "Status Ptr = " << statusPtr;
|
|
*statusPtr = 0;
|
|
freePWM(*javaId, statusPtr);
|
|
PWMJNI_LOG(logDEBUG) << "Status = " << *statusPtr;
|
|
}
|
|
|
|
/*
|
|
* Class: edu_wpi_first_wpilibj_hal_PWMJNI
|
|
* Method: setPWMRate
|
|
* Signature: (DLjava/nio/IntBuffer;)V
|
|
*/
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_PWMJNI_setPWMRate
|
|
(JNIEnv * env, jclass, jdouble value, jobject status)
|
|
{
|
|
PWMJNI_LOG(logDEBUG) << "Calling PWMJNI setPWMRate";
|
|
PWMJNI_LOG(logDEBUG) << "Rate= " << value;
|
|
jint * statusPtr = (jint*)env->GetDirectBufferAddress(status);
|
|
PWMJNI_LOG(logDEBUG) << "Status Ptr = " << statusPtr;
|
|
*statusPtr = 0;
|
|
setPWMRate(value, statusPtr);
|
|
PWMJNI_LOG(logDEBUG) << "Status = " << *statusPtr;
|
|
}
|
|
|
|
/*
|
|
* Class: edu_wpi_first_wpilibj_hal_PWMJNI
|
|
* Method: setPWMDutyCycle
|
|
* Signature: (Ljava/nio/ByteBuffer;DLjava/nio/IntBuffer;)V
|
|
*/
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_PWMJNI_setPWMDutyCycle
|
|
(JNIEnv * env, jclass, jobject id, jdouble value, jobject status)
|
|
{
|
|
PWMJNI_LOG(logDEBUG) << "Calling PWMJNI setPWMDutyCycle";
|
|
void ** javaId = (void**)env->GetDirectBufferAddress(id);
|
|
PWMJNI_LOG(logDEBUG) << "PWM Ptr = " << *javaId;
|
|
PWMJNI_LOG(logDEBUG) << "DutyCycle= " << value;
|
|
jint * statusPtr = (jint*)env->GetDirectBufferAddress(status);
|
|
PWMJNI_LOG(logDEBUG) << "Status Ptr = " << statusPtr;
|
|
*statusPtr = 0;
|
|
setPWMDutyCycle(*javaId, value, statusPtr);
|
|
PWMJNI_LOG(logDEBUG) << "Status = " << *statusPtr;
|
|
}
|
|
|
|
/*
|
|
* Class: edu_wpi_first_wpilibj_hal_PWMJNI
|
|
* Method: setPWMOutputChannel
|
|
* Signature: (Ljava/nio/ByteBuffer;ILjava/nio/IntBuffer;)V
|
|
*/
|
|
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_PWMJNI_setPWMOutputChannel
|
|
(JNIEnv * env, jclass, jobject id, jint value, jobject status)
|
|
{
|
|
PWMJNI_LOG(logDEBUG) << "Calling PWMJNI setPWMOutputChannel";
|
|
void ** javaId = (void**)env->GetDirectBufferAddress(id);
|
|
PWMJNI_LOG(logDEBUG) << "PWM Ptr = " << *javaId;
|
|
PWMJNI_LOG(logDEBUG) << "Pin= " << value;
|
|
jint * statusPtr = (jint*)env->GetDirectBufferAddress(status);
|
|
PWMJNI_LOG(logDEBUG) << "Status Ptr = " << statusPtr;
|
|
*statusPtr = 0;
|
|
setPWMOutputChannel(*javaId, (uint32_t) value, statusPtr);
|
|
PWMJNI_LOG(logDEBUG) << "Status = " << *statusPtr;
|
|
}
|