Merge commit '4ee017201227ce16a4edef20912b357e8f303483' into master

Update WPILib for the 2022 beta test.  This now actually runs on my RIO
2.0!

Change-Id: I6d335f61c6abe50facca76f4f5014537e742f1ac
Signed-off-by: Austin Schuh <austin.linux@gmail.com>
diff --git a/frc971/config/setup_roborio.sh b/frc971/config/setup_roborio.sh
index 0a70e27..f00212f 100755
--- a/frc971/config/setup_roborio.sh
+++ b/frc971/config/setup_roborio.sh
@@ -37,19 +37,11 @@
   ssh "admin@${ROBOT_HOSTNAME}" 'echo "export PATH=\"\${PATH}:/home/admin/robot_code:/home/admin/bin\"" >> /etc/profile'
 fi
 
-if [[ "$(ssh admin@${ROBOT_HOSTNAME} uname -r)" != "4.14.87-rt49-cg-7.0.0f0-xilinx-zynq-189" ]]; then
-  echo "Target roboRIO has the wrong kernel"
-  exit 1
-fi
-
 ssh "admin@${ROBOT_HOSTNAME}" "sed -i 's/vm\.overcommit_memory=2/vm\.overcommit_memory=0/' /etc/sysctl.conf"
 
 ssh "admin@${ROBOT_HOSTNAME}" 'echo "vm.min_free_kbytes=4000" >> /etc/sysctl.conf'
 
-ssh "admin@${ROBOT_HOSTNAME}" mkdir "/lib/modules/4.14.87-rt49-cg-7.0.0f0-xilinx-zynq-189/kernel/net/sctp/ -p"
-scp frc971/config/sctp.ko "admin@${ROBOT_HOSTNAME}:/lib/modules/4.14.87-rt49-cg-7.0.0f0-xilinx-zynq-189/kernel/net/sctp/sctp.ko"
-ssh "admin@${ROBOT_HOSTNAME}" depmod
-ssh "admin@${ROBOT_HOSTNAME}" sed -i -e 's/^StartupDLLs/;StartupDLLs/' /etc/natinst/share/ni-rt.ini
+ssh "admin@${ROBOT_HOSTNAME}" 'sed -i -e "s/^StartupDLLs/;StartupDLLs/" /etc/natinst/share/ni-rt.ini'
 
 # This fails if the code isn't running.
 ssh "admin@${ROBOT_HOSTNAME}" 'PATH="${PATH}":/usr/local/natinst/bin/ /usr/local/frc/bin/frcKillRobot.sh -r -t' || true
diff --git a/frc971/wpilib/ahal/AnalogInput.cc b/frc971/wpilib/ahal/AnalogInput.cc
index 1694708..8d814ad 100644
--- a/frc971/wpilib/ahal/AnalogInput.cc
+++ b/frc971/wpilib/ahal/AnalogInput.cc
@@ -35,7 +35,7 @@
 
   HAL_PortHandle port = HAL_GetPort(channel);
   int32_t status = 0;
-  m_port = HAL_InitializeAnalogInputPort(port, &status);
+  m_port = HAL_InitializeAnalogInputPort(port, nullptr, &status);
   if (status != 0) {
     wpi_setErrorWithContextRange(status, 0, HAL_GetNumAnalogInputs(), channel,
                                  HAL_GetErrorMessage(status));
diff --git a/frc971/wpilib/ahal/BUILD b/frc971/wpilib/ahal/BUILD
index 510a072..1d02b30 100644
--- a/frc971/wpilib/ahal/BUILD
+++ b/frc971/wpilib/ahal/BUILD
@@ -21,5 +21,6 @@
         "//aos:realtime",
         "//aos/logging",
         "//third_party:wpilib_hal",
+        "@com_google_absl//absl/types:span",
     ],
 )
diff --git a/frc971/wpilib/ahal/Compressor.cc b/frc971/wpilib/ahal/Compressor.cc
index 4a17f76..ba04e52 100644
--- a/frc971/wpilib/ahal/Compressor.cc
+++ b/frc971/wpilib/ahal/Compressor.cc
@@ -6,12 +6,11 @@
 /*----------------------------------------------------------------------------*/
 
 #include "frc971/wpilib/ahal/Compressor.h"
-#include "hal/Compressor.h"
 
+#include "frc971/wpilib/ahal/WPIErrors.h"
+#include "hal/CTREPCM.h"
 #include "hal/HAL.h"
 #include "hal/Ports.h"
-#include "hal/Solenoid.h"
-#include "frc971/wpilib/ahal/WPIErrors.h"
 
 using namespace frc;
 
@@ -22,7 +21,7 @@
  */
 Compressor::Compressor(int pcmID) : m_module(pcmID) {
   int32_t status = 0;
-  m_compressorHandle = HAL_InitializeCompressor(m_module, &status);
+  m_compressorHandle = HAL_InitializeCTREPCM(m_module, nullptr, &status);
   if (status != 0) {
     wpi_setErrorWithContextRange(status, 0, HAL_GetNumPCMModules(), pcmID,
                                  HAL_GetErrorMessage(status));
@@ -59,7 +58,7 @@
   int32_t status = 0;
   bool value;
 
-  value = HAL_GetCompressor(m_compressorHandle, &status);
+  value = HAL_GetCTREPCMCompressor(m_compressorHandle, &status);
 
   if (status) {
     wpi_setWPIError(Timeout);
@@ -78,7 +77,7 @@
   int32_t status = 0;
   bool value;
 
-  value = HAL_GetCompressorPressureSwitch(m_compressorHandle, &status);
+  value = HAL_GetCTREPCMPressureSwitch(m_compressorHandle, &status);
 
   if (status) {
     wpi_setWPIError(Timeout);
@@ -97,7 +96,7 @@
   int32_t status = 0;
   double value;
 
-  value = HAL_GetCompressorCurrent(m_compressorHandle, &status);
+  value = HAL_GetCTREPCMCompressorCurrent(m_compressorHandle, &status);
 
   if (status) {
     wpi_setWPIError(Timeout);
@@ -117,7 +116,7 @@
   if (StatusIsFatal()) return;
   int32_t status = 0;
 
-  HAL_SetCompressorClosedLoopControl(m_compressorHandle, on, &status);
+  HAL_SetCTREPCMClosedLoopControl(m_compressorHandle, on, &status);
 
   if (status) {
     wpi_setWPIError(Timeout);
@@ -136,7 +135,7 @@
   int32_t status = 0;
   bool value;
 
-  value = HAL_GetCompressorClosedLoopControl(m_compressorHandle, &status);
+  value = HAL_GetCTREPCMClosedLoopControl(m_compressorHandle, &status);
 
   if (status) {
     wpi_setWPIError(Timeout);
@@ -156,7 +155,7 @@
   int32_t status = 0;
   bool value;
 
-  value = HAL_GetCompressorCurrentTooHighFault(m_compressorHandle, &status);
+  value = HAL_GetCTREPCMCompressorCurrentTooHighFault(m_compressorHandle, &status);
 
   if (status) {
     wpi_setWPIError(Timeout);
@@ -181,7 +180,7 @@
   bool value;
 
   value =
-      HAL_GetCompressorCurrentTooHighStickyFault(m_compressorHandle, &status);
+      HAL_GetCTREPCMCompressorCurrentTooHighStickyFault(m_compressorHandle, &status);
 
   if (status) {
     wpi_setWPIError(Timeout);
@@ -205,7 +204,7 @@
   int32_t status = 0;
   bool value;
 
-  value = HAL_GetCompressorShortedStickyFault(m_compressorHandle, &status);
+  value = HAL_GetCTREPCMCompressorShortedStickyFault(m_compressorHandle, &status);
 
   if (status) {
     wpi_setWPIError(Timeout);
@@ -225,7 +224,7 @@
   int32_t status = 0;
   bool value;
 
-  value = HAL_GetCompressorShortedFault(m_compressorHandle, &status);
+  value = HAL_GetCTREPCMCompressorShortedFault(m_compressorHandle, &status);
 
   if (status) {
     wpi_setWPIError(Timeout);
@@ -248,7 +247,7 @@
   int32_t status = 0;
   bool value;
 
-  value = HAL_GetCompressorNotConnectedStickyFault(m_compressorHandle, &status);
+  value = HAL_GetCTREPCMCompressorNotConnectedStickyFault(m_compressorHandle, &status);
 
   if (status) {
     wpi_setWPIError(Timeout);
@@ -268,7 +267,7 @@
   int32_t status = 0;
   bool value;
 
-  value = HAL_GetCompressorNotConnectedFault(m_compressorHandle, &status);
+  value = HAL_GetCTREPCMCompressorNotConnectedFault(m_compressorHandle, &status);
 
   if (status) {
     wpi_setWPIError(Timeout);
@@ -291,7 +290,7 @@
   if (StatusIsFatal()) return;
   int32_t status = 0;
 
-  HAL_ClearAllPCMStickyFaults(m_module, &status);
+  HAL_ClearAllCTREPCMStickyFaults(m_module, &status);
 
   if (status) {
     wpi_setWPIError(Timeout);
diff --git a/frc971/wpilib/ahal/DigitalGlitchFilter.cc b/frc971/wpilib/ahal/DigitalGlitchFilter.cc
index cddfcf0..83e6201 100644
--- a/frc971/wpilib/ahal/DigitalGlitchFilter.cc
+++ b/frc971/wpilib/ahal/DigitalGlitchFilter.cc
@@ -10,13 +10,13 @@
 #include <algorithm>
 #include <array>
 
+#include "frc971/wpilib/ahal/Counter.h"
+#include "frc971/wpilib/ahal/Encoder.h"
+#include "frc971/wpilib/ahal/WPIErrors.h"
+#include "glog/logging.h"
 #include "hal/Constants.h"
 #include "hal/DIO.h"
 #include "hal/HAL.h"
-#include "frc971/wpilib/ahal/Counter.h"
-#include "frc971/wpilib/ahal/Encoder.h"
-#include "frc971/wpilib/ahal/Utility.h"
-#include "frc971/wpilib/ahal/WPIErrors.h"
 
 using namespace frc;
 
@@ -26,7 +26,7 @@
 DigitalGlitchFilter::DigitalGlitchFilter() {
   auto index =
       std::find(m_filterAllocated.begin(), m_filterAllocated.end(), false);
-  wpi_assert(index != m_filterAllocated.end());
+  CHECK_NE(index, m_filterAllocated.end());
 
   m_channelIndex = std::distance(m_filterAllocated.begin(), index);
   *index = true;
@@ -67,7 +67,7 @@
     // Validate that we set it correctly.
     int actual_index =
         HAL_GetFilterSelect(input->GetPortHandleForRouting(), &status);
-    wpi_assertEqual(actual_index, requested_index);
+    CHECK_EQ(actual_index, requested_index);
 
     HAL_Report(HALUsageReporting::kResourceType_DigitalInput,
                input->GetChannel());
diff --git a/frc971/wpilib/ahal/DigitalInput.cc b/frc971/wpilib/ahal/DigitalInput.cc
index e0121ea..3e07208 100644
--- a/frc971/wpilib/ahal/DigitalInput.cc
+++ b/frc971/wpilib/ahal/DigitalInput.cc
@@ -36,7 +36,8 @@
   m_channel = channel;
 
   int32_t status = 0;
-  m_handle = HAL_InitializeDIOPort(HAL_GetPort(channel), true, &status);
+  m_handle =
+      HAL_InitializeDIOPort(HAL_GetPort(channel), true, nullptr, &status);
   if (status != 0) {
     wpi_setErrorWithContextRange(status, 0, HAL_GetNumDigitalChannels(),
                                  channel, HAL_GetErrorMessage(status));
@@ -54,9 +55,7 @@
 DigitalInput::~DigitalInput() {
   if (StatusIsFatal()) return;
   if (m_interrupt != HAL_kInvalidHandle) {
-    int32_t status = 0;
-    HAL_CleanInterrupts(m_interrupt, &status);
-    // ignore status, as an invalid handle just needs to be ignored.
+    HAL_CleanInterrupts(m_interrupt);
     m_interrupt = HAL_kInvalidHandle;
   }
 
diff --git a/frc971/wpilib/ahal/DigitalOutput.cc b/frc971/wpilib/ahal/DigitalOutput.cc
index f4b2781..cc1f3d2 100644
--- a/frc971/wpilib/ahal/DigitalOutput.cc
+++ b/frc971/wpilib/ahal/DigitalOutput.cc
@@ -38,7 +38,8 @@
   m_channel = channel;
 
   int32_t status = 0;
-  m_handle = HAL_InitializeDIOPort(HAL_GetPort(channel), false, &status);
+  m_handle =
+      HAL_InitializeDIOPort(HAL_GetPort(channel), false, nullptr, &status);
   if (status != 0) {
     wpi_setErrorWithContextRange(status, 0, HAL_GetNumDigitalChannels(),
                                  channel, HAL_GetErrorMessage(status));
diff --git a/frc971/wpilib/ahal/DriverStation.cc b/frc971/wpilib/ahal/DriverStation.cc
index 9ea1f7a..2ed0a97 100644
--- a/frc971/wpilib/ahal/DriverStation.cc
+++ b/frc971/wpilib/ahal/DriverStation.cc
@@ -9,10 +9,11 @@
 
 #include <chrono>
 #include <memory>
+#include <string_view>
+#include <functional>
 
 #include "FRC_NetworkCommunication/FRCComm.h"
 #include "frc971/wpilib/ahal/AnalogInput.h"
-#include "frc971/wpilib/ahal/Utility.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
 #include "hal/HAL.h"
 #include "hal/Power.h"
@@ -43,10 +44,8 @@
  *
  * The error is also printed to the program console.
  */
-void DriverStation::ReportError(const wpi::Twine &error) {
-  wpi::SmallString<128> temp;
-  HAL_SendError(1, 1, 0, error.toNullTerminatedStringRef(temp).data(), "", "",
-                1);
+void DriverStation::ReportError(const std::string_view &error) {
+  HAL_SendError(1, 1, 0, std::string(error).c_str(), "", "", 1);
 }
 
 /**
@@ -54,10 +53,8 @@
  *
  * The warning is also printed to the program console.
  */
-void DriverStation::ReportWarning(const wpi::Twine &error) {
-  wpi::SmallString<128> temp;
-  HAL_SendError(0, 1, 0, error.toNullTerminatedStringRef(temp).data(), "", "",
-                1);
+void DriverStation::ReportWarning(const std::string_view &error) {
+  HAL_SendError(0, 1, 0, std::string(error).c_str(), "", "", 1);
 }
 
 /**
@@ -66,16 +63,11 @@
  * The error is also printed to the program console.
  */
 void DriverStation::ReportError(bool is_error, int32_t code,
-                                const wpi::Twine &error,
-                                const wpi::Twine &location,
-                                const wpi::Twine &stack) {
-  wpi::SmallString<128> errorTemp;
-  wpi::SmallString<128> locationTemp;
-  wpi::SmallString<128> stackTemp;
-  HAL_SendError(is_error, code, 0,
-                error.toNullTerminatedStringRef(errorTemp).data(),
-                location.toNullTerminatedStringRef(locationTemp).data(),
-                stack.toNullTerminatedStringRef(stackTemp).data(), 1);
+                                const std::string_view &error,
+                                const std::string_view &location,
+                                const std::string_view &stack) {
+  HAL_SendError(is_error, code, 0, std::string(error).c_str(),
+                std::string(location).c_str(), std::string(stack).c_str(), 1);
 }
 
 /**
diff --git a/frc971/wpilib/ahal/DriverStation.h b/frc971/wpilib/ahal/DriverStation.h
index 2fbac9c..5150360 100644
--- a/frc971/wpilib/ahal/DriverStation.h
+++ b/frc971/wpilib/ahal/DriverStation.h
@@ -10,12 +10,13 @@
 #include <atomic>
 // #include <condition_variable>
 #include <memory>
+#include <functional>
 #include <string>
+#include <string_view>
 #include <thread>
 
 #include "hal/DriverStation.h"
 #include "frc971/wpilib/ahal/SensorBase.h"
-#include "wpi/Twine.h"
 
 namespace frc {
 
@@ -29,10 +30,10 @@
 
   virtual ~DriverStation();
   static DriverStation &GetInstance();
-  static void ReportError(const wpi::Twine &error);
-  static void ReportWarning(const wpi::Twine &error);
-  static void ReportError(bool is_error, int code, const wpi::Twine &error,
-                          const wpi::Twine &location, const wpi::Twine &stack);
+  static void ReportError(const std::string_view &error);
+  static void ReportWarning(const std::string_view &error);
+  static void ReportError(bool is_error, int code, const std::string_view &error,
+                          const std::string_view &location, const std::string_view &stack);
 
   static const int kJoystickPorts = 6;
 
diff --git a/frc971/wpilib/ahal/ErrorBase.h b/frc971/wpilib/ahal/ErrorBase.h
index c92ca52..f0dfe3e 100644
--- a/frc971/wpilib/ahal/ErrorBase.h
+++ b/frc971/wpilib/ahal/ErrorBase.h
@@ -9,8 +9,6 @@
 
 #include <vector>
 
-#include <wpi/StringRef.h>
-#include <wpi/Twine.h>
 #include <wpi/mutex.h>
 
 // Forward declared manually to avoid needing to pull in entire HAL header.
diff --git a/frc971/wpilib/ahal/InterruptableSensorBase.cc b/frc971/wpilib/ahal/InterruptableSensorBase.cc
index d17f2dd..59eb962 100644
--- a/frc971/wpilib/ahal/InterruptableSensorBase.cc
+++ b/frc971/wpilib/ahal/InterruptableSensorBase.cc
@@ -7,9 +7,9 @@
 
 #include "frc971/wpilib/ahal/InterruptableSensorBase.h"
 
-#include "hal/HAL.h"
-#include "frc971/wpilib/ahal/Utility.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
+#include "glog/logging.h"
+#include "hal/HAL.h"
 
 using namespace frc;
 
@@ -18,8 +18,8 @@
 void InterruptableSensorBase::RequestInterrupts() {
   if (StatusIsFatal()) return;
 
-  wpi_assert(m_interrupt == HAL_kInvalidHandle);
-  AllocateInterrupts(true);
+  CHECK_EQ(m_interrupt, HAL_kInvalidHandle);
+  AllocateInterrupts();
   if (StatusIsFatal()) return;  // if allocate failed, out of interrupts
 
   int32_t status = 0;
@@ -31,19 +31,18 @@
   SetUpSourceEdge(true, false);
 }
 
-void InterruptableSensorBase::AllocateInterrupts(bool watcher) {
-  wpi_assert(m_interrupt == HAL_kInvalidHandle);
+void InterruptableSensorBase::AllocateInterrupts() {
+  CHECK_EQ(m_interrupt, HAL_kInvalidHandle);
   // Expects the calling leaf class to allocate an interrupt index.
   int32_t status = 0;
-  m_interrupt = HAL_InitializeInterrupts(watcher, &status);
+  m_interrupt = HAL_InitializeInterrupts(&status);
   wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
 }
 
 void InterruptableSensorBase::CancelInterrupts() {
   if (StatusIsFatal()) return;
-  wpi_assert(m_interrupt != HAL_kInvalidHandle);
-  int32_t status = 0;
-  HAL_CleanInterrupts(m_interrupt, &status);
+  CHECK_NE(m_interrupt, HAL_kInvalidHandle);
+  HAL_CleanInterrupts(m_interrupt);
   // ignore status, as an invalid handle just needs to be ignored.
   m_interrupt = HAL_kInvalidHandle;
 }
@@ -51,7 +50,7 @@
 InterruptableSensorBase::WaitResult InterruptableSensorBase::WaitForInterrupt(
     double timeout, bool ignorePrevious) {
   if (StatusIsFatal()) return InterruptableSensorBase::kTimeout;
-  wpi_assert(m_interrupt != HAL_kInvalidHandle);
+  CHECK_NE(m_interrupt, HAL_kInvalidHandle);
   int32_t status = 0;
   int result;
 
@@ -67,17 +66,9 @@
   return static_cast<WaitResult>(falling | rising);
 }
 
-void InterruptableSensorBase::EnableInterrupts() {
-  if (StatusIsFatal()) return;
-  wpi_assert(m_interrupt != HAL_kInvalidHandle);
-  int32_t status = 0;
-  HAL_EnableInterrupts(m_interrupt, &status);
-  wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
-}
-
 hal::fpga_clock::time_point InterruptableSensorBase::ReadRisingTimestamp() {
   if (StatusIsFatal()) return hal::fpga_clock::min_time;
-  wpi_assert(m_interrupt != HAL_kInvalidHandle);
+  CHECK_NE(m_interrupt, HAL_kInvalidHandle);
   int32_t status = 0;
   uint64_t timestamp = HAL_ReadInterruptRisingTimestamp(m_interrupt, &status);
   timestamp = HAL_ExpandFPGATime(timestamp, &status);
@@ -87,7 +78,7 @@
 
 hal::fpga_clock::time_point InterruptableSensorBase::ReadFallingTimestamp() {
   if (StatusIsFatal()) return hal::fpga_clock::min_time;
-  wpi_assert(m_interrupt != HAL_kInvalidHandle);
+  CHECK_NE(m_interrupt, HAL_kInvalidHandle);
   int32_t status = 0;
   uint64_t timestamp = HAL_ReadInterruptFallingTimestamp(m_interrupt, &status);
   timestamp = HAL_ExpandFPGATime(timestamp, &status);
diff --git a/frc971/wpilib/ahal/InterruptableSensorBase.h b/frc971/wpilib/ahal/InterruptableSensorBase.h
index 59ddc9e..c52463b 100644
--- a/frc971/wpilib/ahal/InterruptableSensorBase.h
+++ b/frc971/wpilib/ahal/InterruptableSensorBase.h
@@ -46,9 +46,6 @@
   virtual WaitResult WaitForInterrupt(double timeout,
                                       bool ignorePrevious = true);
 
-  // Enables interrupts to occur based on the current configuration.
-  virtual void EnableInterrupts();
-
   // Returns the timestamp for the most recent rising interrupt.
   virtual hal::fpga_clock::time_point ReadRisingTimestamp();
   // Returns the timestamp for the most recent falling interrupt.
@@ -61,7 +58,7 @@
 
  protected:
   HAL_InterruptHandle m_interrupt = HAL_kInvalidHandle;
-  void AllocateInterrupts(bool watcher);
+  void AllocateInterrupts();
 };
 
 }  // namespace frc
diff --git a/frc971/wpilib/ahal/PWM.cc b/frc971/wpilib/ahal/PWM.cc
index 0bf38a3..31b9863 100644
--- a/frc971/wpilib/ahal/PWM.cc
+++ b/frc971/wpilib/ahal/PWM.cc
@@ -10,10 +10,10 @@
 
 #include <sstream>
 
+#include "frc971/wpilib/ahal/WPIErrors.h"
+#include "glog/logging.h"
 #include "hal/HAL.h"
 #include "hal/Ports.h"
-#include "frc971/wpilib/ahal/Utility.h"
-#include "frc971/wpilib/ahal/WPIErrors.h"
 
 using namespace frc;
 
@@ -37,7 +37,7 @@
   }
 
   int32_t status = 0;
-  m_handle = HAL_InitializePWMPort(HAL_GetPort(channel), &status);
+  m_handle = HAL_InitializePWMPort(HAL_GetPort(channel), nullptr, &status);
   if (status != 0) {
     //    wpi_setErrorWithContextRange(status, 0, HAL_GetNumPWMChannels(),
     //    channel,
@@ -271,7 +271,7 @@
       HAL_SetPWMPeriodScale(m_handle, 0, &status);  // Don't squelch any outputs
       break;
     default:
-      wpi_assert(false);
+      LOG(FATAL) << "Invalid multiplier " << mult;
   }
 
   HAL_FATAL_ERROR();
diff --git a/frc971/wpilib/ahal/PowerDistributionPanel.cc b/frc971/wpilib/ahal/PowerDistributionPanel.cc
index 8359cdb..39087fb 100644
--- a/frc971/wpilib/ahal/PowerDistributionPanel.cc
+++ b/frc971/wpilib/ahal/PowerDistributionPanel.cc
@@ -10,7 +10,7 @@
 #include <sstream>
 
 #include "hal/HAL.h"
-#include "hal/PDP.h"
+#include "hal/PowerDistribution.h"
 #include "hal/Ports.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
 
@@ -24,7 +24,9 @@
  */
 PowerDistributionPanel::PowerDistributionPanel(int module) {
   int32_t status = 0;
-  m_handle = HAL_InitializePDP(module, &status);
+  m_handle = HAL_InitializePowerDistribution(
+      module, HAL_PowerDistributionType::HAL_PowerDistributionType_kCTRE,
+      nullptr, &status);
   if (status != 0) {
     return;
   }
@@ -38,7 +40,7 @@
 double PowerDistributionPanel::GetVoltage() const {
   int32_t status = 0;
 
-  double voltage = HAL_GetPDPVoltage(m_handle, &status);
+  double voltage = HAL_GetPowerDistributionVoltage(m_handle, &status);
 
   if (status) {
     WPI_LIB_FATAL_ERROR(Timeout, "");
@@ -55,7 +57,7 @@
 double PowerDistributionPanel::GetTemperature() const {
   int32_t status = 0;
 
-  double temperature = HAL_GetPDPTemperature(m_handle, &status);
+  double temperature = HAL_GetPowerDistributionTemperature(m_handle, &status);
 
   if (status) {
     WPI_LIB_FATAL_ERROR(Timeout, "");
@@ -72,13 +74,16 @@
 double PowerDistributionPanel::GetCurrent(int channel) const {
   int32_t status = 0;
 
-  if (!CheckPDPChannel(channel)) {
+  if (!CheckPDPChannel(
+          channel,
+          HAL_PowerDistributionType::HAL_PowerDistributionType_kCTRE)) {
     std::stringstream buf;
     buf << "PDP Channel " << channel;
     WPI_LIB_FATAL_ERROR(ChannelIndexOutOfRange, buf.str());
   }
 
-  double current = HAL_GetPDPChannelCurrent(m_handle, channel, &status);
+  double current =
+      HAL_GetPowerDistributionChannelCurrent(m_handle, channel, &status);
 
   if (status) {
     WPI_LIB_FATAL_ERROR(Timeout, "");
@@ -95,7 +100,7 @@
 double PowerDistributionPanel::GetTotalCurrent() const {
   int32_t status = 0;
 
-  double current = HAL_GetPDPTotalCurrent(m_handle, &status);
+  double current = HAL_GetPowerDistributionTotalCurrent(m_handle, &status);
 
   if (status) {
     WPI_LIB_FATAL_ERROR(Timeout, "");
@@ -112,7 +117,7 @@
 double PowerDistributionPanel::GetTotalPower() const {
   int32_t status = 0;
 
-  double power = HAL_GetPDPTotalPower(m_handle, &status);
+  double power = HAL_GetPowerDistributionTotalPower(m_handle, &status);
 
   if (status) {
     WPI_LIB_FATAL_ERROR(Timeout, "");
@@ -129,7 +134,7 @@
 double PowerDistributionPanel::GetTotalEnergy() const {
   int32_t status = 0;
 
-  double energy = HAL_GetPDPTotalEnergy(m_handle, &status);
+  double energy = HAL_GetPowerDistributionTotalEnergy(m_handle, &status);
 
   if (status) {
     WPI_LIB_FATAL_ERROR(Timeout, "");
@@ -146,7 +151,7 @@
 void PowerDistributionPanel::ResetTotalEnergy() {
   int32_t status = 0;
 
-  HAL_ResetPDPTotalEnergy(m_handle, &status);
+  HAL_ResetPowerDistributionTotalEnergy(m_handle, &status);
 
   if (status) {
     WPI_LIB_FATAL_ERROR(Timeout, "");
@@ -159,7 +164,7 @@
 void PowerDistributionPanel::ClearStickyFaults() {
   int32_t status = 0;
 
-  HAL_ClearPDPStickyFaults(m_handle, &status);
+  HAL_ClearPowerDistributionStickyFaults(m_handle, &status);
 
   if (status) {
     WPI_LIB_FATAL_ERROR(Timeout, "");
diff --git a/frc971/wpilib/ahal/Relay.cc b/frc971/wpilib/ahal/Relay.cc
index e0cd090..51241be 100644
--- a/frc971/wpilib/ahal/Relay.cc
+++ b/frc971/wpilib/ahal/Relay.cc
@@ -38,7 +38,8 @@
 
   if (m_direction == kBothDirections || m_direction == kForwardOnly) {
     int32_t status = 0;
-    m_forwardHandle = HAL_InitializeRelayPort(portHandle, true, &status);
+    m_forwardHandle =
+        HAL_InitializeRelayPort(portHandle, true, nullptr, &status);
     if (status != 0) {
       wpi_setErrorWithContextRange(status, 0, HAL_GetNumRelayChannels(),
                                    channel, HAL_GetErrorMessage(status));
@@ -50,7 +51,7 @@
   }
   if (m_direction == kBothDirections || m_direction == kReverseOnly) {
     int32_t status = 0;
-    m_reverseHandle = HAL_InitializeRelayPort(portHandle, false, &status);
+    m_reverseHandle = HAL_InitializeRelayPort(portHandle, false, nullptr, &status);
     if (status != 0) {
       wpi_setErrorWithContextRange(status, 0, HAL_GetNumRelayChannels(),
                                    channel, HAL_GetErrorMessage(status));
diff --git a/frc971/wpilib/ahal/RobotBase.cc b/frc971/wpilib/ahal/RobotBase.cc
index 1ce1d4e..3cc39df 100644
--- a/frc971/wpilib/ahal/RobotBase.cc
+++ b/frc971/wpilib/ahal/RobotBase.cc
@@ -11,7 +11,6 @@
 
 #include "hal/HAL.h"
 #include "frc971/wpilib/ahal/DriverStation.h"
-#include "frc971/wpilib/ahal/Utility.h"
 #include "frc971/wpilib/ahal/WPILibVersion.h"
 
 using namespace frc;
diff --git a/frc971/wpilib/ahal/SPI.cc b/frc971/wpilib/ahal/SPI.cc
index 01b1626..d51b20f 100644
--- a/frc971/wpilib/ahal/SPI.cc
+++ b/frc971/wpilib/ahal/SPI.cc
@@ -14,6 +14,7 @@
 #include <wpi/SmallVector.h>
 #include <wpi/mutex.h>
 
+#include "absl/types/span.h"
 #include "frc971/wpilib/ahal/DigitalSource.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
 
@@ -117,7 +118,8 @@
   wpi_setHALError(status);
 }
 
-void SPI::SetAutoTransmitData(wpi::ArrayRef<uint8_t> dataToSend, int zeroSize) {
+void SPI::SetAutoTransmitData(absl::Span<const uint8_t> dataToSend,
+                              int zeroSize) {
   int32_t status = 0;
   HAL_SetSPIAutoTransmitData(m_port, dataToSend.data(), dataToSend.size(),
                              zeroSize, &status);
diff --git a/frc971/wpilib/ahal/SPI.h b/frc971/wpilib/ahal/SPI.h
index 1d439b2..6421535 100644
--- a/frc971/wpilib/ahal/SPI.h
+++ b/frc971/wpilib/ahal/SPI.h
@@ -8,8 +8,9 @@
 #pragma once
 
 #include <hal/SPITypes.h>
-#include <wpi/ArrayRef.h>
 #include <wpi/deprecated.h>
+#include <wpi/span.h>
+#include "absl/types/span.h"
 
 #include <cstdint>
 #include <memory>
@@ -168,7 +169,7 @@
    * @param dataToSend data to send (maximum 16 bytes)
    * @param zeroSize number of zeros to send after the data
    */
-  void SetAutoTransmitData(wpi::ArrayRef<uint8_t> dataToSend, int zeroSize);
+  void SetAutoTransmitData(absl::Span<const uint8_t> dataToSend, int zeroSize);
 
   /**
    * Start running the automatic SPI transfer engine at a periodic rate.
diff --git a/frc971/wpilib/ahal/SensorBase.cc b/frc971/wpilib/ahal/SensorBase.cc
index 0b796f1..111e4c6 100644
--- a/frc971/wpilib/ahal/SensorBase.cc
+++ b/frc971/wpilib/ahal/SensorBase.cc
@@ -8,35 +8,24 @@
 #include "frc971/wpilib/ahal/SensorBase.h"
 
 #include "FRC_NetworkCommunication/LoadOut.h"
+#include "frc971/wpilib/ahal/WPIErrors.h"
 #include "hal/AnalogInput.h"
 #include "hal/AnalogOutput.h"
 #include "hal/DIO.h"
 #include "hal/HAL.h"
-#include "hal/PDP.h"
 #include "hal/PWM.h"
 #include "hal/Ports.h"
+#include "hal/PowerDistribution.h"
 #include "hal/Relay.h"
-#include "hal/Solenoid.h"
-#include "frc971/wpilib/ahal/WPIErrors.h"
 
 namespace frc {
 
 const int kDigitalChannels = HAL_GetNumDigitalChannels();
 const int kAnalogInputs = HAL_GetNumAnalogInputs();
-const int kSolenoidChannels = HAL_GetNumSolenoidChannels();
-const int kSolenoidModules = HAL_GetNumPCMModules();
 const int kPwmChannels = HAL_GetNumPWMChannels();
 const int kRelayChannels = HAL_GetNumRelayHeaders();
-const int kPDPChannels = HAL_GetNumPDPChannels();
-
-/**
- * Check that the solenoid module number is valid.
- *
- * @return Solenoid module is valid and present
- */
-bool CheckSolenoidModule(int moduleNumber) {
-  return HAL_CheckSolenoidModule(moduleNumber);
-}
+const int kCTREPDPChannels = HAL_GetNumCTREPDPChannels();
+const int kREVPDPChannels = HAL_GetNumREVPDHChannels();
 
 /**
  * Check that the digital channel number is valid.
@@ -93,19 +82,12 @@
 }
 
 /**
- * Verify that the solenoid channel number is within limits.
- *
- * @return Solenoid channel is valid
- */
-bool CheckSolenoidChannel(int channel) {
-  return HAL_CheckSolenoidChannel(channel);
-}
-
-/**
  * Verify that the power distribution channel number is within limits.
  *
  * @return PDP channel is valid
  */
-bool CheckPDPChannel(int channel) { return HAL_CheckPDPModule(channel); }
+bool CheckPDPChannel(int channel, HAL_PowerDistributionType type) {
+  return HAL_CheckPowerDistributionModule(channel, type);
+}
 
 }  // namespace frc
diff --git a/frc971/wpilib/ahal/SensorBase.h b/frc971/wpilib/ahal/SensorBase.h
index a4de9cc..39c5130 100644
--- a/frc971/wpilib/ahal/SensorBase.h
+++ b/frc971/wpilib/ahal/SensorBase.h
@@ -10,19 +10,18 @@
 #include <cstdint>
 
 #include "frc971/wpilib/ahal/ErrorBase.h"
+#include "hal/PowerDistribution.h"
 
 namespace frc {
 
 inline int GetDefaultSolenoidModule() { return 0; }
 
-bool CheckSolenoidModule(int moduleNumber);
 bool CheckDigitalChannel(int channel);
 bool CheckRelayChannel(int channel);
 bool CheckPWMChannel(int channel);
 bool CheckAnalogInputChannel(int channel);
 bool CheckAnalogOutputChannel(int channel);
-bool CheckSolenoidChannel(int channel);
-bool CheckPDPChannel(int channel);
+bool CheckPDPChannel(int channel, HAL_PowerDistributionType type);
 
 extern const int kDigitalChannels;
 extern const int kAnalogInputs;
diff --git a/frc971/wpilib/ahal/Utility.cc b/frc971/wpilib/ahal/Utility.cc
index f4b9f38..14ed1c5 100644
--- a/frc971/wpilib/ahal/Utility.cc
+++ b/frc971/wpilib/ahal/Utility.cc
@@ -1,146 +1,10 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) FIRST 2008-2017. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
-
 #include "frc971/wpilib/ahal/Utility.h"
 
-#include <cxxabi.h>
-#include <execinfo.h>
-
-#include <cstdio>
-#include <cstdlib>
-#include <cstring>
-#include <sstream>
-
 #include "frc971/wpilib/ahal/ErrorBase.h"
-#include "hal/DriverStation.h"
 #include "hal/HAL.h"
-#include "wpi/Path.h"
-#include "wpi/SmallString.h"
-#include "wpi/raw_ostream.h"
-
-using namespace frc;
-
-/**
- * Assert implementation.
- * This allows breakpoints to be set on an assert.
- * The users don't call this, but instead use the wpi_assert macros in
- * Utility.h.
- */
-bool wpi_assert_impl(bool conditionValue, const wpi::Twine &conditionText,
-                     const wpi::Twine &message, wpi::StringRef fileName,
-                     int lineNumber, wpi::StringRef funcName) {
-  if (!conditionValue) {
-    wpi::SmallString<128> locBuf;
-    wpi::raw_svector_ostream locStream(locBuf);
-    locStream << funcName << " [" << wpi::sys::path::filename(fileName) << ":"
-              << lineNumber << "]";
-
-    wpi::SmallString<128> errorBuf;
-    wpi::raw_svector_ostream errorStream(errorBuf);
-
-    errorStream << "Assertion \"" << conditionText << "\" ";
-
-    if (message.isTriviallyEmpty() ||
-        (message.isSingleStringRef() && message.getSingleStringRef().empty())) {
-      errorStream << "failed.\n";
-    } else {
-      errorStream << "failed: " << message << "\n";
-    }
-
-    std::string stack = GetStackTrace(2);
-
-    // Print the error and send it to the DriverStation
-    HAL_SendError(1, 1, 0, errorBuf.c_str(), locBuf.c_str(), stack.c_str(), 1);
-  }
-
-  return conditionValue;
-}
-
-/**
- * Common error routines for wpi_assertEqual_impl and wpi_assertNotEqual_impl
- * This should not be called directly; it should only be used by
- * wpi_assertEqual_impl and wpi_assertNotEqual_impl.
- */
-void wpi_assertEqual_common_impl(const wpi::Twine &valueA,
-                                 const wpi::Twine &valueB,
-                                 const wpi::Twine &equalityType,
-                                 const wpi::Twine &message,
-                                 wpi::StringRef fileName, int lineNumber,
-                                 wpi::StringRef funcName) {
-  wpi::SmallString<128> locBuf;
-  wpi::raw_svector_ostream locStream(locBuf);
-  locStream << funcName << " [" << wpi::sys::path::filename(fileName) << ":"
-            << lineNumber << "]";
-
-  wpi::SmallString<128> errorBuf;
-  wpi::raw_svector_ostream errorStream(errorBuf);
-
-  errorStream << "Assertion \"" << valueA << " " << equalityType << " "
-              << valueB << "\" ";
-
-  if (message.isTriviallyEmpty() ||
-      (message.isSingleStringRef() && message.getSingleStringRef().empty())) {
-    errorStream << "failed.\n";
-  } else {
-    errorStream << "failed: " << message << "\n";
-  }
-
-  std::string trace = GetStackTrace(3);
-
-  // Print the error and send it to the DriverStation
-  HAL_SendError(1, 1, 0, errorBuf.c_str(), locBuf.c_str(), trace.c_str(), 1);
-}
-
-/**
- * Assert equal implementation.
- * This determines whether the two given integers are equal. If not,
- * the value of each is printed along with an optional message string.
- * The users don't call this, but instead use the wpi_assertEqual macros in
- * Utility.h.
- */
-bool wpi_assertEqual_impl(int valueA, int valueB,
-                          const wpi::Twine &valueAString,
-                          const wpi::Twine &valueBString,
-                          const wpi::Twine &message, wpi::StringRef fileName,
-                          int lineNumber, wpi::StringRef funcName) {
-  if (!(valueA == valueB)) {
-    wpi_assertEqual_common_impl(valueAString, valueBString, "==", message,
-                                fileName, lineNumber, funcName);
-  }
-  return valueA == valueB;
-}
-
-/**
- * Assert not equal implementation.
- * This determines whether the two given integers are equal. If so,
- * the value of each is printed along with an optional message string.
- * The users don't call this, but instead use the wpi_assertNotEqual macros in
- * Utility.h.
- */
-bool wpi_assertNotEqual_impl(int valueA, int valueB,
-                             const wpi::Twine &valueAString,
-                             const wpi::Twine &valueBString,
-                             const wpi::Twine &message, wpi::StringRef fileName,
-                             int lineNumber, wpi::StringRef funcName) {
-  if (!(valueA != valueB)) {
-    wpi_assertEqual_common_impl(valueAString, valueBString, "!=", message,
-                                fileName, lineNumber, funcName);
-  }
-  return valueA != valueB;
-}
 
 namespace frc {
 
-/**
- * Return the FPGA Version number.
- *
- * For now, expect this to be competition year.
- * @return FPGA Version number.
- */
 int GetFPGAVersion() {
   int32_t status = 0;
   int version = HAL_GetFPGAVersion(&status);
@@ -148,14 +12,6 @@
   return version;
 }
 
-/**
- * Return the FPGA Revision number.
- * The format of the revision is 3 numbers.
- * The 12 most significant bits are the Major Revision.
- * the next 8 bits are the Minor Revision.
- * The 12 least significant bits are the Build Number.
- * @return FPGA Revision number.
- */
 int64_t GetFPGARevision() {
   int32_t status = 0;
   int64_t revision = HAL_GetFPGARevision(&status);
@@ -163,12 +19,6 @@
   return revision;
 }
 
-/**
- * Read the microsecond-resolution timer on the FPGA.
- *
- * @return The current time in microseconds according to the FPGA (since FPGA
- *         reset).
- */
 uint64_t GetFPGATime() {
   int32_t status = 0;
   uint64_t time = HAL_GetFPGATime(&status);
@@ -176,11 +26,6 @@
   return time;
 }
 
-/**
- * Get the state of the "USER" button on the roboRIO.
- *
- * @return True if the button is currently pressed down
- */
 bool GetUserButton() {
   int32_t status = 0;
 
@@ -190,49 +35,4 @@
   return value;
 }
 
-/**
- * Demangle a C++ symbol, used for printing stack traces.
- */
-static std::string demangle(char const *mangledSymbol) {
-  char buffer[256];
-  size_t length;
-  int32_t status;
-
-  if (std::sscanf(mangledSymbol, "%*[^(]%*[(]%255[^)+]", buffer)) {
-    char *symbol = abi::__cxa_demangle(buffer, nullptr, &length, &status);
-    if (status == 0) {
-      return symbol;
-    } else {
-      // If the symbol couldn't be demangled, it's probably a C function,
-      // so just return it as-is.
-      return buffer;
-    }
-  }
-
-  // If everything else failed, just return the mangled symbol
-  return mangledSymbol;
-}
-
-/**
- * Get a stack trace, ignoring the first "offset" symbols.
- * @param offset The number of symbols at the top of the stack to ignore
- */
-std::string GetStackTrace(int offset) {
-  void *stackTrace[128];
-  int stackSize = backtrace(stackTrace, 128);
-  char **mangledSymbols = backtrace_symbols(stackTrace, stackSize);
-  std::stringstream trace;
-
-  for (int i = offset; i < stackSize; i++) {
-    // Only print recursive functions once in a row.
-    if (i == 0 || stackTrace[i] != stackTrace[i - 1]) {
-      trace << "\tat " << demangle(mangledSymbols[i]) << std::endl;
-    }
-  }
-
-  std::free(mangledSymbols);
-
-  return trace.str();
-}
-
 }  // namespace frc
diff --git a/frc971/wpilib/ahal/Utility.h b/frc971/wpilib/ahal/Utility.h
index 196dfce..4962cc9 100644
--- a/frc971/wpilib/ahal/Utility.h
+++ b/frc971/wpilib/ahal/Utility.h
@@ -5,57 +5,30 @@
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-#pragma once
+#ifndef FRC971_WPILIB_AHAL_UTILITY_H_
+#define FRC971_WPILIB_AHAL_UTILITY_H_
 
-/** @file
- * Contains global utility functions
- */
-
-#include <cstdint>
 #include <string>
 
-#include "wpi/StringRef.h"
-#include "wpi/Twine.h"
-
-#define wpi_assert(condition) \
-  wpi_assert_impl(condition, #condition, "", __FILE__, __LINE__, __FUNCTION__)
-#define wpi_assertWithMessage(condition, message)                     \
-  wpi_assert_impl(condition, #condition, message, __FILE__, __LINE__, \
-                  __FUNCTION__)
-
-#define wpi_assertEqual(a, b) \
-  wpi_assertEqual_impl(a, b, #a, #b, "", __FILE__, __LINE__, __FUNCTION__)
-#define wpi_assertEqualWithMessage(a, b, message) \
-  wpi_assertEqual_impl(a, b, #a, #b, message, __FILE__, __LINE__, __FUNCTION__)
-
-#define wpi_assertNotEqual(a, b) \
-  wpi_assertNotEqual_impl(a, b, #a, #b, "", __FILE__, __LINE__, __FUNCTION__)
-#define wpi_assertNotEqualWithMessage(a, b, message)                 \
-  wpi_assertNotEqual_impl(a, b, #a, #b, message, __FILE__, __LINE__, \
-                          __FUNCTION__)
-
-bool wpi_assert_impl(bool conditionValue, const wpi::Twine &conditionText,
-                     const wpi::Twine &message, wpi::StringRef fileName,
-                     int lineNumber, wpi::StringRef funcName);
-bool wpi_assertEqual_impl(int valueA, int valueB,
-                          const wpi::Twine &valueAString,
-                          const wpi::Twine &valueBString,
-                          const wpi::Twine &message, wpi::StringRef fileName,
-                          int lineNumber, wpi::StringRef funcName);
-bool wpi_assertNotEqual_impl(int valueA, int valueB,
-                             const wpi::Twine &valueAString,
-                             const wpi::Twine &valueBString,
-                             const wpi::Twine &message, wpi::StringRef fileName,
-                             int lineNumber, wpi::StringRef funcName);
-
-void wpi_suspendOnAssertEnabled(bool enabled);
-
 namespace frc {
 
+// Returns the FPGA Version number.  For now, this is the competition year.
 int GetFPGAVersion();
+
+// Returns the FPGA Revision number.
+// The format of the revision is 3 numbers.
+// The 12 most significant bits are the Major Revision.
+// the next 8 bits are the Minor Revision.
+// The 12 least significant bits are the Build Number.
 int64_t GetFPGARevision();
+
+// Reads the microsecond-resolution timer on the FPGA since reset.
 uint64_t GetFPGATime();
+
+// Gets the state of the "USER" button on the roboRIO, returning true if
+// pressed.
 bool GetUserButton();
-std::string GetStackTrace(int offset);
 
 }  // namespace frc
+
+#endif  // FRC971_WPILIB_AHAL_UTILITY_H_
diff --git a/frc971/wpilib/buffered_pcm.cc b/frc971/wpilib/buffered_pcm.cc
index 7f6cb37..8f5a3d9 100644
--- a/frc971/wpilib/buffered_pcm.cc
+++ b/frc971/wpilib/buffered_pcm.cc
@@ -5,7 +5,7 @@
 #include "aos/logging/logging.h"
 #include "hal/HAL.h"
 #include "hal/Ports.h"
-#include "hal/Solenoid.h"
+#include "hal/CTREPCM.h"
 
 namespace frc971 {
 namespace wpilib {
@@ -13,8 +13,8 @@
 BufferedPcm::BufferedPcm(int module) : module_(module) {
   for (int i = 0; i < 8; ++i) {
     int32_t status = 0;
-    solenoid_handles_[i] =
-        HAL_InitializeSolenoidPort(HAL_GetPortWithModule(module_, i), &status);
+    solenoid_handles_[i] = HAL_InitializeCTREPCM(
+        HAL_GetPortWithModule(module_, i), nullptr, &status);
     if (status != 0) {
       AOS_LOG(FATAL, "Status was %d\n", status);
     }
@@ -36,7 +36,7 @@
 
 int32_t BufferedPcm::GetAll() {
   int32_t status = 0;
-  int32_t result = HAL_GetAllSolenoids(module_, &status);
+  int32_t result = HAL_GetCTREPCMSolenoids(module_, &status);
   if (status != 0) {
     AOS_LOG(ERROR, "Failed to flush, %d\n", status);
     return 0;
@@ -47,7 +47,7 @@
 void BufferedPcm::Flush() {
   AOS_LOG(DEBUG, "sending solenoids 0x%" PRIx8 "\n", values_);
   int32_t status = 0;
-  HAL_SetAllSolenoids(module_, static_cast<int>(values_), &status);
+  HAL_SetCTREPCMSolenoids(module_, 0xff, static_cast<int>(values_), &status);
   if (status != 0) {
     AOS_LOG(ERROR, "Failed to flush, %d\n", status);
   }
diff --git a/frc971/wpilib/dma_edge_counting.h b/frc971/wpilib/dma_edge_counting.h
index b645d01..2d49ecb 100644
--- a/frc971/wpilib/dma_edge_counting.h
+++ b/frc971/wpilib/dma_edge_counting.h
@@ -8,12 +8,12 @@
 #include "aos/macros.h"
 
 #include "aos/containers/sized_array.h"
+#include "frc971/wpilib/ahal/Utility.h"
 #include "frc971/wpilib/dma.h"
 
 #include "frc971/wpilib/ahal/AnalogInput.h"
 #include "frc971/wpilib/ahal/DigitalInput.h"
 #include "frc971/wpilib/ahal/Encoder.h"
-#include "frc971/wpilib/ahal/Utility.h"
 #undef ERROR
 
 namespace frc971 {
diff --git a/frc971/wpilib/sensor_reader.cc b/frc971/wpilib/sensor_reader.cc
index 16b0e09..2a40128 100644
--- a/frc971/wpilib/sensor_reader.cc
+++ b/frc971/wpilib/sensor_reader.cc
@@ -9,7 +9,6 @@
 #include "aos/util/compiler_memory_barrier.h"
 #include "frc971/wpilib/ahal/DigitalInput.h"
 #include "frc971/wpilib/ahal/DriverStation.h"
-#include "frc971/wpilib/ahal/Utility.h"
 #include "frc971/wpilib/fpga_time_conversion.h"
 #include "frc971/wpilib/wpilib_interface.h"
 #include "hal/PWM.h"