hooked up the battery voltage and analog hall effect shifter stuff
diff --git a/frc971/constants.cc b/frc971/constants.cc
index 76a5f3b..97ff82b 100644
--- a/frc971/constants.cc
+++ b/frc971/constants.cc
@@ -73,6 +73,14 @@
 const int kCompDrivetrainGearboxPinion = 19;
 const int kPracticeDrivetrainGearboxPinion = 17;
 
+const ShifterHallEffect kCompLeftDriveShifter{1.5, 1, 1.2, 1.0};
+const ShifterHallEffect kCompRightDriveShifter{1.5, 1, 1.2, 1.0};
+
+const ShifterHallEffect kPracticeLeftDriveShifter{2.082283, 0.834433, 0.60,
+                                                  0.47};
+const ShifterHallEffect kPracticeRightDriveShifter{2.070124, 0.838993, 0.62,
+                                                   0.55};
+
 const Values *DoGetValues() {
   uint16_t team = ::aos::network::GetTeamNumber();
   LOG(INFO, "creating a Constants for team %" PRIu16 "\n", team);
@@ -96,6 +104,8 @@
                         kAngleAdjustZeroingOffSpeed,
                         kCompAngleAdjustDeadband,
                         kCompDrivetrainGearboxPinion,
+                        kCompLeftDriveShifter,
+                        kCompRightDriveShifter,
                         kCompCameraCenter};
       break;
     case kPracticeTeamNumber:
@@ -117,6 +127,8 @@
                         kAngleAdjustZeroingOffSpeed,
                         kPracticeAngleAdjustDeadband,
                         kPracticeDrivetrainGearboxPinion,
+                        kPracticeLeftDriveShifter,
+                        kPracticeRightDriveShifter,
                         kPracticeCameraCenter};
       break;
     default:
diff --git a/frc971/constants.h b/frc971/constants.h
index 0c9bfdd..da748d9 100644
--- a/frc971/constants.h
+++ b/frc971/constants.h
@@ -12,6 +12,13 @@
 const uint16_t kCompTeamNumber = 5971;
 const uint16_t kPracticeTeamNumber = 971;
 
+// Contains the voltages for an analog hall effect sensor on a shifter.
+struct ShifterHallEffect {
+  double high, low;
+
+  double clear_high, clear_low;
+};
+
 // This structure contains current values for all of the things that change.
 struct Values {
   // Wrist hall effect positive and negative edges.
@@ -57,6 +64,8 @@
   // The number of teeth on the pinion that drives the drivetrain wheels.
   int drivetrain_gearbox_pinion;
 
+  ShifterHallEffect left_drive, right_drive;
+
   // How many pixels off center the vertical line
   // on the camera view is.
   int camera_center;
diff --git a/frc971/input/gyro_sensor_receiver.cc b/frc971/input/gyro_sensor_receiver.cc
index 1d3546d..c554173 100644
--- a/frc971/input/gyro_sensor_receiver.cc
+++ b/frc971/input/gyro_sensor_receiver.cc
@@ -11,6 +11,7 @@
 #include "frc971/control_loops/shooter/shooter_motor.q.h"
 #include "frc971/queues/GyroAngle.q.h"
 #include "frc971/input/usb_receiver.h"
+#include "frc971/constants.h"
 
 #ifndef M_PI
 #define M_PI 3.14159265358979323846
@@ -27,50 +28,57 @@
 namespace frc971 {
 namespace {
 
-inline double drivetrain_translate(int32_t in) {
+double drivetrain_translate(int32_t in) {
   return static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
       (19.0 / 50.0) /*output reduction*/ * (64.0 / 24.0) /*encoder gears*/ *
       (3.5 /*wheel diameter*/ * 2.54 / 100.0 * M_PI);
 }
 
-inline double wrist_translate(int32_t in) {
+double wrist_translate(int32_t in) {
   return static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
       (14.0 / 50.0 * 20.0 / 84.0) /*gears*/ * (2 * M_PI);
 }
 
-inline double angle_adjust_translate(int32_t in) {
+double angle_adjust_translate(int32_t in) {
   static const double kCableDiameter = 0.060;
   return -static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
       ((0.75 + kCableDiameter) / (16.61125 + kCableDiameter)) /*pulleys*/ *
       (2 * M_PI);
 }
 
-inline double shooter_translate(int32_t in) {
+double shooter_translate(int32_t in) {
  return static_cast<double>(in) / (32.0 /*cpr*/ * 4.0 /*quad*/) *
       (15.0 / 34.0) /*gears*/ * (2 * M_PI);
 }
 
-inline double index_translate(int32_t in) {
+double index_translate(int32_t in) {
   return -static_cast<double>(in) / (128.0 /*cpr*/ * 4.0 /*quad*/) *
       (1.0) /*gears*/ * (2 * M_PI);
 }
 
 // Translates values from the ADC into voltage.
-inline double adc_translate(uint16_t in) {
+double adc_translate(uint16_t in) {
   static const double kVRefN = 0;
   static const double kVRefP = 3.3;
-  static const int kMaximumValue = 0x3FF;
-  return kVRefN +
+  static const int kMaximumValue = 0xFFF;
+  static const double kDividerGnd = 31.6, kDividerOther = 28;
+  return (kVRefN +
       (static_cast<double>(in) / static_cast<double>(kMaximumValue) *
-       (kVRefP - kVRefN));
+       (kVRefP - kVRefN))) * (kDividerGnd + kDividerOther) / kDividerGnd;
 }
 
-inline double gyro_translate(int64_t in) {
+double gyro_translate(int64_t in) {
   return in / 16.0 / 1000.0 / (180.0 / M_PI);
 }
 
-inline double battery_translate(uint16_t in) {
-  return adc_translate(in) * 80.8 / 17.8;
+double battery_translate(uint16_t in) {
+  static const double kDividerBig = 98.9, kDividerSmall = 17.8;
+  return adc_translate(in) * kDividerBig / kDividerSmall;
+}
+
+double hall_translate(const constants::ShifterHallEffect &k, uint16_t in) {
+  const double voltage = adc_translate(in);
+  return (voltage - k.low) / (k.high - k.low);
 }
 
 }  // namespace
@@ -150,9 +158,16 @@
         battery_translate(data()->main.battery_voltage),
         adc_translate(data()->main.battery_voltage),
         data()->main.battery_voltage);
-    LOG(DEBUG, "halls l=%f r=%f\n",
+    LOG(DEBUG, "halls l=%f r=%f %" PRIx16 " %" PRIx16 "\n",
         adc_translate(data()->main.left_drive_hall),
-        adc_translate(data()->main.right_drive_hall));
+        adc_translate(data()->main.right_drive_hall),
+        data()->main.left_drive_hall,
+        data()->main.right_drive_hall);
+    LOG(DEBUG, "real l=%f r=%f\n",
+        hall_translate(constants::GetValues().left_drive,
+                       data()->main.left_drive_hall),
+        hall_translate(constants::GetValues().right_drive,
+                       data()->main.right_drive_hall));
   }
 
   bool bad_gyro_;
diff --git a/frc971/input/input.gyp b/frc971/input/input.gyp
index 5558618..8d5ad90 100644
--- a/frc971/input/input.gyp
+++ b/frc971/input/input.gyp
@@ -38,6 +38,7 @@
         '<(AOS)/build/aos.gyp:logging',
         '<(AOS)/common/util/util.gyp:wrapping_counter',
         'usb_receiver',
+        '<(DEPTH)/frc971/frc971.gyp:constants',
       ],
     },
     {
@@ -56,8 +57,12 @@
         '<(DEPTH)/gyro_board/src/libusb-driver/libusb-driver.gyp:libusb_wrap',
         '<(AOS)/common/common.gyp:time',
       ],
+      'variables': {
+        # TODO(brians): Add dependency on this file too (or something).
+        'checksum': '<!(<(DEPTH)/gyro_board/src/usb/data_struct_checksum.sh)',
+      },
       'defines': [
-        'GYRO_BOARD_DATA_CHECKSUM=<!(<(DEPTH)/gyro_board/src/usb/data_struct_checksum.sh)',
+        'GYRO_BOARD_DATA_CHECKSUM=<(checksum)',
       ],
     },
   ],