[hal] Add method to detect if the CAN Stream has overflowed (#6105)

This commit is contained in:
Thad House
2023-12-29 09:10:48 -08:00
committed by GitHub
parent 9333951736
commit 24a76be694
5 changed files with 61 additions and 3 deletions

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);