Die on duplicate/invalid DigitalInput's
Haven't actually checked whether running FATAL checks on every single
access causes any issues, but the CHECK's in the constructors are fine
at least.
Change-Id: Icdca5556c5d041f8812468b19de6690dc80bf416
Signed-off-by: James Kuszmaul <jabukuszmaul+collab@gmail.com>
diff --git a/frc971/wpilib/ahal/AnalogInput.cc b/frc971/wpilib/ahal/AnalogInput.cc
index 8d814ad..7482476 100644
--- a/frc971/wpilib/ahal/AnalogInput.cc
+++ b/frc971/wpilib/ahal/AnalogInput.cc
@@ -41,6 +41,8 @@
HAL_GetErrorMessage(status));
m_channel = std::numeric_limits<int>::max();
m_port = HAL_kInvalidHandle;
+ HAL_CHECK_STATUS(status)
+ << ": Failed to make AnalogInput channel " << channel;
return;
}
@@ -69,6 +71,7 @@
int32_t status = 0;
int value = HAL_GetAnalogValue(m_port, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
return value;
}
@@ -91,6 +94,7 @@
int32_t status = 0;
int value = HAL_GetAnalogAverageValue(m_port, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
return value;
}
@@ -107,6 +111,7 @@
int32_t status = 0;
double voltage = HAL_GetAnalogVoltage(m_port, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
return voltage;
}
@@ -129,6 +134,7 @@
int32_t status = 0;
double voltage = HAL_GetAnalogAverageVoltage(m_port, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
return voltage;
}
@@ -144,6 +150,7 @@
int32_t status = 0;
int lsbWeight = HAL_GetAnalogLSBWeight(m_port, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
return lsbWeight;
}
@@ -159,6 +166,7 @@
int32_t status = 0;
int offset = HAL_GetAnalogOffset(m_port, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
return offset;
}
@@ -188,6 +196,7 @@
int32_t status = 0;
HAL_SetAnalogAverageBits(m_port, bits, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
}
/**
@@ -202,6 +211,7 @@
int32_t status = 0;
int averageBits = HAL_GetAnalogAverageBits(m_port, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
return averageBits;
}
@@ -220,6 +230,7 @@
int32_t status = 0;
HAL_SetAnalogOversampleBits(m_port, bits, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
}
/**
@@ -236,6 +247,7 @@
int32_t status = 0;
int oversampleBits = HAL_GetAnalogOversampleBits(m_port, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
return oversampleBits;
}
@@ -251,6 +263,7 @@
int32_t status = 0;
HAL_SetAnalogSampleRate(samplesPerSecond, &status);
wpi_setGlobalErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
}
/**
@@ -262,5 +275,6 @@
int32_t status = 0;
double sampleRate = HAL_GetAnalogSampleRate(&status);
wpi_setGlobalErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
return sampleRate;
}
diff --git a/frc971/wpilib/ahal/AnalogTrigger.cc b/frc971/wpilib/ahal/AnalogTrigger.cc
index 825a655..bd63189 100644
--- a/frc971/wpilib/ahal/AnalogTrigger.cc
+++ b/frc971/wpilib/ahal/AnalogTrigger.cc
@@ -32,6 +32,7 @@
if (status != 0) {
wpi_setHALError(status);
m_trigger = HAL_kInvalidHandle;
+ HAL_CHECK_STATUS(status);
return;
}
int index = GetIndex();
@@ -46,6 +47,7 @@
if (status != 0) {
wpi_setHALError(status);
m_trigger = HAL_kInvalidHandle;
+ HAL_CHECK_STATUS(status);
return;
}
int index = GetIndex();
@@ -56,6 +58,7 @@
AnalogTrigger::~AnalogTrigger() {
int32_t status = 0;
HAL_CleanAnalogTrigger(m_trigger, &status);
+ HAL_CHECK_STATUS(status);
if (m_ownsAnalog) {
delete m_analogInput;
@@ -83,6 +86,7 @@
int32_t status = 0;
HAL_SetAnalogTriggerLimitsVoltage(m_trigger, lower, upper, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void AnalogTrigger::SetLimitsDutyCycle(double lower, double upper) {
@@ -90,6 +94,7 @@
int32_t status = 0;
HAL_SetAnalogTriggerLimitsDutyCycle(m_trigger, lower, upper, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void AnalogTrigger::SetLimitsRaw(int lower, int upper) {
@@ -97,6 +102,7 @@
int32_t status = 0;
HAL_SetAnalogTriggerLimitsRaw(m_trigger, lower, upper, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void AnalogTrigger::SetAveraged(bool useAveragedValue) {
@@ -104,6 +110,7 @@
int32_t status = 0;
HAL_SetAnalogTriggerAveraged(m_trigger, useAveragedValue, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void AnalogTrigger::SetFiltered(bool useFilteredValue) {
@@ -111,6 +118,7 @@
int32_t status = 0;
HAL_SetAnalogTriggerFiltered(m_trigger, useFilteredValue, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
int AnalogTrigger::GetIndex() const {
@@ -118,6 +126,7 @@
int32_t status = 0;
auto ret = HAL_GetAnalogTriggerFPGAIndex(m_trigger, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
return ret;
}
@@ -126,6 +135,7 @@
int32_t status = 0;
bool result = HAL_GetAnalogTriggerInWindow(m_trigger, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
return result;
}
@@ -134,6 +144,7 @@
int32_t status = 0;
bool result = HAL_GetAnalogTriggerTriggerState(m_trigger, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
return result;
}
diff --git a/frc971/wpilib/ahal/Counter.cc b/frc971/wpilib/ahal/Counter.cc
index 81e2c61..8e91c82 100644
--- a/frc971/wpilib/ahal/Counter.cc
+++ b/frc971/wpilib/ahal/Counter.cc
@@ -19,6 +19,7 @@
int32_t status = 0;
m_counter = HAL_InitializeCounter((HAL_Counter_Mode)mode, &m_index, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
SetMaxPeriod(0.5);
@@ -77,6 +78,7 @@
}
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
SetDownSourceEdge(inverted, true);
}
@@ -86,6 +88,7 @@
int32_t status = 0;
HAL_FreeCounter(m_counter, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void Counter::SetUpSource(int channel) {
@@ -119,6 +122,7 @@
m_counter, source->GetPortHandleForRouting(),
(HAL_AnalogTriggerType)source->GetAnalogTriggerTypeForRouting(), &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void Counter::SetUpSource(DigitalSource& source) {
@@ -136,6 +140,7 @@
int32_t status = 0;
HAL_SetCounterUpSourceEdge(m_counter, risingEdge, fallingEdge, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void Counter::ClearUpSource() {
@@ -144,6 +149,7 @@
int32_t status = 0;
HAL_ClearCounterUpSource(m_counter, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void Counter::SetDownSource(int channel) {
@@ -182,6 +188,7 @@
m_counter, source->GetPortHandleForRouting(),
(HAL_AnalogTriggerType)source->GetAnalogTriggerTypeForRouting(), &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void Counter::SetDownSourceEdge(bool risingEdge, bool fallingEdge) {
@@ -194,6 +201,7 @@
int32_t status = 0;
HAL_SetCounterDownSourceEdge(m_counter, risingEdge, fallingEdge, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void Counter::ClearDownSource() {
@@ -202,6 +210,7 @@
int32_t status = 0;
HAL_ClearCounterDownSource(m_counter, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void Counter::SetUpDownCounterMode() {
@@ -209,6 +218,7 @@
int32_t status = 0;
HAL_SetCounterUpDownMode(m_counter, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void Counter::SetExternalDirectionMode() {
@@ -216,6 +226,7 @@
int32_t status = 0;
HAL_SetCounterExternalDirectionMode(m_counter, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void Counter::SetSemiPeriodMode(bool highSemiPeriod) {
@@ -223,6 +234,7 @@
int32_t status = 0;
HAL_SetCounterSemiPeriodMode(m_counter, highSemiPeriod, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void Counter::SetPulseLengthMode(double threshold) {
@@ -230,6 +242,7 @@
int32_t status = 0;
HAL_SetCounterPulseLengthMode(m_counter, threshold, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void Counter::SetReverseDirection(bool reverseDirection) {
@@ -237,6 +250,7 @@
int32_t status = 0;
HAL_SetCounterReverseDirection(m_counter, reverseDirection, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void Counter::SetSamplesToAverage(int samplesToAverage) {
@@ -248,12 +262,14 @@
int32_t status = 0;
HAL_SetCounterSamplesToAverage(m_counter, samplesToAverage, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
int Counter::GetSamplesToAverage() const {
int32_t status = 0;
int samples = HAL_GetCounterSamplesToAverage(m_counter, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
return samples;
}
@@ -264,6 +280,7 @@
int32_t status = 0;
int value = HAL_GetCounter(m_counter, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
return value;
}
@@ -272,6 +289,7 @@
int32_t status = 0;
HAL_ResetCounter(m_counter, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
double Counter::GetPeriod() const {
@@ -279,6 +297,7 @@
int32_t status = 0;
double value = HAL_GetCounterPeriod(m_counter, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
return value;
}
@@ -287,6 +306,7 @@
int32_t status = 0;
HAL_SetCounterMaxPeriod(m_counter, maxPeriod, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
void Counter::SetUpdateWhenEmpty(bool enabled) {
@@ -294,6 +314,7 @@
int32_t status = 0;
HAL_SetCounterUpdateWhenEmpty(m_counter, enabled, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
}
bool Counter::GetStopped() const {
@@ -301,6 +322,7 @@
int32_t status = 0;
bool value = HAL_GetCounterStopped(m_counter, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
return value;
}
@@ -309,5 +331,6 @@
int32_t status = 0;
bool value = HAL_GetCounterDirection(m_counter, &status);
wpi_setHALError(status);
+ HAL_CHECK_STATUS(status);
return value;
}
diff --git a/frc971/wpilib/ahal/DigitalInput.cc b/frc971/wpilib/ahal/DigitalInput.cc
index 3e07208..d922cae 100644
--- a/frc971/wpilib/ahal/DigitalInput.cc
+++ b/frc971/wpilib/ahal/DigitalInput.cc
@@ -43,6 +43,7 @@
channel, HAL_GetErrorMessage(status));
m_handle = HAL_kInvalidHandle;
m_channel = std::numeric_limits<int>::max();
+ HAL_CHECK_STATUS(status) << ": Channel " << channel;
return;
}
@@ -72,6 +73,7 @@
int32_t status = 0;
bool value = HAL_GetDIO(m_handle, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
return value;
}
diff --git a/frc971/wpilib/ahal/DigitalOutput.cc b/frc971/wpilib/ahal/DigitalOutput.cc
index cc1f3d2..ac00df3 100644
--- a/frc971/wpilib/ahal/DigitalOutput.cc
+++ b/frc971/wpilib/ahal/DigitalOutput.cc
@@ -43,6 +43,7 @@
if (status != 0) {
wpi_setErrorWithContextRange(status, 0, HAL_GetNumDigitalChannels(),
channel, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
m_channel = std::numeric_limits<int>::max();
m_handle = HAL_kInvalidHandle;
return;
@@ -75,6 +76,7 @@
int32_t status = 0;
HAL_SetDIO(m_handle, value, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
}
/**
@@ -88,6 +90,7 @@
int32_t status = 0;
bool val = HAL_GetDIO(m_handle, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
return val;
}
@@ -110,6 +113,7 @@
int32_t status = 0;
HAL_Pulse(m_handle, length, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
}
/**
@@ -123,6 +127,7 @@
int32_t status = 0;
bool value = HAL_IsPulsing(m_handle, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
return value;
}
@@ -142,6 +147,7 @@
int32_t status = 0;
HAL_SetDigitalPWMRate(rate, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+ HAL_CHECK_STATUS(status);
}
/**
@@ -173,6 +179,8 @@
if (StatusIsFatal()) return;
HAL_SetDigitalPWMOutputChannel(m_pwmGenerator, m_channel, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+
+ HAL_CHECK_STATUS(status);
}
/**
@@ -194,6 +202,8 @@
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
m_pwmGenerator = HAL_kInvalidHandle;
+
+ HAL_CHECK_STATUS(status);
}
/**
@@ -210,6 +220,8 @@
int32_t status = 0;
HAL_SetDigitalPWMDutyCycle(m_pwmGenerator, dutyCycle, &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+
+ HAL_CHECK_STATUS(status);
}
/**
diff --git a/frc971/wpilib/ahal/Encoder.cc b/frc971/wpilib/ahal/Encoder.cc
index b452720..417792d 100644
--- a/frc971/wpilib/ahal/Encoder.cc
+++ b/frc971/wpilib/ahal/Encoder.cc
@@ -9,11 +9,10 @@
#include "hal/HAL.h"
#include "frc971/wpilib/ahal/DigitalInput.h"
+#include "frc971/wpilib/ahal/WPIErrors.h"
using namespace frc;
-#define HAL_FATAL_WITH_STATUS(status)
-
/**
* Common initialization code for Encoders.
*
@@ -40,7 +39,7 @@
m_bSource->GetPortHandleForRouting(),
(HAL_AnalogTriggerType)m_bSource->GetAnalogTriggerTypeForRouting(),
reverseDirection, (HAL_EncoderEncodingType)encodingType, &status);
- HAL_FATAL_WITH_STATUS(status);
+ HAL_CHECK_STATUS(status);
HAL_Report(HALUsageReporting::kResourceType_Encoder, GetFPGAIndex(),
encodingType);
@@ -84,7 +83,7 @@
Encoder::~Encoder() {
int32_t status = 0;
HAL_FreeEncoder(m_encoder, &status);
- HAL_FATAL_WITH_STATUS(status);
+ HAL_CHECK_STATUS(status);
}
/**
@@ -110,7 +109,7 @@
int Encoder::GetRaw() const {
int32_t status = 0;
int value = HAL_GetEncoderRaw(m_encoder, &status);
- HAL_FATAL_WITH_STATUS(status);
+ HAL_CHECK_STATUS(status);
return value;
}
@@ -129,7 +128,7 @@
double Encoder::GetPeriod() const {
int32_t status = 0;
double value = HAL_GetEncoderPeriod(m_encoder, &status);
- HAL_FATAL_WITH_STATUS(status);
+ HAL_CHECK_STATUS(status);
return value;
}
/**
@@ -151,12 +150,12 @@
void Encoder::SetMaxPeriod(double maxPeriod) {
int32_t status = 0;
HAL_SetEncoderMaxPeriod(m_encoder, maxPeriod, &status);
- HAL_FATAL_WITH_STATUS(status);
+ HAL_CHECK_STATUS(status);
}
int Encoder::GetFPGAIndex() const {
int32_t status = 0;
int val = HAL_GetEncoderFPGAIndex(m_encoder, &status);
- HAL_FATAL_WITH_STATUS(status);
+ HAL_CHECK_STATUS(status);
return val;
}
diff --git a/frc971/wpilib/ahal/PWM.cc b/frc971/wpilib/ahal/PWM.cc
index 31b9863..7184643 100644
--- a/frc971/wpilib/ahal/PWM.cc
+++ b/frc971/wpilib/ahal/PWM.cc
@@ -17,8 +17,6 @@
using namespace frc;
-#define HAL_FATAL_ERROR()
-
/**
* Allocate a PWM given a channel number.
*
@@ -42,7 +40,7 @@
// wpi_setErrorWithContextRange(status, 0, HAL_GetNumPWMChannels(),
// channel,
// HAL_GetErrorMessage(status));
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status) << ": Channel " << channel;
m_channel = std::numeric_limits<int>::max();
m_handle = HAL_kInvalidHandle;
return;
@@ -51,10 +49,10 @@
m_channel = channel;
HAL_SetPWMDisabled(m_handle, &status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status) << ": Channel " << channel;
status = 0;
HAL_SetPWMEliminateDeadband(m_handle, false, &status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status) << ": Channel " << channel;
HAL_Report(HALUsageReporting::kResourceType_PWM, channel);
}
@@ -68,10 +66,10 @@
int32_t status = 0;
HAL_SetPWMDisabled(m_handle, &status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
HAL_FreePWMPort(m_handle, &status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
}
/**
@@ -85,7 +83,7 @@
void PWM::EnableDeadbandElimination(bool eliminateDeadband) {
int32_t status = 0;
HAL_SetPWMEliminateDeadband(m_handle, eliminateDeadband, &status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
}
/**
@@ -106,7 +104,7 @@
int32_t status = 0;
HAL_SetPWMConfig(m_handle, max, deadbandMax, center, deadbandMin, min,
&status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
}
/**
@@ -127,7 +125,7 @@
int32_t status = 0;
HAL_SetPWMConfigRaw(m_handle, max, deadbandMax, center, deadbandMin, min,
&status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
}
/**
@@ -148,7 +146,7 @@
int32_t status = 0;
HAL_GetPWMConfigRaw(m_handle, max, deadbandMax, center, deadbandMin, min,
&status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
}
/**
@@ -164,7 +162,7 @@
void PWM::SetPosition(double pos) {
int32_t status = 0;
HAL_SetPWMPosition(m_handle, pos, &status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
}
/**
@@ -180,7 +178,7 @@
double PWM::GetPosition() const {
int32_t status = 0;
double position = HAL_GetPWMPosition(m_handle, &status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
return position;
}
@@ -200,7 +198,7 @@
void PWM::SetSpeed(double speed) {
int32_t status = 0;
HAL_SetPWMSpeed(m_handle, speed, &status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
}
/**
@@ -218,7 +216,7 @@
double PWM::GetSpeed() const {
int32_t status = 0;
double speed = HAL_GetPWMSpeed(m_handle, &status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
return speed;
}
@@ -232,7 +230,7 @@
void PWM::SetRaw(uint16_t value) {
int32_t status = 0;
HAL_SetPWMRaw(m_handle, value, &status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
}
/**
@@ -245,7 +243,7 @@
uint16_t PWM::GetRaw() const {
int32_t status = 0;
uint16_t value = HAL_GetPWMRaw(m_handle, &status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
return value;
}
@@ -274,7 +272,7 @@
LOG(FATAL) << "Invalid multiplier " << mult;
}
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
}
/**
@@ -285,12 +283,12 @@
int32_t status = 0;
HAL_SetPWMDisabled(m_handle, &status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
}
void PWM::SetZeroLatch() {
int32_t status = 0;
HAL_LatchPWMZero(m_handle, &status);
- HAL_FATAL_ERROR();
+ HAL_CHECK_STATUS(status);
}
diff --git a/frc971/wpilib/ahal/WPIErrors.h b/frc971/wpilib/ahal/WPIErrors.h
index 482240c..601e65a 100644
--- a/frc971/wpilib/ahal/WPIErrors.h
+++ b/frc971/wpilib/ahal/WPIErrors.h
@@ -9,6 +9,8 @@
#include <cstdint>
+#include "glog/logging.h"
+
#ifdef WPI_ERRORS_DEFINE_STRINGS
#define S(label, offset, message) \
const char *wpi_error_s_##label = message; \
@@ -19,6 +21,9 @@
const int wpi_error_value_##label = offset
#endif
+#define HAL_CHECK_STATUS(status) \
+ CHECK(status == 0) << HAL_GetLastError(&(status))
+
/*
* Fatal errors
*/