Add encoder filters and update max pulses.

Change-Id: I24dee65e45b2b40f0f9d9dd93f83dd8dc2066824
diff --git a/y2016/wpilib/wpilib_interface.cc b/y2016/wpilib/wpilib_interface.cc
index dfe1259..f46611c 100644
--- a/y2016/wpilib/wpilib_interface.cc
+++ b/y2016/wpilib/wpilib_interface.cc
@@ -127,12 +127,23 @@
          (5.0 /*turns*/ / 5.0 /*volts*/) * (2 * M_PI /*radians*/);
 }
 
-// TODO(constants): Update.
-static const double kMaximumEncoderPulsesPerSecond =
-    5600.0 /* free speed RPM */ * 14.0 / 48.0 /* bottom gear reduction */ *
-    18.0 / 32.0 /* big belt reduction */ * 18.0 /
-    66.0 /* top gear reduction */ * 48.0 / 18.0 /* encoder gears */ /
-    60.0 /* seconds / minute */ * 256.0 /* CPR */;
+constexpr double kMaxDrivetrainEncoderPulsesPerSecond =
+    5600.0 /* CIM free speed RPM */ * 14.0 / 48.0 /* 1st reduction */ * 28.0 /
+    50.0 /* 2nd reduction (high gear) */ * 30.0 / 44.0 /* encoder gears */ /
+    60.0 /* seconds per minute */ * 256.0 /* CPR */ * 4 /* edges per cycle */;
+
+constexpr double kMaxShooterEncoderPulsesPerSecond =
+    18700.0 /* 775pro free speed RPM */ * 12.0 /
+    18.0 /* motor to encoder reduction */ / 60.0 /* seconds per minute */ *
+    128.0 /* CPR */ * 4 /* edges per cycle */;
+
+double kMaxDrivetrainShooterEncoderPulsesPerSecond = ::std::max(
+    kMaxDrivetrainEncoderPulsesPerSecond, kMaxShooterEncoderPulsesPerSecond);
+
+constexpr double kMaxSuperstructureEncoderPulsesPerSecond =
+    18700.0 /* 775pro free speed RPM */ * 12.0 /
+    56.0 /* motor to encoder reduction */ / 60.0 /* seconds per minute */ *
+    512.0 /* CPR */ * 4 /* index pulse every quarter cycle */;
 
 // Class to send position messages with sensor readings to our loops.
 class SensorReader {
@@ -140,20 +151,26 @@
   SensorReader() {
     // Set it to filter out anything shorter than 1/4 of the minimum pulse width
     // we should ever see.
-    encoder_filter_.SetPeriodNanoSeconds(
-        static_cast<int>(1 / 4.0 / kMaximumEncoderPulsesPerSecond * 1e9 + 0.5));
+    drivetrain_shooter_encoder_filter_.SetPeriodNanoSeconds(
+        static_cast<int>(1 / 4.0 /* built-in tolerance */ /
+                             kMaxDrivetrainShooterEncoderPulsesPerSecond * 1e9 +
+                         0.5));
+    superstructure_encoder_filter_.SetPeriodNanoSeconds(
+        static_cast<int>(1 / 4.0 /* built-in tolerance */ /
+                             kMaxSuperstructureEncoderPulsesPerSecond * 1e9 +
+                         0.5));
     hall_filter_.SetPeriodNanoSeconds(100000);
   }
 
   // Drivetrain setters.
   void set_drivetrain_left_encoder(::std::unique_ptr<Encoder> encoder) {
+    drivetrain_shooter_encoder_filter_.Add(encoder.get());
     drivetrain_left_encoder_ = ::std::move(encoder);
-    drivetrain_left_encoder_->SetMaxPeriod(0.005);
   }
 
   void set_drivetrain_right_encoder(::std::unique_ptr<Encoder> encoder) {
+    drivetrain_shooter_encoder_filter_.Add(encoder.get());
     drivetrain_right_encoder_ = ::std::move(encoder);
-    drivetrain_right_encoder_->SetMaxPeriod(0.005);
   }
 
   void set_drivetrain_left_hall(::std::unique_ptr<AnalogInput> analog) {
@@ -166,18 +183,18 @@
 
   // Shooter setters.
   void set_shooter_left_encoder(::std::unique_ptr<Encoder> encoder) {
-    encoder_filter_.Add(encoder.get());
+    drivetrain_shooter_encoder_filter_.Add(encoder.get());
     shooter_left_encoder_ = ::std::move(encoder);
   }
 
   void set_shooter_right_encoder(::std::unique_ptr<Encoder> encoder) {
-    encoder_filter_.Add(encoder.get());
+    drivetrain_shooter_encoder_filter_.Add(encoder.get());
     shooter_right_encoder_ = ::std::move(encoder);
   }
 
   // Intake setters.
   void set_intake_encoder(::std::unique_ptr<Encoder> encoder) {
-    encoder_filter_.Add(encoder.get());
+    superstructure_encoder_filter_.Add(encoder.get());
     intake_encoder_.set_encoder(::std::move(encoder));
   }
 
@@ -186,13 +203,13 @@
   }
 
   void set_intake_index(::std::unique_ptr<DigitalInput> index) {
-    encoder_filter_.Add(index.get());
+    superstructure_encoder_filter_.Add(index.get());
     intake_encoder_.set_index(::std::move(index));
   }
 
   // Shoulder setters.
   void set_shoulder_encoder(::std::unique_ptr<Encoder> encoder) {
-    encoder_filter_.Add(encoder.get());
+    superstructure_encoder_filter_.Add(encoder.get());
     shoulder_encoder_.set_encoder(::std::move(encoder));
   }
 
@@ -202,13 +219,13 @@
   }
 
   void set_shoulder_index(::std::unique_ptr<DigitalInput> index) {
-    encoder_filter_.Add(index.get());
+    superstructure_encoder_filter_.Add(index.get());
     shoulder_encoder_.set_index(::std::move(index));
   }
 
   // Wrist setters.
   void set_wrist_encoder(::std::unique_ptr<Encoder> encoder) {
-    encoder_filter_.Add(encoder.get());
+    superstructure_encoder_filter_.Add(encoder.get());
     wrist_encoder_.set_encoder(::std::move(encoder));
   }
 
@@ -217,7 +234,7 @@
   }
 
   void set_wrist_index(::std::unique_ptr<DigitalInput> index) {
-    encoder_filter_.Add(index.get());
+    superstructure_encoder_filter_.Add(index.get());
     wrist_encoder_.set_index(::std::move(index));
   }
 
@@ -351,7 +368,8 @@
       shoulder_encoder_, wrist_encoder_;
 
   ::std::atomic<bool> run_{true};
-  DigitalGlitchFilter encoder_filter_, hall_filter_;
+  DigitalGlitchFilter drivetrain_shooter_encoder_filter_, hall_filter_,
+      superstructure_encoder_filter_;
 };
 
 class SolenoidWriter {