Set up for using WPILib 2016

It works if you switch which line in //aos/externals:BUILD is commented
out.

Change-Id: I19f4d7a1d95554cff0dc29f9fd4a163b9d0cafd5
diff --git a/NO_BUILD_AMD64 b/NO_BUILD_AMD64
index bfc83b1..c29bb2c 100644
--- a/NO_BUILD_AMD64
+++ b/NO_BUILD_AMD64
@@ -1,5 +1,7 @@
 -//aos/externals:wpilib
 -//aos/externals:wpilib_2015
+-//third_party/allwpilib_2016/...
+-//third_party/ntcore_2016/...
 -//frc971/wpilib/...
 -//y2014/wpilib/...
 -//y2014:download
diff --git a/WORKSPACE b/WORKSPACE
index 221437a..0a1c4b7 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -47,3 +47,16 @@
   name = 'python-glog',
   actual = '@python-glog-repo//:glog',
 )
+
+new_http_archive(
+  name = 'allwpilib_ni-libraries_repo',
+  build_file = 'debian/ni-libraries.BUILD',
+  sha256 = '821687afbee2d7531fb3e47d8d58ac10005695e59685be3ac3aa00b3179faf52',
+  url = 'http://frc971.org/Build-Dependencies/allwpilib_ni-libraries_20749ed.tar.gz',
+  strip_prefix = 'ni-libraries',
+)
+
+bind(
+  name = 'ni-libraries',
+  actual = '@allwpilib_ni-libraries_repo//:ni-libraries',
+)
diff --git a/aos/externals/BUILD b/aos/externals/BUILD
index e40bbbb..d85de28 100644
--- a/aos/externals/BUILD
+++ b/aos/externals/BUILD
@@ -1,5 +1,4 @@
 _header_dirs = [
-  'forwpilib',
   'allwpilib/wpilibc/wpilibC++/include',
   'allwpilib/wpilibc/wpilibC++Devices/include',
   'allwpilib/hal/include',
@@ -22,7 +21,6 @@
     'allwpilib/wpilibc/wpilibC++Devices/include/NetworkCommunication/FRCComm.h',
   ]) + [
     'allwpilib/hal/lib/Athena/NetworkCommunication/FRCComm.h',
-    'forwpilib/dma.cc',
     'allwpilib/ni-libraries/libFRC_NetworkCommunication.so.1.5.0',
     'allwpilib/ni-libraries/libRoboRIO_FRC_ChipObject.so.1.2.0',
     'allwpilib/ni-libraries/libNiFpgaLv.so.14.0.0',
@@ -51,5 +49,15 @@
   visibility = ['//visibility:public'],
   deps = [
     ':wpilib_2015',
+    #'//third_party/allwpilib_2016:wpilib',
+  ],
+  includes = [
+    'forwpilib',
+  ],
+  hdrs = [
+    'forwpilib/dma.h',
+  ],
+  srcs = [
+    'forwpilib/dma.cc',
   ],
 )
diff --git a/debian/ni-libraries.BUILD b/debian/ni-libraries.BUILD
new file mode 100644
index 0000000..4e809cc
--- /dev/null
+++ b/debian/ni-libraries.BUILD
@@ -0,0 +1,14 @@
+cc_library(
+  name = 'ni-libraries',
+  visibility = ['//visibility:public'],
+  srcs = [
+    'libFRC_NetworkCommunication.so.16.0.0',
+    'libRoboRIO_FRC_ChipObject.so.16.0.0',
+    'libNiFpgaLv.so.15.0.0',
+    'libNiFpga.so.15.0.0',
+    'libNiRioSrv.so.15.0.0',
+    'libspi.so.1.0.0',
+    'libi2c.so.1.0.0',
+  ],
+  linkstatic = True,
+)
diff --git a/doc/allwpilib_ni-libraries_tarball.sh b/doc/allwpilib_ni-libraries_tarball.sh
new file mode 100755
index 0000000..61fccd4
--- /dev/null
+++ b/doc/allwpilib_ni-libraries_tarball.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# A script to generate a allwpilib_ni-libraries_bla.tar.gz file from a given
+# revision of allwpilib.
+
+# Example: ./doc/allwpilib_ni-libraries_tarball.sh \
+#   https://usfirst.collab.net/gerrit/allwpilib master
+
+set -e
+set -u
+set -o pipefail
+
+if [ $# -ne 2 ]; then
+  echo "Usage: $0 remote ref" >&2
+  exit 1
+fi
+
+REMOTE="$1"
+REF="$2"
+
+git fetch "${REMOTE}" "${REF}"
+
+git archive \
+  -o allwpilib_ni-libraries_$(git rev-parse --short FETCH_HEAD).tar.gz \
+  FETCH_HEAD ni-libraries
diff --git a/frc971/wpilib/LPD8806.cc b/frc971/wpilib/LPD8806.cc
index 6f6304f..d82e38f 100644
--- a/frc971/wpilib/LPD8806.cc
+++ b/frc971/wpilib/LPD8806.cc
@@ -3,6 +3,7 @@
 #include "frc971/queues/gyro.q.h"
 
 #include "SPI.h"
+#undef ERROR
 
 namespace frc971 {
 namespace wpilib {
diff --git a/frc971/wpilib/LPD8806.h b/frc971/wpilib/LPD8806.h
index 48f17ae..84c4667 100644
--- a/frc971/wpilib/LPD8806.h
+++ b/frc971/wpilib/LPD8806.h
@@ -7,6 +7,7 @@
 #include "aos/common/mutex.h"
 
 #include "SPI.h"
+#undef ERROR
 
 namespace frc971 {
 namespace wpilib {
diff --git a/frc971/wpilib/wpilib_interface.cc b/frc971/wpilib/wpilib_interface.cc
index 68e0771..2129ec3 100644
--- a/frc971/wpilib/wpilib_interface.cc
+++ b/frc971/wpilib/wpilib_interface.cc
@@ -1,11 +1,12 @@
 #include "frc971/wpilib/wpilib_interface.h"
 
-#include "DriverStation.h"
-#include "ControllerPower.h"
-
 #include "aos/common/messages/robot_state.q.h"
 #include "aos/common/logging/queue_logging.h"
 
+#include "DriverStation.h"
+#include "ControllerPower.h"
+#undef ERROR
+
 namespace frc971 {
 namespace wpilib {
 
diff --git a/third_party/allwpilib_2016/BUILD b/third_party/allwpilib_2016/BUILD
new file mode 100644
index 0000000..330b330
--- /dev/null
+++ b/third_party/allwpilib_2016/BUILD
@@ -0,0 +1,49 @@
+licenses(['notice'])
+
+_header_dirs = [
+  'wpilibc/wpilibC++/include',
+  'wpilibc/wpilibC++Devices/include',
+  'wpilibc/shared/include',
+  'wpilibc/Athena/include',
+  'hal/include',
+  'hal/lib/Athena/FRC_FPGA_ChipObject',
+  'hal/lib/Athena',
+]
+
+cc_library(
+ name = 'wpilib',
+ visibility = ['//visibility:public'],
+ srcs = glob([
+   'wpilibc/Athena/src/*.cpp',
+   'wpilibc/Athena/src/Internal/*.cpp',
+   'wpilibc/shared/src/**/*.cpp',
+
+   'hal/lib/Athena/*.cpp',
+   'hal/lib/Athena/cpp/*.cpp',
+   'hal/lib/Athena/ctre/*.cpp',
+   'hal/lib/Shared/*.cpp',
+
+   'networktables/ntcore/src/**/*.cpp',
+ ]),
+ copts = [
+   '-Wno-unused-parameter',
+   '-Wno-switch-enum',
+   '-Wno-attributes',
+   '-Wno-cast-align',
+   '-Wno-cast-qual',
+   '-Wno-deprecated-declarations',
+   '-Wno-error',
+ ],
+ deps = [
+   '//third_party/ntcore_2016:ntcore',
+   '//external:ni-libraries',
+ ],
+ hdrs = glob([d + '/**/*.h' for d in _header_dirs]) + glob([d + '/**/*.hpp' for d in _header_dirs]) + ['wpilibc/shared/include/Task.inc'],
+ includes = _header_dirs,
+ linkopts = [
+   '-lpthread',
+ ],
+ defines = [
+   'WPILIB2016=1',
+ ],
+)
diff --git a/third_party/ntcore_2016/BUILD b/third_party/ntcore_2016/BUILD
new file mode 100644
index 0000000..aa53ab1
--- /dev/null
+++ b/third_party/ntcore_2016/BUILD
@@ -0,0 +1,23 @@
+licenses(['notice'])
+
+cc_library(
+  name = 'ntcore',
+  visibility = ['//visibility:public'],
+  srcs = glob([
+    'src/**/*.cpp',
+    'src/**/*.h',
+  ]),
+  copts = [
+    '-Wno-switch-enum',
+    '-Wno-cast-align',
+  ],
+  hdrs = glob([
+    'include/**/*.h',
+  ]),
+  includes = [
+    'include',
+  ],
+  linkopts = [
+    '-lpthread',
+  ],
+)