Update to the 2019 wpilib

Lots of gratuitious incompatibilities to deal with. Started sanifying a
few classes rather than figuring out how to update them too. Has not yet
been tested on a robot, but everything still builds so it should be
fine.

Also ported over our FPGA timestamp fixes, which were previously only in
allwpilib_2018.

Also upgraded to the new roborio compiler, which has to happen at the
same time due to incompatible pre-compiled libraries.

Change-Id: Ib9b6ad8fc0112d90a9855afe1b706588ef4ebde9
diff --git a/WORKSPACE b/WORKSPACE
index 394c856..22cfc8e 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -106,8 +106,9 @@
 new_http_archive(
     name = "arm_frc_linux_gnueabi_repo",
     build_file = "tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi.BUILD",
-    sha256 = "875b23bec5138e09e3d21cc1ff2727ea3ecbec57509c37589514ba50f92979c7",
-    url = "http://www.frc971.org/Build-Dependencies/roborio-compiler-2018.tar.xz",
+    sha256 = "d627c5e437db99780a938392499ef71aecbfb0e9b3fffd53bde7e402a6af4f32",
+    strip_prefix = "frc2019/roborio/",
+    url = "http://www.frc971.org/Build-Dependencies/FRC-2019-Linux-Toolchain-6.3.0-v2019-3.tar.gz",
 )
 
 # Recompressed version of the one downloaded from Linaro at
@@ -299,7 +300,7 @@
 java_runtime(
     name = 'jdk',
     srcs = glob(['**']),
-    visibility = ['//visibility:public']
+    visibility = ['//visibility:public'],
 )
 """,
     sha256 = "f27cb933de4f9e7fe9a703486cf44c84bc8e9f138be0c270c9e5716a32367e87",
@@ -329,3 +330,88 @@
     name = "com_google_ceres_solver",
     path = "third_party/ceres",
 )
+
+# Downloaded from http://devsite.ctr-electronics.com/maven/release/com/ctre/phoenix/api-cpp/5.12.1/.
+new_http_archive(
+    name = "ctre_phoenix_api_cpp_headers_2019",
+    build_file_content = """
+cc_library(
+    name = 'api-cpp',
+    visibility = ['//visibility:public'],
+    hdrs = glob(['ctre/phoenix/**/*.h']),
+)
+""",
+    sha256 = "eb625897a16f1894a4854dd60f68f495875f9b0baed826ea1a38f0afdb14712d",
+    urls = [
+        "http://www.frc971.org/Build-Dependencies/api-cpp-5.12.1-headers.zip",
+    ],
+)
+
+# Downloaded from http://devsite.ctr-electronics.com/maven/release/com/ctre/phoenix/api-cpp/5.12.1/.
+new_http_archive(
+    name = "ctre_phoenix_api_cpp_athena_2019",
+    build_file_content = """
+cc_library(
+    name = 'api-cpp',
+    visibility = ['//visibility:public'],
+    srcs = ['linux/athena/static/libCTRE_Phoenix.a'],
+    restricted_to = ['@//tools:roborio'],
+    deps = [
+    '@ctre_phoenix_core_headers_2019//:core',
+    ],
+)
+""",
+    sha256 = "f6afe6d35b8abcef16b09b2e65c59049091c88a0eb471bf65e77bc510de3f571",
+    urls = [
+        "http://www.frc971.org/Build-Dependencies/api-cpp-5.12.1-linuxathenastatic.zip",
+    ],
+)
+
+# Downloaded from http://devsite.ctr-electronics.com/maven/release/com/ctre/phoenix/cci/5.12.1/.
+new_http_archive(
+    name = "ctre_phoenix_cci_headers_2019",
+    build_file_content = """
+cc_library(
+    name = 'cci',
+    visibility = ['//visibility:public'],
+    hdrs = glob(['ctre/phoenix/**/*.h']),
+)
+""",
+    sha256 = "98f30180fc2cdd8119482364b7d47d38ee02b7746aeecd4cf1d2c25cbde7837b",
+    urls = [
+        "http://www.frc971.org/Build-Dependencies/cci-5.12.1-headers.zip",
+    ],
+)
+
+# Downloaded from http://devsite.ctr-electronics.com/maven/release/com/ctre/phoenix/cci/5.12.1/.
+new_http_archive(
+    name = "ctre_phoenix_cci_athena_2019",
+    build_file_content = """
+cc_library(
+    name = 'cci',
+    visibility = ['//visibility:public'],
+    srcs = ['linux/athena/static/libCTRE_PhoenixCCI.a'],
+    restricted_to = ['@//tools:roborio'],
+)
+""",
+    sha256 = "2fdc8dd0c2bcb463cd7a5082f2a378554497861508b4257b0cc4bab6a4a8316f",
+    urls = [
+        "http://www.frc971.org/Build-Dependencies/cci-5.12.1-linuxathenastatic.zip",
+    ],
+)
+
+# Downloaded from http://devsite.ctr-electronics.com/maven/release/com/ctre/phoenix/core/5.12.1/.
+new_http_archive(
+    name = "ctre_phoenix_core_headers_2019",
+    build_file_content = """
+cc_library(
+    name = 'core',
+    visibility = ['//visibility:public'],
+    hdrs = glob(['ctre/phoenix/**/*.h']),
+)
+""",
+    sha256 = "ddd7d740787279359d9773a4096696770411aec22e092c20749a4f5388779edf",
+    urls = [
+        "http://www.frc971.org/Build-Dependencies/core-5.12.1-headers.zip",
+    ],
+)
diff --git a/aos/config/setup_roborio.sh b/aos/config/setup_roborio.sh
index 99701a3..d2b6b8c 100755
--- a/aos/config/setup_roborio.sh
+++ b/aos/config/setup_roborio.sh
@@ -37,6 +37,3 @@
 
 echo "Deploying robotCommand startup script"
 scp aos/config/robotCommand "admin@${ROBOT_HOSTNAME}:/home/lvuser/"
-
-echo "Copying libstdc++.so.6.0.21 library to /usr/lib"
-scp external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/lib/libstdc++.so.6.0.21 "admin@${ROBOT_HOSTNAME}:/usr/lib/"
diff --git a/debian/clapack.BUILD b/debian/clapack.BUILD
index 8d805c3..b839fae 100644
--- a/debian/clapack.BUILD
+++ b/debian/clapack.BUILD
@@ -298,6 +298,8 @@
         ],
         "gcc": [
             "-Wno-discarded-qualifiers",
+            "-Wno-maybe-uninitialized",
+            "-Wno-unused-but-set-variable",
         ],
     }),
     includes = [
diff --git a/debian/slycot.BUILD b/debian/slycot.BUILD
index 7463173..41e7be2 100644
--- a/debian/slycot.BUILD
+++ b/debian/slycot.BUILD
@@ -79,6 +79,7 @@
         "-Wno-unused-parameter",
         "-Wno-missing-field-initializers",
         "-Wno-unused-function",
+        "-Wno-unused-but-set-variable",
     ],
     restricted_to = ["@//tools:k8"],
     deps = [
diff --git a/frc971/wpilib/ADIS16448.cc b/frc971/wpilib/ADIS16448.cc
index 6c4a6d1..21a5e2c 100644
--- a/frc971/wpilib/ADIS16448.cc
+++ b/frc971/wpilib/ADIS16448.cc
@@ -236,7 +236,10 @@
     }
 
     auto message = imu_values.MakeMessage();
-    message->fpga_timestamp = dio1_->ReadRisingTimestamp();
+    message->fpga_timestamp =
+        chrono::duration_cast<chrono::duration<double>>(
+            dio1_->ReadRisingTimestamp().time_since_epoch())
+            .count();
     message->monotonic_timestamp_ns =
         chrono::duration_cast<chrono::nanoseconds>(read_time.time_since_epoch())
             .count();
diff --git a/frc971/wpilib/ahal/AnalogInput.cc b/frc971/wpilib/ahal/AnalogInput.cc
index fc2e5a7..1694708 100644
--- a/frc971/wpilib/ahal/AnalogInput.cc
+++ b/frc971/wpilib/ahal/AnalogInput.cc
@@ -6,12 +6,12 @@
 /*----------------------------------------------------------------------------*/
 
 #include "frc971/wpilib/ahal/AnalogInput.h"
-#include "HAL/AnalogInput.h"
+#include "hal/AnalogInput.h"
 
 #include <sstream>
 
-#include "HAL/HAL.h"
-#include "HAL/Ports.h"
+#include "hal/HAL.h"
+#include "hal/Ports.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
 
 using namespace frc;
diff --git a/frc971/wpilib/ahal/AnalogInput.h b/frc971/wpilib/ahal/AnalogInput.h
index 5398eec..4540bbe 100644
--- a/frc971/wpilib/ahal/AnalogInput.h
+++ b/frc971/wpilib/ahal/AnalogInput.h
@@ -10,7 +10,7 @@
 #include <memory>
 #include <string>
 
-#include "HAL/Types.h"
+#include "hal/Types.h"
 #include "frc971/wpilib/ahal/SensorBase.h"
 
 namespace frc {
diff --git a/frc971/wpilib/ahal/AnalogTrigger.cc b/frc971/wpilib/ahal/AnalogTrigger.cc
index c9028ae..194537c 100644
--- a/frc971/wpilib/ahal/AnalogTrigger.cc
+++ b/frc971/wpilib/ahal/AnalogTrigger.cc
@@ -9,7 +9,7 @@
 
 #include <memory>
 
-#include <HAL/HAL.h>
+#include <hal/HAL.h>
 
 #include "frc971/wpilib/ahal/AnalogInput.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
diff --git a/frc971/wpilib/ahal/AnalogTrigger.h b/frc971/wpilib/ahal/AnalogTrigger.h
index 7b6fc92..30a07d1 100644
--- a/frc971/wpilib/ahal/AnalogTrigger.h
+++ b/frc971/wpilib/ahal/AnalogTrigger.h
@@ -9,7 +9,7 @@
 
 #include <memory>
 
-#include "HAL/Types.h"
+#include "hal/Types.h"
 #include "frc971/wpilib/ahal/AnalogTriggerOutput.h"
 #include "frc971/wpilib/ahal/SensorBase.h"
 
diff --git a/frc971/wpilib/ahal/AnalogTriggerOutput.cc b/frc971/wpilib/ahal/AnalogTriggerOutput.cc
index bdc47b6..d95b1d7 100644
--- a/frc971/wpilib/ahal/AnalogTriggerOutput.cc
+++ b/frc971/wpilib/ahal/AnalogTriggerOutput.cc
@@ -7,7 +7,7 @@
 
 #include "frc971/wpilib/ahal/AnalogTriggerOutput.h"
 
-#include <HAL/HAL.h>
+#include <hal/HAL.h>
 
 #include "frc971/wpilib/ahal/AnalogTrigger.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
diff --git a/frc971/wpilib/ahal/AnalogTriggerOutput.h b/frc971/wpilib/ahal/AnalogTriggerOutput.h
index 0ddaae0..7eb3163 100644
--- a/frc971/wpilib/ahal/AnalogTriggerOutput.h
+++ b/frc971/wpilib/ahal/AnalogTriggerOutput.h
@@ -7,7 +7,7 @@
 
 #pragma once
 
-#include "HAL/AnalogTrigger.h"
+#include "hal/AnalogTrigger.h"
 #include "frc971/wpilib/ahal/DigitalSource.h"
 
 namespace frc {
diff --git a/frc971/wpilib/ahal/Compressor.cc b/frc971/wpilib/ahal/Compressor.cc
index 2967f05..4a17f76 100644
--- a/frc971/wpilib/ahal/Compressor.cc
+++ b/frc971/wpilib/ahal/Compressor.cc
@@ -6,11 +6,11 @@
 /*----------------------------------------------------------------------------*/
 
 #include "frc971/wpilib/ahal/Compressor.h"
-#include "HAL/Compressor.h"
+#include "hal/Compressor.h"
 
-#include "HAL/HAL.h"
-#include "HAL/Ports.h"
-#include "HAL/Solenoid.h"
+#include "hal/HAL.h"
+#include "hal/Ports.h"
+#include "hal/Solenoid.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
 
 using namespace frc;
diff --git a/frc971/wpilib/ahal/Compressor.h b/frc971/wpilib/ahal/Compressor.h
index 60e21d9..c358ce1 100644
--- a/frc971/wpilib/ahal/Compressor.h
+++ b/frc971/wpilib/ahal/Compressor.h
@@ -10,7 +10,7 @@
 #include <memory>
 #include <string>
 
-#include "HAL/Types.h"
+#include "hal/Types.h"
 #include "frc971/wpilib/ahal/SensorBase.h"
 
 namespace frc {
diff --git a/frc971/wpilib/ahal/ControllerPower.cc b/frc971/wpilib/ahal/ControllerPower.cc
index e045fdc..9637d17 100644
--- a/frc971/wpilib/ahal/ControllerPower.cc
+++ b/frc971/wpilib/ahal/ControllerPower.cc
@@ -9,8 +9,8 @@
 
 #include <stdint.h>
 
-#include "HAL/HAL.h"
-#include "HAL/Power.h"
+#include "hal/HAL.h"
+#include "hal/Power.h"
 #include "frc971/wpilib/ahal/ErrorBase.h"
 
 using namespace frc;
diff --git a/frc971/wpilib/ahal/Counter.cc b/frc971/wpilib/ahal/Counter.cc
index 352904b..3614b8c 100644
--- a/frc971/wpilib/ahal/Counter.cc
+++ b/frc971/wpilib/ahal/Counter.cc
@@ -7,7 +7,7 @@
 
 #include "frc971/wpilib/ahal/Counter.h"
 
-#include "HAL/HAL.h"
+#include "hal/HAL.h"
 #include "frc971/wpilib/ahal/AnalogTrigger.h"
 #include "frc971/wpilib/ahal/DigitalInput.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
diff --git a/frc971/wpilib/ahal/Counter.h b/frc971/wpilib/ahal/Counter.h
index c32dd33..26ae7a2 100644
--- a/frc971/wpilib/ahal/Counter.h
+++ b/frc971/wpilib/ahal/Counter.h
@@ -10,8 +10,8 @@
 #include <memory>
 #include <string>
 
-#include "HAL/Counter.h"
-#include "HAL/Types.h"
+#include "hal/Counter.h"
+#include "hal/Types.h"
 #include "frc971/wpilib/ahal/AnalogTrigger.h"
 #include "frc971/wpilib/ahal/CounterBase.h"
 #include "frc971/wpilib/ahal/SensorBase.h"
diff --git a/frc971/wpilib/ahal/DigitalGlitchFilter.cc b/frc971/wpilib/ahal/DigitalGlitchFilter.cc
index 76e2b3b..cddfcf0 100644
--- a/frc971/wpilib/ahal/DigitalGlitchFilter.cc
+++ b/frc971/wpilib/ahal/DigitalGlitchFilter.cc
@@ -10,9 +10,9 @@
 #include <algorithm>
 #include <array>
 
-#include "HAL/Constants.h"
-#include "HAL/DIO.h"
-#include "HAL/HAL.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"
@@ -31,7 +31,7 @@
   m_channelIndex = std::distance(m_filterAllocated.begin(), index);
   *index = true;
 
-  HAL_Report(HALUsageReporting::kResourceType_DigitalFilter, m_channelIndex);
+  HAL_Report(HALUsageReporting::kResourceType_DigitalGlitchFilter, m_channelIndex);
 }
 
 DigitalGlitchFilter::~DigitalGlitchFilter() {
diff --git a/frc971/wpilib/ahal/DigitalGlitchFilter.h b/frc971/wpilib/ahal/DigitalGlitchFilter.h
index 1864542..d31b9d5 100644
--- a/frc971/wpilib/ahal/DigitalGlitchFilter.h
+++ b/frc971/wpilib/ahal/DigitalGlitchFilter.h
@@ -10,7 +10,7 @@
 #include <array>
 
 #include "frc971/wpilib/ahal/DigitalSource.h"
-// #include "HAL/cpp/priority_mutex.h"
+// #include "hal/cpp/priority_mutex.h"
 
 namespace frc {
 
diff --git a/frc971/wpilib/ahal/DigitalInput.cc b/frc971/wpilib/ahal/DigitalInput.cc
index 45e405d..e0121ea 100644
--- a/frc971/wpilib/ahal/DigitalInput.cc
+++ b/frc971/wpilib/ahal/DigitalInput.cc
@@ -10,9 +10,9 @@
 #include <limits>
 #include <sstream>
 
-#include "HAL/DIO.h"
-#include "HAL/HAL.h"
-#include "HAL/Ports.h"
+#include "hal/DIO.h"
+#include "hal/HAL.h"
+#include "hal/Ports.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
 
 using namespace frc;
diff --git a/frc971/wpilib/ahal/DigitalOutput.cc b/frc971/wpilib/ahal/DigitalOutput.cc
index 7f8495b..f4b2781 100644
--- a/frc971/wpilib/ahal/DigitalOutput.cc
+++ b/frc971/wpilib/ahal/DigitalOutput.cc
@@ -10,9 +10,9 @@
 #include <limits>
 #include <sstream>
 
-#include "HAL/DIO.h"
-#include "HAL/HAL.h"
-#include "HAL/Ports.h"
+#include "hal/DIO.h"
+#include "hal/HAL.h"
+#include "hal/Ports.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
 
 using namespace frc;
diff --git a/frc971/wpilib/ahal/DigitalOutput.h b/frc971/wpilib/ahal/DigitalOutput.h
index e1f7080..c6139ce 100644
--- a/frc971/wpilib/ahal/DigitalOutput.h
+++ b/frc971/wpilib/ahal/DigitalOutput.h
@@ -10,7 +10,7 @@
 #include <memory>
 #include <string>
 
-#include "HAL/Types.h"
+#include "hal/Types.h"
 #include "frc971/wpilib/ahal/DigitalSource.h"
 
 namespace frc {
diff --git a/frc971/wpilib/ahal/DigitalSource.h b/frc971/wpilib/ahal/DigitalSource.h
index 6844923..f5ece9c 100644
--- a/frc971/wpilib/ahal/DigitalSource.h
+++ b/frc971/wpilib/ahal/DigitalSource.h
@@ -7,7 +7,7 @@
 
 #pragma once
 
-#include "HAL/Types.h"
+#include "hal/Types.h"
 #include "frc971/wpilib/ahal/InterruptableSensorBase.h"
 
 namespace frc {
diff --git a/frc971/wpilib/ahal/DriverStation.cc b/frc971/wpilib/ahal/DriverStation.cc
index c34db1b..8420a9e 100644
--- a/frc971/wpilib/ahal/DriverStation.cc
+++ b/frc971/wpilib/ahal/DriverStation.cc
@@ -10,13 +10,13 @@
 #include <chrono>
 
 #include "FRC_NetworkCommunication/FRCComm.h"
-#include "HAL/HAL.h"
-#include "HAL/Power.h"
 #include "aos/make_unique.h"
 #include "frc971/wpilib/ahal/AnalogInput.h"
 #include "frc971/wpilib/ahal/Utility.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
-#include "llvm/SmallString.h"
+#include "hal/HAL.h"
+#include "hal/Power.h"
+#include "wpi/SmallString.h"
 
 using namespace frc;
 
@@ -43,9 +43,10 @@
  *
  * The error is also printed to the program console.
  */
-void DriverStation::ReportError(llvm::StringRef error) {
-  llvm::SmallString<128> temp;
-  HAL_SendError(1, 1, 0, error.c_str(temp), "", "", 1);
+void DriverStation::ReportError(const wpi::Twine &error) {
+  wpi::SmallString<128> temp;
+  HAL_SendError(1, 1, 0, error.toNullTerminatedStringRef(temp).data(), "", "",
+                1);
 }
 
 /**
@@ -53,9 +54,10 @@
  *
  * The warning is also printed to the program console.
  */
-void DriverStation::ReportWarning(llvm::StringRef error) {
-  llvm::SmallString<128> temp;
-  HAL_SendError(0, 1, 0, error.c_str(temp), "", "", 1);
+void DriverStation::ReportWarning(const wpi::Twine &error) {
+  wpi::SmallString<128> temp;
+  HAL_SendError(0, 1, 0, error.toNullTerminatedStringRef(temp).data(), "", "",
+                1);
 }
 
 /**
@@ -64,13 +66,16 @@
  * The error is also printed to the program console.
  */
 void DriverStation::ReportError(bool is_error, int32_t code,
-                                llvm::StringRef error, llvm::StringRef location,
-                                llvm::StringRef stack) {
-  llvm::SmallString<128> errorTemp;
-  llvm::SmallString<128> locationTemp;
-  llvm::SmallString<128> stackTemp;
-  HAL_SendError(is_error, code, 0, error.c_str(errorTemp),
-                location.c_str(locationTemp), stack.c_str(stackTemp), 1);
+                                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);
 }
 
 /**
@@ -394,17 +399,17 @@
   // DS, and if the DS thinks you don't have robot code, then you can't enable).
   HAL_ObserveUserProgramStarting();
 
-  m_joystickAxes = std::make_unique<HAL_JoystickAxes[]>(kJoystickPorts);
-  m_joystickPOVs = std::make_unique<HAL_JoystickPOVs[]>(kJoystickPorts);
-  m_joystickButtons = std::make_unique<HAL_JoystickButtons[]>(kJoystickPorts);
+  m_joystickAxes = aos::make_unique<HAL_JoystickAxes[]>(kJoystickPorts);
+  m_joystickPOVs = aos::make_unique<HAL_JoystickPOVs[]>(kJoystickPorts);
+  m_joystickButtons = aos::make_unique<HAL_JoystickButtons[]>(kJoystickPorts);
   m_joystickDescriptor =
-      std::make_unique<HAL_JoystickDescriptor[]>(kJoystickPorts);
-  m_joystickAxesCache = std::make_unique<HAL_JoystickAxes[]>(kJoystickPorts);
-  m_joystickPOVsCache = std::make_unique<HAL_JoystickPOVs[]>(kJoystickPorts);
+      aos::make_unique<HAL_JoystickDescriptor[]>(kJoystickPorts);
+  m_joystickAxesCache = aos::make_unique<HAL_JoystickAxes[]>(kJoystickPorts);
+  m_joystickPOVsCache = aos::make_unique<HAL_JoystickPOVs[]>(kJoystickPorts);
   m_joystickButtonsCache =
-      std::make_unique<HAL_JoystickButtons[]>(kJoystickPorts);
+      aos::make_unique<HAL_JoystickButtons[]>(kJoystickPorts);
   m_joystickDescriptorCache =
-      std::make_unique<HAL_JoystickDescriptor[]>(kJoystickPorts);
+      aos::make_unique<HAL_JoystickDescriptor[]>(kJoystickPorts);
 
   // All joysticks should default to having zero axes, povs and buttons, so
   // uninitialized memory doesn't get sent to speed controllers.
diff --git a/frc971/wpilib/ahal/DriverStation.h b/frc971/wpilib/ahal/DriverStation.h
index f1d0804..2fbac9c 100644
--- a/frc971/wpilib/ahal/DriverStation.h
+++ b/frc971/wpilib/ahal/DriverStation.h
@@ -13,9 +13,9 @@
 #include <string>
 #include <thread>
 
-#include "HAL/DriverStation.h"
+#include "hal/DriverStation.h"
 #include "frc971/wpilib/ahal/SensorBase.h"
-#include "llvm/StringRef.h"
+#include "wpi/Twine.h"
 
 namespace frc {
 
@@ -29,10 +29,10 @@
 
   virtual ~DriverStation();
   static DriverStation &GetInstance();
-  static void ReportError(llvm::StringRef error);
-  static void ReportWarning(llvm::StringRef error);
-  static void ReportError(bool is_error, int code, llvm::StringRef error,
-                          llvm::StringRef location, llvm::StringRef stack);
+  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 const int kJoystickPorts = 6;
 
diff --git a/frc971/wpilib/ahal/Encoder.cc b/frc971/wpilib/ahal/Encoder.cc
index 8d57eda..b452720 100644
--- a/frc971/wpilib/ahal/Encoder.cc
+++ b/frc971/wpilib/ahal/Encoder.cc
@@ -7,7 +7,7 @@
 
 #include "frc971/wpilib/ahal/Encoder.h"
 
-#include "HAL/HAL.h"
+#include "hal/HAL.h"
 #include "frc971/wpilib/ahal/DigitalInput.h"
 
 using namespace frc;
diff --git a/frc971/wpilib/ahal/Encoder.h b/frc971/wpilib/ahal/Encoder.h
index 2f06e65..56e499f 100644
--- a/frc971/wpilib/ahal/Encoder.h
+++ b/frc971/wpilib/ahal/Encoder.h
@@ -10,7 +10,7 @@
 #include <memory>
 #include <string>
 
-#include "HAL/Encoder.h"
+#include "hal/Encoder.h"
 
 namespace frc {
 
diff --git a/frc971/wpilib/ahal/ErrorBase.h b/frc971/wpilib/ahal/ErrorBase.h
index 0f4e377..8228df1 100644
--- a/frc971/wpilib/ahal/ErrorBase.h
+++ b/frc971/wpilib/ahal/ErrorBase.h
@@ -8,7 +8,7 @@
 #pragma once
 
 #include "frc971/wpilib/ahal/Base.h"
-#include "llvm/StringRef.h"
+#include "wpi/StringRef.h"
 
 #define wpi_setErrnoErrorWithContext(context) \
   this->SetErrnoError((context), __FILE__, __FUNCTION__, __LINE__)
diff --git a/frc971/wpilib/ahal/InterruptableSensorBase.cc b/frc971/wpilib/ahal/InterruptableSensorBase.cc
index a757bee..4becafc 100644
--- a/frc971/wpilib/ahal/InterruptableSensorBase.cc
+++ b/frc971/wpilib/ahal/InterruptableSensorBase.cc
@@ -7,47 +7,50 @@
 
 #include "frc971/wpilib/ahal/InterruptableSensorBase.h"
 
-#include "HAL/HAL.h"
+#include "hal/HAL.h"
 #include "frc971/wpilib/ahal/Utility.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
 
 using namespace frc;
 
-InterruptableSensorBase::InterruptableSensorBase() {}
+namespace {
 
-/**
- * Request one of the 8 interrupts asynchronously on this digital input.
- *
- * Request interrupts in asynchronous mode where the user's interrupt handler
- * will be called when the interrupt fires. Users that want control over the
- * thread priority should use the synchronous method with their own spawned
- * thread. The default is interrupt on rising edges only.
- */
-void InterruptableSensorBase::RequestInterrupts(
-    HAL_InterruptHandlerFunction handler, void *param) {
-  if (StatusIsFatal()) return;
+// Converts a freestanding lower half to a 64 bit FPGA timestamp
+//
+// Note: This is making the assumption that the timestamp being converted is
+// always in the past.  If you call this with a future timestamp, it probably
+// will make it in the past.  If you wait over 70 minutes between capturing the
+// bottom 32 bits of the timestamp and expanding it, you will be off by
+// multiples of 1<<32 microseconds.
+//
+// @return The current time in microseconds according to the FPGA (since FPGA
+// reset) as a 64 bit number.
+uint64_t HAL_ExpandFPGATime(uint32_t unexpanded_lower, int32_t* status) {
+  // Capture the current FPGA time.  This will give us the upper half of the
+  // clock.
+  uint64_t fpga_time = HAL_GetFPGATime(status);
+  if (*status != 0) return 0;
 
-  wpi_assert(m_interrupt == HAL_kInvalidHandle);
-  AllocateInterrupts(false);
-  if (StatusIsFatal()) return;  // if allocate failed, out of interrupts
+  // Now, we need to detect the case where the lower bits rolled over after we
+  // sampled.  In that case, the upper bits will be 1 bigger than they should
+  // be.
 
-  int32_t status = 0;
-  HAL_RequestInterrupts(
-      m_interrupt, GetPortHandleForRouting(),
-      static_cast<HAL_AnalogTriggerType>(GetAnalogTriggerTypeForRouting()),
-      &status);
-  SetUpSourceEdge(true, false);
-  HAL_AttachInterruptHandler(m_interrupt, handler, param, &status);
-  wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+  // Break it into lower and upper portions.
+  uint32_t lower = fpga_time & ((uint64_t)0xffffffff);
+  uint64_t upper = (fpga_time >> 32) & 0xffffffff;
+
+  // The time was sampled *before* the current time, so roll it back.
+  if (lower < unexpanded_lower) {
+    --upper;
+  }
+
+  return (upper << 32) + static_cast<uint64_t>(unexpanded_lower);
 }
 
-/**
- * Request one of the 8 interrupts synchronously on this digital input.
- *
- * Request interrupts in synchronous mode where the user program will have to
- * explicitly wait for the interrupt to occur using WaitForInterrupt.
- * The default is interrupt on rising edges only.
- */
+}  // namespace
+
+InterruptableSensorBase::InterruptableSensorBase() {}
+
 void InterruptableSensorBase::RequestInterrupts() {
   if (StatusIsFatal()) return;
 
@@ -72,11 +75,6 @@
   wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
 }
 
-/**
- * Cancel interrupts on this device.
- *
- * This deallocates all the chipobject structures and disables any interrupts.
- */
 void InterruptableSensorBase::CancelInterrupts() {
   if (StatusIsFatal()) return;
   wpi_assert(m_interrupt != HAL_kInvalidHandle);
@@ -86,18 +84,6 @@
   m_interrupt = HAL_kInvalidHandle;
 }
 
-/**
- * In synchronous mode, wait for the defined interrupt to occur.
- *
- * You should <b>NOT</b> attempt to read the sensor from another thread while
- * waiting for an interrupt. This is not threadsafe, and can cause memory
- * corruption
- *
- * @param timeout        Timeout in seconds
- * @param ignorePrevious If true, ignore interrupts that happened before
- *                       WaitForInterrupt was called.
- * @return What interrupts fired
- */
 InterruptableSensorBase::WaitResult InterruptableSensorBase::WaitForInterrupt(
     double timeout, bool ignorePrevious) {
   if (StatusIsFatal()) return InterruptableSensorBase::kTimeout;
@@ -117,13 +103,6 @@
   return static_cast<WaitResult>(falling | rising);
 }
 
-/**
- * Enable interrupts to occur on this input.
- *
- * Interrupts are disabled when the RequestInterrupt call is made. This gives
- * time to do the setup of the other options before starting to field
- * interrupts.
- */
 void InterruptableSensorBase::EnableInterrupts() {
   if (StatusIsFatal()) return;
   wpi_assert(m_interrupt != HAL_kInvalidHandle);
@@ -132,59 +111,26 @@
   wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
 }
 
-/**
- * Disable Interrupts without without deallocating structures.
- */
-void InterruptableSensorBase::DisableInterrupts() {
-  if (StatusIsFatal()) return;
+hal::fpga_clock::time_point InterruptableSensorBase::ReadRisingTimestamp() {
+  if (StatusIsFatal()) return hal::fpga_clock::min_time;
   wpi_assert(m_interrupt != HAL_kInvalidHandle);
   int32_t status = 0;
-  HAL_DisableInterrupts(m_interrupt, &status);
+  uint64_t timestamp = HAL_ReadInterruptRisingTimestamp(m_interrupt, &status);
+  timestamp = HAL_ExpandFPGATime(timestamp, &status);
   wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
+  return hal::fpga_clock::time_point(hal::fpga_clock::duration(timestamp));
 }
 
-/**
- * Return the timestamp for the rising interrupt that occurred most recently.
- *
- * This is in the same time domain as GetClock().
- * The rising-edge interrupt should be enabled with
- * {@link #DigitalInput.SetUpSourceEdge}
- *
- * @return Timestamp in seconds since boot.
- */
-double InterruptableSensorBase::ReadRisingTimestamp() {
-  if (StatusIsFatal()) return 0.0;
+hal::fpga_clock::time_point InterruptableSensorBase::ReadFallingTimestamp() {
+  if (StatusIsFatal()) return hal::fpga_clock::min_time;
   wpi_assert(m_interrupt != HAL_kInvalidHandle);
   int32_t status = 0;
-  double timestamp = HAL_ReadInterruptRisingTimestamp(m_interrupt, &status);
+  uint64_t timestamp = HAL_ReadInterruptFallingTimestamp(m_interrupt, &status);
+  timestamp = HAL_ExpandFPGATime(timestamp, &status);
   wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
-  return timestamp;
+  return hal::fpga_clock::time_point(hal::fpga_clock::duration(timestamp));
 }
 
-/**
- * Return the timestamp for the falling interrupt that occurred most recently.
- *
- * This is in the same time domain as GetClock().
- * The falling-edge interrupt should be enabled with
- * {@link #DigitalInput.SetUpSourceEdge}
- *
- * @return Timestamp in seconds since boot.
-*/
-double InterruptableSensorBase::ReadFallingTimestamp() {
-  if (StatusIsFatal()) return 0.0;
-  wpi_assert(m_interrupt != HAL_kInvalidHandle);
-  int32_t status = 0;
-  double timestamp = HAL_ReadInterruptFallingTimestamp(m_interrupt, &status);
-  wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
-  return timestamp;
-}
-
-/**
- * Set which edge to trigger interrupts on
- *
- * @param risingEdge  true to interrupt on rising edge
- * @param fallingEdge true to interrupt on falling edge
- */
 void InterruptableSensorBase::SetUpSourceEdge(bool risingEdge,
                                               bool fallingEdge) {
   if (StatusIsFatal()) return;
diff --git a/frc971/wpilib/ahal/InterruptableSensorBase.h b/frc971/wpilib/ahal/InterruptableSensorBase.h
index e19e09b..59ddc9e 100644
--- a/frc971/wpilib/ahal/InterruptableSensorBase.h
+++ b/frc971/wpilib/ahal/InterruptableSensorBase.h
@@ -9,9 +9,10 @@
 
 #include <memory>
 
-#include "HAL/Interrupts.h"
 #include "frc971/wpilib/ahal/AnalogTriggerType.h"
 #include "frc971/wpilib/ahal/SensorBase.h"
+#include "hal/Interrupts.h"
+#include "hal/cpp/fpga_clock.h"
 
 namespace frc {
 
@@ -26,24 +27,36 @@
 
   InterruptableSensorBase();
   virtual ~InterruptableSensorBase() = default;
+
   virtual HAL_Handle GetPortHandleForRouting() const = 0;
   virtual AnalogTriggerType GetAnalogTriggerTypeForRouting() const = 0;
-  virtual void RequestInterrupts(
-      HAL_InterruptHandlerFunction handler,
-      void *param);                  ///< Asynchronous handler version.
-  virtual void RequestInterrupts();  ///< Synchronous Wait version.
-  virtual void
-  CancelInterrupts();  ///< Free up the underlying chipobject functions.
-  virtual WaitResult WaitForInterrupt(
-      double timeout,
-      bool ignorePrevious = true);  ///< Synchronous version.
-  virtual void
-  EnableInterrupts();  ///< Enable interrupts - after finishing setup.
-  virtual void DisableInterrupts();       ///< Disable, but don't deallocate.
-  virtual double ReadRisingTimestamp();   ///< Return the timestamp for the
-                                          /// rising interrupt that occurred.
-  virtual double ReadFallingTimestamp();  ///< Return the timestamp for the
-                                          /// falling interrupt that occurred.
+
+  // Requests interrupts in synchronous mode. This means you should call
+  // WaitForInterrupt to receive interrupts.
+  virtual void RequestInterrupts();
+
+  // Prevents any more interrupts from occuring.
+  virtual void CancelInterrupts();
+
+  // Waits for an interrupt or timeout to occur.
+  //
+  // Must be synchronized with all other operations on the input.
+  //
+  // timeout is in seconds.
+  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.
+  virtual hal::fpga_clock::time_point ReadFallingTimestamp();
+
+  // Configures which edges to interrupt on.
+  //
+  // The default is on rising edges only.
   virtual void SetUpSourceEdge(bool risingEdge, bool fallingEdge);
 
  protected:
diff --git a/frc971/wpilib/ahal/PWM.cc b/frc971/wpilib/ahal/PWM.cc
index 9407a9c..0bf38a3 100644
--- a/frc971/wpilib/ahal/PWM.cc
+++ b/frc971/wpilib/ahal/PWM.cc
@@ -5,13 +5,13 @@
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-#include "HAL/PWM.h"
+#include "hal/PWM.h"
 #include "frc971/wpilib/ahal/PWM.h"
 
 #include <sstream>
 
-#include "HAL/HAL.h"
-#include "HAL/Ports.h"
+#include "hal/HAL.h"
+#include "hal/Ports.h"
 #include "frc971/wpilib/ahal/Utility.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
 
diff --git a/frc971/wpilib/ahal/PWM.h b/frc971/wpilib/ahal/PWM.h
index 9af8d0f..c6e7a25 100644
--- a/frc971/wpilib/ahal/PWM.h
+++ b/frc971/wpilib/ahal/PWM.h
@@ -10,7 +10,7 @@
 #include <memory>
 #include <string>
 
-#include "HAL/Types.h"
+#include "hal/Types.h"
 #include "frc971/wpilib/ahal/SensorBase.h"
 
 namespace frc {
diff --git a/frc971/wpilib/ahal/PowerDistributionPanel.cc b/frc971/wpilib/ahal/PowerDistributionPanel.cc
index 90655c2..d9d106b 100644
--- a/frc971/wpilib/ahal/PowerDistributionPanel.cc
+++ b/frc971/wpilib/ahal/PowerDistributionPanel.cc
@@ -9,9 +9,9 @@
 
 #include <sstream>
 
-#include "HAL/HAL.h"
-#include "HAL/PDP.h"
-#include "HAL/Ports.h"
+#include "hal/HAL.h"
+#include "hal/PDP.h"
+#include "hal/Ports.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
 
 using namespace frc;
diff --git a/frc971/wpilib/ahal/Relay.cc b/frc971/wpilib/ahal/Relay.cc
index b69e7af..e0cd090 100644
--- a/frc971/wpilib/ahal/Relay.cc
+++ b/frc971/wpilib/ahal/Relay.cc
@@ -5,13 +5,13 @@
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-#include "HAL/Relay.h"
+#include "hal/Relay.h"
 #include "frc971/wpilib/ahal/Relay.h"
 
 #include <sstream>
 
-#include "HAL/HAL.h"
-#include "HAL/Ports.h"
+#include "hal/HAL.h"
+#include "hal/Ports.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
 
 using namespace frc;
diff --git a/frc971/wpilib/ahal/Relay.h b/frc971/wpilib/ahal/Relay.h
index ecdd8af..389947c 100644
--- a/frc971/wpilib/ahal/Relay.h
+++ b/frc971/wpilib/ahal/Relay.h
@@ -10,7 +10,7 @@
 #include <memory>
 #include <string>
 
-#include "HAL/Types.h"
+#include "hal/Types.h"
 #include "frc971/wpilib/ahal/SensorBase.h"
 
 namespace frc {
diff --git a/frc971/wpilib/ahal/RobotBase.cc b/frc971/wpilib/ahal/RobotBase.cc
index 35e5570..1ce1d4e 100644
--- a/frc971/wpilib/ahal/RobotBase.cc
+++ b/frc971/wpilib/ahal/RobotBase.cc
@@ -9,7 +9,7 @@
 
 #include <cstdio>
 
-#include "HAL/HAL.h"
+#include "hal/HAL.h"
 #include "frc971/wpilib/ahal/DriverStation.h"
 #include "frc971/wpilib/ahal/Utility.h"
 #include "frc971/wpilib/ahal/WPILibVersion.h"
diff --git a/frc971/wpilib/ahal/RobotBase.h b/frc971/wpilib/ahal/RobotBase.h
index da37e06..df91525 100644
--- a/frc971/wpilib/ahal/RobotBase.h
+++ b/frc971/wpilib/ahal/RobotBase.h
@@ -11,7 +11,7 @@
 #include <iostream>
 #include <thread>
 
-#include "HAL/HAL.h"
+#include "hal/HAL.h"
 #include "frc971/wpilib/ahal/Base.h"
 
 namespace frc {
diff --git a/frc971/wpilib/ahal/SPI.cc b/frc971/wpilib/ahal/SPI.cc
index 84a72db..00e7dc9 100644
--- a/frc971/wpilib/ahal/SPI.cc
+++ b/frc971/wpilib/ahal/SPI.cc
@@ -5,13 +5,13 @@
 /* the project.                                                               */
 /*----------------------------------------------------------------------------*/
 
-#include "HAL/SPI.h"
+#include "hal/SPI.h"
 #include "frc971/wpilib/ahal/SPI.h"
 
 #include <cstring>
 
-#include "HAL/HAL.h"
-#include "llvm/SmallVector.h"
+#include "hal/HAL.h"
+#include "wpi/SmallVector.h"
 
 using namespace frc;
 
@@ -87,7 +87,7 @@
 int SPI::Read(bool initiate, uint8_t *dataReceived, int size) {
   int retVal = 0;
   if (initiate) {
-    llvm::SmallVector<uint8_t, 32> dataToSend;
+    wpi::SmallVector<uint8_t, 32> dataToSend;
     dataToSend.resize(size);
     retVal = HAL_TransactionSPI(m_port, dataToSend.data(), dataReceived, size);
   } else {
diff --git a/frc971/wpilib/ahal/SPI.h b/frc971/wpilib/ahal/SPI.h
index dbac4ae..898f426 100644
--- a/frc971/wpilib/ahal/SPI.h
+++ b/frc971/wpilib/ahal/SPI.h
@@ -7,7 +7,7 @@
 
 #pragma once
 
-#include "HAL/SPI.h"
+#include "hal/SPI.h"
 
 namespace frc {
 
diff --git a/frc971/wpilib/ahal/SensorBase.cc b/frc971/wpilib/ahal/SensorBase.cc
index c6db447..0b796f1 100644
--- a/frc971/wpilib/ahal/SensorBase.cc
+++ b/frc971/wpilib/ahal/SensorBase.cc
@@ -8,15 +8,15 @@
 #include "frc971/wpilib/ahal/SensorBase.h"
 
 #include "FRC_NetworkCommunication/LoadOut.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/Relay.h"
-#include "HAL/Solenoid.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/Relay.h"
+#include "hal/Solenoid.h"
 #include "frc971/wpilib/ahal/WPIErrors.h"
 
 namespace frc {
diff --git a/frc971/wpilib/ahal/Spark.cc b/frc971/wpilib/ahal/Spark.cc
index 9127931..deb891b 100644
--- a/frc971/wpilib/ahal/Spark.cc
+++ b/frc971/wpilib/ahal/Spark.cc
@@ -7,7 +7,7 @@
 
 #include "frc971/wpilib/ahal/Spark.h"
 
-#include <HAL/HAL.h>
+#include <hal/HAL.h>
 
 using namespace frc;
 
diff --git a/frc971/wpilib/ahal/Talon.cc b/frc971/wpilib/ahal/Talon.cc
index 40d8a77..e3af567 100644
--- a/frc971/wpilib/ahal/Talon.cc
+++ b/frc971/wpilib/ahal/Talon.cc
@@ -7,7 +7,7 @@
 
 #include "frc971/wpilib/ahal/Talon.h"
 
-#include "HAL/HAL.h"
+#include "hal/HAL.h"
 
 using namespace frc;
 
diff --git a/frc971/wpilib/ahal/Utility.cc b/frc971/wpilib/ahal/Utility.cc
index 7a00e42..f4b9f38 100644
--- a/frc971/wpilib/ahal/Utility.cc
+++ b/frc971/wpilib/ahal/Utility.cc
@@ -15,10 +15,12 @@
 #include <cstring>
 #include <sstream>
 
-#include "HAL/DriverStation.h"
-#include "HAL/HAL.h"
 #include "frc971/wpilib/ahal/ErrorBase.h"
-#include "llvm/SmallString.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;
 
@@ -28,31 +30,31 @@
  * The users don't call this, but instead use the wpi_assert macros in
  * Utility.h.
  */
-bool wpi_assert_impl(bool conditionValue, llvm::StringRef conditionText,
-                     llvm::StringRef message, llvm::StringRef fileName,
-                     int lineNumber, llvm::StringRef funcName) {
+bool wpi_assert_impl(bool conditionValue, const wpi::Twine &conditionText,
+                     const wpi::Twine &message, wpi::StringRef fileName,
+                     int lineNumber, wpi::StringRef funcName) {
   if (!conditionValue) {
-    std::stringstream locStream;
-    locStream << funcName << " [";
-    llvm::SmallString<128> fileTemp;
-    locStream << basename(fileName.c_str(fileTemp)) << ":" << lineNumber << "]";
+    wpi::SmallString<128> locBuf;
+    wpi::raw_svector_ostream locStream(locBuf);
+    locStream << funcName << " [" << wpi::sys::path::filename(fileName) << ":"
+              << lineNumber << "]";
 
-    std::stringstream errorStream;
+    wpi::SmallString<128> errorBuf;
+    wpi::raw_svector_ostream errorStream(errorBuf);
 
     errorStream << "Assertion \"" << conditionText << "\" ";
 
-    if (message[0] != '\0') {
-      errorStream << "failed: " << message << std::endl;
+    if (message.isTriviallyEmpty() ||
+        (message.isSingleStringRef() && message.getSingleStringRef().empty())) {
+      errorStream << "failed.\n";
     } else {
-      errorStream << "failed." << std::endl;
+      errorStream << "failed: " << message << "\n";
     }
 
     std::string stack = GetStackTrace(2);
-    std::string location = locStream.str();
-    std::string error = errorStream.str();
 
     // Print the error and send it to the DriverStation
-    HAL_SendError(1, 1, 0, error.c_str(), location.c_str(), stack.c_str(), 1);
+    HAL_SendError(1, 1, 0, errorBuf.c_str(), locBuf.c_str(), stack.c_str(), 1);
   }
 
   return conditionValue;
@@ -63,33 +65,34 @@
  * This should not be called directly; it should only be used by
  * wpi_assertEqual_impl and wpi_assertNotEqual_impl.
  */
-void wpi_assertEqual_common_impl(llvm::StringRef valueA, llvm::StringRef valueB,
-                                 llvm::StringRef equalityType,
-                                 llvm::StringRef message,
-                                 llvm::StringRef fileName, int lineNumber,
-                                 llvm::StringRef funcName) {
-  std::stringstream locStream;
-  locStream << funcName << " [";
-  llvm::SmallString<128> fileTemp;
-  locStream << basename(fileName.c_str(fileTemp)) << ":" << lineNumber << "]";
+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 << "]";
 
-  std::stringstream errorStream;
+  wpi::SmallString<128> errorBuf;
+  wpi::raw_svector_ostream errorStream(errorBuf);
 
   errorStream << "Assertion \"" << valueA << " " << equalityType << " "
               << valueB << "\" ";
 
-  if (message[0] != '\0') {
-    errorStream << "failed: " << message << std::endl;
+  if (message.isTriviallyEmpty() ||
+      (message.isSingleStringRef() && message.getSingleStringRef().empty())) {
+    errorStream << "failed.\n";
   } else {
-    errorStream << "failed." << std::endl;
+    errorStream << "failed: " << message << "\n";
   }
 
   std::string trace = GetStackTrace(3);
-  std::string location = locStream.str();
-  std::string error = errorStream.str();
 
   // Print the error and send it to the DriverStation
-  HAL_SendError(1, 1, 0, error.c_str(), location.c_str(), trace.c_str(), 1);
+  HAL_SendError(1, 1, 0, errorBuf.c_str(), locBuf.c_str(), trace.c_str(), 1);
 }
 
 /**
@@ -99,10 +102,11 @@
  * The users don't call this, but instead use the wpi_assertEqual macros in
  * Utility.h.
  */
-bool wpi_assertEqual_impl(int valueA, int valueB, llvm::StringRef valueAString,
-                          llvm::StringRef valueBString, llvm::StringRef message,
-                          llvm::StringRef fileName, int lineNumber,
-                          llvm::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) {
   if (!(valueA == valueB)) {
     wpi_assertEqual_common_impl(valueAString, valueBString, "==", message,
                                 fileName, lineNumber, funcName);
@@ -118,10 +122,10 @@
  * Utility.h.
  */
 bool wpi_assertNotEqual_impl(int valueA, int valueB,
-                             llvm::StringRef valueAString,
-                             llvm::StringRef valueBString,
-                             llvm::StringRef message, llvm::StringRef fileName,
-                             int lineNumber, llvm::StringRef funcName) {
+                             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);
diff --git a/frc971/wpilib/ahal/Utility.h b/frc971/wpilib/ahal/Utility.h
index bf97692..be8dc35 100644
--- a/frc971/wpilib/ahal/Utility.h
+++ b/frc971/wpilib/ahal/Utility.h
@@ -15,7 +15,8 @@
 
 #include <string>
 
-#include "llvm/StringRef.h"
+#include "wpi/StringRef.h"
+#include "wpi/Twine.h"
 
 #define wpi_assert(condition) \
   wpi_assert_impl(condition, #condition, "", __FILE__, __LINE__, __FUNCTION__)
@@ -34,18 +35,19 @@
   wpi_assertNotEqual_impl(a, b, #a, #b, message, __FILE__, __LINE__, \
                           __FUNCTION__)
 
-bool wpi_assert_impl(bool conditionValue, llvm::StringRef conditionText,
-                     llvm::StringRef message, llvm::StringRef fileName,
-                     int lineNumber, llvm::StringRef funcName);
-bool wpi_assertEqual_impl(int valueA, int valueB, llvm::StringRef valueAString,
-                          llvm::StringRef valueBString, llvm::StringRef message,
-                          llvm::StringRef fileName, int lineNumber,
-                          llvm::StringRef funcName);
+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,
-                             llvm::StringRef valueAString,
-                             llvm::StringRef valueBString,
-                             llvm::StringRef message, llvm::StringRef fileName,
-                             int lineNumber, llvm::StringRef funcName);
+                             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);
 
diff --git a/frc971/wpilib/ahal/VictorSP.cc b/frc971/wpilib/ahal/VictorSP.cc
index 7d1741b..fee03a9 100644
--- a/frc971/wpilib/ahal/VictorSP.cc
+++ b/frc971/wpilib/ahal/VictorSP.cc
@@ -7,7 +7,7 @@
 
 #include "frc971/wpilib/ahal/VictorSP.h"
 
-#include "HAL/HAL.h"
+#include "hal/HAL.h"
 
 using namespace frc;
 
diff --git a/frc971/wpilib/buffered_pcm.cc b/frc971/wpilib/buffered_pcm.cc
index 9625073..de8c547 100644
--- a/frc971/wpilib/buffered_pcm.cc
+++ b/frc971/wpilib/buffered_pcm.cc
@@ -2,10 +2,10 @@
 
 #include <inttypes.h>
 
-#include <HAL/HAL.h>
-#include <HAL/Ports.h>
-#include <HAL/Solenoid.h>
 #include "aos/logging/logging.h"
+#include "hal/HAL.h"
+#include "hal/Ports.h"
+#include "hal/Solenoid.h"
 
 namespace frc971 {
 namespace wpilib {
diff --git a/frc971/wpilib/buffered_pcm.h b/frc971/wpilib/buffered_pcm.h
index 877e830..033ded6 100644
--- a/frc971/wpilib/buffered_pcm.h
+++ b/frc971/wpilib/buffered_pcm.h
@@ -3,7 +3,7 @@
 
 #include <memory>
 
-#include <HAL/HAL.h>
+#include <hal/HAL.h>
 
 #include "frc971/wpilib/buffered_solenoid.h"
 
diff --git a/frc971/wpilib/dma.cc b/frc971/wpilib/dma.cc
index a379262..b990532 100644
--- a/frc971/wpilib/dma.cc
+++ b/frc971/wpilib/dma.cc
@@ -5,10 +5,10 @@
 #include <algorithm>
 #include <type_traits>
 
-#include "HAL/HAL.h"
 #include "frc971/wpilib/ahal/AnalogInput.h"
 #include "frc971/wpilib/ahal/DigitalSource.h"
 #include "frc971/wpilib/ahal/Encoder.h"
+#include "hal/HAL.h"
 
 // Interface to the roboRIO FPGA's DMA features.
 
diff --git a/frc971/wpilib/dma.h b/frc971/wpilib/dma.h
index c870728..6d82af8 100644
--- a/frc971/wpilib/dma.h
+++ b/frc971/wpilib/dma.h
@@ -9,7 +9,7 @@
 #include <array>
 #include <memory>
 
-#include "HAL/ChipObject.h"
+#include "hal/ChipObject.h"
 
 class DMA;
 namespace frc {
diff --git a/frc971/wpilib/joystick_sender.cc b/frc971/wpilib/joystick_sender.cc
index e005475..6a3281b 100644
--- a/frc971/wpilib/joystick_sender.cc
+++ b/frc971/wpilib/joystick_sender.cc
@@ -5,8 +5,8 @@
 #include "aos/network/team_number.h"
 #include "aos/logging/queue_logging.h"
 
-#include "HAL/HAL.h"
 #include "frc971/wpilib/ahal/DriverStation.h"
+#include "hal/HAL.h"
 
 namespace frc971 {
 namespace wpilib {
@@ -32,7 +32,6 @@
         new_state->scale_left = match_info.gameSpecificMessage[1] == 'L' ||
                                 match_info.gameSpecificMessage[1] == 'l';
       }
-      HAL_FreeMatchInfo(&match_info);
 
       new_state->test_mode = ds->IsTestMode();
       new_state->fms_attached = ds->IsFmsAttached();
diff --git a/frc971/wpilib/wpilib_interface.cc b/frc971/wpilib/wpilib_interface.cc
index 8db81e1..4dddd91 100644
--- a/frc971/wpilib/wpilib_interface.cc
+++ b/frc971/wpilib/wpilib_interface.cc
@@ -3,7 +3,7 @@
 #include "aos/robot_state/robot_state.q.h"
 #include "aos/logging/queue_logging.h"
 
-#include <HAL/HAL.h>
+#include "hal/HAL.h"
 
 namespace frc971 {
 namespace wpilib {
diff --git a/third_party/BUILD b/third_party/BUILD
index 934486e..d67d4b4 100644
--- a/third_party/BUILD
+++ b/third_party/BUILD
@@ -10,5 +10,17 @@
     name = "wpilib_hal",
     restricted_to = ["//tools:roborio"],
     visibility = ["//visibility:public"],
-    deps = ["//third_party/allwpilib_2018:hal"],
+    deps = ["//third_party/allwpilib_2019:hal"],
+)
+
+cc_library(
+    name = "phoenix",
+    restricted_to = ["//tools:roborio"],
+    visibility = ["//visibility:public"],
+    deps = [
+        "@ctre_phoenix_api_cpp_athena_2019//:api-cpp",
+        "@ctre_phoenix_api_cpp_headers_2019//:api-cpp",
+        "@ctre_phoenix_cci_athena_2019//:cci",
+        "@ctre_phoenix_cci_headers_2019//:cci",
+    ],
 )
diff --git a/third_party/allwpilib_2019/BUILD b/third_party/allwpilib_2019/BUILD
index ea548fc..e35687d 100644
--- a/third_party/allwpilib_2019/BUILD
+++ b/third_party/allwpilib_2019/BUILD
@@ -63,9 +63,10 @@
     srcs = glob(
         include = [
             "hal/src/main/native/athena/*.cpp",
-            "hal/src/main/native/athena/cpp/*.cpp",
+            "hal/src/main/native/cpp/cpp/*.cpp",
             "hal/src/main/native/athena/ctre/*.cpp",
             "hal/src/main/native/shared/handles/*.cpp",
+            "hal/src/main/native/cpp/handles/*.cpp",
         ],
         exclude = ["**/%s.*" % d for d in _excluded_devices],
     ),
diff --git a/third_party/allwpilib_2019/wpiutil/BUILD b/third_party/allwpilib_2019/wpiutil/BUILD
index aceed4a..e579466 100644
--- a/third_party/allwpilib_2019/wpiutil/BUILD
+++ b/third_party/allwpilib_2019/wpiutil/BUILD
@@ -4,9 +4,12 @@
     name = "wpiutil",
     srcs = glob([
         "src/main/native/cpp/llvm/*.cpp",
+    ]) + [
         "src/main/native/cpp/llvm/Unix/Path.inc",
-        "src/main/native/cpp/support/timestamp.cpp",
-    ]),
+        "src/main/native/cpp/timestamp.cpp",
+        "src/main/native/cpp/SafeThread.cpp",
+        "src/main/native/cpp/memory.cpp",
+    ],
     hdrs = glob([
         "src/main/native/include/**",
     ]),
diff --git a/third_party/cddlib/lib-src/cddlib.c b/third_party/cddlib/lib-src/cddlib.c
index ca9469f..1fb9551 100644
--- a/third_party/cddlib/lib-src/cddlib.c
+++ b/third_party/cddlib/lib-src/cddlib.c
@@ -114,7 +114,7 @@
     }
     if (!cone->PreOrderedRun){
       for (itemp=1; cone->OrderVector[itemp]!=hh; itemp++);
-        otemp=cone->OrderVector[cone->Iteration];
+      otemp=cone->OrderVector[cone->Iteration];
       cone->OrderVector[cone->Iteration]=hh;
         /* store the dynamic ordering in ordervec */
       cone->OrderVector[itemp]=otemp;
diff --git a/third_party/ceres/BUILD b/third_party/ceres/BUILD
index 216b1b5..8bc1dde 100644
--- a/third_party/ceres/BUILD
+++ b/third_party/ceres/BUILD
@@ -32,6 +32,7 @@
 # not support parameterization around threading choice or sparse backends.
 
 load("//:bazel/ceres.bzl", "ceres_library")
+load("@//tools/build_rules:select.bzl", "cpu_select")
 
 ceres_library(
     name = "ceres",
@@ -170,7 +171,10 @@
     "-Wno-format-nonliteral",
     "-Wno-missing-braces",
     "-Wno-missing-field-initializers",
-]
+] + cpu_select({
+    "roborio": ["-Wno-nonnull-compare"],
+    "else": [],
+})
 
 TEST_DEPS = [
     "//:ceres",
diff --git a/third_party/googletest/googlemock/test/BUILD.bazel b/third_party/googletest/googlemock/test/BUILD.bazel
index 550a77a..541ef8e 100644
--- a/third_party/googletest/googlemock/test/BUILD.bazel
+++ b/third_party/googletest/googlemock/test/BUILD.bazel
@@ -46,6 +46,7 @@
     ),
     copts = [
         "-Wno-unused-parameter",
+        "-Wno-unused-function",
     ],
     deps = ["//third_party/googletest:gtest"],
 )
diff --git a/third_party/libjpeg/BUILD b/third_party/libjpeg/BUILD
index 3fb36ec..2f3a812 100644
--- a/third_party/libjpeg/BUILD
+++ b/third_party/libjpeg/BUILD
@@ -65,7 +65,16 @@
         "-Wno-switch-enum",
         "-Wno-format-nonliteral",
         "-Wno-unused-parameter",
-    ],
+    ] + select({
+        "//tools:cpu_roborio": [
+            # This is sketchy under the standard, but it's a known issue with
+            # libjpeg which isn't particularly well defined by the JPEG standard
+            # either. We should be fine because all our platforms are two's
+            # complement.
+            "-Wno-shift-negative-value",
+        ],
+        "//conditions:default": [],
+    }),
     includes = ["src/main/c"],
     visibility = ["//visibility:public"],
 )
diff --git a/tools/build_rules/select.bzl b/tools/build_rules/select.bzl
index 2d0bce5..8754f26 100644
--- a/tools/build_rules/select.bzl
+++ b/tools/build_rules/select.bzl
@@ -40,9 +40,9 @@
     if key not in all_cpus and key != 'else':
       fail('Not sure what a %s CPU is!' % key, 'values')
   return select({
-    '//tools:cpu_k8': values['amd64'],
-    '//tools:cpu_roborio': values['roborio'],
-    '//tools:cpu_armhf': values['armhf'],
+    '@//tools:cpu_k8': values['amd64'],
+    '@//tools:cpu_roborio': values['roborio'],
+    '@//tools:cpu_armhf': values['armhf'],
   })
 
 """A select wrapper for address space sizes.
@@ -58,9 +58,9 @@
   if '64' not in values:
     fail('Need to handle 64 bit addresses!', 'values')
   return select({
-    '//tools:cpu_k8': values['64'],
-    '//tools:cpu_roborio': values['32'],
-    '//tools:cpu_armhf': values['32'],
+    '@//tools:cpu_k8': values['64'],
+    '@//tools:cpu_roborio': values['32'],
+    '@//tools:cpu_armhf': values['32'],
   })
 
 """A select wrapper for compilers.
diff --git a/tools/cpp/CROSSTOOL b/tools/cpp/CROSSTOOL
index a530233..12d69ec 100644
--- a/tools/cpp/CROSSTOOL
+++ b/tools/cpp/CROSSTOOL
@@ -343,6 +343,10 @@
     path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ar"
   }
   tool_path {
+    name: "as"
+    path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-as"
+  }
+  tool_path {
     name: "compat-ld"
     path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ld"
   }
@@ -398,13 +402,10 @@
   linking_mode_flags {
     mode: DYNAMIC
   }
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%/c++/5.4.0"
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%/c++/5.4.0/arm-frc-linux-gnueabi"
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%/c++/5.4.0/backward"
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include)%"
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include-fixed)%"
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%"
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/usr/include)%"
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//arm-frc2019-linux-gnueabi/usr/lib/gcc/arm-frc2019-linux-gnueabi/6.3.0/include)%"
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//arm-frc2019-linux-gnueabi/usr/lib/gcc/arm-frc2019-linux-gnueabi/6.3.0/include-fixed)%"
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//arm-frc2019-linux-gnueabi/usr/include/c++/6.3.0/arm-frc2019-linux-gnueabi)%"
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//arm-frc2019-linux-gnueabi/usr/include/c++/6.3.0/backward)%"
   builtin_sysroot: ""
   unfiltered_cxx_flag: "-no-canonical-prefixes"
   unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
@@ -429,14 +430,41 @@
       action: "lto-backend"
       action: "clif-match"
       flag_group {
-        flag: "--sysroot=external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi"
+        flag: "--sysroot=external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi"
         flag: "-nostdinc"
         flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include"
+        flag: "external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi/usr/lib/gcc/arm-frc2019-linux-gnueabi/6.3.0/include"
         flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include-fixed"
+        flag: "external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi/usr/lib/gcc/arm-frc2019-linux-gnueabi/6.3.0/include-fixed"
+      }
+    }
+    flag_set {
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      flag_group {
         flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/usr/include"
+        flag: "external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi/usr/include/c++/6.3.0"
+        flag: "-isystem"
+        flag: "external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi/usr/include/c++/6.3.0/arm-frc2019-linux-gnueabi"
+        flag: "-isystem"
+        flag: "external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi/usr/include/c++/6.3.0/backward"
+      }
+    }
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-isystem"
+        flag: "external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi/usr/include"
         flag: "-mfpu=neon"
         flag: "-D__STDC_FORMAT_MACROS"
         flag: "-D__STDC_CONSTANT_MACROS"
@@ -498,34 +526,6 @@
     implies: "opt_post"
   }
   feature {
-    name: "compile_flags2"
-    flag_set {
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include/c++/5.4.0"
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include/c++/5.4.0/arm-frc-linux-gnueabi"
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include/c++/5.4.0/backward"
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include"
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include-fixed"
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include"
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/usr/include"
-      }
-    }
-    enabled: true
-  }
-  feature {
     name: "dependency_file"
     flag_set {
       action: "assemble"
@@ -676,6 +676,7 @@
       action: "c++-module-compile"
       flag_group {
         flag: "-std=gnu++1y"
+        flag: "-fno-sized-deallocation"
       }
     }
     flag_set {
diff --git a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ar b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ar
index 5725bbb..09e37a4 100755
--- a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ar
+++ b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ar
@@ -4,6 +4,6 @@
 LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/arm_frc_gnueabi_deps/lib/x86_64-linux-gnu"
 export LD_LIBRARY_PATH
 
-exec -a arm-frc-linux-gnueabi-ar \
-	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/usr/bin/arm-frc-linux-gnueabi-ar" \
+exec -a arm-frc2019-linux-gnueabi-ar \
+	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/bin/arm-frc2019-linux-gnueabi-ar" \
 	"$@"
diff --git a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-as b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-as
index 6e67db8..df82796 100755
--- a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-as
+++ b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-as
@@ -4,6 +4,6 @@
 LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/arm_frc_gnueabi_deps/lib/x86_64-linux-gnu"
 export LD_LIBRARY_PATH
 
-exec -a arm-frc-linux-gnueabi-as \
-	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/usr/bin/arm-frc-linux-gnueabi-as" \
+exec -a arm-frc2019-linux-gnueabi-as \
+	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/bin/arm-frc2019-linux-gnueabi-as" \
 	"$@"
diff --git a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-cpp b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-cpp
index d2968e3..00e88d6 100755
--- a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-cpp
+++ b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-cpp
@@ -4,6 +4,6 @@
 LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/arm_frc_gnueabi_deps/lib/x86_64-linux-gnu"
 export LD_LIBRARY_PATH
 
-exec -a arm-frc-linux-gnueabi-cpp \
-	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/usr/bin/arm-frc-linux-gnueabi-cpp" \
+exec -a arm-frc2019-linux-gnueabi-cpp \
+	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/bin/arm-frc2019-linux-gnueabi-cpp" \
 	"$@"
diff --git a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-dwp b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-dwp
index 697f65a..9201bbe 100755
--- a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-dwp
+++ b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-dwp
@@ -4,6 +4,6 @@
 LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/arm_frc_gnueabi_deps/lib/x86_64-linux-gnu"
 export LD_LIBRARY_PATH
 
-exec -a arm-frc-linux-gnueabi-dwp \
-	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/usr/bin/arm-frc-linux-gnueabi-dwp" \
+exec -a arm-frc2019-linux-gnueabi-dwp \
+	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/bin/arm-frc2019-linux-gnueabi-dwp" \
 	"$@"
diff --git a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcc b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcc
index 7b127aa..33bf997 100755
--- a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcc
+++ b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcc
@@ -4,6 +4,5 @@
 LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/arm_frc_gnueabi_deps/lib/x86_64-linux-gnu"
 export LD_LIBRARY_PATH
 
-exec \
-	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/usr/bin/arm-frc-linux-gnueabi-gcc" \
+exec "${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/bin/arm-frc2019-linux-gnueabi-gcc" \
 	"$@"
diff --git a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcov b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcov
index 35d71c2..2f0a64e 100755
--- a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcov
+++ b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcov
@@ -4,6 +4,6 @@
 LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/arm_frc_gnueabi_deps/lib/x86_64-linux-gnu"
 export LD_LIBRARY_PATH
 
-exec -a arm-frc-linux-gnueabi-gcov \
-	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/usr/bin/arm-frc-linux-gnueabi-gcov" \
+exec -a arm-frc2019-linux-gnueabi-gcov \
+	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/bin/arm-frc2019-linux-gnueabi-gcov" \
 	"$@"
diff --git a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ld b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ld
index f3dc5ef..862fb3c 100755
--- a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ld
+++ b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ld
@@ -4,6 +4,6 @@
 LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/arm_frc_gnueabi_deps/lib/x86_64-linux-gnu"
 export LD_LIBRARY_PATH
 
-exec -a arm-frc-linux-gnueabi-ld \
-	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/usr/bin/arm-frc-linux-gnueabi-ld" \
+exec -a arm-frc2019-linux-gnueabi-ld \
+	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/bin/arm-frc2019-linux-gnueabi-ld" \
 	"$@"
diff --git a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-nm b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-nm
index b9bc2b8..1436464 100755
--- a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-nm
+++ b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-nm
@@ -4,6 +4,6 @@
 LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/arm_frc_gnueabi_deps/lib/x86_64-linux-gnu"
 export LD_LIBRARY_PATH
 
-exec -a arm-frc-linux-gnueabi-nm \
-	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/usr/bin/arm-frc-linux-gnueabi-nm" \
+exec -a arm-frc2019-linux-gnueabi-nm \
+	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/bin/arm-frc2019-linux-gnueabi-nm" \
 	"$@"
diff --git a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objcopy b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objcopy
index 04381fa..fec13a6 100755
--- a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objcopy
+++ b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objcopy
@@ -4,6 +4,6 @@
 LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/arm_frc_gnueabi_deps/lib/x86_64-linux-gnu"
 export LD_LIBRARY_PATH
 
-exec -a arm-frc-linux-gnueabi-objcopy \
-	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/usr/bin/arm-frc-linux-gnueabi-objcopy" \
+exec -a arm-frc2019-linux-gnueabi-objcopy \
+	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/bin/arm-frc2019-linux-gnueabi-objcopy" \
 	"$@"
diff --git a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objdump b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objdump
index 2c6a99c..d305185 100755
--- a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objdump
+++ b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objdump
@@ -4,6 +4,6 @@
 LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/arm_frc_gnueabi_deps/lib/x86_64-linux-gnu"
 export LD_LIBRARY_PATH
 
-exec -a arm-frc-linux-gnueabi-objdump \
-	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/usr/bin/arm-frc-linux-gnueabi-objdump" \
+exec -a arm-frc2019-linux-gnueabi-objdump \
+	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/bin/arm-frc2019-linux-gnueabi-objdump" \
 	"$@"
diff --git a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-strip b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-strip
index 78a0f65..3de77a6 100755
--- a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-strip
+++ b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-strip
@@ -4,6 +4,6 @@
 LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/arm_frc_gnueabi_deps/lib/x86_64-linux-gnu"
 export LD_LIBRARY_PATH
 
-exec -a arm-frc-linux-gnueabi-strip \
-	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/usr/bin/arm-frc-linux-gnueabi-strip" \
+exec -a arm-frc2019-linux-gnueabi-strip \
+	"${BAZEL_OUTPUT_ROOT}external/arm_frc_linux_gnueabi_repo/bin/arm-frc2019-linux-gnueabi-strip" \
 	"$@"
diff --git a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi.BUILD b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi.BUILD
index a2725fe..51b17a7 100644
--- a/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi.BUILD
+++ b/tools/cpp/arm-frc-linux-gnueabi/arm-frc-linux-gnueabi.BUILD
@@ -1,72 +1,75 @@
 package(default_visibility = ["//visibility:public"])
 
+prefix = "arm-frc2019-linux-gnueabi"
+
 filegroup(
     name = "gcc",
     srcs = [
-        "usr/bin/arm-frc-linux-gnueabi-gcc",
+        "bin/" + prefix + "-gcc",
     ],
 )
 
 filegroup(
     name = "ar",
     srcs = [
-        "usr/bin/arm-frc-linux-gnueabi-ar",
+        "bin/" + prefix + "-ar",
     ],
 )
 
 filegroup(
     name = "as",
     srcs = [
-        "usr/bin/arm-frc-linux-gnueabi-as",
+        "bin/" + prefix + "-as",
     ],
 )
 
 filegroup(
     name = "ld",
     srcs = [
-        "usr/bin/arm-frc-linux-gnueabi-ld",
+        "bin/" + prefix + "-ld",
     ],
 )
 
 filegroup(
     name = "nm",
     srcs = [
-        "usr/bin/arm-frc-linux-gnueabi-nm",
+        "bin/" + prefix + "-nm",
     ],
 )
 
 filegroup(
     name = "objcopy",
     srcs = [
-        "usr/bin/arm-frc-linux-gnueabi-objcopy",
+        "bin/" + prefix + "-objcopy",
     ],
 )
 
 filegroup(
     name = "objdump",
     srcs = [
-        "usr/bin/arm-frc-linux-gnueabi-objdump",
+        "bin/" + prefix + "-objdump",
     ],
 )
 
 filegroup(
     name = "strip",
     srcs = [
-        "usr/bin/arm-frc-linux-gnueabi-strip",
+        "bin/" + prefix + "-strip",
     ],
 )
 
 filegroup(
     name = "compiler_pieces",
-    srcs = glob([
-        "usr/bin/**/*",
-        "usr/include/**/*",
-        "usr/lib/**/*",
-        "usr/arm-frc-linux-gnueabi/**/*",
-        "usr/lib/x86_64-linux-gnu/gcc/**/*",
-    ]) + [
-        "@arm_frc_gnueabi_deps",
-    ],
+    srcs = glob([prefix + "/" + s for s in [
+        "usr/include/**",
+        "usr/lib/**",
+        "lib/**",
+        "bin/**",
+        "**"
+    ]] + [
+        "libexec/gcc/" + prefix + "/6.3.0/**",
+        "bin/**",
+    ]),
 )
 
 filegroup(
diff --git a/tools/cpp/static_crosstool.pb b/tools/cpp/static_crosstool.pb
index 682ce1e..778a70d 100644
--- a/tools/cpp/static_crosstool.pb
+++ b/tools/cpp/static_crosstool.pb
@@ -343,6 +343,7 @@
   supports_thin_archives: false
 
   tool_path { name: "ar" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ar" }
+  tool_path { name: "as" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-as" }
   tool_path { name: "compat-ld" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ld" }
   tool_path { name: "cpp" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-cpp" }
   tool_path { name: "dwp" path: "/bin/false" }
@@ -373,14 +374,44 @@
       action: "lto-backend"
       action: "clif-match"
       flag_group {
-        flag: "--sysroot=external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi"
+        flag: "--sysroot=external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi"
         flag: "-nostdinc"
         flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include"
+        flag: "external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi/usr/lib/gcc/arm-frc2019-linux-gnueabi/6.3.0/include"
         flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include-fixed"
+        flag: "external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi/usr/lib/gcc/arm-frc2019-linux-gnueabi/6.3.0/include-fixed"
+      }
+    }
+
+    flag_set {
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      flag_group {
         flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/usr/include"
+        flag: "external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi/usr/include/c++/6.3.0"
+        flag: "-isystem"
+        flag: "external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi/usr/include/c++/6.3.0/arm-frc2019-linux-gnueabi"
+        flag: "-isystem"
+        flag: "external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi/usr/include/c++/6.3.0/backward"
+      }
+    }
+
+    flag_set {
+      action: "assemble"
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-module-compile"
+      action: "c++-module-codegen"
+      action: "lto-backend"
+      action: "clif-match"
+      flag_group {
+        flag: "-isystem"
+        flag: "external/arm_frc_linux_gnueabi_repo/arm-frc2019-linux-gnueabi/usr/include"
+
         flag: "-mfpu=neon"
 
         # Things that the code wants defined.
@@ -462,46 +493,15 @@
     }
   }
 
-  feature {
-    name: "compile_flags2"
-    enabled: true
-    flag_set {
-      action: "c++-compile"
-      action: "c++-header-parsing"
-      action: "c++-module-compile"
-      action: "c++-module-codegen"
-      action: "lto-backend"
-      action: "clif-match"
-      flag_group {
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include/c++/5.4.0"
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include/c++/5.4.0/arm-frc-linux-gnueabi"
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include/c++/5.4.0/backward"
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include"
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include-fixed"
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include"
-        flag: "-isystem"
-        flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/usr/include"
-      }
-    }
-  }
-
   # TODO(bazel-team): In theory, the path here ought to exactly match the path
   # used by gcc. That works because bazel currently doesn't track files at
   # absolute locations and has no remote execution, yet. However, this will need
   # to be fixed, maybe with auto-detection?
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%/c++/5.4.0"
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%/c++/5.4.0/arm-frc-linux-gnueabi"
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%/c++/5.4.0/backward"
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include)%"
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include-fixed)%"
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%"
-  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/usr/include)%"
+
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//arm-frc2019-linux-gnueabi/usr/lib/gcc/arm-frc2019-linux-gnueabi/6.3.0/include)%"
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//arm-frc2019-linux-gnueabi/usr/lib/gcc/arm-frc2019-linux-gnueabi/6.3.0/include-fixed)%"
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//arm-frc2019-linux-gnueabi/usr/include/c++/6.3.0/arm-frc2019-linux-gnueabi)%"
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//arm-frc2019-linux-gnueabi/usr/include/c++/6.3.0/backward)%"
 
   linker_flag: "-lstdc++"
   linker_flag: "-Ltools/cpp/arm-frc-linux-gnueabi/libs"
@@ -670,6 +670,7 @@
       action: "c++-module-compile"
       flag_group {
         flag: "-std=gnu++1y"
+        flag: "-fno-sized-deallocation"
       }
     }
     flag_set {
diff --git a/y2018/BUILD b/y2018/BUILD
index 18a8ba0..5285116 100644
--- a/y2018/BUILD
+++ b/y2018/BUILD
@@ -95,8 +95,8 @@
         "//frc971/wpilib:pdp_fetcher",
         "//frc971/wpilib:sensor_reader",
         "//frc971/wpilib:wpilib_robot_base",
+        "//third_party:phoenix",
         "//third_party:wpilib",
-        "//third_party/Phoenix-frc-lib:phoenix",
         "//y2018:constants",
         "//y2018/control_loops/superstructure:superstructure_queue",
         "//y2018/vision:vision_queue",
diff --git a/y2019/BUILD b/y2019/BUILD
index a4f498b..c00f25b 100644
--- a/y2019/BUILD
+++ b/y2019/BUILD
@@ -70,8 +70,8 @@
         "//frc971/wpilib:sensor_reader",
         "//frc971/wpilib:wpilib_interface",
         "//frc971/wpilib:wpilib_robot_base",
+        "//third_party:phoenix",
         "//third_party:wpilib",
-        "//third_party/Phoenix-frc-lib:phoenix",
         "//y2019/control_loops/superstructure:superstructure_queue",
     ],
 )
diff --git a/y2019/wpilib_interface.cc b/y2019/wpilib_interface.cc
index 221bb51..eee7342 100644
--- a/y2019/wpilib_interface.cc
+++ b/y2019/wpilib_interface.cc
@@ -42,7 +42,7 @@
 #include "frc971/wpilib/pdp_fetcher.h"
 #include "frc971/wpilib/sensor_reader.h"
 #include "frc971/wpilib/wpilib_robot_base.h"
-#include "third_party/Phoenix-frc-lib/cpp/include/ctre/phoenix/MotorControl/CAN/TalonSRX.h"
+#include "ctre/phoenix/motorcontrol/can/TalonSRX.h"
 #include "y2019/constants.h"
 #include "y2019/control_loops/superstructure/superstructure.q.h"