Created a spline drivetrain.

Change-Id: Icfbfcec930d17d1a2ca075fc2eb67594d35113df
diff --git a/frc971/control_loops/drivetrain/splinedrivetrain.h b/frc971/control_loops/drivetrain/splinedrivetrain.h
new file mode 100644
index 0000000..b311e14
--- /dev/null
+++ b/frc971/control_loops/drivetrain/splinedrivetrain.h
@@ -0,0 +1,40 @@
+#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_SPLINEDRIVETRAIN_H_
+#define FRC971_CONTROL_LOOPS_DRIVETRAIN_SPLINEDRIVETRAIN_H_
+
+#include "frc971/control_loops/drivetrain/distance_spline.h"
+#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/drivetrain/drivetrain_config.h"
+#include "frc971/control_loops/drivetrain/spline.h"
+#include "frc971/control_loops/drivetrain/trajectory.h"
+
+namespace frc971 {
+namespace control_loops {
+namespace drivetrain {
+
+class SplineDrivetrain {
+ public:
+  SplineDrivetrain(const DrivetrainConfig<double> &dt_config);
+
+  void SetGoal(const ::frc971::control_loops::DrivetrainQueue::Goal &goal);
+
+  void SetOutput(
+      ::frc971::control_loops::DrivetrainQueue::Output *output);
+  // TODO(alex): What status do we need?
+  void PopulateStatus(
+      ::frc971::control_loops::DrivetrainQueue::Status *status) const;
+ private:
+  const DrivetrainConfig<double> dt_config_;
+
+  uint32_t current_spline_handle_; // Current spline told to excecute.
+  uint32_t current_spline_idx_;  // Current excecuting spline.
+  ::std::unique_ptr<DistanceSpline> distance_spline_;
+  ::std::unique_ptr<Trajectory> current_trajectory_;
+  ::std::vector<::Eigen::Matrix<double, 3, 1>> current_xva_plan_;
+  size_t current_xva_idx_;
+};
+
+}  // namespace drivetrain
+}  // namespace control_loops
+}  // namespace frc971
+
+#endif  // FRC971_CONTROL_LOOPS_DRIVETRAIN_SPLINEDRIVETRAIN_H_