Add drivetrain_main for 2019 robot

Needs masses and controller still tuned.

Change-Id: I29d62286b2941238abb9770a21e764148fbb688b
diff --git a/y2019/control_loops/drivetrain/BUILD b/y2019/control_loops/drivetrain/BUILD
new file mode 100644
index 0000000..4d7e616
--- /dev/null
+++ b/y2019/control_loops/drivetrain/BUILD
@@ -0,0 +1,81 @@
+load("//aos/build:queues.bzl", "queue_library")
+
+genrule(
+    name = "genrule_drivetrain",
+    outs = [
+        "drivetrain_dog_motor_plant.h",
+        "drivetrain_dog_motor_plant.cc",
+        "kalman_drivetrain_motor_plant.h",
+        "kalman_drivetrain_motor_plant.cc",
+    ],
+    cmd = "$(location //y2019/control_loops/python:drivetrain) $(OUTS)",
+    tools = [
+        "//y2019/control_loops/python:drivetrain",
+    ],
+)
+
+genrule(
+    name = "genrule_polydrivetrain",
+    outs = [
+        "polydrivetrain_dog_motor_plant.h",
+        "polydrivetrain_dog_motor_plant.cc",
+        "polydrivetrain_cim_plant.h",
+        "polydrivetrain_cim_plant.cc",
+        "hybrid_velocity_drivetrain.h",
+        "hybrid_velocity_drivetrain.cc",
+    ],
+    cmd = "$(location //y2019/control_loops/python:polydrivetrain) $(OUTS)",
+    tools = [
+        "//y2019/control_loops/python:polydrivetrain",
+    ],
+)
+
+cc_library(
+    name = "polydrivetrain_plants",
+    srcs = [
+        "drivetrain_dog_motor_plant.cc",
+        "hybrid_velocity_drivetrain.cc",
+        "kalman_drivetrain_motor_plant.cc",
+        "polydrivetrain_dog_motor_plant.cc",
+    ],
+    hdrs = [
+        "drivetrain_dog_motor_plant.h",
+        "hybrid_velocity_drivetrain.h",
+        "kalman_drivetrain_motor_plant.h",
+        "polydrivetrain_dog_motor_plant.h",
+    ],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//frc971/control_loops:hybrid_state_feedback_loop",
+        "//frc971/control_loops:state_feedback_loop",
+    ],
+)
+
+cc_library(
+    name = "drivetrain_base",
+    srcs = [
+        "drivetrain_base.cc",
+    ],
+    hdrs = [
+        "drivetrain_base.h",
+    ],
+    visibility = ["//visibility:public"],
+    deps = [
+        ":polydrivetrain_plants",
+        "//frc971:shifter_hall_effect",
+        "//frc971/control_loops/drivetrain:drivetrain_config",
+    ],
+)
+
+cc_binary(
+    name = "drivetrain",
+    srcs = [
+        "drivetrain_main.cc",
+    ],
+    visibility = ["//visibility:public"],
+    deps = [
+        ":drivetrain_base",
+        "//aos:init",
+        "//frc971/control_loops/drivetrain:drivetrain_lib",
+    ],
+)
diff --git a/y2019/control_loops/drivetrain/drivetrain_base.cc b/y2019/control_loops/drivetrain/drivetrain_base.cc
new file mode 100644
index 0000000..0c34882
--- /dev/null
+++ b/y2019/control_loops/drivetrain/drivetrain_base.cc
@@ -0,0 +1,55 @@
+#include "y2019/control_loops/drivetrain/drivetrain_base.h"
+
+#include <chrono>
+
+#include "frc971/control_loops/drivetrain/drivetrain_config.h"
+#include "frc971/control_loops/state_feedback_loop.h"
+#include "y2019/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
+#include "y2019/control_loops/drivetrain/hybrid_velocity_drivetrain.h"
+#include "y2019/control_loops/drivetrain/kalman_drivetrain_motor_plant.h"
+#include "y2019/control_loops/drivetrain/polydrivetrain_dog_motor_plant.h"
+
+using ::frc971::control_loops::drivetrain::DrivetrainConfig;
+
+namespace chrono = ::std::chrono;
+
+namespace y2019 {
+namespace control_loops {
+namespace drivetrain {
+
+using ::frc971::constants::ShifterHallEffect;
+
+const ShifterHallEffect kThreeStateDriveShifter{0.0, 0.0, 0.25, 0.75};
+
+const DrivetrainConfig<double> &GetDrivetrainConfig() {
+  static DrivetrainConfig<double> kDrivetrainConfig{
+      ::frc971::control_loops::drivetrain::ShifterType::SIMPLE_SHIFTER,
+      ::frc971::control_loops::drivetrain::LoopType::OPEN_LOOP,
+      ::frc971::control_loops::drivetrain::GyroType::IMU_Z_GYRO,
+      ::frc971::control_loops::drivetrain::IMUType::IMU_Y,
+
+      drivetrain::MakeDrivetrainLoop,
+      drivetrain::MakeVelocityDrivetrainLoop,
+      drivetrain::MakeKFDrivetrainLoop,
+      drivetrain::MakeHybridVelocityDrivetrainLoop,
+
+      chrono::duration_cast<chrono::nanoseconds>(
+          chrono::duration<double>(drivetrain::kDt)),
+      drivetrain::kRobotRadius, drivetrain::kWheelRadius, drivetrain::kV,
+
+      drivetrain::kHighGearRatio, drivetrain::kLowGearRatio,
+      drivetrain::kJ,
+      drivetrain::kMass,
+      kThreeStateDriveShifter, kThreeStateDriveShifter,
+      true /* default_high_gear */, 0 /* down_offset if using constants use
+                                   constants::GetValues().down_error */,
+      0.8 /* wheel_non_linearity */, 1.2 /* quickturn_wheel_multiplier */,
+      1.5 /* wheel_multiplier */,
+  };
+
+  return kDrivetrainConfig;
+};
+
+}  // namespace drivetrain
+}  // namespace control_loops
+}  // namespace y2019
diff --git a/y2019/control_loops/drivetrain/drivetrain_base.h b/y2019/control_loops/drivetrain/drivetrain_base.h
new file mode 100644
index 0000000..5cee1b5
--- /dev/null
+++ b/y2019/control_loops/drivetrain/drivetrain_base.h
@@ -0,0 +1,17 @@
+#ifndef Y2019_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_BASE_H_
+#define Y2019_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_BASE_H_
+
+#include "frc971/control_loops/drivetrain/drivetrain_config.h"
+
+namespace y2019 {
+namespace control_loops {
+namespace drivetrain {
+
+const ::frc971::control_loops::drivetrain::DrivetrainConfig<double>
+    &GetDrivetrainConfig();
+
+}  // namespace drivetrain
+}  // namespace control_loops
+}  // namespace y2019
+
+#endif  // Y2019_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_BASE_H_
diff --git a/y2019/control_loops/drivetrain/drivetrain_main.cc b/y2019/control_loops/drivetrain/drivetrain_main.cc
new file mode 100644
index 0000000..c872622
--- /dev/null
+++ b/y2019/control_loops/drivetrain/drivetrain_main.cc
@@ -0,0 +1,15 @@
+#include "aos/init.h"
+
+#include "frc971/control_loops/drivetrain/drivetrain.h"
+#include "y2019/control_loops/drivetrain/drivetrain_base.h"
+
+using ::frc971::control_loops::drivetrain::DrivetrainLoop;
+
+int main() {
+  ::aos::Init();
+  DrivetrainLoop drivetrain(
+      ::y2019::control_loops::drivetrain::GetDrivetrainConfig());
+  drivetrain.Run();
+  ::aos::Cleanup();
+  return 0;
+}
diff --git a/y2019/control_loops/python/BUILD b/y2019/control_loops/python/BUILD
index 1b395e5..90aafbc 100644
--- a/y2019/control_loops/python/BUILD
+++ b/y2019/control_loops/python/BUILD
@@ -53,5 +53,5 @@
     name = "python_init",
     srcs = ["__init__.py"],
     visibility = ["//visibility:public"],
-    deps = ["//y2018/control_loops:python_init"],
+    deps = ["//y2019/control_loops:python_init"],
 )
diff --git a/y2019/control_loops/python/drivetrain.py b/y2019/control_loops/python/drivetrain.py
index 6421379..b0a213b 100644
--- a/y2019/control_loops/python/drivetrain.py
+++ b/y2019/control_loops/python/drivetrain.py
@@ -14,24 +14,24 @@
 #robot radius needs confirming(set as distance of center wheels from each other)
 #J needs updating
 
+# TODO(austin): wpilib
+# Encoder is on a 24 tooth gear attached to the output gear.
+
 kDrivetrain = drivetrain.DrivetrainParams(
-    J=6.0,
-    mass=68.0,
+    J=4.0,
+    mass=40.0,
+    # TODO(austin): Measure.
     robot_radius=0.616 / 2.0,
-    wheel_radius=0.127 / 2.0 * 120.0 / 118.0,
-    G_low=46.0 / 60.0 * 20.0 / 48.0 * 14.0 / 62.0,
-    G_high=62.0 / 44.0 * 20.0 / 48.0 * 14.0 / 62.0,
-    q_pos_low=0.12,
-    q_pos_high=0.14,
-    q_vel_low=1.0,
-    q_vel_high=0.95,
-    efficiency=0.70,
+    wheel_radius=4.0 * 0.0254 / 2.0,
+    G=9.0 / 52.0,
+    q_pos=0.14,
+    q_vel=0.95,
+    efficiency=0.80,
     has_imu=True,
     force=True,
     kf_q_voltage=13.0,
     controller_poles=[0.82, 0.82],
-    robot_cg_offset=0.0,
-)
+    robot_cg_offset=0.0)
 
 
 def main(argv):
@@ -44,7 +44,7 @@
         print "Expected .h file name and .cc file name"
     else:
         # Write the generated constants out to a file.
-        drivetrain.WriteDrivetrain(argv[1:3], argv[3:5], 'y2018', kDrivetrain)
+        drivetrain.WriteDrivetrain(argv[1:3], argv[3:5], 'y2019', kDrivetrain)
 
 if __name__ == '__main__':
     sys.exit(main(sys.argv))
diff --git a/y2019/control_loops/python/polydrivetrain.py b/y2019/control_loops/python/polydrivetrain.py
index 1652b99..fe52859 100644
--- a/y2019/control_loops/python/polydrivetrain.py
+++ b/y2019/control_loops/python/polydrivetrain.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 import sys
-from y2018.control_loops.python import drivetrain
+from y2019.control_loops.python import drivetrain
 from frc971.control_loops.python import polydrivetrain
 
 import gflags
@@ -22,7 +22,7 @@
   elif len(argv) != 7:
     glog.fatal('Expected .h file name and .cc file name')
   else:
-    polydrivetrain.WritePolyDrivetrain(argv[1:3], argv[3:5], argv[5:7], 'y2018',
+    polydrivetrain.WritePolyDrivetrain(argv[1:3], argv[3:5], argv[5:7], 'y2019',
                                        drivetrain.kDrivetrain)
 
 if __name__ == '__main__':