Pass errors to DS in C++ and Java

Squashed commit of the following:

commit f317b3522e312cf7e7bb9eb0494f2f96a7f6363c
Author: Kevin O'Connor <koconnor@usfirst.org>
Date:   Mon Oct 20 17:15:46 2014 -0400

    Send unhandled exceptions back to the DS.

    Change-Id: I0e658fdb6d43593ee20457f20f71f4f4cd2d21c3

commit f834ef8c791945697ad483c27b4167eb917ac242
Author: Kevin O'Connor <koconnor@usfirst.org>
Date:   Mon Oct 20 16:05:24 2014 -0400

    Add StackTrace to Java errors

    Change-Id: I83b162afcc5f294703705770fbcd8623b0895539

commit 02e040b0c79067ce046ada29e26004e0460fceb0
Author: Kevin O'Connor <koconnor@usfirst.org>
Date:   Mon Oct 20 15:07:44 2014 -0400

    HAL Errors to DS in Java

    Change-Id: I5fb51e4066bbc26ea59ca513c03c5ec5ace98831

commit 03775ddc42b129c27fdf403f17f0796009311c3c
Author: Kevin O'Connor <koconnor@usfirst.org>
Date:   Mon Oct 20 13:38:18 2014 -0400

    Update AnalogInput to report errors for getting and setting sample rate

    Change-Id: I00eb78f52fc5b17a60bc84456f0ec9842cc40ef7

commit 4c10cb79612ae81e3cbb6bd4d6da8cf3b8955821
Author: Kevin O'Connor <koconnor@usfirst.org>
Date:   Mon Oct 20 11:46:03 2014 -0400

    Define errors in HAL

    Change-Id: I96595472e42ba61f0f3d0da17caf01a748d0422a

commit 56cb5dcd93e5e849a016f63ac9d0dc245a23eb2b
Author: Kevin O'Connor <koconnor@usfirst.org>
Date:   Fri Oct 17 10:59:29 2014 -0400

    Throttle errors (1 report per second per error code) and fix issue with GetTime conflicting with GetTime from Timer.h/Timer.cpp

    Change-Id: Ibe4dc2e400fc4671b240b876a46959256ea65ad7

commit 71c78826e548682ecd0c1548255f8a6552cece32
Author: Kevin O'Connor <koconnor@usfirst.org>
Date:   Thu Oct 16 16:41:04 2014 -0400

    Feed errors to DS from C++

    Change-Id: I009a7798499fd93e9fdd976ff00aa74c0bd094ae

commit 81030c6cee7f18a5ddf0e95c4e402a6cf7b5de6c
Author: Kevin O'Connor <koconnor@usfirst.org>
Date:   Thu Oct 16 16:40:50 2014 -0400

    Don't try to de-mangle lines without any symbols in them

    Change-Id: Icea02494b68f2ec9116d6cbf20a35a3a132234f8

Change-Id: If7717025b03914183736ccd95da5c9d49819a6f3
This commit is contained in:
Kevin O'Connor
2014-10-20 17:19:28 -04:00
committed by Brad Miller
parent 26419ec209
commit 003dc0dc2b
17 changed files with 237 additions and 127 deletions

View File

@@ -1,26 +1,47 @@
#pragma once
#define SAMPLE_RATE_TOO_HIGH 1
#define SAMPLE_RATE_TOO_HIGH_MESSAGE "Analog module sample rate is too high"
#define VOLTAGE_OUT_OF_RANGE 2
#define VOLTAGE_OUT_OF_RANGE_MESSAGE "Voltage to convert to raw value is out of range [0; 5]"
#define LOOP_TIMING_ERROR 4
#define LOOP_TIMING_ERROR_MESSAGE "Digital module loop timing is not the expected value"
#define SPI_WRITE_NO_MOSI 12
#define SPI_WRITE_NO_MOSI_MESSAGE "Cannot write to SPI port with no MOSI output"
#define SPI_READ_NO_MISO 13
#define SPI_READ_NO_MISO_MESSAGE "Cannot read from SPI port with no MISO input"
#define SPI_READ_NO_DATA 14
#define SPI_READ_NO_DATA_MESSAGE "No data available to read from SPI"
#define INCOMPATIBLE_STATE 15
#define INCOMPATIBLE_STATE_MESSAGE "Incompatible State: The operation cannot be completed"
#define NO_AVAILABLE_RESOURCES -4
#define NO_AVAILABLE_RESOURCES_MESSAGE "No available resources to allocate"
#define NULL_PARAMETER -5
#define NULL_PARAMETER_MESSAGE "A pointer parameter to a method is NULL"
#define ANALOG_TRIGGER_LIMIT_ORDER_ERROR -10
#define ANALOG_TRIGGER_LIMIT_ORDER_ERROR_MESSAGE "AnalogTrigger limits error. Lower limit > Upper Limit"
#define ANALOG_TRIGGER_PULSE_OUTPUT_ERROR -11
#define ANALOG_TRIGGER_PULSE_OUTPUT_ERROR_MESSAGE "Attempted to read AnalogTrigger pulse output."
#define PARAMETER_OUT_OF_RANGE -28
#define PARAMETER_OUT_OF_RANGE_MESSAGE "A parameter is out of range."
#define CTR_RxTimeout_MESSAGE "CTRE CAN Recieve Timeout"
#define CTR_TxTimeout_MESSAGE "CTRE CAN Transmit Timeout"
#define CTR_InvalidParamValue_MESSAGE "CTRE CAN Invalid Parameter"
#define CTR_UnexpectedArbId_MESSAGE "CTRE Unexpected Arbitration ID (CAN Node ID)"
#define NiFpga_Status_FifoTimeout_MESSAGE "NIFPGA: FIFO timeout error"
#define NiFpga_Status_TransferAborted_MESSAGE "NIFPGA: Transfer aborted error"
#define NiFpga_Status_MemoryFull_MESSAGE "NIFPGA: Memory Allocation failed, memory full"
#define NiFpga_Status_SoftwareFault_MESSAGE "NIFPGA: Unexepected software error"
#define NiFpga_Status_InvalidParameter_MESSAGE "NIFPGA: Invalid Parameter"
#define NiFpga_Status_ResourceNotFound_MESSAGE "NIFPGA: Resource not found"
#define NiFpga_Status_ResourceNotInitialized_MESSAGE "NIFPGA: Resource not initialized"
#define NiFpga_Status_HardwareFault_MESSAGE "NIFPGA: Hardware Fault"
#define NiFpga_Status_IrqTimeout_MESSAGE "NIFPGA: Interrupt timeout"
#define ERR_CANSessionMux_InvalidBuffer_MESSAGE "CAN: Invalid Buffer"
#define ERR_CANSessionMux_MessageNotFound_MESSAGE "CAN: Message not found"
#define WARN_CANSessionMux_NoToken_MESSAGE "CAN: No token"
#define ERR_CANSessionMux_NotAllowed_MESSAGE "CAN: Not allowed"
#define ERR_CANSessionMux_NotInitialized_MESSAGE "CAN: Not initialized"
#define SAMPLE_RATE_TOO_HIGH 1001
#define SAMPLE_RATE_TOO_HIGH_MESSAGE "HAL: Analog module sample rate is too high"
#define VOLTAGE_OUT_OF_RANGE 1002
#define VOLTAGE_OUT_OF_RANGE_MESSAGE "HAL: Voltage to convert to raw value is out of range [0; 5]"
#define LOOP_TIMING_ERROR 1004
#define LOOP_TIMING_ERROR_MESSAGE "HAL: Digital module loop timing is not the expected value"
#define SPI_WRITE_NO_MOSI 1012
#define SPI_WRITE_NO_MOSI_MESSAGE "HAL: Cannot write to SPI port with no MOSI output"
#define SPI_READ_NO_MISO 1013
#define SPI_READ_NO_MISO_MESSAGE "HAL: Cannot read from SPI port with no MISO input"
#define SPI_READ_NO_DATA 1014
#define SPI_READ_NO_DATA_MESSAGE "HAL: No data available to read from SPI"
#define INCOMPATIBLE_STATE 1015
#define INCOMPATIBLE_STATE_MESSAGE "HAL: Incompatible State: The operation cannot be completed"
#define NO_AVAILABLE_RESOURCES -1004
#define NO_AVAILABLE_RESOURCES_MESSAGE "HAL: No available resources to allocate"
#define NULL_PARAMETER -1005
#define NULL_PARAMETER_MESSAGE "HAL: A pointer parameter to a method is NULL"
#define ANALOG_TRIGGER_LIMIT_ORDER_ERROR -1010
#define ANALOG_TRIGGER_LIMIT_ORDER_ERROR_MESSAGE "HAL: AnalogTrigger limits error. Lower limit > Upper Limit"
#define ANALOG_TRIGGER_PULSE_OUTPUT_ERROR -1011
#define ANALOG_TRIGGER_PULSE_OUTPUT_ERROR_MESSAGE "HAL: Attempted to read AnalogTrigger pulse output."
#define PARAMETER_OUT_OF_RANGE -1028
#define PARAMETER_OUT_OF_RANGE_MESSAGE "HAL: A parameter is out of range."

View File

@@ -2,6 +2,7 @@
#include "Port.h"
#include "HAL/Errors.hpp"
#include "ctre/ctre.h"
#include "ChipObject.h"
#include "NetworkCommunication/FRCComm.h"
#include "NetworkCommunication/UsageReporting.h"
@@ -38,34 +39,72 @@ void* getPortWithModule(uint8_t module, uint8_t pin)
const char* getHALErrorMessage(int32_t code)
{
if (code == 0)
return "";
else if (code == SAMPLE_RATE_TOO_HIGH)
return SAMPLE_RATE_TOO_HIGH_MESSAGE;
else if (code == VOLTAGE_OUT_OF_RANGE)
return VOLTAGE_OUT_OF_RANGE_MESSAGE;
else if (code == LOOP_TIMING_ERROR)
return LOOP_TIMING_ERROR_MESSAGE;
else if (code == SPI_WRITE_NO_MOSI)
return SPI_WRITE_NO_MOSI_MESSAGE;
else if (code == SPI_READ_NO_MISO)
return SPI_READ_NO_MISO_MESSAGE;
else if (code == SPI_READ_NO_DATA)
return SPI_READ_NO_DATA_MESSAGE;
else if (code == INCOMPATIBLE_STATE)
return INCOMPATIBLE_STATE_MESSAGE;
else if (code == NO_AVAILABLE_RESOURCES)
return NO_AVAILABLE_RESOURCES_MESSAGE;
else if (code == NULL_PARAMETER)
return NULL_PARAMETER_MESSAGE;
else if (code == ANALOG_TRIGGER_LIMIT_ORDER_ERROR)
return ANALOG_TRIGGER_LIMIT_ORDER_ERROR_MESSAGE;
else if (code == ANALOG_TRIGGER_PULSE_OUTPUT_ERROR)
return ANALOG_TRIGGER_PULSE_OUTPUT_ERROR_MESSAGE;
else if (code == PARAMETER_OUT_OF_RANGE)
return PARAMETER_OUT_OF_RANGE_MESSAGE;
else
return "";
switch(code) {
case 0:
return "";
case CTR_RxTimeout:
return CTR_RxTimeout_MESSAGE;
case CTR_TxTimeout:
return CTR_TxTimeout_MESSAGE;
case CTR_InvalidParamValue:
return CTR_InvalidParamValue_MESSAGE;
case CTR_UnexpectedArbId:
return CTR_UnexpectedArbId_MESSAGE;
case NiFpga_Status_FifoTimeout:
return NiFpga_Status_FifoTimeout_MESSAGE;
case NiFpga_Status_TransferAborted:
return NiFpga_Status_TransferAborted_MESSAGE;
case NiFpga_Status_MemoryFull:
return NiFpga_Status_MemoryFull_MESSAGE;
case NiFpga_Status_SoftwareFault:
return NiFpga_Status_SoftwareFault_MESSAGE;
case NiFpga_Status_InvalidParameter:
return NiFpga_Status_InvalidParameter_MESSAGE;
case NiFpga_Status_ResourceNotFound:
return NiFpga_Status_ResourceNotFound_MESSAGE;
case NiFpga_Status_ResourceNotInitialized:
return NiFpga_Status_ResourceNotInitialized_MESSAGE;
case NiFpga_Status_HardwareFault:
return NiFpga_Status_HardwareFault_MESSAGE;
case NiFpga_Status_IrqTimeout:
return NiFpga_Status_IrqTimeout_MESSAGE;
case SAMPLE_RATE_TOO_HIGH:
return SAMPLE_RATE_TOO_HIGH_MESSAGE;
case VOLTAGE_OUT_OF_RANGE:
return VOLTAGE_OUT_OF_RANGE_MESSAGE;
case LOOP_TIMING_ERROR:
return LOOP_TIMING_ERROR_MESSAGE;
case SPI_WRITE_NO_MOSI:
return SPI_WRITE_NO_MOSI_MESSAGE;
case SPI_READ_NO_MISO:
return SPI_READ_NO_MISO_MESSAGE;
case SPI_READ_NO_DATA:
return SPI_READ_NO_DATA_MESSAGE;
case INCOMPATIBLE_STATE:
return INCOMPATIBLE_STATE_MESSAGE;
case NO_AVAILABLE_RESOURCES:
return NO_AVAILABLE_RESOURCES_MESSAGE;
case NULL_PARAMETER:
return NULL_PARAMETER_MESSAGE;
case ANALOG_TRIGGER_LIMIT_ORDER_ERROR:
return ANALOG_TRIGGER_LIMIT_ORDER_ERROR_MESSAGE;
case ANALOG_TRIGGER_PULSE_OUTPUT_ERROR:
return ANALOG_TRIGGER_PULSE_OUTPUT_ERROR_MESSAGE;
case PARAMETER_OUT_OF_RANGE:
return PARAMETER_OUT_OF_RANGE_MESSAGE;
case ERR_CANSessionMux_InvalidBuffer:
return ERR_CANSessionMux_InvalidBuffer_MESSAGE;
case ERR_CANSessionMux_MessageNotFound:
return ERR_CANSessionMux_MessageNotFound_MESSAGE;
case WARN_CANSessionMux_NoToken:
return WARN_CANSessionMux_NoToken_MESSAGE;
case ERR_CANSessionMux_NotAllowed:
return ERR_CANSessionMux_NotAllowed_MESSAGE;
case ERR_CANSessionMux_NotInitialized:
return ERR_CANSessionMux_NotInitialized_MESSAGE;
default:
return "Unknown error status";
}
}
/**

View File

@@ -29,7 +29,7 @@ public:
const char *GetFunction() const;
uint32_t GetLineNumber() const;
const ErrorBase* GetOriginatingObject() const;
double GetTime() const;
double GetTimestamp() const;
void Clear();
void Set(Code code, const char* contextMessage, const char* filename, const char *function,
uint32_t lineNumber, const ErrorBase* originatingObject);

View File

@@ -8,13 +8,12 @@
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stdint.h>
#include "HAL/Task.hpp"
//#include "NetworkCommunication/FRCComm.h"
#include "DriverStation.h"
#include "Timer.h"
#include "Utility.h"
bool Error::m_suspendOnErrorEnabled = false;
@@ -58,20 +57,30 @@ uint32_t Error::GetLineNumber() const
const ErrorBase* Error::GetOriginatingObject() const
{ return m_originatingObject; }
double Error::GetTime() const
double Error::GetTimestamp() const
{ return m_timestamp; }
void Error::Set(Code code, const char* contextMessage, const char* filename, const char* function, uint32_t lineNumber, const ErrorBase* originatingObject)
{
bool report = true;
if(code == m_code && GetTime() - m_timestamp < 1)
{
report = false;
}
m_code = code;
m_message = contextMessage;
m_filename = filename;
m_function = function;
m_lineNumber = lineNumber;
m_originatingObject = originatingObject;
m_timestamp = GetTime();
Report();
if(report)
{
m_timestamp = GetTime();
Report();
}
if (m_suspendOnErrorEnabled) suspendTask(0);
}
@@ -87,9 +96,7 @@ void Error::Report()
std::string error = errorStream.str();
// Print the error and send it to the DriverStation
std::cout << error << std::endl;
// TODO: Better logging HALSetErrorData(error.c_str(), error.size(), 100);
DriverStation::ReportError(error);
}
void Error::Clear()

View File

@@ -28,6 +28,7 @@ public:
virtual ~DriverStation();
static DriverStation *GetInstance();
static void ReportError(std::string error);
static const uint32_t kJoystickPorts = 4;

View File

@@ -387,6 +387,7 @@ void AnalogInput::SetSampleRate(float samplesPerSecond)
{
int32_t status = 0;
setAnalogSampleRate(samplesPerSecond, &status);
wpi_setGlobalErrorWithContext(status, getHALErrorMessage(status));
}
/**
@@ -398,6 +399,7 @@ float AnalogInput::GetSampleRate()
{
int32_t status = 0;
float sampleRate = getAnalogSampleRate(&status);
wpi_setGlobalErrorWithContext(status, getHALErrorMessage(status));
return sampleRate;
}

View File

@@ -366,3 +366,13 @@ double DriverStation::GetMatchTime()
return 0.0;
return Timer::GetFPGATimestamp() - m_approxMatchTimeOffset;
}
/**
* Report an error to the DriverStation messages window.
* The error is also printed to the program console.
*/
void DriverStation::ReportError(std::string error)
{
std::cout << error << std::endl;
HALSetErrorData(error.c_str(), error.size(), 0);
}

View File

@@ -225,10 +225,10 @@ static std::string demangle(char const *mangledSymbol)
size_t length;
int status;
if(sscanf(mangledSymbol, "%*[^(]%*[^_]%255[^)+]", buffer))
if(sscanf(mangledSymbol, "%*[^(]%*[(]%255[^)+]", buffer))
{
char *symbol = abi::__cxa_demangle(buffer, NULL, &length, &status);
if(status == 0)
{
return symbol;

View File

@@ -31,6 +31,7 @@ public:
virtual ~DriverStation();
static DriverStation *GetInstance();
static void ReportError(std::string error);
static const uint32_t kBatteryChannel = 7;
static const uint32_t kJoystickPorts = 4;
@@ -59,6 +60,8 @@ public:
double GetMatchTime();
float GetBatteryVoltage();
uint16_t GetTeamNumber();
void IncrementUpdateNumber()
{

View File

@@ -60,7 +60,7 @@ DriverStation::DriverStation()
&DriverStation::joystickCallback2, this);
joysticks[2] = msgs::JoystickPtr(new msgs::Joystick());
joysticksSub[2] = MainNode::Subscribe("~/ds/joysticks/3",
&DriverStation::joystickCallback3, this);
&DriverStation::joystickCallback3, this);
joysticks[3] = msgs::JoystickPtr(new msgs::Joystick());
joysticksSub[3] = MainNode::Subscribe("~/ds/joysticks/4",
&DriverStation::joystickCallback4, this);
@@ -325,6 +325,15 @@ double DriverStation::GetMatchTime()
return Timer::GetFPGATimestamp() - m_approxMatchTimeOffset;
}
/**
* Report an error to the DriverStation messages window.
* The error is also printed to the program console.
*/
void DriverStation::ReportError(std::string error)
{
std::cout << error << std::endl;
}
/**
* Return the team number that the Driver Station is configured for
* @return The team number

View File

@@ -400,6 +400,26 @@ public class DriverStation implements RobotState.Interface {
}
return Timer.getFPGATimestamp() - m_approxMatchTimeOffset;
}
/**
* Report error to Driver Station.
* Also prints error to System.err
* Optionally appends Stack trace to error message
* @param printTrace If true, append stack trace to error string
*/
public static void reportError(String error, boolean printTrace) {
String errorString = error;
if(printTrace) {
errorString += " at ";
StackTraceElement[] traces = Thread.currentThread().getStackTrace();
for (int i=2; i<traces.length; i++)
{
errorString += traces[i].toString() + "\n";
}
}
System.err.println(errorString);
FRCNetworkCommunicationsLibrary.HALSetErrorData(errorString);
}
/** Only to be used to tell the Driver Station what code you claim to be executing
* for diagnostic purposes only

View File

@@ -11,6 +11,7 @@ import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;
import java.util.jar.Manifest;
import java.util.Arrays;
import edu.wpi.first.wpilibj.communication.FRCNetworkCommunicationsLibrary;
import edu.wpi.first.wpilibj.communication.FRCNetworkCommunicationsLibrary.tInstances;
@@ -19,6 +20,7 @@ import edu.wpi.first.wpilibj.communication.UsageReporting;
import edu.wpi.first.wpilibj.internal.HardwareHLUsageReporting;
import edu.wpi.first.wpilibj.internal.HardwareTimer;
import edu.wpi.first.wpilibj.networktables.NetworkTable;
import edu.wpi.first.wpilibj.Utility;
/**
* Implement a Robot Program framework.
@@ -197,7 +199,7 @@ public abstract class RobotBase {
try {
robot.startCompetition();
} catch (Throwable t) {
t.printStackTrace();
DriverStation.reportError("ERROR Unhandled exception: " + t.toString() + " at " + Arrays.toString(t.getStackTrace()), false);
errorOnExit = true;
} finally {
// startCompetition never returns unless exception occurs....

View File

@@ -10,9 +10,11 @@ package edu.wpi.first.wpilibj;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
import java.lang.StackTraceElement;
import edu.wpi.first.wpilibj.hal.HALLibrary;
import edu.wpi.first.wpilibj.hal.HALUtil;
import edu.wpi.first.wpilibj.communication.FRCNetworkCommunicationsLibrary;
/**
* Contains global utility functions

View File

@@ -468,42 +468,6 @@ public class FRCNetworkCommunicationsLibrary extends JNIWrapper {
return HALAllianceStationID.Blue2;
case 5:
return HALAllianceStationID.Blue3;
default:
return null;
}
}
public static int kMaxJoystickAxes = 12;
public static int kMaxJoystickPOVs = 12;
public static native short[] HALGetJoystickAxes(byte joystickNum);
public static native short[] HALGetJoystickPOVs(byte joystickNum);
public static native int HALGetJoystickButtons(byte joystickNum);
/*
public static class pthread_mutex_t extends PointerType {
public pthread_mutex_t(Pointer address) {
super(address);
}
public pthread_mutex_t() {
super();
}
};
public static class STATUS extends PointerType {
public STATUS(Pointer address) {
super(address);
}
public STATUS() {
super();
}
};*/
//
// JNI Testing
//
public static native void JNIValueParameterTest(boolean booleanValue, byte byteValue, char charValue, short shortValue, int intValue, long longValue, float floatValue, double doubleValue );
public static native boolean JNIValueReturnBooleanTest(boolean booleanValue);
public static native byte JNIValueReturnByteTest(byte byteValue);
public static native char JNIValueReturnCharTest(char charValue);
public static native short JNIValueReturnShortTest(short shortValue);
public static native int JNIValueReturnIntTest(int intValue);
default:
return null;
}

View File

@@ -2,16 +2,17 @@ package edu.wpi.first.wpilibj.hal;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import edu.wpi.first.wpilibj.DriverStation;
public class HALUtil extends JNIWrapper {
public static final int NULL_PARAMETER = -5;
public static final int SAMPLE_RATE_TOO_HIGH = 1;
public static final int VOLTAGE_OUT_OF_RANGE = 2;
public static final int LOOP_TIMING_ERROR = 4;
public static final int INCOMPATIBLE_STATE = 15;
public static final int ANALOG_TRIGGER_PULSE_OUTPUT_ERROR = -11;
public static final int NO_AVAILABLE_RESOURCES = -4;
public static final int PARAMETER_OUT_OF_RANGE = -28;
public static final int NULL_PARAMETER = -1005;
public static final int SAMPLE_RATE_TOO_HIGH = 1001;
public static final int VOLTAGE_OUT_OF_RANGE = 1002;
public static final int LOOP_TIMING_ERROR = 1004;
public static final int INCOMPATIBLE_STATE = 1015;
public static final int ANALOG_TRIGGER_PULSE_OUTPUT_ERROR = -1011;
public static final int NO_AVAILABLE_RESOURCES = -104;
public static final int PARAMETER_OUT_OF_RANGE = -1028;
//public static final int SEMAPHORE_WAIT_FOREVER = -1;
//public static final int SEMAPHORE_Q_PRIORITY = 0x01;
@@ -38,22 +39,13 @@ public class HALUtil extends JNIWrapper {
public static void checkStatus(IntBuffer status)
{
int s = status.get(0);
if (s != 0)
if (s < 0)
{
String message = "Code: " + s + ". " + HALUtil.getHALErrorMessage(s);
if (s == HALUtil.NULL_PARAMETER
|| s == HALUtil.SAMPLE_RATE_TOO_HIGH
|| s == HALUtil.VOLTAGE_OUT_OF_RANGE)
throw new IllegalArgumentException(message);
else if (s == HALUtil.LOOP_TIMING_ERROR)
throw new RuntimeException(message);
else if (s == HALUtil.INCOMPATIBLE_STATE
|| s == HALUtil.ANALOG_TRIGGER_PULSE_OUTPUT_ERROR)
throw new IllegalStateException(message);
else if (s == HALUtil.NO_AVAILABLE_RESOURCES)
throw new RuntimeException(message);
else
throw new RuntimeException("Unknown error. Code: " + s + ". " + message);
String message = getHALErrorMessage(s);
throw new RuntimeException(" Code: " + s + ". " + message);
} else if (s > 0) {
String message = getHALErrorMessage(s);
DriverStation.reportError(message, true);
}
}

View File

@@ -88,8 +88,8 @@ JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_communication_FRCNetworkCommun
JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_communication_FRCNetworkCommunicationsLibrary_FRCNetworkCommunicationUsageReportingReport
(JNIEnv * paramEnv, jclass, jbyte paramResource, jbyte paramInstanceNumber, jbyte paramContext, jstring paramFeature)
{
NETCOMM_LOG(logDEBUG) << "Calling FRCNetworkCommunicationsLibrary report " << "res:"<< (unsigned int)paramResource << " instance:" << (unsigned int)paramInstanceNumber << " context:" << (unsigned int)paramContext << " feature:" << paramFeature;
const char * featureStr = paramEnv->GetStringUTFChars(paramFeature, NULL);
NETCOMM_LOG(logDEBUG) << "Calling FRCNetworkCommunicationsLibrary report " << "res:"<< (unsigned int)paramResource << " instance:" << (unsigned int)paramInstanceNumber << " context:" << (unsigned int)paramContext << " feature:" << featureStr;
jint returnValue = HALReport(paramResource, paramInstanceNumber, paramContext, featureStr);
paramEnv->ReleaseStringUTFChars(paramFeature,featureStr);
return returnValue;
@@ -534,3 +534,22 @@ JNIEXPORT jobject JNICALL Java_edu_wpi_first_wpilibj_communication_FRCNetworkCom
return env->NewDirectByteBuffer(returnByteArray, 4);
}
/*
* Class: edu_wpi_first_wpilibj_communication_FRCNetworkCommunicationsLibrary
* Method: HALSetErrorData
* Signature: (Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_communication_FRCNetworkCommunicationsLibrary_HALSetErrorData
(JNIEnv * env, jclass, jstring error)
{
const char * errorStr = env->GetStringUTFChars(error, NULL);
jsize length = env->GetStringUTFLength(error);
NETCOMM_LOG(logDEBUG) << "Set Error: " << errorStr;
NETCOMM_LOG(logDEBUG) << "Length: " << length;
jint returnValue = HALSetErrorData(errorStr, (jint) length, 0);
env->ReleaseStringUTFChars(error,errorStr);
return returnValue;
}

View File

@@ -283,6 +283,25 @@ public class DriverStation implements RobotState.Interface {
public boolean isFMSAttached() {
return false;
}
/**
* Report error to Driver Station.
* Also prints error to System.err
* Optionally appends Stack trace to error message
* @param printTrace If true, append stack trace to error string
*/
public static void reportError(String error, boolean printTrace) {
String errorString = error;
if(printTrace) {
errorString += " at ";
StackTraceElement[] traces = Thread.currentThread().getStackTrace();
for (int i=2; i<traces.length; i++)
{
errorString += traces[i].toString() + "\n";
}
}
System.err.println(errorString);
}
/** Only to be used to tell the Driver Station what code you claim to be executing
* for diagnostic purposes only