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
  */