Add spline goal to 2022 field visualization

Signed-off-by: James Kuszmaul <jabukuszmaul+collab@gmail.com>
Change-Id: Iedfab5a04eca4239ea58aee1fcf850f6b6f7596f
diff --git a/aos/network/www/reflection.ts b/aos/network/www/reflection.ts
index a765eea..328ee58 100644
--- a/aos/network/www/reflection.ts
+++ b/aos/network/www/reflection.ts
@@ -6,8 +6,8 @@
 // constructed flatbuffers.
 // See reflection_test_main.ts for sample usage.
 
-import * as aos from 'org_frc971/aos/configuration_generated';
-import * as reflection from '../../../external/com_github_google_flatbuffers/reflection/reflection_generated';
+import * as aos from '../../configuration_generated';
+import * as reflection from 'flatbuffers_reflection/reflection_generated';
 import {ByteBuffer} from 'flatbuffers';
 
 // Returns the size, in bytes, of the given type. For vectors/strings/etc.
diff --git a/y2020/www/field_handler.ts b/y2020/www/field_handler.ts
index c165bcc..28c35aa 100644
--- a/y2020/www/field_handler.ts
+++ b/y2020/www/field_handler.ts
@@ -1,10 +1,9 @@
 import {ByteBuffer} from 'flatbuffers';
-import {Connection} from 'org_frc971/aos/network/www/proxy';
-import * as flatbuffers_builder from 'org_frc971/external/com_github_google_flatbuffers/ts/builder';
-import {Status as DrivetrainStatus} from 'org_frc971/frc971/control_loops/drivetrain/drivetrain_status_generated';
-import {LocalizerDebug, RejectionReason, ImageMatchDebug} from 'org_frc971/y2020/control_loops/drivetrain/localizer_debug_generated';
-import {Status as SuperstructureStatus, FlywheelControllerStatus} from 'org_frc971/y2020/control_loops/superstructure/superstructure_status_generated'
-import {ImageMatchResult} from 'org_frc971/y2020/vision/sift/sift_generated';
+import {Connection} from '../../aos/network/www/proxy';
+import {Status as DrivetrainStatus} from '../../frc971/control_loops/drivetrain/drivetrain_status_generated';
+import {LocalizerDebug, RejectionReason, ImageMatchDebug} from '../control_loops/drivetrain/localizer_debug_generated';
+import {Status as SuperstructureStatus, FlywheelControllerStatus} from '../control_loops/superstructure/superstructure_status_generated'
+import {ImageMatchResult} from '../vision/sift/sift_generated';
 
 import {FIELD_LENGTH, FIELD_WIDTH, FT_TO_M, IN_TO_M} from './constants';
 
diff --git a/y2022/www/BUILD b/y2022/www/BUILD
index 88e54a5..957045d 100644
--- a/y2022/www/BUILD
+++ b/y2022/www/BUILD
@@ -24,6 +24,7 @@
         "//aos/network:connect_ts_fbs",
         "//aos/network:web_proxy_ts_fbs",
         "//aos/network/www:proxy",
+        "//frc971/control_loops/drivetrain:drivetrain_status_ts_fbs",
         "//y2022/control_loops/superstructure:superstructure_status_ts_fbs",
         "//y2022/localizer:localizer_output_ts_fbs",
         "//y2022/localizer:localizer_status_ts_fbs",
diff --git a/y2022/www/field_handler.ts b/y2022/www/field_handler.ts
index 22989be..5072ffd 100644
--- a/y2022/www/field_handler.ts
+++ b/y2022/www/field_handler.ts
@@ -1,9 +1,10 @@
 import {ByteBuffer} from 'flatbuffers';
-import {Connection} from 'org_frc971/aos/network/www/proxy';
-import {IntakeState, Status as SuperstructureStatus, SuperstructureState} from 'org_frc971/y2022/control_loops/superstructure/superstructure_status_generated'
-import {LocalizerOutput} from 'org_frc971/y2022/localizer/localizer_output_generated';
-import {RejectionReason} from 'org_frc971/y2022/localizer/localizer_status_generated';
-import {LocalizerVisualization, TargetEstimateDebug} from 'org_frc971/y2022/localizer/localizer_visualization_generated';
+import {Connection} from '../../aos/network/www/proxy';
+import {IntakeState, Status as SuperstructureStatus, SuperstructureState} from '../control_loops/superstructure/superstructure_status_generated'
+import {LocalizerOutput} from '../localizer/localizer_output_generated';
+import {RejectionReason} from '../localizer/localizer_status_generated';
+import {Status as DrivetrainStatus} from '../../frc971/control_loops/drivetrain/drivetrain_status_generated';
+import {LocalizerVisualization, TargetEstimateDebug} from '../localizer/localizer_visualization_generated';
 
 import {FIELD_LENGTH, FIELD_WIDTH, FT_TO_M, IN_TO_M} from './constants';
 
@@ -19,6 +20,7 @@
 export class FieldHandler {
   private canvas = document.createElement('canvas');
   private localizerOutput: LocalizerOutput|null = null;
+  private drivetrainStatus: DrivetrainStatus|null = null;
   private superstructureStatus: SuperstructureStatus|null = null;
 
   // Image information indexed by timestamp (seconds since the epoch), so that
@@ -105,6 +107,10 @@
             this.handleLocalizerDebug(data);
           });
       this.connection.addHandler(
+          '/drivetrain', DrivetrainStatus.getFullyQualifiedName(), (data) => {
+            this.handleDrivetrainStatus(data);
+          });
+      this.connection.addHandler(
           '/localizer', LocalizerOutput.getFullyQualifiedName(), (data) => {
             this.handleLocalizerOutput(data);
           });
@@ -154,6 +160,11 @@
     this.localizerOutput = LocalizerOutput.getRootAsLocalizerOutput(fbBuffer);
   }
 
+  private handleDrivetrainStatus(data: Uint8Array): void {
+    const fbBuffer = new ByteBuffer(data);
+    this.drivetrainStatus = DrivetrainStatus.getRootAsStatus(fbBuffer);
+  }
+
   private handleSuperstructureStatus(data: Uint8Array): void {
     const fbBuffer = new ByteBuffer(data);
     this.superstructureStatus = SuperstructureStatus.getRootAsStatus(fbBuffer);
@@ -377,6 +388,14 @@
       }
     }
 
+    if (this.drivetrainStatus && this.drivetrainStatus.trajectoryLogging()) {
+      this.drawRobot(
+          this.drivetrainStatus.trajectoryLogging().x(),
+          this.drivetrainStatus.trajectoryLogging().y(),
+          this.drivetrainStatus.trajectoryLogging().theta(), null, "#000000FF",
+          false);
+    }
+
     if (this.localizerOutput) {
       if (!this.localizerOutput.zeroed()) {
         this.setZeroing(this.x);