Merge "Changing 2017 constants from aos::Once to absl::call_once()"
diff --git a/aos/ipc_lib/BUILD b/aos/ipc_lib/BUILD
index 1e8b118..684620a 100644
--- a/aos/ipc_lib/BUILD
+++ b/aos/ipc_lib/BUILD
@@ -13,7 +13,7 @@
     ],
     deps = [
         "//aos:macros",
-        "//aos:once",
+        "@com_google_absl//absl/base",
         "//aos/logging",
         "//aos/util:compiler_memory_barrier",
     ],
diff --git a/aos/ipc_lib/aos_sync.cc b/aos/ipc_lib/aos_sync.cc
index 101a189..3962467 100644
--- a/aos/ipc_lib/aos_sync.cc
+++ b/aos/ipc_lib/aos_sync.cc
@@ -29,7 +29,7 @@
 #include "aos/logging/logging.h"
 #include "aos/macros.h"
 #include "aos/util/compiler_memory_barrier.h"
-#include "aos/once.h"
+#include "absl/base/call_once.h"
 
 using ::aos::linux_code::ipc_lib::FutexAccessorObserver;
 
@@ -377,11 +377,10 @@
   my_tid = 0;
 }
 
-void *InstallAtforkHook() {
+void InstallAtforkHook() {
   if (pthread_atfork(NULL, NULL, atfork_child) != 0) {
     AOS_PLOG(FATAL, "pthread_atfork(NULL, NULL, %p) failed", atfork_child);
   }
-  return nullptr;
 }
 
 // This gets called to set everything up in a new thread by get_tid().
@@ -601,8 +600,8 @@
 
   my_tid = do_get_tid();
 
-  static ::aos::Once<void> atfork_hook_installed(InstallAtforkHook);
-  atfork_hook_installed.Get();
+  static absl::once_flag once_;
+  absl::call_once(once_, InstallAtforkHook);
 
   my_robust_list::Init();
 }
diff --git a/tsconfig.json b/tsconfig.json
index 91093d3..d330268 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -2,7 +2,9 @@
   "compilerOptions": {
     "experimentalDecorators": true,
     "strict": true,
-    "noImplicitAny": false
+    "noImplicitAny": false,
+    "target": "es6",
+    "lib": ["es6", "dom"]
   },
   "bazelOptions": {
     "workspaceName": "971-Robot-Code"
diff --git a/y2018/BUILD b/y2018/BUILD
index fc2aae8..d7cc2fd 100644
--- a/y2018/BUILD
+++ b/y2018/BUILD
@@ -49,7 +49,6 @@
     ],
     visibility = ["//visibility:public"],
     deps = [
-        "//aos:once",
         "//aos/logging",
         "//aos/mutex",
         "//aos/network:team_number",
diff --git a/y2018/constants.cc b/y2018/constants.cc
index 97a62a1..ea21a5b 100644
--- a/y2018/constants.cc
+++ b/y2018/constants.cc
@@ -13,7 +13,6 @@
 #include "aos/logging/logging.h"
 #include "aos/mutex/mutex.h"
 #include "aos/network/team_number.h"
-#include "aos/once.h"
 
 #include "y2018/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
 #include "y2018/control_loops/drivetrain/polydrivetrain_dog_motor_plant.h"
diff --git a/y2018_bot3/BUILD b/y2018_bot3/BUILD
deleted file mode 100644
index 49ae5a5..0000000
--- a/y2018_bot3/BUILD
+++ /dev/null
@@ -1,5 +0,0 @@
-py_library(
-    name = "python_init",
-    srcs = ["__init__.py"],
-    visibility = ["//visibility:public"],
-)
diff --git a/y2018_bot3/__init__.py b/y2018_bot3/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/y2018_bot3/__init__.py
+++ /dev/null
diff --git a/y2018_bot3/control_loops/BUILD b/y2018_bot3/control_loops/BUILD
deleted file mode 100644
index da1a4aa..0000000
--- a/y2018_bot3/control_loops/BUILD
+++ /dev/null
@@ -1,6 +0,0 @@
-py_library(
-    name = "python_init",
-    srcs = ["__init__.py"],
-    visibility = ["//visibility:public"],
-    deps = ["//y2018_bot3:python_init"],
-)
diff --git a/y2018_bot3/control_loops/__init__.py b/y2018_bot3/control_loops/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/y2018_bot3/control_loops/__init__.py
+++ /dev/null
diff --git a/y2018_bot3/control_loops/drivetrain/BUILD b/y2018_bot3/control_loops/drivetrain/BUILD
deleted file mode 100644
index 62484c0..0000000
--- a/y2018_bot3/control_loops/drivetrain/BUILD
+++ /dev/null
@@ -1,80 +0,0 @@
-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 //y2018_bot3/control_loops/python:drivetrain) $(OUTS)",
-    tools = [
-        "//y2018_bot3/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 //y2018_bot3/control_loops/python:polydrivetrain) $(OUTS)",
-    tools = [
-        "//y2018_bot3/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",
-    ],
-    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",
-    ],
-    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",
-        "//aos/events:shm-event-loop",
-        "//frc971/control_loops/drivetrain:drivetrain_lib",
-    ],
-)
diff --git a/y2018_bot3/control_loops/drivetrain/drivetrain_base.cc b/y2018_bot3/control_loops/drivetrain/drivetrain_base.cc
deleted file mode 100644
index 23b0705..0000000
--- a/y2018_bot3/control_loops/drivetrain/drivetrain_base.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-#include "y2018_bot3/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 "y2018_bot3/control_loops/drivetrain/hybrid_velocity_drivetrain.h"
-#include "y2018_bot3/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
-#include "y2018_bot3/control_loops/drivetrain/kalman_drivetrain_motor_plant.h"
-#include "y2018_bot3/control_loops/drivetrain/polydrivetrain_dog_motor_plant.h"
-
-using ::frc971::control_loops::drivetrain::DrivetrainConfig;
-
-namespace chrono = ::std::chrono;
-
-namespace y2018_bot3 {
-namespace control_loops {
-namespace drivetrain {
-
-namespace {
-const ::frc971::constants::ShifterHallEffect kThreeStateDriveShifter{
-    0.0, 0.0, 0.25, 0.75};
-}  // namespace
-
-const DrivetrainConfig<double> &GetDrivetrainConfig() {
-  static DrivetrainConfig<double> kDrivetrainConfig{
-      ::frc971::control_loops::drivetrain::ShifterType::SIMPLE_SHIFTER,
-      ::frc971::control_loops::drivetrain::LoopType::CLOSED_LOOP,
-      ::frc971::control_loops::drivetrain::GyroType::SPARTAN_GYRO,
-      ::frc971::control_loops::drivetrain::IMUType::IMU_X,
-
-      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::kHighGearRatio,
-      drivetrain::kJ,
-      drivetrain::kMass,
-      kThreeStateDriveShifter, kThreeStateDriveShifter,
-      // TODO(sabina): confirm once robot is built
-      true /* default_high_gear */, 0 /* down_offset */,
-      0.4 /* wheel_non_linearity */, 1.0 /* quickturn_wheel_multiplier */,
-      1.0 /* wheel_multiplier */,
-  };
-
-  return kDrivetrainConfig;
-};
-
-}  // namespace drivetrain
-}  // namespace control_loops
-}  // namespace y2018_bot3
diff --git a/y2018_bot3/control_loops/drivetrain/drivetrain_base.h b/y2018_bot3/control_loops/drivetrain/drivetrain_base.h
deleted file mode 100644
index 2368c96..0000000
--- a/y2018_bot3/control_loops/drivetrain/drivetrain_base.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef Y2018_BOT3_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_BASE_H_
-#define Y2018_BOT3_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_BASE_H_
-
-#include "frc971/control_loops/drivetrain/drivetrain_config.h"
-
-namespace y2018_bot3 {
-namespace control_loops {
-namespace drivetrain {
-
-const ::frc971::control_loops::drivetrain::DrivetrainConfig<double>
-    &GetDrivetrainConfig();
-
-}  // namespace drivetrain
-}  // namespace control_loops
-}  // namespace y2018_bot3
-
-#endif  // Y2018_BOT3_CONTROL_LOOPS_DRIVETRAIN_DRIVETRAIN_BASE_H_
diff --git a/y2018_bot3/control_loops/drivetrain/drivetrain_main.cc b/y2018_bot3/control_loops/drivetrain/drivetrain_main.cc
deleted file mode 100644
index 095aaf9..0000000
--- a/y2018_bot3/control_loops/drivetrain/drivetrain_main.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "aos/init.h"
-
-#include "aos/events/shm-event-loop.h"
-#include "frc971/control_loops/drivetrain/drivetrain.h"
-#include "y2018_bot3/control_loops/drivetrain/drivetrain_base.h"
-
-using ::frc971::control_loops::drivetrain::DrivetrainLoop;
-
-int main() {
-  ::aos::InitNRT(true);
-
-  ::aos::ShmEventLoop event_loop;
-  ::frc971::control_loops::drivetrain::DeadReckonEkf localizer(
-      &event_loop,
-      ::y2018_bot3::control_loops::drivetrain::GetDrivetrainConfig());
-  DrivetrainLoop drivetrain(
-      ::y2018_bot3::control_loops::drivetrain::GetDrivetrainConfig(),
-      &event_loop, &localizer);
-
-  event_loop.Run();
-
-  ::aos::Cleanup();
-  return 0;
-}
diff --git a/y2018_bot3/control_loops/python/BUILD b/y2018_bot3/control_loops/python/BUILD
deleted file mode 100644
index 5b6f0a2..0000000
--- a/y2018_bot3/control_loops/python/BUILD
+++ /dev/null
@@ -1,54 +0,0 @@
-package(default_visibility = ["//y2018_bot3:__subpackages__"])
-
-py_binary(
-    name = "drivetrain",
-    srcs = [
-        "drivetrain.py",
-    ],
-    legacy_create_init = False,
-    restricted_to = ["//tools:k8"],
-    deps = [
-        ":python_init",
-        "//external:python-gflags",
-        "//external:python-glog",
-        "//frc971/control_loops/python:drivetrain",
-    ],
-)
-
-py_binary(
-    name = "polydrivetrain",
-    srcs = [
-        "drivetrain.py",
-        "polydrivetrain.py",
-    ],
-    legacy_create_init = False,
-    restricted_to = ["//tools:k8"],
-    deps = [
-        ":python_init",
-        "//external:python-gflags",
-        "//external:python-glog",
-        "//frc971/control_loops/python:polydrivetrain",
-    ],
-)
-
-py_library(
-    name = "polydrivetrain_lib",
-    srcs = [
-        "drivetrain.py",
-        "polydrivetrain.py",
-    ],
-    restricted_to = ["//tools:k8"],
-    deps = [
-        "//external:python-gflags",
-        "//external:python-glog",
-        "//frc971/control_loops/python:controls",
-        "//frc971/control_loops/python:drivetrain",
-    ],
-)
-
-py_library(
-    name = "python_init",
-    srcs = ["__init__.py"],
-    visibility = ["//visibility:public"],
-    deps = ["//y2018_bot3/control_loops:python_init"],
-)
diff --git a/y2018_bot3/control_loops/python/__init__.py b/y2018_bot3/control_loops/python/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/y2018_bot3/control_loops/python/__init__.py
+++ /dev/null
diff --git a/y2018_bot3/control_loops/python/drivetrain.py b/y2018_bot3/control_loops/python/drivetrain.py
deleted file mode 100644
index 1d3ad4b..0000000
--- a/y2018_bot3/control_loops/python/drivetrain.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/python
-
-from frc971.control_loops.python import drivetrain
-import sys
-
-import gflags
-import glog
-
-FLAGS = gflags.FLAGS
-
-gflags.DEFINE_bool('plot', False, 'If true, plot the loop response.')
-
-#TODO(sabina): update values
-kDrivetrain = drivetrain.DrivetrainParams(
-    J=1.0,
-    mass=1.0,
-    robot_radius=0.6 / 2.0,
-    wheel_radius=4.0 / 2.0,
-    G_high=1.0,
-    G_low=1.0,
-    q_pos_low=0.12,
-    q_pos_high=0.14,
-    q_vel_low=1.0,
-    q_vel_high=0.95,
-    has_imu=False)
-
-def main(argv):
-    argv = FLAGS(argv)
-    glog.init()
-
-    if FLAGS.plot:
-        drivetrain.PlotDrivetrainMotions(kDrivetrain)
-    elif len(argv) != 5:
-        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_bot3', kDrivetrain)
-
-if __name__ == '__main__':
-    sys.exit(main(sys.argv))
diff --git a/y2018_bot3/control_loops/python/polydrivetrain.py b/y2018_bot3/control_loops/python/polydrivetrain.py
deleted file mode 100644
index 6037138..0000000
--- a/y2018_bot3/control_loops/python/polydrivetrain.py
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/python
-
-import sys
-from y2018_bot3.control_loops.python import drivetrain
-from frc971.control_loops.python import polydrivetrain
-
-import gflags
-import glog
-
-__author__ = 'Austin Schuh (austin.linux@gmail.com)'
-
-FLAGS = gflags.FLAGS
-
-try:
-  gflags.DEFINE_bool('plot', False, 'If true, plot the loop response.')
-except gflags.DuplicateFlagError:
-  pass
-
-def main(argv):
-  if FLAGS.plot:
-    polydrivetrain.PlotPolyDrivetrainMotions(drivetrain.kDrivetrain)
-  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_bot3', drivetrain.kDrivetrain)
-
-if __name__ == '__main__':
-  argv = FLAGS(sys.argv)
-  glog.init()
-  sys.exit(main(argv))
diff --git a/y2019/BUILD b/y2019/BUILD
index 792844f..04855d5 100644
--- a/y2019/BUILD
+++ b/y2019/BUILD
@@ -26,7 +26,7 @@
     ],
     visibility = ["//visibility:public"],
     deps = [
-        "//aos:once",
+        "@com_google_absl//absl/base",
         "//aos/logging",
         "//aos/mutex",
         "//aos/network:team_number",
diff --git a/y2019/constants.cc b/y2019/constants.cc
index 043624d..5466ce2 100644
--- a/y2019/constants.cc
+++ b/y2019/constants.cc
@@ -11,7 +11,7 @@
 #include "aos/logging/logging.h"
 #include "aos/mutex/mutex.h"
 #include "aos/network/team_number.h"
-#include "aos/once.h"
+#include "absl/base/call_once.h"
 #include "y2019/control_loops/superstructure/elevator/integral_elevator_plant.h"
 #include "y2019/control_loops/superstructure/intake/integral_intake_plant.h"
 #include "y2019/control_loops/superstructure/stilts/integral_stilts_plant.h"
@@ -230,17 +230,19 @@
   return r;
 }
 
-const Values *DoGetValues() {
+void DoGetValues(const Values** result) {
   uint16_t team = ::aos::network::GetTeamNumber();
   AOS_LOG(INFO, "creating a Constants for team %" PRIu16 "\n", team);
-  return DoGetValuesForTeam(team);
+  *result = DoGetValuesForTeam(team);
 }
 
 }  // namespace
 
 const Values &GetValues() {
-  static ::aos::Once<const Values> once(DoGetValues);
-  return *once.Get();
+  static absl::once_flag once_;
+  static const Values* result;
+  absl::call_once(once_, DoGetValues, &result);
+  return *result;
 }
 
 const Values &GetValuesForTeam(uint16_t team_number) {
diff --git a/y2019/vision/server/www/main.ts b/y2019/vision/server/www/main.ts
index 5647d7b..9e90563 100644
--- a/y2019/vision/server/www/main.ts
+++ b/y2019/vision/server/www/main.ts
@@ -16,7 +16,7 @@
   private targetX = 0;
   private targetY = 0;
   private targetTheta = 0;
-  private cameraFrames : Frame[];
+  private cameraFrames : Frame[] = [];
 
   private wrist: number = -1;
   private elevator: number = -1;
@@ -42,12 +42,13 @@
 
     const server = location.host;
     this.initWebSocket(server);
-    window.requestAnimationFrame(() => this.draw(ctx));
+    if (!!ctx) {
+      window.requestAnimationFrame(() => this.draw(ctx));
+    }
   }
 
   initWebSocket(server: string): void {
     const socket = new WebSocket(`ws://${server}/ws`);
-    this.cameraFrames = [];
 
     socket.addEventListener('message', (event) => {
       const j = JSON.parse(event.data);