mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-07-01 02:41:48 +00:00
[hal] Add method to detect if the CAN Stream has overflowed (#6105)
This commit is contained in:
@@ -31,5 +31,6 @@ public class CANJNI extends JNIWrapper {
|
||||
public static native void closeCANStreamSession(int sessionHandle);
|
||||
|
||||
public static native int readCANStreamSession(
|
||||
int sessionHandle, CANStreamMessage[] messages, int messagesToRead);
|
||||
int sessionHandle, CANStreamMessage[] messages, int messagesToRead)
|
||||
throws CANStreamOverflowException;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
// 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.
|
||||
|
||||
package edu.wpi.first.hal.can;
|
||||
|
||||
import edu.wpi.first.hal.CANStreamMessage;
|
||||
import java.io.IOException;
|
||||
|
||||
public class CANStreamOverflowException extends IOException {
|
||||
private final CANStreamMessage[] m_messages;
|
||||
private final int m_messagesRead;
|
||||
|
||||
/**
|
||||
* Constructs a new CANStreamOverflowException.
|
||||
*
|
||||
* @param messages The messages
|
||||
* @param messagesRead The length of messages read
|
||||
*/
|
||||
@SuppressWarnings("PMD.ArrayIsStoredDirectly")
|
||||
public CANStreamOverflowException(CANStreamMessage[] messages, int messagesRead) {
|
||||
super("A CAN Stream has overflowed. Data will be missed");
|
||||
this.m_messages = messages;
|
||||
this.m_messagesRead = messagesRead;
|
||||
}
|
||||
|
||||
@SuppressWarnings("PMD.MethodReturnsInternalArray")
|
||||
public CANStreamMessage[] getMessages() {
|
||||
return m_messages;
|
||||
}
|
||||
|
||||
public int getMessagesRead() {
|
||||
return m_messagesRead;
|
||||
}
|
||||
}
|
||||
@@ -151,7 +151,8 @@ Java_edu_wpi_first_hal_can_CANJNI_readCANStreamSession
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!CheckStatus(env, status)) {
|
||||
if (status != HAL_ERR_CANSessionMux_SessionOverrun &&
|
||||
!CheckStatus(env, status)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -181,6 +182,12 @@ Java_edu_wpi_first_hal_can_CANJNI_readCANStreamSession
|
||||
reinterpret_cast<jbyte*>(msg->data));
|
||||
}
|
||||
|
||||
if (status == HAL_ERR_CANSessionMux_SessionOverrun) {
|
||||
ThrowCANStreamOverflowException(env, messages,
|
||||
static_cast<jint>(messagesRead));
|
||||
return 0;
|
||||
}
|
||||
|
||||
return static_cast<jint>(messagesRead);
|
||||
}
|
||||
|
||||
|
||||
@@ -56,6 +56,7 @@ static JClass canStreamMessageCls;
|
||||
static JClass halValueCls;
|
||||
static JClass baseStoreCls;
|
||||
static JClass revPHVersionCls;
|
||||
static JClass canStreamOverflowExCls;
|
||||
|
||||
static const JClassInit classes[] = {
|
||||
{"edu/wpi/first/hal/PowerDistributionVersion",
|
||||
@@ -68,7 +69,9 @@ static const JClassInit classes[] = {
|
||||
{"edu/wpi/first/hal/CANStreamMessage", &canStreamMessageCls},
|
||||
{"edu/wpi/first/hal/HALValue", &halValueCls},
|
||||
{"edu/wpi/first/hal/DMAJNISample$BaseStore", &baseStoreCls},
|
||||
{"edu/wpi/first/hal/REVPHVersion", &revPHVersionCls}};
|
||||
{"edu/wpi/first/hal/REVPHVersion", &revPHVersionCls},
|
||||
{"edu/wpi/first/hal/can/CANStreamOverflowException",
|
||||
&canStreamOverflowExCls}};
|
||||
|
||||
static const JExceptionInit exceptions[] = {
|
||||
{"java/lang/IllegalArgumentException", &illegalArgExCls},
|
||||
@@ -209,6 +212,16 @@ void ReportCANError(JNIEnv* env, int32_t status, int message_id) {
|
||||
}
|
||||
}
|
||||
|
||||
void ThrowCANStreamOverflowException(JNIEnv* env, jobjectArray messages,
|
||||
jint length) {
|
||||
static jmethodID constructor =
|
||||
env->GetMethodID(canStreamOverflowExCls, "<init>",
|
||||
"([Ledu/wpi/first/hal/CANStreamMessage;I)V");
|
||||
jobject exception =
|
||||
env->NewObject(canStreamOverflowExCls, constructor, messages, length);
|
||||
env->Throw(static_cast<jthrowable>(exception));
|
||||
}
|
||||
|
||||
void ThrowIllegalArgumentException(JNIEnv* env, std::string_view msg) {
|
||||
illegalArgExCls.Throw(env, msg);
|
||||
}
|
||||
|
||||
@@ -51,6 +51,8 @@ inline bool CheckCANStatus(JNIEnv* env, int32_t status, int32_t message_id) {
|
||||
return status == 0;
|
||||
}
|
||||
|
||||
void ThrowCANStreamOverflowException(JNIEnv* env, jobjectArray messages,
|
||||
jint length);
|
||||
void ThrowIllegalArgumentException(JNIEnv* env, std::string_view msg);
|
||||
void ThrowBoundaryException(JNIEnv* env, double value, double lower,
|
||||
double upper);
|
||||
|
||||
Reference in New Issue
Block a user